From 638bf4b33b997dcd9daa3d3a01f97ffc579cc66b Mon Sep 17 00:00:00 2001 From: kurakinasv Date: Fri, 22 Dec 2023 13:28:49 +0300 Subject: [PATCH 01/46] [*] access to window object; WindowType fields --- src/checkVkPlatform.ts | 47 ++++++++++++++++++---------------------- src/initializeVkApp.ts | 37 +++---------------------------- src/setVkViewSettings.ts | 7 +++--- src/types/common.ts | 8 +++++++ src/types/window.ts | 20 +---------------- 5 files changed, 37 insertions(+), 82 deletions(-) diff --git a/src/checkVkPlatform.ts b/src/checkVkPlatform.ts index ed5ba17..e023430 100644 --- a/src/checkVkPlatform.ts +++ b/src/checkVkPlatform.ts @@ -1,4 +1,4 @@ -import { VkPlatformType } from './types'; +import { DeviceInfo, VkPlatformType } from './types'; /** * Платформы ВКонтакте, для которых можно считать, что приложение открыто на десктопе. @@ -66,23 +66,23 @@ const VK_PLATFORM_CLASSNAME = { }; /** - * Утилита для установки настроек под текущую платформу, на которой запущено приложение ВКонтакте. - * В зависимости от платформы устанавливает нужные флаги в window и добавляет нужные класснеймы на тег body. + * Утилита для вычисления информации о текущей платформе, на которой запущено приложение ВКонтакте. + * В зависимости от платформы возвращает нужные параметры и добавляет нужные класснеймы на тег body. * - * Если приложение открыто на desktop (window.platform одна из {@link DESKTOP_VK_PLATFORMS}), - * устанавливает window.is_mobile = false и добавляет класснейм 'desktop' на тег body. + * Если приложение открыто на desktop (vk_platform одна из {@link DESKTOP_VK_PLATFORMS}), + * устанавливает isMobile в false и добавляет класснейм 'desktop' на тег body. * - * Если приложение открыто в мобильном приложении ВКонтакте на IOS (window.platform одна из {@link IOS_VK_PLATFORMS}), - * устанавливает в true window.is_mobile и window.is_ios и добавляет класснеймы 'mobile ios'. + * Если приложение открыто в мобильном приложении ВКонтакте на IOS (vk_platform одна из {@link IOS_VK_PLATFORMS}), + * устанавливает в true isMobile и isIos и добавляет класснеймы 'mobile ios'. * - * Если приложение открыто в мобильном приложении ВКонтакте на Android (window.platform одна из {@link ANDROID_VK_PLATFORMS}), - * устанавливает в true window.is_mobile и window.is_android и добавляет класснеймы 'mobile android'. + * Если приложение открыто в мобильном приложении ВКонтакте на Android (vk_platform одна из {@link ANDROID_VK_PLATFORMS}), + * устанавливает в true isMobile и isAndroid и добавляет класснеймы 'mobile android'. * * Если приложение открыто в браузере на мобильном устройстве (m.vk), - * устанавливает в true window.is_mobile и window.is_mvk = true и добавляет класснеймы 'mobile mvk'. + * устанавливает в true isMobile и isMvk и добавляет класснеймы 'mobile mvk'. * Также по регулярным выражениям для UserAgent проверяет, открыт ли m.vk на Android - * (помимо предыдущих значений еще устанавливает в true window.is_android и добавляет класснейм 'android'), - * или на IOS (помимо предыдущих значений еще устанавливает в true window.is_ios и добавляет класснейм 'ios'). + * (помимо предыдущих значений еще устанавливает в true isAndroid и добавляет класснейм 'android', + * или на IOS устанавливает в true isIos и добавляет класснейм 'ios'). * * Возможные варианты сочетаний: * - desktop - браузер на компьютере @@ -92,13 +92,14 @@ const VK_PLATFORM_CLASSNAME = { * - mobile mvk ios - мобильный браузер на платформе IOS * - mobile mvk android - мобильный браузер на платформе Android * - * @param {VkPlatformType | undefined} [platform=window.platform] Значение текущей платформы, полученное в параметрах запуска ВКонтакте + * @param {VkPlatformType | undefined} [platform] Значение текущей платформы, полученное в параметрах запуска ВКонтакте * * @see https://dev.vk.com/mini-apps/development/launch-params#vk_platform */ + const checkVkPlatform = ( - platform: VkPlatformType | undefined = window.platform -): void => { + platform: VkPlatformType | undefined +): DeviceInfo | void => { if (!platform) { return; } @@ -114,47 +115,41 @@ const checkVkPlatform = ( if (!isMobile) { document.body.classList.add(VK_PLATFORM_CLASSNAME.desktop); - return; + return { isMobile: false, isIos: false, isAndroid: false, isMvk: false }; } - window.is_mobile = true; document.body.classList.add(VK_PLATFORM_CLASSNAME.mobile); /** * Проверяем, открыты ли мобильное приложение или мобильный браузер на IOS */ if (IOS_VK_PLATFORMS.includes(platform)) { - window.is_ios = true; document.body.classList.add(VK_PLATFORM_CLASSNAME.ios); - return; + return { isMobile: true, isIos: true, isAndroid: false, isMvk: false }; } /** * Проверяем, открыты ли мобильное приложение или мобильный браузер на Android */ if (ANDROID_VK_PLATFORMS.includes(platform)) { - window.is_android = true; document.body.classList.add(VK_PLATFORM_CLASSNAME.android); - return; + return { isMobile: true, isIos: false, isAndroid: true, isMvk: false }; } - window.is_mvk = true; document.body.classList.add(VK_PLATFORM_CLASSNAME.mvk); if (/(iPad|iPhone|iPod)/g.test(navigator.userAgent)) { - window.is_ios = true; document.body.classList.add(VK_PLATFORM_CLASSNAME.ios); - return; + return { isMobile: true, isIos: true, isAndroid: false, isMvk: true }; } if (/android/i.test(navigator.userAgent)) { - window.is_android = true; document.body.classList.add(VK_PLATFORM_CLASSNAME.android); - return; + return { isMobile: true, isIos: false, isAndroid: true, isMvk: true }; } }; diff --git a/src/initializeVkApp.ts b/src/initializeVkApp.ts index 6aa7aca..54a2a53 100644 --- a/src/initializeVkApp.ts +++ b/src/initializeVkApp.ts @@ -1,45 +1,14 @@ import bridge from '@vkontakte/vk-bridge'; -import { - findGetParameter, - initializeAppParams, -} from '@ktsstudio/mediaproject-utils'; -import { checkVkPlatform } from './checkVkPlatform'; -import { InitializeVkAppResponseType, VkPlatformType } from './types'; +import { InitializeVkAppResponseType } from './types'; /** - * Утилита для инициализации параметров mini-app ВКонтакте. - * Сначала инициализирует общие параметры через initializeAppParams - * из {@link https://github.com/ktsstudio/mediaproject-utils @ktsstudio/mediaproject-utils}. - * Затем получает {@link https://dev.vk.com/mini-apps/development/launch-params параметры запуска} - * из query-параметров и сохраняет их в window ({@link WindowType}). - * После этого вызывает утилиту {@link checkVkPlatform}. - * В конце отправляет событие {@link https://dev.vk.com/bridge/VKWebAppInit VKWebAppInit} в vk-bridge. + * Утилита для инициализации mini-app ВКонтакте. + * Отправляет событие {@link https://dev.vk.com/bridge/VKWebAppInit VKWebAppInit} в vk-bridge. * * @returns {Promise} Возвращает ответ, полученный на запрос VKWebAppInit. */ const initializeVkApp = async (): Promise => { - initializeAppParams(); - - window.user_id = Number(findGetParameter('vk_user_id')); - window.app_id = Number(findGetParameter('vk_app_id')); - window.notifications_enabled = - findGetParameter('vk_are_notifications_enabled') === '1'; - window.language = findGetParameter('vk_language') || undefined; - window.ref = findGetParameter('vk_ref') || undefined; - window.scope = findGetParameter('vk_access_token_settings') || undefined; - window.group_id = findGetParameter('group_id') || undefined; - window.viewer_group_role = - findGetParameter('vk_viewer_group_role') || undefined; - window.platform = (findGetParameter('vk_platform') || - 'desktop_web') as VkPlatformType; - window.is_odr = findGetParameter('odr_enabled') === '1'; - - checkVkPlatform(); - - // eslint-disable-next-line no-console - console.log(`VK, ${window.is_mobile ? 'mobile, ' : ''}${window.platform}`); - return await bridge.send('VKWebAppInit', {}); }; diff --git a/src/setVkViewSettings.ts b/src/setVkViewSettings.ts index 900d292..2353112 100644 --- a/src/setVkViewSettings.ts +++ b/src/setVkViewSettings.ts @@ -29,21 +29,22 @@ const VK_PLATFORMS_WITH_VIEW_SETTINGS: VkPlatformType[] = [ * @see {@link https://dev.vk.com/bridge/VKWebAppSetViewSettings} */ const setVkViewSettings = async ( + platform: VkPlatformType, viewSettings: SetViewSettingsPropsType ): Promise => { try { let settingsForCurrentPlatform = { ...viewSettings }; if ( - window.platform && - VK_PLATFORMS_WITH_VIEW_SETTINGS.includes(window.platform) && + platform && + VK_PLATFORMS_WITH_VIEW_SETTINGS.includes(platform) && bridge.supports('VKWebAppSetViewSettings') ) { /** * Все настройки поддерживаются только на android, * так что если платформа не android, то используем только цвет status bar */ - if (window.platform !== 'mobile_android') { + if (platform !== 'mobile_android') { settingsForCurrentPlatform = { status_bar_style: viewSettings.status_bar_style, }; diff --git a/src/types/common.ts b/src/types/common.ts index 339de4d..93e5faf 100644 --- a/src/types/common.ts +++ b/src/types/common.ts @@ -29,9 +29,17 @@ type ExternalVkPlatformType = type VkPlatformType = InternalVkPlatformType | ExternalVkPlatformType; +type DeviceInfo = { + isMobile: boolean; + isIos: boolean; + isAndroid: boolean; + isMvk: boolean; +}; + export type { VkResponseType, InternalVkPlatformType, ExternalVkPlatformType, VkPlatformType, + DeviceInfo, }; diff --git a/src/types/window.ts b/src/types/window.ts index 0dfb6e2..de5d961 100644 --- a/src/types/window.ts +++ b/src/types/window.ts @@ -1,24 +1,6 @@ import { WindowType as CommonWindowType } from '@ktsstudio/mediaproject-utils'; -import { VkPlatformType } from './common'; - -export interface WindowType - extends Omit { - /** Параметры запуска */ - user_id?: number; - notifications_enabled?: boolean; - language?: string; - ref?: string; - group_id?: string; - viewer_group_role?: string; - platform?: VkPlatformType; - is_odr?: boolean; - - /** Параметры текущей платформы */ - is_ios?: boolean; - is_android?: boolean; - is_mvk?: boolean; - +export interface WindowType extends CommonWindowType { /** Токен доступа и его права */ access_token?: string; scope?: string; From 7453e31e637be9bd5f8105738bd76ba25a2cddd4 Mon Sep 17 00:00:00 2001 From: kurakinasv Date: Fri, 22 Dec 2023 13:31:29 +0300 Subject: [PATCH 02/46] [*] removed default appId argument --- src/callVkApi.ts | 7 ++++--- src/getVkAccessToken.ts | 2 +- src/shareVkPost.ts | 2 ++ src/types/getVkAccessToken.ts | 2 +- src/types/shareVkPost.ts | 1 + 5 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/callVkApi.ts b/src/callVkApi.ts index 8aa8325..879d7f7 100644 --- a/src/callVkApi.ts +++ b/src/callVkApi.ts @@ -39,7 +39,7 @@ const callVkApi = async ({ version = '5.131', accessToken = null, renewTokenIfExpired = true, - getAccessTokenParams = {}, + getAccessTokenParams, }: CallVkApiPropsType): Promise> => { try { let token: string | null = accessToken; @@ -48,7 +48,7 @@ const callVkApi = async ({ * Если access token нет, * получаем новый перед запросом к API */ - if (!accessToken) { + if (!accessToken && getAccessTokenParams) { token = await getVkAccessToken(getAccessTokenParams); } @@ -86,7 +86,8 @@ const callVkApi = async ({ if ( renewTokenIfExpired && errorMessage && - VK_TOKEN_ERRORS.includes(errorMessage) + VK_TOKEN_ERRORS.includes(errorMessage) && + getAccessTokenParams ) { window.access_token = undefined; const newAccessToken = await getVkAccessToken(getAccessTokenParams); diff --git a/src/getVkAccessToken.ts b/src/getVkAccessToken.ts index 0ec7db0..bb90358 100644 --- a/src/getVkAccessToken.ts +++ b/src/getVkAccessToken.ts @@ -76,7 +76,7 @@ const checkOneScopesSetIncludesAnother = ( */ const getNewVkAccessToken = async ({ scopes = null, - appId = window.app_id, + appId, }: GetNewVkAccessTokenParamsType): Promise => { try { /** diff --git a/src/shareVkPost.ts b/src/shareVkPost.ts index ec47513..05856aa 100644 --- a/src/shareVkPost.ts +++ b/src/shareVkPost.ts @@ -65,6 +65,7 @@ const shareVkPostWithUpload = async ({ file, apiUploadUrl, userId, + appId, accessToken = window.access_token, onUserDeniedAccess, onErrorOccurred, @@ -77,6 +78,7 @@ const shareVkPostWithUpload = async ({ method: 'photos.getWallUploadServer', accessToken, getAccessTokenParams: { + appId, scopes: ['photos'], onUserDeniedAll: onUserDeniedAccess, onUserDeniedSomeScopes: onUserDeniedAccess, diff --git a/src/types/getVkAccessToken.ts b/src/types/getVkAccessToken.ts index 48be5cd..f4a23a1 100644 --- a/src/types/getVkAccessToken.ts +++ b/src/types/getVkAccessToken.ts @@ -10,7 +10,7 @@ export type GetVkAccessTokenPropsType = RequestPropsMap['VKWebAppGetAuthToken']; export type GetNewVkAccessTokenParamsType = { scopes?: PersonalAuthScope[] | null; - appId?: GetVkAccessTokenPropsType['app_id']; + appId: GetVkAccessTokenPropsType['app_id']; }; export type GetVkAccessTokenParamsType = GetNewVkAccessTokenParamsType & { diff --git a/src/types/shareVkPost.ts b/src/types/shareVkPost.ts index 9b75707..de9dd7b 100644 --- a/src/types/shareVkPost.ts +++ b/src/types/shareVkPost.ts @@ -18,6 +18,7 @@ type ShareVkPostWithUploadParamsType = { file: File; apiUploadUrl: UrlConfigType; userId: number; + appId: number; accessToken?: string; onUserDeniedAccess?: VoidFunction; // eslint-disable-next-line From ac3bdf50f05d79c8fb4c26f2b99fa0bc430ac588 Mon Sep 17 00:00:00 2001 From: kurakinasv Date: Fri, 22 Dec 2023 14:15:21 +0300 Subject: [PATCH 03/46] [*] version, changelog --- CHANGELOG.md | 10 +++++++--- package.json | 2 +- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 201d94c..ae6e471 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,11 @@ -#### v2.1.1 +# v3.0.0 -[-] shareVkPostWithUpload: убрана вложенность response +- [*] отрефакторены утилиты `checkVkPlatform`, `setVkViewSettings` и `initializeVkApp` – удалены обращения к `window` +- [*] из `WindowType` убраны поля, которые не должны храниться в `window`: параметры запуска и параметры определения платформы + +### v2.1.1 + +- [-] shareVkPostWithUpload: убрана вложенность response ## v2.1.0 @@ -15,7 +20,6 @@ [-] shareVkPostWithUpload: убрана вложенность response - ### v2.0.1 - [+] checkVkUserDenied: добавлена обработка нового кода ошибки от ВК в случае отказа от ручного действия diff --git a/package.json b/package.json index 04dc85c..5904c1a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@ktsstudio/mediaproject-vk", - "version": "2.1.1", + "version": "3.0.0", "description": "Package with utils for VK Mini Apps", "author": "KTS Studio (https://kts.studio)", "keywords": [ From cdd0000b96a3c8d78bae66826ac864d6f6444f32 Mon Sep 17 00:00:00 2001 From: kurakinasv Date: Mon, 25 Dec 2023 19:27:07 +0300 Subject: [PATCH 04/46] [*] pr fixes - getAccessTokenParams is required in callVkApi - checkVkPlatform: void -> null - setVkViewSettings: arguments order --- src/callVkApi.ts | 5 ++--- src/checkVkPlatform.ts | 6 ++++-- src/getVkAccessToken.ts | 4 ++-- src/setVkViewSettings.ts | 4 ++-- src/shareVkPost.ts | 1 + src/types/callVkApi.ts | 14 +++----------- 6 files changed, 14 insertions(+), 20 deletions(-) diff --git a/src/callVkApi.ts b/src/callVkApi.ts index 879d7f7..c8b3928 100644 --- a/src/callVkApi.ts +++ b/src/callVkApi.ts @@ -48,7 +48,7 @@ const callVkApi = async ({ * Если access token нет, * получаем новый перед запросом к API */ - if (!accessToken && getAccessTokenParams) { + if (!accessToken) { token = await getVkAccessToken(getAccessTokenParams); } @@ -86,8 +86,7 @@ const callVkApi = async ({ if ( renewTokenIfExpired && errorMessage && - VK_TOKEN_ERRORS.includes(errorMessage) && - getAccessTokenParams + VK_TOKEN_ERRORS.includes(errorMessage) ) { window.access_token = undefined; const newAccessToken = await getVkAccessToken(getAccessTokenParams); diff --git a/src/checkVkPlatform.ts b/src/checkVkPlatform.ts index e023430..f65d087 100644 --- a/src/checkVkPlatform.ts +++ b/src/checkVkPlatform.ts @@ -99,9 +99,9 @@ const VK_PLATFORM_CLASSNAME = { const checkVkPlatform = ( platform: VkPlatformType | undefined -): DeviceInfo | void => { +): DeviceInfo | null => { if (!platform) { - return; + return null; } const isMobile = Boolean( @@ -151,6 +151,8 @@ const checkVkPlatform = ( return { isMobile: true, isIos: false, isAndroid: true, isMvk: true }; } + + return null; }; export { diff --git a/src/getVkAccessToken.ts b/src/getVkAccessToken.ts index bb90358..99bf4d4 100644 --- a/src/getVkAccessToken.ts +++ b/src/getVkAccessToken.ts @@ -69,7 +69,7 @@ const checkOneScopesSetIncludesAnother = ( * * @param {GetNewVkAccessTokenParamsType} props * @param {PersonalAuthScope[] | null} [props.scopes=null] Массив необходимых scopes. Если не передан, будет получен токен с пустым scope. - * @param {number=} props.appId ID текущего приложения. Если не указан, будет взят из window.app_id. + * @param {number=} props.appId ID текущего приложения. * @returns {Promise} Возвращает ответ, полученный на запрос VKWebAppGetAuthToken с переданными параметрами. * * @see {@link https://dev.vk.com/bridge/VKWebAppGetAuthToken} @@ -106,7 +106,7 @@ const getNewVkAccessToken = async ({ * @param {(error?: ErrorData) => void=} props.onUserDeniedAll Коллбэк, вызываемый в случае, если пользователь отказался давать доступ к запрашиваемым scopes. * @param {(error?: ErrorData) => void=} props.onUserDeniedSomeScopes Коллбэк, вызываемый в случае, если пользователь дал доступ не ко всем требуемым scopes. * @param {(error?: ErrorData) => void=} props.onErrorOccurred Коллбэк, вызываемый в случае, если произошла ошибка. - * @param {number=} props.appId ID текущего приложения. Если не указан, будет взят из window.app_id. + * @param {number=} props.appId ID текущего приложения. * @returns {Promise} В случае успеха возвращает токен доступа. Иначе возвращает null. * * @see {@link https://dev.vk.com/bridge/VKWebAppGetAuthToken} diff --git a/src/setVkViewSettings.ts b/src/setVkViewSettings.ts index 2353112..0ecd22a 100644 --- a/src/setVkViewSettings.ts +++ b/src/setVkViewSettings.ts @@ -29,8 +29,8 @@ const VK_PLATFORMS_WITH_VIEW_SETTINGS: VkPlatformType[] = [ * @see {@link https://dev.vk.com/bridge/VKWebAppSetViewSettings} */ const setVkViewSettings = async ( - platform: VkPlatformType, - viewSettings: SetViewSettingsPropsType + viewSettings: SetViewSettingsPropsType, + platform: VkPlatformType ): Promise => { try { let settingsForCurrentPlatform = { ...viewSettings }; diff --git a/src/shareVkPost.ts b/src/shareVkPost.ts index 05856aa..be688ef 100644 --- a/src/shareVkPost.ts +++ b/src/shareVkPost.ts @@ -141,6 +141,7 @@ const shareVkPostWithUpload = async ({ server: Number(server), user_id: userId, }, + getAccessTokenParams: { appId }, }); if (saveWallPhotoData.error_type || !saveWallPhotoData.response?.[0]) { diff --git a/src/types/callVkApi.ts b/src/types/callVkApi.ts index a6d2915..9d8aa1e 100644 --- a/src/types/callVkApi.ts +++ b/src/types/callVkApi.ts @@ -4,22 +4,14 @@ import { GetVkAccessTokenParamsType } from './getVkAccessToken'; type CallVkApiRequestBasePropsType = RequestPropsMap['VKWebAppCallAPIMethod']; -type CallVkApiAccessTokenPropsType = - | { - renewTokenIfExpired?: false; - getAccessTokenParams?: GetVkAccessTokenParamsType; - } - | { - renewTokenIfExpired?: true; - getAccessTokenParams: GetVkAccessTokenParamsType; - }; - type CallVkApiPropsType = { method: CallVkApiRequestBasePropsType['method']; params?: Omit; version?: CallVkApiRequestBasePropsType['params']['v']; accessToken?: CallVkApiRequestBasePropsType['params']['access_token'] | null; -} & CallVkApiAccessTokenPropsType; + renewTokenIfExpired?: boolean; + getAccessTokenParams: GetVkAccessTokenParamsType; +}; type CallVkApiResponseType = Partial< { From 0919556eb80601dc06b11dce38c4444ba81ddfb6 Mon Sep 17 00:00:00 2001 From: kurakinasv Date: Mon, 25 Dec 2023 19:27:56 +0300 Subject: [PATCH 05/46] [-] initializeVkApp --- CHANGELOG.md | 3 ++- README.md | 1 - src/index.ts | 2 -- src/initializeVkApp.ts | 15 --------------- 4 files changed, 2 insertions(+), 19 deletions(-) delete mode 100644 src/initializeVkApp.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index ae6e471..5094d5d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,8 @@ # v3.0.0 -- [*] отрефакторены утилиты `checkVkPlatform`, `setVkViewSettings` и `initializeVkApp` – удалены обращения к `window` +- [*] отрефакторены утилиты `checkVkPlatform` и `setVkViewSettings` – удалены обращения к `window` - [*] из `WindowType` убраны поля, которые не должны храниться в `window`: параметры запуска и параметры определения платформы +- [-] удалена утилита `initializeVkApp` ### v2.1.1 diff --git a/README.md b/README.md index 7a4a746..ec0afd3 100644 --- a/README.md +++ b/README.md @@ -34,7 +34,6 @@ - [checkVkAvatarIsDefault](./src/checkVkAvatarIsDefault.ts) - [checkVkPlatform](./src/checkVkPlatform.ts) -- [initializeVkApp](./src/initializeVkApp.ts) ## Обратная связь diff --git a/src/index.ts b/src/index.ts index 6172eec..960eb5c 100644 --- a/src/index.ts +++ b/src/index.ts @@ -12,8 +12,6 @@ export * from './checkVkUserDenied'; export * from './getVkAccessToken'; -export * from './initializeVkApp'; - export * from './setVkViewSettings'; export * from './shareVkPost'; diff --git a/src/initializeVkApp.ts b/src/initializeVkApp.ts deleted file mode 100644 index 54a2a53..0000000 --- a/src/initializeVkApp.ts +++ /dev/null @@ -1,15 +0,0 @@ -import bridge from '@vkontakte/vk-bridge'; - -import { InitializeVkAppResponseType } from './types'; - -/** - * Утилита для инициализации mini-app ВКонтакте. - * Отправляет событие {@link https://dev.vk.com/bridge/VKWebAppInit VKWebAppInit} в vk-bridge. - * - * @returns {Promise} Возвращает ответ, полученный на запрос VKWebAppInit. - */ -const initializeVkApp = async (): Promise => { - return await bridge.send('VKWebAppInit', {}); -}; - -export { initializeVkApp }; From 185bee2cedb80a1e6453a86d385ac3b562238f26 Mon Sep 17 00:00:00 2001 From: "d.ragozin" Date: Thu, 11 Jan 2024 14:24:17 +0300 Subject: [PATCH 06/46] =?UTF-8?q?[*]=20=D0=A0=D0=B0=D1=81=D1=88=D0=B8?= =?UTF-8?q?=D1=80=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=B2=D0=BE=D0=B7=D0=BC=D0=BE?= =?UTF-8?q?=D0=B6=D0=BD=D1=8B=D1=85=20=D0=BA=D0=B5=D0=B9=D1=81=D0=BE=D0=B2?= =?UTF-8?q?=20=D0=B2=20=D0=BF=D1=80=D0=BE=D0=B2=D0=B5=D1=80=D0=BA=D0=B5=20?= =?UTF-8?q?=D0=BD=D0=B0=20=D0=BE=D1=82=D0=BA=D0=B0=D0=B7=20=D0=BF=D0=BE?= =?UTF-8?q?=D0=BB=D1=8C=D0=B7=D0=BE=D0=B2=D0=B0=D1=82=D0=B5=D0=BB=D1=8F;?= =?UTF-8?q?=20[+]=20=D0=A3=D1=82=D0=B8=D0=BB=D0=B8=D1=82=D0=B0=20=D0=B4?= =?UTF-8?q?=D0=BB=D1=8F=20=D0=BF=D1=80=D0=BE=D0=B2=D0=B5=D1=80=D0=BA=D0=B8?= =?UTF-8?q?=20=D0=BD=D0=B0=20=D1=81=D0=BE=D0=BE=D1=82=D0=B2=D0=B5=D1=82?= =?UTF-8?q?=D1=81=D1=82=D0=B2=D0=B8=D0=B5=20=D1=82=D0=B8=D0=BF=D1=83=20?= =?UTF-8?q?=D0=BE=D1=88=D0=B8=D0=B1=D0=BA=D0=B8=20=D0=BE=D1=82=20=D0=92?= =?UTF-8?q?=D0=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/checkVkUserDenied.ts | 6 +----- src/index.ts | 2 ++ src/isVkError.ts | 29 +++++++++++++++++++++++++++++ 3 files changed, 32 insertions(+), 5 deletions(-) create mode 100644 src/isVkError.ts diff --git a/src/checkVkUserDenied.ts b/src/checkVkUserDenied.ts index 4b2ec81..3ecee9b 100644 --- a/src/checkVkUserDenied.ts +++ b/src/checkVkUserDenied.ts @@ -15,11 +15,7 @@ const checkVkUserDenied = (error: ErrorData): boolean => { return false; } - const { - error_data: { error_reason, error_code }, - } = error; - - return error_code === 4 && userDeniedReasons.has(error_reason); + return userDeniedReasons.has(error.error_data.error_reason); }; export { checkVkUserDenied }; diff --git a/src/index.ts b/src/index.ts index 6172eec..927e972 100644 --- a/src/index.ts +++ b/src/index.ts @@ -19,3 +19,5 @@ export * from './setVkViewSettings'; export * from './shareVkPost'; export * from './shareVkStory'; + +export * from './isVkError'; diff --git a/src/isVkError.ts b/src/isVkError.ts new file mode 100644 index 0000000..8c4ec8a --- /dev/null +++ b/src/isVkError.ts @@ -0,0 +1,29 @@ +import { ErrorData } from '@vkontakte/vk-bridge'; + +const vkErrorTypes = new Set([ + 'client_error', + 'api_error', + 'auth_error', +]); + +/** + * Утилита для проверки произвольного значения на соответствие + * типу {@link ErrorData}, обозначающему ошибку, приходящую от API VK + * + * @param {any} value Произвольное значение. + * @returns {boolean} Если переданное значение соответствует + * типу ошибки от API VK, возвращает true, а компилятор TypeScript + * будет считать, что переданное значение имеет тип {@link ErrorData}. + * Иначе функция возвращает false, а TypeScript считает, + * что переданное значение не имеет тип {@link ErrorData} + */ +const isVkError = (value: any): value is ErrorData => { + return ( + typeof value === 'object' && + value !== null && + 'error_data' in value && + vkErrorTypes.has(value?.error_type) + ); +}; + +export { isVkError }; From be3580d4c044e90e39da247ccf0b8d01e01ea7fa Mon Sep 17 00:00:00 2001 From: "d.ragozin" Date: Thu, 11 Jan 2024 14:34:55 +0300 Subject: [PATCH 07/46] =?UTF-8?q?[*]=20=D0=9A=D0=BE=D0=BC=D0=BC=D0=B5?= =?UTF-8?q?=D0=BD=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/isVkError.ts | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/isVkError.ts b/src/isVkError.ts index 8c4ec8a..86f480a 100644 --- a/src/isVkError.ts +++ b/src/isVkError.ts @@ -16,6 +16,19 @@ const vkErrorTypes = new Set([ * будет считать, что переданное значение имеет тип {@link ErrorData}. * Иначе функция возвращает false, а TypeScript считает, * что переданное значение не имеет тип {@link ErrorData} + * + * @example + * try { + * await bridge.send(...); + * } catch (error) { + * if (!isVkError(error)) { + * return; + * } + * + * if (checkVkUserDenied(error)) { + * return; + * } + * } */ const isVkError = (value: any): value is ErrorData => { return ( From b2cbd14ddbf20b52dd4cf8a591e916c98eda2177 Mon Sep 17 00:00:00 2001 From: "d.ragozin" Date: Thu, 11 Jan 2024 15:22:23 +0300 Subject: [PATCH 08/46] =?UTF-8?q?[*]=20=D0=92=D1=8B=D0=BD=D0=B5=D1=81?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BA=D0=BE=D0=BD=D1=81=D1=82=D0=B0?= =?UTF-8?q?=D0=BD=D1=82=20=D1=81=20=D1=82=D0=B8=D0=BF=D0=B0=D0=BC=D0=B8=20?= =?UTF-8?q?=D0=BE=D1=88=D0=B8=D0=B1=D0=BE=D0=BA=20=D0=92=D0=9A,=20=D1=80?= =?UTF-8?q?=D0=B0=D1=81=D1=88=D0=B8=D1=80=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BF?= =?UTF-8?q?=D1=80=D0=BE=D0=B2=D0=B5=D1=80=D0=BA=D0=B8=20=D0=BD=D0=B0=20?= =?UTF-8?q?=D0=BE=D1=88=D0=B8=D0=B1=D0=BA=D1=83=20=D0=BE=D1=82=20=D0=92?= =?UTF-8?q?=D0=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/checkVkUserDenied.ts | 6 +++++- src/consts.ts | 9 +++++++++ src/index.ts | 2 ++ src/isVkError.ts | 6 +----- 4 files changed, 17 insertions(+), 6 deletions(-) create mode 100644 src/consts.ts diff --git a/src/checkVkUserDenied.ts b/src/checkVkUserDenied.ts index 3ecee9b..26d0aa8 100644 --- a/src/checkVkUserDenied.ts +++ b/src/checkVkUserDenied.ts @@ -15,7 +15,11 @@ const checkVkUserDenied = (error: ErrorData): boolean => { return false; } - return userDeniedReasons.has(error.error_data.error_reason); + const { + error_data: { error_reason, error_code }, + } = error; + + return userDeniedReasons.has(error_reason) || error_code === 4; }; export { checkVkUserDenied }; diff --git a/src/consts.ts b/src/consts.ts new file mode 100644 index 0000000..0409a12 --- /dev/null +++ b/src/consts.ts @@ -0,0 +1,9 @@ +import { ErrorData } from '@vkontakte/vk-bridge'; + +const vkErrorTypes = new Set([ + 'client_error', + 'api_error', + 'auth_error', +]); + +export { vkErrorTypes }; diff --git a/src/index.ts b/src/index.ts index 927e972..b7b37e2 100644 --- a/src/index.ts +++ b/src/index.ts @@ -21,3 +21,5 @@ export * from './shareVkPost'; export * from './shareVkStory'; export * from './isVkError'; + +export * from './consts'; diff --git a/src/isVkError.ts b/src/isVkError.ts index 86f480a..8a0bc42 100644 --- a/src/isVkError.ts +++ b/src/isVkError.ts @@ -1,10 +1,6 @@ import { ErrorData } from '@vkontakte/vk-bridge'; -const vkErrorTypes = new Set([ - 'client_error', - 'api_error', - 'auth_error', -]); +import { vkErrorTypes } from './consts'; /** * Утилита для проверки произвольного значения на соответствие From 60a0feb8f525724247934c88116e8c86bd91ec82 Mon Sep 17 00:00:00 2001 From: "d.ragozin" Date: Thu, 11 Jan 2024 17:10:44 +0300 Subject: [PATCH 09/46] =?UTF-8?q?[-]=20=D0=AD=D0=BA=D1=81=D0=BF=D0=BE?= =?UTF-8?q?=D1=80=D1=82=20consts=20=D0=B8=D0=B7=20=D0=BB=D0=B8=D0=B1=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/index.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/index.ts b/src/index.ts index b7b37e2..927e972 100644 --- a/src/index.ts +++ b/src/index.ts @@ -21,5 +21,3 @@ export * from './shareVkPost'; export * from './shareVkStory'; export * from './isVkError'; - -export * from './consts'; From 41dda82f09917eb6cd06f616a13b2186b46c0efc Mon Sep 17 00:00:00 2001 From: "d.ragozin" Date: Thu, 11 Jan 2024 17:13:17 +0300 Subject: [PATCH 10/46] =?UTF-8?q?[+]=20=D0=A2=D0=B5=D1=81=D1=82=D1=8B=20?= =?UTF-8?q?=D1=84=D1=83=D0=BD=D0=BA=D1=86=D0=B8=D0=B9=20isVkError,=20check?= =?UTF-8?q?VkUserDenied?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jest.config.ts | 10 + package.json | 8 + rollup.config.mjs | 1 + src/__tests__/checkVkUserDenied.test.ts | 173 ++ src/__tests__/isVkError.test.ts | 115 ++ src/__tests__/utils/index.ts | 5 + src/__tests__/utils/randomNumberUpTo.ts | 2 + src/__tests__/utils/randomString.ts | 13 + src/__tests__/utils/range.ts | 1 + src/checkVkUserDenied.ts | 4 +- src/consts.ts | 7 +- tsconfig.build.json | 10 + tsconfig.json | 3 +- yarn.lock | 2140 ++++++++++++++++++++++- 14 files changed, 2464 insertions(+), 28 deletions(-) create mode 100644 jest.config.ts create mode 100644 src/__tests__/checkVkUserDenied.test.ts create mode 100644 src/__tests__/isVkError.test.ts create mode 100644 src/__tests__/utils/index.ts create mode 100644 src/__tests__/utils/randomNumberUpTo.ts create mode 100644 src/__tests__/utils/randomString.ts create mode 100644 src/__tests__/utils/range.ts create mode 100644 tsconfig.build.json diff --git a/jest.config.ts b/jest.config.ts new file mode 100644 index 0000000..a04a382 --- /dev/null +++ b/jest.config.ts @@ -0,0 +1,10 @@ +import type { Config } from 'jest'; + +const config: Config = { + testEnvironment: 'jsdom', + transform: { + '^.+\\.(t|j)sx?$': '@swc/jest', + }, +}; + +export default config; diff --git a/package.json b/package.json index 04dc85c..7ec6890 100644 --- a/package.json +++ b/package.json @@ -35,6 +35,8 @@ "lint": "eslint src --fix", "codestyle": "prettier --write \"src/**/*.{ts,js}?(x)\"", "tsc-check": "tsc --skipLibCheck --noEmit --project tsconfig.json", + "test": "jest", + "test:cover": "jest --coverage --collectCoverageFrom='src/**/*.{ts,tsx}'", "precommit": "lint-staged" }, "lint-staged": { @@ -52,6 +54,9 @@ "@rollup/plugin-node-resolve": "^15.0.1", "@rollup/plugin-terser": "^0.4.0", "@rollup/plugin-typescript": "^11.0.0", + "@swc/core": "^1.3.102", + "@swc/jest": "^0.2.29", + "@types/jest": "^29.5.11", "@types/node": "^16.4.0", "@types/react": ">=17", "@typescript-eslint/eslint-plugin": "^4.13.0", @@ -64,11 +69,14 @@ "eslint-plugin-prettier": "^3.3.1", "eslint-plugin-react": "^7.22.0", "husky": "^7.0.1", + "jest": "^29.7.0", + "jest-environment-jsdom": "^29.7.0", "lint-staged": "^11.0.0", "prettier": "^2.2.1", "react": ">=17", "rollup": "^3.10.1", "rollup-plugin-peer-deps-external": "^2.2.4", + "ts-node": "^10.9.2", "typescript": "^4.1.3" }, "peerDependencies": { diff --git a/rollup.config.mjs b/rollup.config.mjs index b3cce94..28c026b 100644 --- a/rollup.config.mjs +++ b/rollup.config.mjs @@ -12,6 +12,7 @@ const IS_PRODUCTION = process.env.NODE_ENV === 'production'; const getPlugins = (declarationDir, minification = false) => [ typescript({ + tsconfig: IS_PRODUCTION ? './tsconfig.build.json' : './tsconfig.json', compilerOptions: { rootDir: INPUT_DIR, declaration: true, diff --git a/src/__tests__/checkVkUserDenied.test.ts b/src/__tests__/checkVkUserDenied.test.ts new file mode 100644 index 0000000..3a3ad21 --- /dev/null +++ b/src/__tests__/checkVkUserDenied.test.ts @@ -0,0 +1,173 @@ +import { ErrorData } from '@vkontakte/vk-bridge/dist/types/src/types/bridge'; + +import { checkVkUserDenied } from '../checkVkUserDenied'; +import { userDeniedErrorReasons } from '../consts'; + +import { randomNumberUpTo, randomString, range } from './utils'; + +const getRandomStrings = () => range(3).map(() => randomString(24)); + +const getVkApiTypeError = ({ + errorReason, + errorCode = randomNumberUpTo(100), +}: { errorReason?: string; errorCode?: number } = {}): ErrorData => ({ + error_type: 'api_error', + error_data: errorReason + ? { + error_code: errorCode, + error_msg: randomString(10), + request_params: getRandomStrings(), + // @ts-ignore + error_reason: errorReason, + } + : { + error_code: errorCode, + error_msg: randomString(10), + request_params: getRandomStrings(), + }, + request_id: randomNumberUpTo(100), +}); + +const getVkAuthTypeError = ({ + errorReason = randomString(10), + errorCode = randomNumberUpTo(100), +}: { errorReason?: string; errorCode?: number } = {}): ErrorData => ({ + error_type: 'auth_error', + error_data: { + error_code: errorCode, + error_reason: errorReason, + }, + request_id: randomNumberUpTo(100), +}); + +const getVKClientTypeError = ({ + errorReason = randomString(10), + // +5, чтобы точно не было правильного кода ошибки + errorCode = 5 + randomNumberUpTo(100), +} = {}): ErrorData => ({ + error_type: 'client_error', + error_data: { + error_code: errorCode, + error_reason: errorReason, + error_description: randomString(10), + }, + request_id: randomNumberUpTo(100), +}); + +describe('Функция checkVkUserDenied', () => { + it('Объект ошибки, соответствующий типу ошибки api_error', () => { + expect(checkVkUserDenied(getVkApiTypeError())).toBe(false); + }); + + userDeniedErrorReasons.forEach((reason) => { + it( + 'Объект ошибки, соответствующий типу ошибки api_error' + + ` но с error_reason "${reason}" и кодом ошибки 4`, + () => { + expect( + checkVkUserDenied( + getVkApiTypeError({ errorReason: reason, errorCode: 4 }) + ) + ).toBe(false); + } + ); + }); + + it('Объект ошибки, соответствующий типу ошибки auth_error', () => { + expect(checkVkUserDenied(getVkAuthTypeError())).toBe(false); + }); + + userDeniedErrorReasons.forEach((reason) => { + it( + 'Объект ошибки, соответствующий типу ошибки auth_error,' + + ` но с error_reason "${reason}" и кодом ошибки 4`, + () => { + expect( + checkVkUserDenied( + getVkAuthTypeError({ errorReason: reason, errorCode: 4 }) + ) + ).toBe(false); + } + ); + }); + + userDeniedErrorReasons.forEach((reason) => { + it( + 'Объект ошибки, соответствующий типу ошибки client_error' + + ` с правильным error_reason "${reason}" и кодом ошибки 4`, + () => { + expect( + checkVkUserDenied( + getVKClientTypeError({ errorReason: reason, errorCode: 4 }) + ) + ).toBe(true); + } + ); + }); + + userDeniedErrorReasons.forEach((reason) => { + it( + 'Объект ошибки, соответствующий типу ошибки client_error с произвольным кодом ошибки,' + + ` с правильным error_reason "${reason}", но в нижнем регистре`, + () => { + expect( + checkVkUserDenied( + getVKClientTypeError({ + errorReason: reason.toLowerCase(), + }) + ) + ).toBe(false); + } + ); + }); + + userDeniedErrorReasons.forEach((reason) => { + it( + 'Объект ошибки, соответствующий типу ошибки client_error,' + + ' с произвольным кодом ошибки,' + + ` с правильным error_reason "${reason}"`, + () => { + expect( + checkVkUserDenied(getVKClientTypeError({ errorReason: reason })) + ).toBe(true); + } + ); + }); + + it( + 'Объект ошибки, соответствующий типу ошибки client_error с кодом ошибки 4,' + + ' с произвольной причиной ошибки', + () => { + expect(checkVkUserDenied(getVKClientTypeError({ errorCode: 4 }))).toBe( + true + ); + } + ); + + it( + 'Объект ошибки, соответствующий типу ошибки client_error' + + ' с произвольным кодом ошибки,' + + ' с произвольной причиной ошибки', + () => { + expect(checkVkUserDenied(getVKClientTypeError())).toBe(false); + } + ); + + userDeniedErrorReasons.forEach((reason) => { + it( + 'Объект, содержащий минимально достаточные поля, с типом ошибки client_error' + + ` с причиной ошибки "${reason}" и кодом ошибки 4`, + () => { + expect( + checkVkUserDenied({ + error_type: 'client_error', + error_data: { + error_reason: reason, + error_code: 4, + }, + }) + ).toBe(true); + } + ); + }); +}); diff --git a/src/__tests__/isVkError.test.ts b/src/__tests__/isVkError.test.ts new file mode 100644 index 0000000..31916e2 --- /dev/null +++ b/src/__tests__/isVkError.test.ts @@ -0,0 +1,115 @@ +import { isVkError } from '../isVkError'; +import { vkErrorTypes } from '../consts'; + +import { randomNumberUpTo, randomString, range } from './utils'; + +const getRandomNumbers = () => range(3).map(() => randomNumberUpTo(10000)); + +const getRandomBigInts = () => + range(3).map(() => BigInt(randomNumberUpTo(10000))); + +const getRandomStrings = () => range(3).map(() => randomString(24)); + +const getPrimitives = () => [ + null, + undefined, + false, + true, + Symbol(), + Symbol('named symbol'), + ...getRandomNumbers(), + ...getRandomBigInts(), + ...getRandomStrings(), +]; + +describe('Функция isVkError', () => { + getPrimitives().forEach((value) => + it(`Примитив ${String(value)}`, () => { + expect(isVkError(value)).toBe(false); + }) + ); + + it('Функция стрелочная', () => { + expect(isVkError((n: number) => 'smth' + n)).toBe(false); + }); + + it('Функция не стрелочная', () => { + expect( + // eslint-disable-next-line prefer-arrow-callback + isVkError(function (n: number) { + return 'smth' + n; + }) + ).toBe(false); + }); + + it('Пустой объект', () => { + expect(isVkError({})).toBe(false); + }); + + it('Объект произвольной структуры', () => { + expect( + isVkError({ + a: 1, + [123]: '123', + [Symbol('b')]: null, + }) + ).toBe(false); + }); + + it('Объект ошибки Error', () => { + expect(isVkError(new Error())).toBe(false); + }); + + vkErrorTypes.forEach((errorType) => { + it(`Объект с error_type, равным "${errorType}", но с отсутствующим error_data`, () => { + expect(isVkError({ error_type: errorType })).toBe(false); + }); + }); + + vkErrorTypes.forEach((errorType) => { + it( + `Объект с error_type, равным "${errorType}", ` + + 'с произвольным request_id, но с отсутствующим error_data', + () => { + expect( + isVkError({ + error_type: errorType, + request_id: randomString(6), + }) + ).toBe(false); + } + ); + }); + + it('Объект с произвольным значением поля error_data, но отсутствующим error_type', () => { + expect(isVkError({ error_data: randomString(6) })); + }); + + it('Объект с произвольным значением поля error_data и неправильным error_type', () => { + expect( + isVkError({ error_data: randomString(6), error_type: randomString(6) }) + ); + }); + + vkErrorTypes.forEach((errorType) => { + it(`Объект с произвольным error_data и error_type, равным "${errorType}"`, () => { + expect(isVkError({ error_data: randomString(6), error_type: errorType })); + }); + }); + + vkErrorTypes.forEach((errorType) => { + it( + 'Объект с произвольным error_data, произвольным полем' + + `и error_type, равным "${errorType}"`, + () => { + expect( + isVkError({ + error_data: randomString(6), + error_type: errorType, + [randomString(6)]: randomNumberUpTo(100), + }) + ); + } + ); + }); +}); diff --git a/src/__tests__/utils/index.ts b/src/__tests__/utils/index.ts new file mode 100644 index 0000000..17e9b2a --- /dev/null +++ b/src/__tests__/utils/index.ts @@ -0,0 +1,5 @@ +export * from './randomNumberUpTo'; + +export * from './range'; + +export * from './randomString'; diff --git a/src/__tests__/utils/randomNumberUpTo.ts b/src/__tests__/utils/randomNumberUpTo.ts new file mode 100644 index 0000000..7c01d8e --- /dev/null +++ b/src/__tests__/utils/randomNumberUpTo.ts @@ -0,0 +1,2 @@ +export const randomNumberUpTo = (max: number) => + Math.floor(Math.random() * max); diff --git a/src/__tests__/utils/randomString.ts b/src/__tests__/utils/randomString.ts new file mode 100644 index 0000000..3dc1b3e --- /dev/null +++ b/src/__tests__/utils/randomString.ts @@ -0,0 +1,13 @@ +export const randomString = (length: number) => { + let result = ''; + const characters = + 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; + + const charactersLength = characters.length; + + for (let i = 0; i < length; i++) { + result += characters.charAt(Math.floor(Math.random() * charactersLength)); + } + + return result; +}; diff --git a/src/__tests__/utils/range.ts b/src/__tests__/utils/range.ts new file mode 100644 index 0000000..a74c681 --- /dev/null +++ b/src/__tests__/utils/range.ts @@ -0,0 +1 @@ +export const range = (n: number) => Array.from(Array(n).keys()); diff --git a/src/checkVkUserDenied.ts b/src/checkVkUserDenied.ts index 26d0aa8..2ebe146 100644 --- a/src/checkVkUserDenied.ts +++ b/src/checkVkUserDenied.ts @@ -1,6 +1,6 @@ import { ErrorData } from '@vkontakte/vk-bridge'; -const userDeniedReasons = new Set(['User denied', 'Operation denied by user']); +import { userDeniedErrorReasons } from './consts'; /** * Утилита для проверки, что пришедшая от API ВКонтакте ошибка, @@ -19,7 +19,7 @@ const checkVkUserDenied = (error: ErrorData): boolean => { error_data: { error_reason, error_code }, } = error; - return userDeniedReasons.has(error_reason) || error_code === 4; + return userDeniedErrorReasons.has(error_reason) || error_code === 4; }; export { checkVkUserDenied }; diff --git a/src/consts.ts b/src/consts.ts index 0409a12..2eb662e 100644 --- a/src/consts.ts +++ b/src/consts.ts @@ -6,4 +6,9 @@ const vkErrorTypes = new Set([ 'auth_error', ]); -export { vkErrorTypes }; +const userDeniedErrorReasons = new Set([ + 'User denied', + 'Operation denied by user', +]); + +export { vkErrorTypes, userDeniedErrorReasons }; diff --git a/tsconfig.build.json b/tsconfig.build.json new file mode 100644 index 0000000..e201b6c --- /dev/null +++ b/tsconfig.build.json @@ -0,0 +1,10 @@ +{ + "extends": "./tsconfig.json", + "exclude": [ + "**/__tests__", + "**/*.test.ts", + "**/*.test.tsx", + "**/*.spec.ts", + "**/*.spec.tsx" + ] +} diff --git a/tsconfig.json b/tsconfig.json index 2de1910..aba473f 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -8,6 +8,7 @@ "esModuleInterop": true, "jsx": "react", "strictNullChecks": true, + "resolveJsonModule": true, }, - "include": ["src"] + "include": ["src", "jest.config.ts"] } diff --git a/yarn.lock b/yarn.lock index 6d9bc1c..f093d82 100644 --- a/yarn.lock +++ b/yarn.lock @@ -10,6 +10,14 @@ "@jridgewell/gen-mapping" "^0.1.0" "@jridgewell/trace-mapping" "^0.3.9" +"@ampproject/remapping@^2.2.0": + version "2.2.1" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.1.tgz#99e8e11851128b8702cd57c33684f1d0f260b630" + integrity sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg== + dependencies: + "@jridgewell/gen-mapping" "^0.3.0" + "@jridgewell/trace-mapping" "^0.3.9" + "@babel/code-frame@7.12.11": version "7.12.11" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.11.tgz#f4ad435aa263db935b8f10f2c552d23fb716a63f" @@ -24,6 +32,14 @@ dependencies: "@babel/highlight" "^7.14.5" +"@babel/code-frame@^7.12.13", "@babel/code-frame@^7.22.13", "@babel/code-frame@^7.23.5": + version "7.23.5" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.23.5.tgz#9009b69a8c602293476ad598ff53e4562e15c244" + integrity sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA== + dependencies: + "@babel/highlight" "^7.23.4" + chalk "^2.4.2" + "@babel/code-frame@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.18.6.tgz#3b25d38c89600baa2dcc219edfa88a74eb2c427a" @@ -36,6 +52,32 @@ resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.20.10.tgz#9d92fa81b87542fff50e848ed585b4212c1d34ec" integrity sha512-sEnuDPpOJR/fcafHMjpcpGN5M2jbUGUHwmuWKM/YdPzeEDJg8bgmbcWQFUfE32MQjti1koACvoPVsDe8Uq+idg== +"@babel/compat-data@^7.23.5": + version "7.23.5" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.23.5.tgz#ffb878728bb6bdcb6f4510aa51b1be9afb8cfd98" + integrity sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw== + +"@babel/core@^7.11.6", "@babel/core@^7.12.3": + version "7.23.7" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.23.7.tgz#4d8016e06a14b5f92530a13ed0561730b5c6483f" + integrity sha512-+UpDgowcmqe36d4NwqvKsyPMlOLNGMsfMmQ5WGCu+siCe3t3dfe9njrzGfdN4qq+bcNUt0+Vw6haRxBOycs4dw== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.23.5" + "@babel/generator" "^7.23.6" + "@babel/helper-compilation-targets" "^7.23.6" + "@babel/helper-module-transforms" "^7.23.3" + "@babel/helpers" "^7.23.7" + "@babel/parser" "^7.23.6" + "@babel/template" "^7.22.15" + "@babel/traverse" "^7.23.7" + "@babel/types" "^7.23.6" + convert-source-map "^2.0.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.3" + semver "^6.3.1" + "@babel/core@^7.20.12": version "7.20.12" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.20.12.tgz#7930db57443c6714ad216953d1356dac0eb8496d" @@ -66,6 +108,16 @@ "@jridgewell/gen-mapping" "^0.3.2" jsesc "^2.5.1" +"@babel/generator@^7.23.6", "@babel/generator@^7.7.2": + version "7.23.6" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.23.6.tgz#9e1fca4811c77a10580d17d26b57b036133f3c2e" + integrity sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw== + dependencies: + "@babel/types" "^7.23.6" + "@jridgewell/gen-mapping" "^0.3.2" + "@jridgewell/trace-mapping" "^0.3.17" + jsesc "^2.5.1" + "@babel/helper-annotate-as-pure@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz#eaa49f6f80d5a33f9a5dd2276e6d6e451be0a6bb" @@ -92,6 +144,17 @@ lru-cache "^5.1.1" semver "^6.3.0" +"@babel/helper-compilation-targets@^7.23.6": + version "7.23.6" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz#4d79069b16cbcf1461289eccfbbd81501ae39991" + integrity sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ== + dependencies: + "@babel/compat-data" "^7.23.5" + "@babel/helper-validator-option" "^7.23.5" + browserslist "^4.22.2" + lru-cache "^5.1.1" + semver "^6.3.1" + "@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.20.5", "@babel/helper-create-class-features-plugin@^7.20.7": version "7.20.12" resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.20.12.tgz#4349b928e79be05ed2d1643b20b99bb87c503819" @@ -131,6 +194,11 @@ resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz#0c0cee9b35d2ca190478756865bb3528422f51be" integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg== +"@babel/helper-environment-visitor@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167" + integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA== + "@babel/helper-explode-assignable-expression@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz#41f8228ef0a6f1a036b8dfdfec7ce94f9a6bc096" @@ -146,6 +214,14 @@ "@babel/template" "^7.18.10" "@babel/types" "^7.19.0" +"@babel/helper-function-name@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz#1f9a3cdbd5b2698a670c30d2735f9af95ed52759" + integrity sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw== + dependencies: + "@babel/template" "^7.22.15" + "@babel/types" "^7.23.0" + "@babel/helper-hoist-variables@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz#d4d2c8fb4baeaa5c68b99cc8245c56554f926678" @@ -153,6 +229,13 @@ dependencies: "@babel/types" "^7.18.6" +"@babel/helper-hoist-variables@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb" + integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== + dependencies: + "@babel/types" "^7.22.5" + "@babel/helper-member-expression-to-functions@^7.20.7": version "7.20.7" resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.20.7.tgz#a6f26e919582275a93c3aa6594756d71b0bb7f05" @@ -167,6 +250,13 @@ dependencies: "@babel/types" "^7.18.6" +"@babel/helper-module-imports@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz#16146307acdc40cc00c3b2c647713076464bdbf0" + integrity sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w== + dependencies: + "@babel/types" "^7.22.15" + "@babel/helper-module-transforms@^7.18.6", "@babel/helper-module-transforms@^7.20.11": version "7.20.11" resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.20.11.tgz#df4c7af713c557938c50ea3ad0117a7944b2f1b0" @@ -181,6 +271,17 @@ "@babel/traverse" "^7.20.10" "@babel/types" "^7.20.7" +"@babel/helper-module-transforms@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz#d7d12c3c5d30af5b3c0fcab2a6d5217773e2d0f1" + integrity sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ== + dependencies: + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-module-imports" "^7.22.15" + "@babel/helper-simple-access" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/helper-validator-identifier" "^7.22.20" + "@babel/helper-optimise-call-expression@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz#9369aa943ee7da47edab2cb4e838acf09d290ffe" @@ -193,6 +294,11 @@ resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz#d1b9000752b18d0877cff85a5c376ce5c3121629" integrity sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ== +"@babel/helper-plugin-utils@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz#dd7ee3735e8a313b9f7b05a773d892e88e6d7295" + integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg== + "@babel/helper-remap-async-to-generator@^7.18.9": version "7.18.9" resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz#997458a0e3357080e54e1d79ec347f8a8cd28519" @@ -222,6 +328,13 @@ dependencies: "@babel/types" "^7.20.2" +"@babel/helper-simple-access@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz#4938357dc7d782b80ed6dbb03a0fba3d22b1d5de" + integrity sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w== + dependencies: + "@babel/types" "^7.22.5" + "@babel/helper-skip-transparent-expression-wrappers@^7.20.0": version "7.20.0" resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz#fbe4c52f60518cab8140d77101f0e63a8a230684" @@ -236,11 +349,23 @@ dependencies: "@babel/types" "^7.18.6" +"@babel/helper-split-export-declaration@^7.22.6": + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz#322c61b7310c0997fe4c323955667f18fcefb91c" + integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g== + dependencies: + "@babel/types" "^7.22.5" + "@babel/helper-string-parser@^7.19.4": version "7.19.4" resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz#38d3acb654b4701a9b77fb0615a96f775c3a9e63" integrity sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw== +"@babel/helper-string-parser@^7.23.4": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz#9478c707febcbbe1ddb38a3d91a2e054ae622d83" + integrity sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ== + "@babel/helper-validator-identifier@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz#d0f0e277c512e0c938277faa85a3968c9a44c0e8" @@ -251,11 +376,21 @@ resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2" integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== +"@babel/helper-validator-identifier@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0" + integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== + "@babel/helper-validator-option@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz#bf0d2b5a509b1f336099e4ff36e1a63aa5db4db8" integrity sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw== +"@babel/helper-validator-option@^7.23.5": + version "7.23.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz#907a3fbd4523426285365d1206c423c4c5520307" + integrity sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw== + "@babel/helper-wrap-function@^7.18.9": version "7.20.5" resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz#75e2d84d499a0ab3b31c33bcfe59d6b8a45f62e3" @@ -275,6 +410,15 @@ "@babel/traverse" "^7.20.13" "@babel/types" "^7.20.7" +"@babel/helpers@^7.23.7": + version "7.23.8" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.23.8.tgz#fc6b2d65b16847fd50adddbd4232c76378959e34" + integrity sha512-KDqYz4PiOWvDFrdHLPhKtCThtIcKVy6avWD2oG4GEvyQ+XDZwHD4YQd+H2vNMnq2rkdxsDkU82T+Vk8U/WXHRQ== + dependencies: + "@babel/template" "^7.22.15" + "@babel/traverse" "^7.23.7" + "@babel/types" "^7.23.6" + "@babel/highlight@^7.10.4", "@babel/highlight@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.14.5.tgz#6861a52f03966405001f6aa534a01a24d99e8cd9" @@ -293,6 +437,20 @@ chalk "^2.0.0" js-tokens "^4.0.0" +"@babel/highlight@^7.23.4": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.23.4.tgz#edaadf4d8232e1a961432db785091207ead0621b" + integrity sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A== + dependencies: + "@babel/helper-validator-identifier" "^7.22.20" + chalk "^2.4.2" + js-tokens "^4.0.0" + +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.22.15", "@babel/parser@^7.23.6": + version "7.23.6" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.6.tgz#ba1c9e512bda72a47e285ae42aff9d2a635a9e3b" + integrity sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ== + "@babel/parser@^7.20.13", "@babel/parser@^7.20.7": version "7.20.13" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.20.13.tgz#ddf1eb5a813588d2fb1692b70c6fce75b945c088" @@ -450,7 +608,14 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-class-properties@^7.12.13": +"@babel/plugin-syntax-bigint@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz#4c9a6f669f5d0cdf1b90a1671e9a146be5300cea" + integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-class-properties@^7.12.13", "@babel/plugin-syntax-class-properties@^7.8.3": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== @@ -485,6 +650,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.19.0" +"@babel/plugin-syntax-import-meta@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" + integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-json-strings@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" @@ -492,7 +664,14 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-logical-assignment-operators@^7.10.4": +"@babel/plugin-syntax-jsx@^7.7.2": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz#8f2e4f8a9b5f9aa16067e142c1ac9cd9f810f473" + integrity sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-syntax-logical-assignment-operators@^7.10.4", "@babel/plugin-syntax-logical-assignment-operators@^7.8.3": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== @@ -506,7 +685,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-numeric-separator@^7.10.4": +"@babel/plugin-syntax-numeric-separator@^7.10.4", "@babel/plugin-syntax-numeric-separator@^7.8.3": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== @@ -541,13 +720,20 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-syntax-top-level-await@^7.14.5": +"@babel/plugin-syntax-top-level-await@^7.14.5", "@babel/plugin-syntax-top-level-await@^7.8.3": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== dependencies: "@babel/helper-plugin-utils" "^7.14.5" +"@babel/plugin-syntax-typescript@^7.7.2": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.23.3.tgz#24f460c85dbbc983cd2b9c4994178bcc01df958f" + integrity sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-transform-arrow-functions@^7.18.6": version "7.20.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.20.7.tgz#bea332b0e8b2dab3dafe55a163d8227531ab0551" @@ -907,6 +1093,15 @@ "@babel/parser" "^7.20.7" "@babel/types" "^7.20.7" +"@babel/template@^7.22.15", "@babel/template@^7.3.3": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.15.tgz#09576efc3830f0430f4548ef971dde1350ef2f38" + integrity sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w== + dependencies: + "@babel/code-frame" "^7.22.13" + "@babel/parser" "^7.22.15" + "@babel/types" "^7.22.15" + "@babel/traverse@^7.20.10", "@babel/traverse@^7.20.12", "@babel/traverse@^7.20.13", "@babel/traverse@^7.20.5", "@babel/traverse@^7.20.7": version "7.20.13" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.20.13.tgz#817c1ba13d11accca89478bd5481b2d168d07473" @@ -923,6 +1118,31 @@ debug "^4.1.0" globals "^11.1.0" +"@babel/traverse@^7.23.7": + version "7.23.7" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.7.tgz#9a7bf285c928cb99b5ead19c3b1ce5b310c9c305" + integrity sha512-tY3mM8rH9jM0YHFGyfC0/xf+SB5eKUu7HPj7/k3fpi9dAlsMc5YbQvDi0Sh2QTPXqMhyaAtzAr807TIyfQrmyg== + dependencies: + "@babel/code-frame" "^7.23.5" + "@babel/generator" "^7.23.6" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-function-name" "^7.23.0" + "@babel/helper-hoist-variables" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/parser" "^7.23.6" + "@babel/types" "^7.23.6" + debug "^4.3.1" + globals "^11.1.0" + +"@babel/types@^7.0.0", "@babel/types@^7.22.15", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.23.6", "@babel/types@^7.3.3": + version "7.23.6" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.6.tgz#be33fdb151e1f5a56877d704492c240fc71c7ccd" + integrity sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg== + dependencies: + "@babel/helper-string-parser" "^7.23.4" + "@babel/helper-validator-identifier" "^7.22.20" + to-fast-properties "^2.0.0" + "@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.19.0", "@babel/types@^7.20.0", "@babel/types@^7.20.2", "@babel/types@^7.20.5", "@babel/types@^7.20.7", "@babel/types@^7.4.4": version "7.20.7" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.20.7.tgz#54ec75e252318423fc07fb644dc6a58a64c09b7f" @@ -932,6 +1152,18 @@ "@babel/helper-validator-identifier" "^7.19.1" to-fast-properties "^2.0.0" +"@bcoe/v8-coverage@^0.2.3": + version "0.2.3" + resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" + integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== + +"@cspotcode/source-map-support@^0.8.0": + version "0.8.1" + resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" + integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== + dependencies: + "@jridgewell/trace-mapping" "0.3.9" + "@eslint/eslintrc@^0.4.3": version "0.4.3" resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.3.tgz#9e42981ef035beb3dd49add17acb96e8ff6f394c" @@ -961,6 +1193,232 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz#87de7af9c231826fdd68ac7258f77c429e0e5fcf" integrity sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w== +"@istanbuljs/load-nyc-config@^1.0.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" + integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== + dependencies: + camelcase "^5.3.1" + find-up "^4.1.0" + get-package-type "^0.1.0" + js-yaml "^3.13.1" + resolve-from "^5.0.0" + +"@istanbuljs/schema@^0.1.2": + version "0.1.3" + resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" + integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== + +"@jest/console@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-29.7.0.tgz#cd4822dbdb84529265c5a2bdb529a3c9cc950ffc" + integrity sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg== + dependencies: + "@jest/types" "^29.6.3" + "@types/node" "*" + chalk "^4.0.0" + jest-message-util "^29.7.0" + jest-util "^29.7.0" + slash "^3.0.0" + +"@jest/core@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/core/-/core-29.7.0.tgz#b6cccc239f30ff36609658c5a5e2291757ce448f" + integrity sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg== + dependencies: + "@jest/console" "^29.7.0" + "@jest/reporters" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + ci-info "^3.2.0" + exit "^0.1.2" + graceful-fs "^4.2.9" + jest-changed-files "^29.7.0" + jest-config "^29.7.0" + jest-haste-map "^29.7.0" + jest-message-util "^29.7.0" + jest-regex-util "^29.6.3" + jest-resolve "^29.7.0" + jest-resolve-dependencies "^29.7.0" + jest-runner "^29.7.0" + jest-runtime "^29.7.0" + jest-snapshot "^29.7.0" + jest-util "^29.7.0" + jest-validate "^29.7.0" + jest-watcher "^29.7.0" + micromatch "^4.0.4" + pretty-format "^29.7.0" + slash "^3.0.0" + strip-ansi "^6.0.0" + +"@jest/create-cache-key-function@^27.4.2": + version "27.5.1" + resolved "https://registry.yarnpkg.com/@jest/create-cache-key-function/-/create-cache-key-function-27.5.1.tgz#7448fae15602ea95c828f5eceed35c202a820b31" + integrity sha512-dmH1yW+makpTSURTy8VzdUwFnfQh1G8R+DxO2Ho2FFmBbKFEVm+3jWdvFhE2VqB/LATCTokkP0dotjyQyw5/AQ== + dependencies: + "@jest/types" "^27.5.1" + +"@jest/environment@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-29.7.0.tgz#24d61f54ff1f786f3cd4073b4b94416383baf2a7" + integrity sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw== + dependencies: + "@jest/fake-timers" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + jest-mock "^29.7.0" + +"@jest/expect-utils@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.7.0.tgz#023efe5d26a8a70f21677d0a1afc0f0a44e3a1c6" + integrity sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA== + dependencies: + jest-get-type "^29.6.3" + +"@jest/expect@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-29.7.0.tgz#76a3edb0cb753b70dfbfe23283510d3d45432bf2" + integrity sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ== + dependencies: + expect "^29.7.0" + jest-snapshot "^29.7.0" + +"@jest/fake-timers@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-29.7.0.tgz#fd91bf1fffb16d7d0d24a426ab1a47a49881a565" + integrity sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ== + dependencies: + "@jest/types" "^29.6.3" + "@sinonjs/fake-timers" "^10.0.2" + "@types/node" "*" + jest-message-util "^29.7.0" + jest-mock "^29.7.0" + jest-util "^29.7.0" + +"@jest/globals@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-29.7.0.tgz#8d9290f9ec47ff772607fa864ca1d5a2efae1d4d" + integrity sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ== + dependencies: + "@jest/environment" "^29.7.0" + "@jest/expect" "^29.7.0" + "@jest/types" "^29.6.3" + jest-mock "^29.7.0" + +"@jest/reporters@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-29.7.0.tgz#04b262ecb3b8faa83b0b3d321623972393e8f4c7" + integrity sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg== + dependencies: + "@bcoe/v8-coverage" "^0.2.3" + "@jest/console" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" + "@jridgewell/trace-mapping" "^0.3.18" + "@types/node" "*" + chalk "^4.0.0" + collect-v8-coverage "^1.0.0" + exit "^0.1.2" + glob "^7.1.3" + graceful-fs "^4.2.9" + istanbul-lib-coverage "^3.0.0" + istanbul-lib-instrument "^6.0.0" + istanbul-lib-report "^3.0.0" + istanbul-lib-source-maps "^4.0.0" + istanbul-reports "^3.1.3" + jest-message-util "^29.7.0" + jest-util "^29.7.0" + jest-worker "^29.7.0" + slash "^3.0.0" + string-length "^4.0.1" + strip-ansi "^6.0.0" + v8-to-istanbul "^9.0.1" + +"@jest/schemas@^29.6.3": + version "29.6.3" + resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.6.3.tgz#430b5ce8a4e0044a7e3819663305a7b3091c8e03" + integrity sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA== + dependencies: + "@sinclair/typebox" "^0.27.8" + +"@jest/source-map@^29.6.3": + version "29.6.3" + resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-29.6.3.tgz#d90ba772095cf37a34a5eb9413f1b562a08554c4" + integrity sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw== + dependencies: + "@jridgewell/trace-mapping" "^0.3.18" + callsites "^3.0.0" + graceful-fs "^4.2.9" + +"@jest/test-result@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-29.7.0.tgz#8db9a80aa1a097bb2262572686734baed9b1657c" + integrity sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA== + dependencies: + "@jest/console" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/istanbul-lib-coverage" "^2.0.0" + collect-v8-coverage "^1.0.0" + +"@jest/test-sequencer@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz#6cef977ce1d39834a3aea887a1726628a6f072ce" + integrity sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw== + dependencies: + "@jest/test-result" "^29.7.0" + graceful-fs "^4.2.9" + jest-haste-map "^29.7.0" + slash "^3.0.0" + +"@jest/transform@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-29.7.0.tgz#df2dd9c346c7d7768b8a06639994640c642e284c" + integrity sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw== + dependencies: + "@babel/core" "^7.11.6" + "@jest/types" "^29.6.3" + "@jridgewell/trace-mapping" "^0.3.18" + babel-plugin-istanbul "^6.1.1" + chalk "^4.0.0" + convert-source-map "^2.0.0" + fast-json-stable-stringify "^2.1.0" + graceful-fs "^4.2.9" + jest-haste-map "^29.7.0" + jest-regex-util "^29.6.3" + jest-util "^29.7.0" + micromatch "^4.0.4" + pirates "^4.0.4" + slash "^3.0.0" + write-file-atomic "^4.0.2" + +"@jest/types@^27.5.1": + version "27.5.1" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-27.5.1.tgz#3c79ec4a8ba61c170bf937bcf9e98a9df175ec80" + integrity sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw== + dependencies: + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^16.0.0" + chalk "^4.0.0" + +"@jest/types@^29.6.3": + version "29.6.3" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.6.3.tgz#1131f8cf634e7e84c5e77bab12f052af585fba59" + integrity sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw== + dependencies: + "@jest/schemas" "^29.6.3" + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^17.0.8" + chalk "^4.0.0" + "@jridgewell/gen-mapping@^0.1.0": version "0.1.1" resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz#e5d2e450306a9491e3bd77e323e38d7aff315996" @@ -983,6 +1441,11 @@ resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== +"@jridgewell/resolve-uri@^3.0.3", "@jridgewell/resolve-uri@^3.1.0": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721" + integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== + "@jridgewell/set-array@^1.0.0", "@jridgewell/set-array@^1.0.1": version "1.1.2" resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" @@ -1001,6 +1464,27 @@ resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== +"@jridgewell/sourcemap-codec@^1.4.14": + version "1.4.15" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" + integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== + +"@jridgewell/trace-mapping@0.3.9": + version "0.3.9" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" + integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== + dependencies: + "@jridgewell/resolve-uri" "^3.0.3" + "@jridgewell/sourcemap-codec" "^1.4.10" + +"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.18": + version "0.3.20" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz#72e45707cf240fa6b081d0366f8265b0cd10197f" + integrity sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q== + dependencies: + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" + "@jridgewell/trace-mapping@^0.3.9": version "0.3.17" resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz#793041277af9073b0951a7fe0f0d8c4c98c36985" @@ -1095,16 +1579,230 @@ estree-walker "^2.0.2" picomatch "^2.3.1" +"@sinclair/typebox@^0.27.8": + version "0.27.8" + resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.27.8.tgz#6667fac16c436b5434a387a34dedb013198f6e6e" + integrity sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA== + +"@sinonjs/commons@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-3.0.0.tgz#beb434fe875d965265e04722ccfc21df7f755d72" + integrity sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA== + dependencies: + type-detect "4.0.8" + +"@sinonjs/fake-timers@^10.0.2": + version "10.3.0" + resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz#55fdff1ecab9f354019129daf4df0dd4d923ea66" + integrity sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA== + dependencies: + "@sinonjs/commons" "^3.0.0" + +"@swc/core-darwin-arm64@1.3.102": + version "1.3.102" + resolved "https://registry.yarnpkg.com/@swc/core-darwin-arm64/-/core-darwin-arm64-1.3.102.tgz#2bbd90a8751e6eee981f857ec3f0b6233208da37" + integrity sha512-CJDxA5Wd2cUMULj3bjx4GEoiYyyiyL8oIOu4Nhrs9X+tlg8DnkCm4nI57RJGP8Mf6BaXPIJkHX8yjcefK2RlDA== + +"@swc/core-darwin-x64@1.3.102": + version "1.3.102" + resolved "https://registry.yarnpkg.com/@swc/core-darwin-x64/-/core-darwin-x64-1.3.102.tgz#df16d51f45771d3c9cca8554b28a3190cdb075cf" + integrity sha512-X5akDkHwk6oAer49oER0qZMjNMkLH3IOZaV1m98uXIasAGyjo5WH1MKPeMLY1sY6V6TrufzwiSwD4ds571ytcg== + +"@swc/core-linux-arm-gnueabihf@1.3.102": + version "1.3.102" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.3.102.tgz#eb71697590c56ea261fa9a4b198c45304c7ece39" + integrity sha512-kJH3XtZP9YQdjq/wYVBeFuiVQl4HaC4WwRrIxAHwe2OyvrwUI43dpW3LpxSggBnxXcVCXYWf36sTnv8S75o2Gw== + +"@swc/core-linux-arm64-gnu@1.3.102": + version "1.3.102" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.3.102.tgz#75d72d5253d56723fa7054e1a8f313bf3d17b1a2" + integrity sha512-flQP2WDyCgO24WmKA1wjjTx+xfCmavUete2Kp6yrM+631IHLGnr17eu7rYJ/d4EnDBId/ytMyrnWbTVkaVrpbQ== + +"@swc/core-linux-arm64-musl@1.3.102": + version "1.3.102" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.3.102.tgz#7db86022fec57c1e06c573d45cef5e911bcc420e" + integrity sha512-bQEQSnC44DyoIGLw1+fNXKVGoCHi7eJOHr8BdH0y1ooy9ArskMjwobBFae3GX4T1AfnrTaejyr0FvLYIb0Zkog== + +"@swc/core-linux-x64-gnu@1.3.102": + version "1.3.102" + resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.3.102.tgz#298a25aa854924bedc7e4b69da52da19f84fc7a8" + integrity sha512-dFvnhpI478svQSxqISMt00MKTDS0e4YtIr+ioZDG/uJ/q+RpcNy3QI2KMm05Fsc8Y0d4krVtvCKWgfUMsJZXAg== + +"@swc/core-linux-x64-musl@1.3.102": + version "1.3.102" + resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.3.102.tgz#1bcd911aaa88b96f3bb665b0fd84ef4d21adf886" + integrity sha512-+a0M3CvjeIRNA/jTCzWEDh2V+mhKGvLreHOL7J97oULZy5yg4gf7h8lQX9J8t9QLbf6fsk+0F8bVH1Ie/PbXjA== + +"@swc/core-win32-arm64-msvc@1.3.102": + version "1.3.102" + resolved "https://registry.yarnpkg.com/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.3.102.tgz#59084786364d03fa4a120bdd589a557a00caedeb" + integrity sha512-w76JWLjkZNOfkB25nqdWUNCbt0zJ41CnWrJPZ+LxEai3zAnb2YtgB/cCIrwxDebRuMgE9EJXRj7gDDaTEAMOOQ== + +"@swc/core-win32-ia32-msvc@1.3.102": + version "1.3.102" + resolved "https://registry.yarnpkg.com/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.3.102.tgz#27954889d940a63796d58ff7753f5f27ed381a1f" + integrity sha512-vlDb09HiGqKwz+2cxDS9T5/461ipUQBplvuhW+cCbzzGuPq8lll2xeyZU0N1E4Sz3MVdSPx1tJREuRvlQjrwNg== + +"@swc/core-win32-x64-msvc@1.3.102": + version "1.3.102" + resolved "https://registry.yarnpkg.com/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.3.102.tgz#477da542e6b01b3eb64476ec9a78f497a9b87807" + integrity sha512-E/jfSD7sShllxBwwgDPeXp1UxvIqehj/ShSUqq1pjR/IDRXngcRSXKJK92mJkNFY7suH6BcCWwzrxZgkO7sWmw== + +"@swc/core@^1.3.102": + version "1.3.102" + resolved "https://registry.yarnpkg.com/@swc/core/-/core-1.3.102.tgz#870874bcf1d78cd7bb1bc66b31bf2b1a87c1a667" + integrity sha512-OAjNLY/f6QWKSDzaM3bk31A+OYHu6cPa9P/rFIx8X5d24tHXUpRiiq6/PYI6SQRjUPlB72GjsjoEU8F+ALadHg== + dependencies: + "@swc/counter" "^0.1.1" + "@swc/types" "^0.1.5" + optionalDependencies: + "@swc/core-darwin-arm64" "1.3.102" + "@swc/core-darwin-x64" "1.3.102" + "@swc/core-linux-arm-gnueabihf" "1.3.102" + "@swc/core-linux-arm64-gnu" "1.3.102" + "@swc/core-linux-arm64-musl" "1.3.102" + "@swc/core-linux-x64-gnu" "1.3.102" + "@swc/core-linux-x64-musl" "1.3.102" + "@swc/core-win32-arm64-msvc" "1.3.102" + "@swc/core-win32-ia32-msvc" "1.3.102" + "@swc/core-win32-x64-msvc" "1.3.102" + +"@swc/counter@^0.1.1": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@swc/counter/-/counter-0.1.2.tgz#bf06d0770e47c6f1102270b744e17b934586985e" + integrity sha512-9F4ys4C74eSTEUNndnER3VJ15oru2NumfQxS8geE+f3eB5xvfxpWyqE5XlVnxb/R14uoXi6SLbBwwiDSkv+XEw== + +"@swc/jest@^0.2.29": + version "0.2.29" + resolved "https://registry.yarnpkg.com/@swc/jest/-/jest-0.2.29.tgz#b27d647ec430c909f9bb567d1df2a47eaa3841f4" + integrity sha512-8reh5RvHBsSikDC3WGCd5ZTd2BXKkyOdK7QwynrCH58jk2cQFhhHhFBg/jvnWZehUQe/EoOImLENc9/DwbBFow== + dependencies: + "@jest/create-cache-key-function" "^27.4.2" + jsonc-parser "^3.2.0" + +"@swc/types@^0.1.5": + version "0.1.5" + resolved "https://registry.yarnpkg.com/@swc/types/-/types-0.1.5.tgz#043b731d4f56a79b4897a3de1af35e75d56bc63a" + integrity sha512-myfUej5naTBWnqOCc/MdVOLVjXUXtIA+NpDrDBKJtLLg2shUjBu3cZmB/85RyitKc55+lUUyl7oRfLOvkr2hsw== + +"@tootallnate/once@2": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-2.0.0.tgz#f544a148d3ab35801c1f633a7441fd87c2e484bf" + integrity sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A== + +"@tsconfig/node10@^1.0.7": + version "1.0.9" + resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.9.tgz#df4907fc07a886922637b15e02d4cebc4c0021b2" + integrity sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA== + +"@tsconfig/node12@^1.0.7": + version "1.0.11" + resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" + integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== + +"@tsconfig/node14@^1.0.0": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" + integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== + +"@tsconfig/node16@^1.0.2": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.4.tgz#0b92dcc0cc1c81f6f306a381f28e31b1a56536e9" + integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== + +"@types/babel__core@^7.1.14": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.5.tgz#3df15f27ba85319caa07ba08d0721889bb39c017" + integrity sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA== + dependencies: + "@babel/parser" "^7.20.7" + "@babel/types" "^7.20.7" + "@types/babel__generator" "*" + "@types/babel__template" "*" + "@types/babel__traverse" "*" + +"@types/babel__generator@*": + version "7.6.8" + resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.8.tgz#f836c61f48b1346e7d2b0d93c6dacc5b9535d3ab" + integrity sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw== + dependencies: + "@babel/types" "^7.0.0" + +"@types/babel__template@*": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.4.tgz#5672513701c1b2199bc6dad636a9d7491586766f" + integrity sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A== + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + +"@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.5.tgz#7b7502be0aa80cc4ef22978846b983edaafcd4dd" + integrity sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ== + dependencies: + "@babel/types" "^7.20.7" + "@types/estree@*", "@types/estree@^1.0.0": version "1.0.0" resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.0.tgz#5fb2e536c1ae9bf35366eed879e827fa59ca41c2" integrity sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ== +"@types/graceful-fs@^4.1.3": + version "4.1.9" + resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.9.tgz#2a06bc0f68a20ab37b3e36aa238be6abdf49e8b4" + integrity sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ== + dependencies: + "@types/node" "*" + +"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": + version "2.0.6" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz#7739c232a1fee9b4d3ce8985f314c0c6d33549d7" + integrity sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w== + +"@types/istanbul-lib-report@*": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz#53047614ae72e19fc0401d872de3ae2b4ce350bf" + integrity sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA== + dependencies: + "@types/istanbul-lib-coverage" "*" + +"@types/istanbul-reports@^3.0.0": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz#0f03e3d2f670fbdac586e34b433783070cc16f54" + integrity sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ== + dependencies: + "@types/istanbul-lib-report" "*" + +"@types/jest@^29.5.11": + version "29.5.11" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.5.11.tgz#0c13aa0da7d0929f078ab080ae5d4ced80fa2f2c" + integrity sha512-S2mHmYIVe13vrm6q4kN6fLYYAka15ALQki/vgDC3mIukEOx8WJlv0kQPM+d4w8Gp6u0uSdKND04IlTXBv0rwnQ== + dependencies: + expect "^29.0.0" + pretty-format "^29.0.0" + +"@types/jsdom@^20.0.0": + version "20.0.1" + resolved "https://registry.yarnpkg.com/@types/jsdom/-/jsdom-20.0.1.tgz#07c14bc19bd2f918c1929541cdaacae894744808" + integrity sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ== + dependencies: + "@types/node" "*" + "@types/tough-cookie" "*" + parse5 "^7.0.0" + "@types/json-schema@^7.0.7": version "7.0.8" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.8.tgz#edf1bf1dbf4e04413ca8e5b17b3b7d7d54b59818" integrity sha512-YSBPTLTVm2e2OoQIDYx8HaeWJ5tTToLH67kXR7zYNGupXMEHa2++G8k+DczX2cFVgalypqtyZIcU19AFcmOpmg== +"@types/node@*": + version "20.11.0" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.11.0.tgz#8e0b99e70c0c1ade1a86c4a282f7b7ef87c9552f" + integrity sha512-o9bjXmDNcF7GbM4CNQpmi+TutCgap/K3w1JyKgxAjqx41zp9qlIAVFi0IhCNsJcXolEqLWhbFbEeL0PvYm4pcQ== + dependencies: + undici-types "~5.26.4" + "@types/node@^16.4.0": version "16.4.0" resolved "https://registry.yarnpkg.com/@types/node/-/node-16.4.0.tgz#2c219eaa3b8d1e4d04f4dd6e40bc68c7467d5272" @@ -1139,6 +1837,35 @@ resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.2.tgz#1a62f89525723dde24ba1b01b092bf5df8ad4d39" integrity sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew== +"@types/stack-utils@^2.0.0": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.3.tgz#6209321eb2c1712a7e7466422b8cb1fc0d9dd5d8" + integrity sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw== + +"@types/tough-cookie@*": + version "4.0.5" + resolved "https://registry.yarnpkg.com/@types/tough-cookie/-/tough-cookie-4.0.5.tgz#cb6e2a691b70cb177c6e3ae9c1d2e8b2ea8cd304" + integrity sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA== + +"@types/yargs-parser@*": + version "21.0.3" + resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.3.tgz#815e30b786d2e8f0dcd85fd5bcf5e1a04d008f15" + integrity sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ== + +"@types/yargs@^16.0.0": + version "16.0.9" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-16.0.9.tgz#ba506215e45f7707e6cbcaf386981155b7ab956e" + integrity sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA== + dependencies: + "@types/yargs-parser" "*" + +"@types/yargs@^17.0.8": + version "17.0.32" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.32.tgz#030774723a2f7faafebf645f4e5a48371dca6229" + integrity sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog== + dependencies: + "@types/yargs-parser" "*" + "@typescript-eslint/eslint-plugin@^4.13.0": version "4.28.4" resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.28.4.tgz#e73c8cabbf3f08dee0e1bda65ed4e622ae8f8921" @@ -1213,21 +1940,51 @@ resolved "https://registry.yarnpkg.com/@vkontakte/vk-bridge/-/vk-bridge-2.7.2.tgz#284380d3d5f54774741e6a2e67cce9fbe62e2072" integrity sha512-m/cgWEbd4Xi49xyS0tn14h3b8fLTG3Vw/wNo72k5sw5ILf8SFzB1CAyruc7kKBE6Xc8ibyIydVx1YkHwW1O0PA== +abab@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291" + integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== + +acorn-globals@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-7.0.1.tgz#0dbf05c44fa7c94332914c02066d5beff62c40c3" + integrity sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q== + dependencies: + acorn "^8.1.0" + acorn-walk "^8.0.2" + acorn-jsx@^5.3.1: version "5.3.2" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== +acorn-walk@^8.0.2, acorn-walk@^8.1.1: + version "8.3.1" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.1.tgz#2f10f5b69329d90ae18c58bf1fa8fccd8b959a43" + integrity sha512-TgUZgYvqZprrl7YldZNoa9OciCAyZR+Ejm9eXzKCmjsF5IKp/wgQ7Z/ZpjpGTIUPwrHQIcYeI8qDh4PsEwxMbw== + acorn@^7.4.0: version "7.4.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== +acorn@^8.1.0, acorn@^8.4.1, acorn@^8.8.1: + version "8.11.3" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a" + integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== + acorn@^8.5.0: version "8.8.2" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.2.tgz#1b2f25db02af965399b9776b0c2c391276d37c4a" integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== +agent-base@6: + version "6.0.2" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" + integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== + dependencies: + debug "4" + aggregate-error@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" @@ -1261,7 +2018,7 @@ ansi-colors@^4.1.1: resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== -ansi-escapes@^4.3.0: +ansi-escapes@^4.2.1, ansi-escapes@^4.3.0: version "4.3.2" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== @@ -1273,6 +2030,11 @@ ansi-regex@^5.0.0: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" @@ -1287,6 +2049,24 @@ ansi-styles@^4.0.0, ansi-styles@^4.1.0: dependencies: color-convert "^2.0.1" +ansi-styles@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" + integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== + +anymatch@^3.0.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +arg@^4.1.0: + version "4.1.3" + resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" + integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== + argparse@^1.0.7: version "1.0.10" resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" @@ -1334,6 +2114,11 @@ astral-regex@^2.0.0: resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== + axios@^0.24.0: version "0.24.0" resolved "https://registry.yarnpkg.com/axios/-/axios-0.24.0.tgz#804e6fa1e4b9c5288501dd9dff56a7a0940d20d6" @@ -1341,6 +2126,40 @@ axios@^0.24.0: dependencies: follow-redirects "^1.14.4" +babel-jest@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.7.0.tgz#f4369919225b684c56085998ac63dbd05be020d5" + integrity sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg== + dependencies: + "@jest/transform" "^29.7.0" + "@types/babel__core" "^7.1.14" + babel-plugin-istanbul "^6.1.1" + babel-preset-jest "^29.6.3" + chalk "^4.0.0" + graceful-fs "^4.2.9" + slash "^3.0.0" + +babel-plugin-istanbul@^6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73" + integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@istanbuljs/load-nyc-config" "^1.0.0" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-instrument "^5.0.4" + test-exclude "^6.0.0" + +babel-plugin-jest-hoist@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz#aadbe943464182a8922c3c927c3067ff40d24626" + integrity sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg== + dependencies: + "@babel/template" "^7.3.3" + "@babel/types" "^7.3.3" + "@types/babel__core" "^7.1.14" + "@types/babel__traverse" "^7.0.6" + babel-plugin-polyfill-corejs2@^0.3.3: version "0.3.3" resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz#5d1bd3836d0a19e1b84bbf2d9640ccb6f951c122" @@ -1365,6 +2184,32 @@ babel-plugin-polyfill-regenerator@^0.4.1: dependencies: "@babel/helper-define-polyfill-provider" "^0.3.3" +babel-preset-current-node-syntax@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz#b4399239b89b2a011f9ddbe3e4f401fc40cff73b" + integrity sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ== + dependencies: + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-syntax-bigint" "^7.8.3" + "@babel/plugin-syntax-class-properties" "^7.8.3" + "@babel/plugin-syntax-import-meta" "^7.8.3" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.8.3" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.8.3" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-syntax-top-level-await" "^7.8.3" + +babel-preset-jest@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz#fa05fa510e7d493896d7b0dd2033601c840f171c" + integrity sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA== + dependencies: + babel-plugin-jest-hoist "^29.6.3" + babel-preset-current-node-syntax "^1.0.0" + balanced-match@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" @@ -1402,6 +2247,23 @@ browserslist@^4.21.3, browserslist@^4.21.4: node-releases "^2.0.6" update-browserslist-db "^1.0.9" +browserslist@^4.22.2: + version "4.22.2" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.22.2.tgz#704c4943072bd81ea18997f3bd2180e89c77874b" + integrity sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A== + dependencies: + caniuse-lite "^1.0.30001565" + electron-to-chromium "^1.4.601" + node-releases "^2.0.14" + update-browserslist-db "^1.0.13" + +bser@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" + integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== + dependencies: + node-int64 "^0.4.0" + buffer-from@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" @@ -1425,12 +2287,27 @@ callsites@^3.0.0: resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== +camelcase@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + +camelcase@^6.2.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" + integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== + caniuse-lite@^1.0.30001400: version "1.0.30001448" resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001448.tgz#ca7550b1587c92a392a2b377cd9c508b3b4395bf" integrity sha512-tq2YI+MJnooG96XpbTRYkBxLxklZPOdLmNIOdIhvf7SNJan6u5vCKum8iT7ZfCt70m1GPkuC7P3TtX6UuhupuA== -chalk@^2.0.0: +caniuse-lite@^1.0.30001565: + version "1.0.30001576" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001576.tgz#893be772cf8ee6056d6c1e2d07df365b9ec0a5c4" + integrity sha512-ff5BdakGe2P3SQsMsiqmt1Lc8221NR1VzHj5jXN5vBny9A6fpze94HiVV/n7XRosOlsShJcvMv5mdnpjOGCEgg== + +chalk@^2.0.0, chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -1447,6 +2324,21 @@ chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.1: ansi-styles "^4.1.0" supports-color "^7.1.0" +char-regex@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" + integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== + +ci-info@^3.2.0: + version "3.9.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" + integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== + +cjs-module-lexer@^1.0.0: + version "1.2.3" + resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz#6c370ab19f8a3394e318fe682686ec0ac684d107" + integrity sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ== + clean-stack@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" @@ -1467,6 +2359,25 @@ cli-truncate@^2.1.0: slice-ansi "^3.0.0" string-width "^4.2.0" +cliui@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" + integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.1" + wrap-ansi "^7.0.0" + +co@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + integrity sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ== + +collect-v8-coverage@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz#c0b29bcd33bcd0779a1344c2136051e6afd3d9e9" + integrity sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q== + color-convert@^1.9.0: version "1.9.3" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" @@ -1496,6 +2407,13 @@ colorette@^1.2.2: resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.2.tgz#cbcc79d5e99caea2dbf10eb3a26fd8b3e6acfa94" integrity sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w== +combined-stream@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + commander@^2.20.0: version "2.20.3" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" @@ -1521,6 +2439,11 @@ convert-source-map@^1.7.0: resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== +convert-source-map@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" + integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== + core-js-compat@^3.25.1: version "3.27.2" resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.27.2.tgz#607c50ad6db8fd8326af0b2883ebb987be3786da" @@ -1539,6 +2462,24 @@ cosmiconfig@^7.0.0: path-type "^4.0.0" yaml "^1.10.0" +create-jest@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/create-jest/-/create-jest-29.7.0.tgz#a355c5b3cb1e1af02ba177fe7afd7feee49a5320" + integrity sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q== + dependencies: + "@jest/types" "^29.6.3" + chalk "^4.0.0" + exit "^0.1.2" + graceful-fs "^4.2.9" + jest-config "^29.7.0" + jest-util "^29.7.0" + prompts "^2.0.1" + +create-require@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" + integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== + cross-spawn@^7.0.2, cross-spawn@^7.0.3: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" @@ -1548,11 +2489,44 @@ cross-spawn@^7.0.2, cross-spawn@^7.0.3: shebang-command "^2.0.0" which "^2.0.1" +cssom@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.5.0.tgz#d254fa92cd8b6fbd83811b9fbaed34663cc17c36" + integrity sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw== + +cssom@~0.3.6: + version "0.3.8" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" + integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== + +cssstyle@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-2.3.0.tgz#ff665a0ddbdc31864b09647f34163443d90b0852" + integrity sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A== + dependencies: + cssom "~0.3.6" + csstype@^3.0.2: version "3.1.1" resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.1.tgz#841b532c45c758ee546a11d5bd7b7b473c8c30b9" integrity sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw== +data-urls@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-3.0.2.tgz#9cf24a477ae22bcef5cd5f6f0bfbc1d2d3be9143" + integrity sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ== + dependencies: + abab "^2.0.6" + whatwg-mimetype "^3.0.0" + whatwg-url "^11.0.0" + +debug@4, debug@^4.1.0: + version "4.3.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + debug@^2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" @@ -1574,18 +2548,21 @@ debug@^4.0.1, debug@^4.1.1, debug@^4.3.1: dependencies: ms "2.1.2" -debug@^4.1.0: - version "4.3.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== - dependencies: - ms "2.1.2" +decimal.js@^10.4.2: + version "10.4.3" + resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.4.3.tgz#1044092884d245d1b7f65725fa4ad4c6f781cc23" + integrity sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA== dedent@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" integrity sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw= +dedent@^1.0.0: + version "1.5.1" + resolved "https://registry.yarnpkg.com/dedent/-/dedent-1.5.1.tgz#4f3fc94c8b711e9bb2800d185cd6ad20f2a90aff" + integrity sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg== + deep-is@^0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" @@ -1603,6 +2580,26 @@ define-properties@^1.1.3: dependencies: object-keys "^1.0.12" +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== + +detect-newline@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" + integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== + +diff-sequences@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.6.3.tgz#4deaf894d11407c51efc8418012f9e70b84ea921" + integrity sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q== + +diff@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" + integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== + dir-glob@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" @@ -1624,11 +2621,28 @@ doctrine@^3.0.0: dependencies: esutils "^2.0.2" -electron-to-chromium@^1.4.251: - version "1.4.284" +domexception@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/domexception/-/domexception-4.0.0.tgz#4ad1be56ccadc86fc76d033353999a8037d03673" + integrity sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw== + dependencies: + webidl-conversions "^7.0.0" + +electron-to-chromium@^1.4.251: + version "1.4.284" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz#61046d1e4cab3a25238f6bf7413795270f125592" integrity sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA== +electron-to-chromium@^1.4.601: + version "1.4.628" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.628.tgz#97cefa4b2356d981875f19639885e4fc50ce6e82" + integrity sha512-2k7t5PHvLsufpP6Zwk0nof62yLOsCf032wZx7/q0mv8gwlXjhcxI3lz6f0jBr0GrnWKcm3burXzI3t5IrcdUxw== + +emittery@^0.13.1: + version "0.13.1" + resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.13.1.tgz#c04b8c3457490e0847ae51fced3af52d338e3dad" + integrity sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ== + emoji-regex@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" @@ -1641,6 +2655,11 @@ enquirer@^2.3.5, enquirer@^2.3.6: dependencies: ansi-colors "^4.1.1" +entities@^4.4.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" + integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== + error-ex@^1.3.1: version "1.3.2" resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" @@ -1689,11 +2708,27 @@ escape-string-regexp@^1.0.5: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= +escape-string-regexp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" + integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== + escape-string-regexp@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== +escodegen@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.1.0.tgz#ba93bbb7a43986d29d6041f99f5262da773e2e17" + integrity sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w== + dependencies: + esprima "^4.0.1" + estraverse "^5.2.0" + esutils "^2.0.2" + optionalDependencies: + source-map "~0.6.1" + eslint-config-prettier@^7.2.0: version "7.2.0" resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-7.2.0.tgz#f4a4bd2832e810e8cc7c1411ec85b3e85c0c53f9" @@ -1859,7 +2894,7 @@ espree@^7.3.0, espree@^7.3.1: acorn-jsx "^5.3.1" eslint-visitor-keys "^1.3.0" -esprima@^4.0.0: +esprima@^4.0.0, esprima@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== @@ -1913,6 +2948,22 @@ execa@^5.0.0: signal-exit "^3.0.3" strip-final-newline "^2.0.0" +exit@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" + integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== + +expect@^29.0.0, expect@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/expect/-/expect-29.7.0.tgz#578874590dcb3214514084c08115d8aee61e11bc" + integrity sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw== + dependencies: + "@jest/expect-utils" "^29.7.0" + jest-get-type "^29.6.3" + jest-matcher-utils "^29.7.0" + jest-message-util "^29.7.0" + jest-util "^29.7.0" + fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" @@ -1934,7 +2985,7 @@ fast-glob@^3.1.1: merge2 "^1.3.0" micromatch "^4.0.4" -fast-json-stable-stringify@^2.0.0: +fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== @@ -1951,6 +3002,13 @@ fastq@^1.6.0: dependencies: reusify "^1.0.4" +fb-watchman@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.2.tgz#e9524ee6b5c77e9e5001af0f85f3adbb8623255c" + integrity sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA== + dependencies: + bser "2.1.1" + file-entry-cache@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" @@ -1972,6 +3030,14 @@ find-up@^2.0.0, find-up@^2.1.0: dependencies: locate-path "^2.0.0" +find-up@^4.0.0, find-up@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + flat-cache@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" @@ -1990,11 +3056,25 @@ follow-redirects@^1.14.4: resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== +form-data@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" + integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= +fsevents@^2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== + fsevents@~2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" @@ -2015,6 +3095,11 @@ gensync@^1.0.0-beta.2: resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== +get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" @@ -2029,6 +3114,11 @@ get-own-enumerable-property-symbols@^3.0.0: resolved "https://registry.yarnpkg.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz#b5fde77f22cbe35f390b4e089922c50bce6ef664" integrity sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g== +get-package-type@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" + integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== + get-stream@^6.0.0: version "6.0.1" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" @@ -2053,6 +3143,18 @@ glob@^7.1.3, glob@^7.1.6: once "^1.3.0" path-is-absolute "^1.0.0" +glob@^7.1.4: + version "7.2.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + glob@^8.0.3: version "8.1.0" resolved "https://registry.yarnpkg.com/glob/-/glob-8.1.0.tgz#d388f656593ef708ee3e34640fdfb99a9fd1c33e" @@ -2093,6 +3195,11 @@ graceful-fs@^4.1.2: resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee" integrity sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ== +graceful-fs@^4.2.9: + version "4.2.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + has-bigints@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.1.tgz#64fe6acb020673e3b78db035a5af69aa9d07b113" @@ -2125,6 +3232,35 @@ hosted-git-info@^2.1.4: resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== +html-encoding-sniffer@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz#2cb1a8cf0db52414776e5b2a7a04d5dd98158de9" + integrity sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA== + dependencies: + whatwg-encoding "^2.0.0" + +html-escaper@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" + integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== + +http-proxy-agent@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz#5129800203520d434f142bc78ff3c170800f2b43" + integrity sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w== + dependencies: + "@tootallnate/once" "2" + agent-base "6" + debug "4" + +https-proxy-agent@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" + integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== + dependencies: + agent-base "6" + debug "4" + human-signals@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" @@ -2135,6 +3271,13 @@ husky@^7.0.1: resolved "https://registry.yarnpkg.com/husky/-/husky-7.0.1.tgz#579f4180b5da4520263e8713cc832942b48e1f1c" integrity sha512-gceRaITVZ+cJH9sNHqx5tFwbzlLCVxtVZcusME8JYQ8Edy5mpGDOqD8QBCdMhpyo9a+JXddnujQ4rpY2Ff9SJA== +iconv-lite@0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" + integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + ignore@^4.0.6: version "4.0.6" resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" @@ -2153,6 +3296,14 @@ import-fresh@^3.0.0, import-fresh@^3.2.1: parent-module "^1.0.0" resolve-from "^4.0.0" +import-local@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4" + integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== + dependencies: + pkg-dir "^4.2.0" + resolve-cwd "^3.0.0" + imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" @@ -2243,6 +3394,11 @@ is-fullwidth-code-point@^3.0.0: resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== +is-generator-fn@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" + integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== + is-glob@^4.0.0, is-glob@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" @@ -2275,6 +3431,11 @@ is-obj@^1.0.1: resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8= +is-potential-custom-element-name@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" + integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== + is-reference@1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/is-reference/-/is-reference-1.2.1.tgz#8b2dac0b371f4bc994fdeaba9eb542d03002d0b7" @@ -2322,6 +3483,431 @@ isexe@^2.0.0: resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= +istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz#2d166c4b0644d43a39f04bf6c2edd1e585f31756" + integrity sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg== + +istanbul-lib-instrument@^5.0.4: + version "5.2.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz#d10c8885c2125574e1c231cacadf955675e1ce3d" + integrity sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg== + dependencies: + "@babel/core" "^7.12.3" + "@babel/parser" "^7.14.7" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-coverage "^3.2.0" + semver "^6.3.0" + +istanbul-lib-instrument@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.1.tgz#71e87707e8041428732518c6fb5211761753fbdf" + integrity sha512-EAMEJBsYuyyztxMxW3g7ugGPkrZsV57v0Hmv3mm1uQsmB+QnZuepg731CRaIgeUVSdmsTngOkSnauNF8p7FIhA== + dependencies: + "@babel/core" "^7.12.3" + "@babel/parser" "^7.14.7" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-coverage "^3.2.0" + semver "^7.5.4" + +istanbul-lib-report@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz#908305bac9a5bd175ac6a74489eafd0fc2445a7d" + integrity sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw== + dependencies: + istanbul-lib-coverage "^3.0.0" + make-dir "^4.0.0" + supports-color "^7.1.0" + +istanbul-lib-source-maps@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz#895f3a709fcfba34c6de5a42939022f3e4358551" + integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw== + dependencies: + debug "^4.1.1" + istanbul-lib-coverage "^3.0.0" + source-map "^0.6.1" + +istanbul-reports@^3.1.3: + version "3.1.6" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.6.tgz#2544bcab4768154281a2f0870471902704ccaa1a" + integrity sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg== + dependencies: + html-escaper "^2.0.0" + istanbul-lib-report "^3.0.0" + +jest-changed-files@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-29.7.0.tgz#1c06d07e77c78e1585d020424dedc10d6e17ac3a" + integrity sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w== + dependencies: + execa "^5.0.0" + jest-util "^29.7.0" + p-limit "^3.1.0" + +jest-circus@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-29.7.0.tgz#b6817a45fcc835d8b16d5962d0c026473ee3668a" + integrity sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw== + dependencies: + "@jest/environment" "^29.7.0" + "@jest/expect" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + chalk "^4.0.0" + co "^4.6.0" + dedent "^1.0.0" + is-generator-fn "^2.0.0" + jest-each "^29.7.0" + jest-matcher-utils "^29.7.0" + jest-message-util "^29.7.0" + jest-runtime "^29.7.0" + jest-snapshot "^29.7.0" + jest-util "^29.7.0" + p-limit "^3.1.0" + pretty-format "^29.7.0" + pure-rand "^6.0.0" + slash "^3.0.0" + stack-utils "^2.0.3" + +jest-cli@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-29.7.0.tgz#5592c940798e0cae677eec169264f2d839a37995" + integrity sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg== + dependencies: + "@jest/core" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/types" "^29.6.3" + chalk "^4.0.0" + create-jest "^29.7.0" + exit "^0.1.2" + import-local "^3.0.2" + jest-config "^29.7.0" + jest-util "^29.7.0" + jest-validate "^29.7.0" + yargs "^17.3.1" + +jest-config@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-29.7.0.tgz#bcbda8806dbcc01b1e316a46bb74085a84b0245f" + integrity sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ== + dependencies: + "@babel/core" "^7.11.6" + "@jest/test-sequencer" "^29.7.0" + "@jest/types" "^29.6.3" + babel-jest "^29.7.0" + chalk "^4.0.0" + ci-info "^3.2.0" + deepmerge "^4.2.2" + glob "^7.1.3" + graceful-fs "^4.2.9" + jest-circus "^29.7.0" + jest-environment-node "^29.7.0" + jest-get-type "^29.6.3" + jest-regex-util "^29.6.3" + jest-resolve "^29.7.0" + jest-runner "^29.7.0" + jest-util "^29.7.0" + jest-validate "^29.7.0" + micromatch "^4.0.4" + parse-json "^5.2.0" + pretty-format "^29.7.0" + slash "^3.0.0" + strip-json-comments "^3.1.1" + +jest-diff@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.7.0.tgz#017934a66ebb7ecf6f205e84699be10afd70458a" + integrity sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw== + dependencies: + chalk "^4.0.0" + diff-sequences "^29.6.3" + jest-get-type "^29.6.3" + pretty-format "^29.7.0" + +jest-docblock@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-29.7.0.tgz#8fddb6adc3cdc955c93e2a87f61cfd350d5d119a" + integrity sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g== + dependencies: + detect-newline "^3.0.0" + +jest-each@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-29.7.0.tgz#162a9b3f2328bdd991beaabffbb74745e56577d1" + integrity sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ== + dependencies: + "@jest/types" "^29.6.3" + chalk "^4.0.0" + jest-get-type "^29.6.3" + jest-util "^29.7.0" + pretty-format "^29.7.0" + +jest-environment-jsdom@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-29.7.0.tgz#d206fa3551933c3fd519e5dfdb58a0f5139a837f" + integrity sha512-k9iQbsf9OyOfdzWH8HDmrRT0gSIcX+FLNW7IQq94tFX0gynPwqDTW0Ho6iMVNjGz/nb+l/vW3dWM2bbLLpkbXA== + dependencies: + "@jest/environment" "^29.7.0" + "@jest/fake-timers" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/jsdom" "^20.0.0" + "@types/node" "*" + jest-mock "^29.7.0" + jest-util "^29.7.0" + jsdom "^20.0.0" + +jest-environment-node@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-29.7.0.tgz#0b93e111dda8ec120bc8300e6d1fb9576e164376" + integrity sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw== + dependencies: + "@jest/environment" "^29.7.0" + "@jest/fake-timers" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + jest-mock "^29.7.0" + jest-util "^29.7.0" + +jest-get-type@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.6.3.tgz#36f499fdcea197c1045a127319c0481723908fd1" + integrity sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw== + +jest-haste-map@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-29.7.0.tgz#3c2396524482f5a0506376e6c858c3bbcc17b104" + integrity sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA== + dependencies: + "@jest/types" "^29.6.3" + "@types/graceful-fs" "^4.1.3" + "@types/node" "*" + anymatch "^3.0.3" + fb-watchman "^2.0.0" + graceful-fs "^4.2.9" + jest-regex-util "^29.6.3" + jest-util "^29.7.0" + jest-worker "^29.7.0" + micromatch "^4.0.4" + walker "^1.0.8" + optionalDependencies: + fsevents "^2.3.2" + +jest-leak-detector@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz#5b7ec0dadfdfec0ca383dc9aa016d36b5ea4c728" + integrity sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw== + dependencies: + jest-get-type "^29.6.3" + pretty-format "^29.7.0" + +jest-matcher-utils@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz#ae8fec79ff249fd592ce80e3ee474e83a6c44f12" + integrity sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g== + dependencies: + chalk "^4.0.0" + jest-diff "^29.7.0" + jest-get-type "^29.6.3" + pretty-format "^29.7.0" + +jest-message-util@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.7.0.tgz#8bc392e204e95dfe7564abbe72a404e28e51f7f3" + integrity sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w== + dependencies: + "@babel/code-frame" "^7.12.13" + "@jest/types" "^29.6.3" + "@types/stack-utils" "^2.0.0" + chalk "^4.0.0" + graceful-fs "^4.2.9" + micromatch "^4.0.4" + pretty-format "^29.7.0" + slash "^3.0.0" + stack-utils "^2.0.3" + +jest-mock@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-29.7.0.tgz#4e836cf60e99c6fcfabe9f99d017f3fdd50a6347" + integrity sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw== + dependencies: + "@jest/types" "^29.6.3" + "@types/node" "*" + jest-util "^29.7.0" + +jest-pnp-resolver@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz#930b1546164d4ad5937d5540e711d4d38d4cad2e" + integrity sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w== + +jest-regex-util@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-29.6.3.tgz#4a556d9c776af68e1c5f48194f4d0327d24e8a52" + integrity sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg== + +jest-resolve-dependencies@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz#1b04f2c095f37fc776ff40803dc92921b1e88428" + integrity sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA== + dependencies: + jest-regex-util "^29.6.3" + jest-snapshot "^29.7.0" + +jest-resolve@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-29.7.0.tgz#64d6a8992dd26f635ab0c01e5eef4399c6bcbc30" + integrity sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA== + dependencies: + chalk "^4.0.0" + graceful-fs "^4.2.9" + jest-haste-map "^29.7.0" + jest-pnp-resolver "^1.2.2" + jest-util "^29.7.0" + jest-validate "^29.7.0" + resolve "^1.20.0" + resolve.exports "^2.0.0" + slash "^3.0.0" + +jest-runner@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-29.7.0.tgz#809af072d408a53dcfd2e849a4c976d3132f718e" + integrity sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ== + dependencies: + "@jest/console" "^29.7.0" + "@jest/environment" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + chalk "^4.0.0" + emittery "^0.13.1" + graceful-fs "^4.2.9" + jest-docblock "^29.7.0" + jest-environment-node "^29.7.0" + jest-haste-map "^29.7.0" + jest-leak-detector "^29.7.0" + jest-message-util "^29.7.0" + jest-resolve "^29.7.0" + jest-runtime "^29.7.0" + jest-util "^29.7.0" + jest-watcher "^29.7.0" + jest-worker "^29.7.0" + p-limit "^3.1.0" + source-map-support "0.5.13" + +jest-runtime@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-29.7.0.tgz#efecb3141cf7d3767a3a0cc8f7c9990587d3d817" + integrity sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ== + dependencies: + "@jest/environment" "^29.7.0" + "@jest/fake-timers" "^29.7.0" + "@jest/globals" "^29.7.0" + "@jest/source-map" "^29.6.3" + "@jest/test-result" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + chalk "^4.0.0" + cjs-module-lexer "^1.0.0" + collect-v8-coverage "^1.0.0" + glob "^7.1.3" + graceful-fs "^4.2.9" + jest-haste-map "^29.7.0" + jest-message-util "^29.7.0" + jest-mock "^29.7.0" + jest-regex-util "^29.6.3" + jest-resolve "^29.7.0" + jest-snapshot "^29.7.0" + jest-util "^29.7.0" + slash "^3.0.0" + strip-bom "^4.0.0" + +jest-snapshot@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-29.7.0.tgz#c2c574c3f51865da1bb329036778a69bf88a6be5" + integrity sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw== + dependencies: + "@babel/core" "^7.11.6" + "@babel/generator" "^7.7.2" + "@babel/plugin-syntax-jsx" "^7.7.2" + "@babel/plugin-syntax-typescript" "^7.7.2" + "@babel/types" "^7.3.3" + "@jest/expect-utils" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" + babel-preset-current-node-syntax "^1.0.0" + chalk "^4.0.0" + expect "^29.7.0" + graceful-fs "^4.2.9" + jest-diff "^29.7.0" + jest-get-type "^29.6.3" + jest-matcher-utils "^29.7.0" + jest-message-util "^29.7.0" + jest-util "^29.7.0" + natural-compare "^1.4.0" + pretty-format "^29.7.0" + semver "^7.5.3" + +jest-util@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.7.0.tgz#23c2b62bfb22be82b44de98055802ff3710fc0bc" + integrity sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA== + dependencies: + "@jest/types" "^29.6.3" + "@types/node" "*" + chalk "^4.0.0" + ci-info "^3.2.0" + graceful-fs "^4.2.9" + picomatch "^2.2.3" + +jest-validate@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-29.7.0.tgz#7bf705511c64da591d46b15fce41400d52147d9c" + integrity sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw== + dependencies: + "@jest/types" "^29.6.3" + camelcase "^6.2.0" + chalk "^4.0.0" + jest-get-type "^29.6.3" + leven "^3.1.0" + pretty-format "^29.7.0" + +jest-watcher@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-29.7.0.tgz#7810d30d619c3a62093223ce6bb359ca1b28a2f2" + integrity sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g== + dependencies: + "@jest/test-result" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + emittery "^0.13.1" + jest-util "^29.7.0" + string-length "^4.0.1" + +jest-worker@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.7.0.tgz#acad073acbbaeb7262bd5389e1bcf43e10058d4a" + integrity sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw== + dependencies: + "@types/node" "*" + jest-util "^29.7.0" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +jest@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest/-/jest-29.7.0.tgz#994676fc24177f088f1c5e3737f5697204ff2613" + integrity sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw== + dependencies: + "@jest/core" "^29.7.0" + "@jest/types" "^29.6.3" + import-local "^3.0.2" + jest-cli "^29.7.0" + "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" @@ -2335,6 +3921,38 @@ js-yaml@^3.13.1: argparse "^1.0.7" esprima "^4.0.0" +jsdom@^20.0.0: + version "20.0.3" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-20.0.3.tgz#886a41ba1d4726f67a8858028c99489fed6ad4db" + integrity sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ== + dependencies: + abab "^2.0.6" + acorn "^8.8.1" + acorn-globals "^7.0.0" + cssom "^0.5.0" + cssstyle "^2.3.0" + data-urls "^3.0.2" + decimal.js "^10.4.2" + domexception "^4.0.0" + escodegen "^2.0.0" + form-data "^4.0.0" + html-encoding-sniffer "^3.0.0" + http-proxy-agent "^5.0.0" + https-proxy-agent "^5.0.1" + is-potential-custom-element-name "^1.0.1" + nwsapi "^2.2.2" + parse5 "^7.1.1" + saxes "^6.0.0" + symbol-tree "^3.2.4" + tough-cookie "^4.1.2" + w3c-xmlserializer "^4.0.0" + webidl-conversions "^7.0.0" + whatwg-encoding "^2.0.0" + whatwg-mimetype "^3.0.0" + whatwg-url "^11.0.0" + ws "^8.11.0" + xml-name-validator "^4.0.0" + jsesc@^2.5.1: version "2.5.2" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" @@ -2377,11 +3995,16 @@ json5@^2.2.0: dependencies: minimist "^1.2.5" -json5@^2.2.2: +json5@^2.2.2, json5@^2.2.3: version "2.2.3" resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== +jsonc-parser@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.2.0.tgz#31ff3f4c2b9793f89c67212627c51c6394f88e76" + integrity sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w== + "jsx-ast-utils@^2.4.1 || ^3.0.0": version "3.2.0" resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.2.0.tgz#41108d2cec408c3453c1bbe8a4aae9e1e2bd8f82" @@ -2390,6 +4013,16 @@ json5@^2.2.2: array-includes "^3.1.2" object.assign "^4.1.2" +kleur@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" + integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== + +leven@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" + integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== + levn@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" @@ -2455,6 +4088,13 @@ locate-path@^2.0.0: p-locate "^2.0.0" path-exists "^3.0.0" +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + lodash.clonedeep@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" @@ -2521,6 +4161,25 @@ magic-string@^0.27.0: dependencies: "@jridgewell/sourcemap-codec" "^1.4.13" +make-dir@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-4.0.0.tgz#c3c2307a771277cd9638305f915c29ae741b614e" + integrity sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw== + dependencies: + semver "^7.5.3" + +make-error@^1.1.1: + version "1.3.6" + resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" + integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== + +makeerror@1.0.12: + version "1.0.12" + resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a" + integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg== + dependencies: + tmpl "1.0.5" + merge-stream@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" @@ -2539,6 +4198,18 @@ micromatch@^4.0.4: braces "^3.0.1" picomatch "^2.2.3" +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@^2.1.12: + version "2.1.35" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + mimic-fn@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" @@ -2551,6 +4222,13 @@ minimatch@^3.0.4: dependencies: brace-expansion "^1.1.7" +minimatch@^3.1.1: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + minimatch@^5.0.1: version "5.1.6" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" @@ -2583,6 +4261,16 @@ natural-compare@^1.4.0: resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= +node-int64@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" + integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== + +node-releases@^2.0.14: + version "2.0.14" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.14.tgz#2ffb053bceb8b2be8495ece1ab6ce600c4461b0b" + integrity sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw== + node-releases@^2.0.6: version "2.0.8" resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.8.tgz#0f349cdc8fcfa39a92ac0be9bc48b7706292b9ae" @@ -2610,6 +4298,11 @@ npm-run-path@^4.0.1: dependencies: path-key "^3.0.0" +nwsapi@^2.2.2: + version "2.2.7" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.7.tgz#738e0707d3128cb750dddcfe90e4610482df0f30" + integrity sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ== + object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" @@ -2696,6 +4389,20 @@ p-limit@^1.1.0: dependencies: p-try "^1.0.0" +p-limit@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-limit@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + p-locate@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" @@ -2703,6 +4410,13 @@ p-locate@^2.0.0: dependencies: p-limit "^1.1.0" +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + p-map@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" @@ -2715,6 +4429,11 @@ p-try@^1.0.0: resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + parent-module@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" @@ -2730,7 +4449,7 @@ parse-json@^4.0.0: error-ex "^1.3.1" json-parse-better-errors "^1.0.1" -parse-json@^5.0.0: +parse-json@^5.0.0, parse-json@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== @@ -2740,11 +4459,23 @@ parse-json@^5.0.0: json-parse-even-better-errors "^2.3.0" lines-and-columns "^1.1.6" +parse5@^7.0.0, parse5@^7.1.1: + version "7.1.2" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-7.1.2.tgz#0736bebbfd77793823240a23b7fc5e010b7f8e32" + integrity sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw== + dependencies: + entities "^4.4.0" + path-exists@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + path-is-absolute@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" @@ -2777,21 +4508,26 @@ picocolors@^1.0.0: resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== +picomatch@^2.0.4, picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + picomatch@^2.2.3: version "2.3.0" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972" integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw== -picomatch@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" - integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== - pify@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= +pirates@^4.0.4: + version "4.0.6" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.6.tgz#3018ae32ecfcff6c29ba2267cbf21166ac1f36b9" + integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== + pkg-dir@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" @@ -2799,6 +4535,13 @@ pkg-dir@^2.0.0: dependencies: find-up "^2.1.0" +pkg-dir@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" + integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== + dependencies: + find-up "^4.0.0" + pkg-up@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-2.0.0.tgz#c819ac728059a461cab1c3889a2be3c49a004d7f" @@ -2830,11 +4573,28 @@ prettier@^2.2.1: resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.3.2.tgz#ef280a05ec253712e486233db5c6f23441e7342d" integrity sha512-lnJzDfJ66zkMy58OL5/NY5zp70S7Nz6KqcKkXYzn2tMVrNxvbqaBpg7H3qHaLxCJ5lNMsGuM8+ohS7cZrthdLQ== +pretty-format@^29.0.0, pretty-format@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.7.0.tgz#ca42c758310f365bfa71a0bda0a807160b776812" + integrity sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ== + dependencies: + "@jest/schemas" "^29.6.3" + ansi-styles "^5.0.0" + react-is "^18.0.0" + progress@^2.0.0: version "2.0.3" resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== +prompts@^2.0.1: + version "2.4.2" + resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" + integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== + dependencies: + kleur "^3.0.3" + sisteransi "^1.0.5" + prop-types@^15.7.2: version "15.7.2" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5" @@ -2844,11 +4604,31 @@ prop-types@^15.7.2: object-assign "^4.1.1" react-is "^16.8.1" +psl@^1.1.33: + version "1.9.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" + integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== + punycode@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== +punycode@^2.1.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" + integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== + +pure-rand@^6.0.0: + version "6.0.4" + resolved "https://registry.yarnpkg.com/pure-rand/-/pure-rand-6.0.4.tgz#50b737f6a925468679bff00ad20eade53f37d5c7" + integrity sha512-LA0Y9kxMYv47GIPJy6MI84fqTd2HmYZI83W/kM/SkKfDlajnZYfmXFTxkbY+xSBPkLJxltMa9hIkmdc29eguMA== + +querystringify@^2.1.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" + integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== + queue-microtask@^1.2.2: version "1.2.3" resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" @@ -2866,6 +4646,11 @@ react-is@^16.8.1: resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== +react-is@^18.0.0: + version "18.2.0" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" + integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== + react@>=17: version "18.2.0" resolved "https://registry.yarnpkg.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5" @@ -2951,16 +4736,43 @@ regjsparser@^0.9.1: dependencies: jsesc "~0.5.0" +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== + require-from-string@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== +requires-port@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== + +resolve-cwd@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" + integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== + dependencies: + resolve-from "^5.0.0" + resolve-from@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== +resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + +resolve.exports@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-2.0.2.tgz#f8c934b8e6a13f539e38b7098e2e36134f01e800" + integrity sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg== + resolve@^1.10.0, resolve@^1.13.1, resolve@^1.17.0, resolve@^1.20.0: version "1.20.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" @@ -3037,6 +4849,18 @@ safe-buffer@^5.1.0: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== +"safer-buffer@>= 2.1.2 < 3.0.0": + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +saxes@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/saxes/-/saxes-6.0.0.tgz#fe5b4a4768df4f14a201b1ba6a65c1f3d9988cc5" + integrity sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA== + dependencies: + xmlchars "^2.2.0" + semver-compare@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc" @@ -3052,6 +4876,11 @@ semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== +semver@^6.3.1: + version "6.3.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== + semver@^7.2.1, semver@^7.3.5: version "7.3.5" resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" @@ -3059,6 +4888,13 @@ semver@^7.2.1, semver@^7.3.5: dependencies: lru-cache "^6.0.0" +semver@^7.5.3, semver@^7.5.4: + version "7.5.4" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" + integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== + dependencies: + lru-cache "^6.0.0" + serialize-javascript@^6.0.0: version "6.0.1" resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.1.tgz#b206efb27c3da0b0ab6b52f48d170b7996458e5c" @@ -3092,6 +4928,16 @@ signal-exit@^3.0.2, signal-exit@^3.0.3: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== +signal-exit@^3.0.7: + version "3.0.7" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + +sisteransi@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" + integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== + slash@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" @@ -3120,6 +4966,14 @@ smob@^0.0.6: resolved "https://registry.yarnpkg.com/smob/-/smob-0.0.6.tgz#09b268fea916158a2781c152044c6155adbb8aa1" integrity sha512-V21+XeNni+tTyiST1MHsa84AQhT1aFZipzPpOFAVB8DkHzwJyjjAmt9bgwnuZiZWnIbMo2duE29wybxv/7HWUw== +source-map-support@0.5.13: + version "0.5.13" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.13.tgz#31b24a9c2e73c2de85066c0feb7d44767ed52932" + integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + source-map-support@~0.5.20: version "0.5.21" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" @@ -3128,7 +4982,7 @@ source-map-support@~0.5.20: buffer-from "^1.0.0" source-map "^0.6.0" -source-map@^0.6.0: +source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== @@ -3164,11 +5018,26 @@ sprintf-js@~1.0.2: resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= +stack-utils@^2.0.3: + version "2.0.6" + resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.6.tgz#aaf0748169c02fc33c8232abccf933f54a1cc34f" + integrity sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ== + dependencies: + escape-string-regexp "^2.0.0" + string-argv@0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.1.tgz#95e2fbec0427ae19184935f816d74aaa4c5c19da" integrity sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg== +string-length@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a" + integrity sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ== + dependencies: + char-regex "^1.0.2" + strip-ansi "^6.0.0" + string-width@^4.1.0, string-width@^4.2.0: version "4.2.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.2.tgz#dafd4f9559a7585cfba529c6a0a4f73488ebd4c5" @@ -3178,6 +5047,15 @@ string-width@^4.1.0, string-width@^4.2.0: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.0" +string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + string.prototype.matchall@^4.0.5: version "4.0.5" resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.5.tgz#59370644e1db7e4c0c045277690cf7b01203c4da" @@ -3224,11 +5102,23 @@ strip-ansi@^6.0.0: dependencies: ansi-regex "^5.0.0" +strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + strip-bom@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= +strip-bom@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" + integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== + strip-final-newline@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" @@ -3253,11 +5143,23 @@ supports-color@^7.1.0: dependencies: has-flag "^4.0.0" +supports-color@^8.0.0: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + supports-preserve-symlinks-flag@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== +symbol-tree@^3.2.4: + version "3.2.4" + resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" + integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== + table@^6.0.9: version "6.7.1" resolved "https://registry.yarnpkg.com/table/-/table-6.7.1.tgz#ee05592b7143831a8c94f3cee6aae4c1ccef33e2" @@ -3280,6 +5182,15 @@ terser@^5.15.1: commander "^2.20.0" source-map-support "~0.5.20" +test-exclude@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" + integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== + dependencies: + "@istanbuljs/schema" "^0.1.2" + glob "^7.1.4" + minimatch "^3.0.4" + text-table@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" @@ -3290,6 +5201,11 @@ through@^2.3.8: resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= +tmpl@1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" + integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== + to-fast-properties@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" @@ -3302,6 +5218,42 @@ to-regex-range@^5.0.1: dependencies: is-number "^7.0.0" +tough-cookie@^4.1.2: + version "4.1.3" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.3.tgz#97b9adb0728b42280aa3d814b6b999b2ff0318bf" + integrity sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw== + dependencies: + psl "^1.1.33" + punycode "^2.1.1" + universalify "^0.2.0" + url-parse "^1.5.3" + +tr46@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-3.0.0.tgz#555c4e297a950617e8eeddef633c87d4d9d6cbf9" + integrity sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA== + dependencies: + punycode "^2.1.1" + +ts-node@^10.9.2: + version "10.9.2" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.2.tgz#70f021c9e185bccdca820e26dc413805c101c71f" + integrity sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ== + dependencies: + "@cspotcode/source-map-support" "^0.8.0" + "@tsconfig/node10" "^1.0.7" + "@tsconfig/node12" "^1.0.7" + "@tsconfig/node14" "^1.0.0" + "@tsconfig/node16" "^1.0.2" + acorn "^8.4.1" + acorn-walk "^8.1.1" + arg "^4.1.0" + create-require "^1.1.0" + diff "^4.0.1" + make-error "^1.1.1" + v8-compile-cache-lib "^3.0.1" + yn "3.1.1" + tsconfig-paths@^3.9.0: version "3.10.1" resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.10.1.tgz#79ae67a68c15289fdf5c51cb74f397522d795ed7" @@ -3330,6 +5282,11 @@ type-check@^0.4.0, type-check@~0.4.0: dependencies: prelude-ls "^1.2.1" +type-detect@4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" + integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== + type-fest@^0.20.2: version "0.20.2" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" @@ -3355,6 +5312,11 @@ unbox-primitive@^1.0.1: has-symbols "^1.0.2" which-boxed-primitive "^1.0.2" +undici-types@~5.26.4: + version "5.26.5" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" + integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== + unicode-canonical-property-names-ecmascript@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc" @@ -3378,6 +5340,19 @@ unicode-property-aliases-ecmascript@^2.0.0: resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz#43d41e3be698bd493ef911077c9b131f827e8ccd" integrity sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w== +universalify@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.2.0.tgz#6451760566fa857534745ab1dde952d1b1761be0" + integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg== + +update-browserslist-db@^1.0.13: + version "1.0.13" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz#3c5e4f5c083661bd38ef64b6328c26ed6c8248c4" + integrity sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg== + dependencies: + escalade "^3.1.1" + picocolors "^1.0.0" + update-browserslist-db@^1.0.9: version "1.0.10" resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz#0f54b876545726f17d00cd9a2561e6dade943ff3" @@ -3393,11 +5368,33 @@ uri-js@^4.2.2: dependencies: punycode "^2.1.0" +url-parse@^1.5.3: + version "1.5.10" + resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" + integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== + dependencies: + querystringify "^2.1.1" + requires-port "^1.0.0" + +v8-compile-cache-lib@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" + integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== + v8-compile-cache@^2.0.3: version "2.3.0" resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== +v8-to-istanbul@^9.0.1: + version "9.2.0" + resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.2.0.tgz#2ed7644a245cddd83d4e087b9b33b3e62dfd10ad" + integrity sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA== + dependencies: + "@jridgewell/trace-mapping" "^0.3.12" + "@types/istanbul-lib-coverage" "^2.0.1" + convert-source-map "^2.0.0" + validate-npm-package-license@^3.0.1: version "3.0.4" resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" @@ -3406,6 +5403,45 @@ validate-npm-package-license@^3.0.1: spdx-correct "^3.0.0" spdx-expression-parse "^3.0.0" +w3c-xmlserializer@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz#aebdc84920d806222936e3cdce408e32488a3073" + integrity sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw== + dependencies: + xml-name-validator "^4.0.0" + +walker@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" + integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== + dependencies: + makeerror "1.0.12" + +webidl-conversions@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-7.0.0.tgz#256b4e1882be7debbf01d05f0aa2039778ea080a" + integrity sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g== + +whatwg-encoding@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz#e7635f597fd87020858626805a2729fa7698ac53" + integrity sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg== + dependencies: + iconv-lite "0.6.3" + +whatwg-mimetype@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz#5fa1a7623867ff1af6ca3dc72ad6b8a4208beba7" + integrity sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q== + +whatwg-url@^11.0.0: + version "11.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-11.0.0.tgz#0a849eebb5faf2119b901bb76fd795c2848d4018" + integrity sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ== + dependencies: + tr46 "^3.0.0" + webidl-conversions "^7.0.0" + which-boxed-primitive@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" @@ -3452,6 +5488,34 @@ wrappy@1: resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= +write-file-atomic@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-4.0.2.tgz#a9df01ae5b77858a027fd2e80768ee433555fcfd" + integrity sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg== + dependencies: + imurmurhash "^0.1.4" + signal-exit "^3.0.7" + +ws@^8.11.0: + version "8.16.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.16.0.tgz#d1cd774f36fbc07165066a60e40323eab6446fd4" + integrity sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ== + +xml-name-validator@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-4.0.0.tgz#79a006e2e63149a8600f15430f0a4725d1524835" + integrity sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw== + +xmlchars@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" + integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== + +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + yallist@^3.0.2: version "3.1.1" resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" @@ -3466,3 +5530,31 @@ yaml@^1.10.0: version "1.10.2" resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== + +yargs-parser@^21.1.1: + version "21.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" + integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== + +yargs@^17.3.1: + version "17.7.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" + integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== + dependencies: + cliui "^8.0.1" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.1.1" + +yn@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" + integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== From c6a1aa03bb7a91f665a366bd276d43c05a8fe904 Mon Sep 17 00:00:00 2001 From: "d.ragozin" Date: Fri, 12 Jan 2024 13:05:22 +0300 Subject: [PATCH 11/46] =?UTF-8?q?[+]=20=D0=A2=D0=B5=D1=81=D1=82=D1=8B=20?= =?UTF-8?q?=D0=BD=D0=B0=20=D1=84=D1=83=D0=BD=D0=BA=D1=86=D0=B8=D1=8E=20cal?= =?UTF-8?q?lVkApi?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jest.config.ts | 1 + src/__tests__/callVkApi.test.ts | 449 ++++++++++++++++++++++++ src/__tests__/checkVkUserDenied.test.ts | 6 +- src/checkVkUserDenied.ts | 7 +- src/consts.ts | 7 +- 5 files changed, 460 insertions(+), 10 deletions(-) create mode 100644 src/__tests__/callVkApi.test.ts diff --git a/jest.config.ts b/jest.config.ts index a04a382..26b9027 100644 --- a/jest.config.ts +++ b/jest.config.ts @@ -2,6 +2,7 @@ import type { Config } from 'jest'; const config: Config = { testEnvironment: 'jsdom', + testPathIgnorePatterns: ['/node_modules/', '/__tests__/utils/'], transform: { '^.+\\.(t|j)sx?$': '@swc/jest', }, diff --git a/src/__tests__/callVkApi.test.ts b/src/__tests__/callVkApi.test.ts new file mode 100644 index 0000000..f26dd2e --- /dev/null +++ b/src/__tests__/callVkApi.test.ts @@ -0,0 +1,449 @@ +import originalBridge from '@vkontakte/vk-bridge'; +import { + AnyRequestMethodName, + ErrorData, +} from '@vkontakte/vk-bridge/dist/types/src/types/bridge'; + +import { getVkAccessToken as originalGetVkAccessToken } from '../getVkAccessToken'; +import { callVkApi, VK_TOKEN_ERRORS } from '../callVkApi'; +import { GetVkAccessTokenParamsType } from '../types'; + +import { randomNumberUpTo, randomString, range } from './utils'; + +jest.mock('@vkontakte/vk-bridge'); +jest.mock('../getVkAccessToken'); + +const bridge = originalBridge as jest.Mocked; +const getVkAccessToken = originalGetVkAccessToken as jest.MockedFn< + typeof originalGetVkAccessToken +>; + +type BridgeSendReturn = ReturnType; + +const MOCK_VK_BRIDGE_CUSTOM_METHOD = + 'MOCK_VK_BRIDGE_CUSTOM_METHOD' as AnyRequestMethodName; + +const MOCK_VK_API_VERSION = 'MOCK_VK_API_VERSION'; + +const VK_BRIDGE_VK_API_METHOD = 'VKWebAppCallAPIMethod'; + +const MOCK_TOKEN = 'MOCK_TOKEN'; +const MOCK_NEW_TOKEN = 'MOCK_NEW_TOKEN'; + +const MOCK_SUCCESS = 'MOCK_SUCCESS' as unknown as BridgeSendReturn; + +const MOCK_ANY_ERROR: ErrorData = { + error_type: 'api_error', + error_data: { + error_code: randomNumberUpTo(100), + error_msg: randomString(10), + request_params: range(3).map(() => randomString(3)), + }, +}; + +const MOCK_GET_TOKEN_PARAMS = { + [randomString(5)]: randomString(5), +} as GetVkAccessTokenParamsType; + +const getMockTokenExpiredError = ({ + isWeb = true, + message = VK_TOKEN_ERRORS[0], +}: { + isWeb?: boolean; + message?: string; +} = {}) => ({ + error_type: 'some error type', + error_data: isWeb + ? { + error_reason: { + error_msg: message, + }, + } + : { + error_msg: message, + }, +}); + +/** + * Подготовить кейсы возникновения ошибки о протухшем токене: на вебе/мобиле и с различным сообщением об ошибке + */ +const getMockTokenExpiredErrorCases = () => + [true, false].reduce<{ isWeb: boolean; message: string }[]>( + (acc, isWeb) => [ + ...acc, + ...VK_TOKEN_ERRORS.map((message) => ({ isWeb, message })), + ], + [] + ); + +/** + * Проверка на передачу в бридж токена + * @param token + * @param nthTime + */ +const expectBridgeCalledWithToken = ({ + token, + nthTime, +}: { + token: string; + nthTime?: number; +}) => { + if (nthTime) { + return expect(bridge.send).toHaveBeenNthCalledWith( + nthTime, + VK_BRIDGE_VK_API_METHOD, + expect.objectContaining({ + params: expect.objectContaining({ + access_token: token, + }), + }) + ); + } + + expect(bridge.send).toHaveBeenCalledWith( + VK_BRIDGE_VK_API_METHOD, + expect.objectContaining({ + params: expect.objectContaining({ + access_token: token, + }), + }) + ); +}; + +/** + * Кейсы: + * Передача ответа бриджа: + * 1. Успешный запрос с изначально корректным токеном. + * 2. Некоторая ошибка (в том числе из-за возможно некорректного токена). + * + * Получение нового токена: + * 3. Успешный запрос, нет токена, токен должен быть получен один раз. + * 4. Некоторая ошибка (в том числе из-за возможного некорректного токена), + * нет токена, токен должен быть получен один раз. + * 5. Успешный запрос, изначально протухший токен, + * новый токен должен быть получен один раз. + * 6. Некоторая ошибка (в том числе из-за возможного некорректного токена) + * после получения нового токена. Изначально протухший токен, + * новый токен должен быть получен один раз. + * 7. Запрос с некоторым ответом, изначально протухший токен. + * Новый токен получать не нужно. + * + * Правильная передача параметров запроса: + * 8. Запрос, название метода передаётся в бридж. + * 9. Запрос, версия VK API передаётся в параметры. + * 10. Запрос, токена нет, параметры для получения токена + * передаются в getVkAccessToken, новый токен передаётся в бридж. + * 11. Запрос, токен передаётся в бридж. + * 12. Запрос, протухший токен передаётся в бридж, + * затем новый токен передаётся в бридж. Параметры получения токена + * передаются в getVkAccessToken. + * 13. Запрос, дополнительные параметры передаются в бридж. + */ +describe('Функция callVkApi', () => { + afterEach(() => { + bridge.send.mockClear(); + getVkAccessToken.mockClear(); + }); + + beforeEach(() => { + // Гарантированно замокать имплементацию + bridge.send.mockImplementation(() => Promise.resolve()); + getVkAccessToken.mockImplementation(() => Promise.resolve('')); + }); + + it('Успешный запрос с изначально корректным токеном', async () => { + bridge.send.mockImplementation(() => MOCK_SUCCESS); + + const result = await callVkApi({ + accessToken: MOCK_TOKEN, + method: MOCK_VK_BRIDGE_CUSTOM_METHOD, + renewTokenIfExpired: true, + getAccessTokenParams: {}, + }); + + expect(bridge.send).toBeCalledTimes(1); + expect(result).toBe(MOCK_SUCCESS); + }); + + it('Некоторая ошибка (в том числе из-за возможно некорректного токена)', async () => { + bridge.send.mockImplementation(() => { + throw MOCK_ANY_ERROR; + }); + + const result = await callVkApi({ + method: MOCK_VK_BRIDGE_CUSTOM_METHOD, + accessToken: MOCK_TOKEN, + renewTokenIfExpired: true, + getAccessTokenParams: {}, + }); + + expect(result).toBe(MOCK_ANY_ERROR); + }); + + it('Успешный запрос, нет токена, токен должен быть получен один раз', async () => { + bridge.send.mockImplementation(() => MOCK_SUCCESS); + + const result = await callVkApi({ + method: MOCK_VK_BRIDGE_CUSTOM_METHOD, + renewTokenIfExpired: true, + getAccessTokenParams: {}, + }); + + expect(result).toBe(MOCK_SUCCESS); + expect(bridge.send).toBeCalledTimes(1); + expect(getVkAccessToken).toBeCalledTimes(1); + }); + + it( + 'Некоторая ошибка (в том числе из-за возможного некорректного токена), ' + + 'нет токена, токен должен быть получен один раз', + async () => { + bridge.send.mockImplementation(() => { + throw MOCK_ANY_ERROR; + }); + + const result = await callVkApi({ + method: MOCK_VK_BRIDGE_CUSTOM_METHOD, + renewTokenIfExpired: true, + getAccessTokenParams: {}, + }); + + expect(result).toBe(MOCK_ANY_ERROR); + expect(bridge.send).toBeCalledTimes(1); + expect(getVkAccessToken).toBeCalledTimes(1); + } + ); + + getMockTokenExpiredErrorCases().forEach(({ message, isWeb }) => { + it( + 'Успешный запрос, изначально протухший токен, ' + + 'новый токен должен быть получен один раз. ' + + `Ошибка: ${message}, веб: ${isWeb}`, + async () => { + getVkAccessToken.mockImplementation(() => Promise.resolve(MOCK_TOKEN)); + + // Первый вызов bridge.send породит ошибку, второй — успех + bridge.send + .mockImplementationOnce(() => { + throw getMockTokenExpiredError({ + isWeb, + message, + }); + }) + .mockImplementationOnce(() => MOCK_SUCCESS); + + const result = await callVkApi({ + method: MOCK_VK_BRIDGE_CUSTOM_METHOD, + accessToken: MOCK_TOKEN, + renewTokenIfExpired: true, + getAccessTokenParams: {}, + }); + + expect(result).toBe(MOCK_SUCCESS); + expect(bridge.send).toBeCalledTimes(2); + expect(getVkAccessToken).toBeCalledTimes(1); + } + ); + }); + + getMockTokenExpiredErrorCases().forEach(({ message, isWeb }) => { + it( + 'Некоторая ошибка (в том числе из-за возможного некорректного токена) ' + + 'после получения нового токена. Изначально протухший токен, ' + + 'новый токен должен быть получен один раз. ' + + `Ошибка: ${message}, веб: ${isWeb}`, + async () => { + getVkAccessToken.mockImplementation(() => Promise.resolve(MOCK_TOKEN)); + + bridge.send + .mockImplementationOnce(() => { + throw getMockTokenExpiredError({ + isWeb, + message, + }); + }) + .mockImplementationOnce(() => { + throw MOCK_ANY_ERROR; + }); + + const result = await callVkApi({ + method: MOCK_VK_BRIDGE_CUSTOM_METHOD, + accessToken: MOCK_TOKEN, + renewTokenIfExpired: true, + getAccessTokenParams: {}, + }); + + expect(result).toBe(MOCK_ANY_ERROR); + expect(bridge.send).toBeCalledTimes(2); + expect(getVkAccessToken).toBeCalledTimes(1); + } + ); + }); + + getMockTokenExpiredErrorCases().forEach(({ message, isWeb }) => { + it( + 'Запрос с некоторым ответом, изначально протухший токен. ' + + 'Новый токен получать не нужно. ' + + `Ошибка: ${message}, веб: ${isWeb}`, + async () => { + const tokenExpiredError = getMockTokenExpiredError({ + isWeb, + message, + }); + + bridge.send.mockImplementation(() => { + throw tokenExpiredError; + }); + + const result = await callVkApi({ + method: MOCK_VK_BRIDGE_CUSTOM_METHOD, + accessToken: MOCK_TOKEN, + renewTokenIfExpired: false, + getAccessTokenParams: {}, + }); + + expect(result).toBe(tokenExpiredError); + expect(bridge.send).toBeCalledTimes(1); + expect(getVkAccessToken).toBeCalledTimes(0); + } + ); + }); + + it('Запрос, название метода передаётся в бридж', async () => { + bridge.send.mockImplementation(() => MOCK_SUCCESS); + + const result = await callVkApi({ + accessToken: MOCK_TOKEN, + method: MOCK_VK_BRIDGE_CUSTOM_METHOD, + getAccessTokenParams: {}, + }); + + expect(result).toBe(MOCK_SUCCESS); + expect(bridge.send).toBeCalledTimes(1); + expect(bridge.send).toBeCalledWith( + VK_BRIDGE_VK_API_METHOD, + expect.objectContaining({ + method: MOCK_VK_BRIDGE_CUSTOM_METHOD, + }) + ); + }); + + it('Запрос, версия VK API передаётся в параметры', async () => { + bridge.send.mockImplementation(() => MOCK_SUCCESS); + + const result = await callVkApi({ + version: MOCK_VK_API_VERSION, + accessToken: MOCK_TOKEN, + method: MOCK_VK_BRIDGE_CUSTOM_METHOD, + getAccessTokenParams: {}, + }); + + expect(result).toBe(MOCK_SUCCESS); + expect(bridge.send).toBeCalledTimes(1); + expect(bridge.send).toBeCalledWith( + VK_BRIDGE_VK_API_METHOD, + expect.objectContaining({ + params: expect.objectContaining({ + v: MOCK_VK_API_VERSION, + }), + }) + ); + }); + + it( + 'Запрос, токена нет, параметры для получения токена ' + + 'передаются в getVkAccessToken, новый токен передаётся в бридж', + async () => { + getVkAccessToken.mockImplementation(() => + Promise.resolve(MOCK_NEW_TOKEN) + ); + + bridge.send.mockImplementation(() => MOCK_SUCCESS); + + const result = await callVkApi({ + method: MOCK_VK_BRIDGE_CUSTOM_METHOD, + getAccessTokenParams: MOCK_GET_TOKEN_PARAMS, + }); + + expect(result).toBe(MOCK_SUCCESS); + + expect(getVkAccessToken).toBeCalledTimes(1); + expect(getVkAccessToken).toBeCalledWith(MOCK_GET_TOKEN_PARAMS); + + expect(bridge.send).toBeCalledTimes(1); + expectBridgeCalledWithToken({ token: MOCK_NEW_TOKEN }); + } + ); + + it('Запрос, токен передаётся в бридж', async () => { + bridge.send.mockImplementation(() => MOCK_SUCCESS); + + const result = await callVkApi({ + accessToken: MOCK_TOKEN, + method: MOCK_VK_BRIDGE_CUSTOM_METHOD, + getAccessTokenParams: {}, + }); + + expect(result).toBe(MOCK_SUCCESS); + expect(bridge.send).toBeCalledTimes(1); + expectBridgeCalledWithToken({ token: MOCK_TOKEN }); + }); + + it( + 'Запрос, протухший токен передаётся в бридж, ' + + 'затем новый токен передаётся в бридж. Параметры получения токена ' + + 'передаются в getVkAccessToken', + async () => { + getVkAccessToken.mockImplementation(() => + Promise.resolve(MOCK_NEW_TOKEN) + ); + + bridge.send + .mockImplementationOnce(() => { + throw getMockTokenExpiredError(); + }) + .mockImplementationOnce(() => MOCK_SUCCESS); + + const result = await callVkApi({ + accessToken: MOCK_TOKEN, + method: MOCK_VK_BRIDGE_CUSTOM_METHOD, + renewTokenIfExpired: true, + getAccessTokenParams: MOCK_GET_TOKEN_PARAMS, + }); + + expect(result).toBe(MOCK_SUCCESS); + + expect(getVkAccessToken).toBeCalledTimes(1); + expect(getVkAccessToken).toBeCalledWith(MOCK_GET_TOKEN_PARAMS); + + expect(bridge.send).toBeCalledTimes(2); + expectBridgeCalledWithToken({ nthTime: 1, token: MOCK_TOKEN }); + expectBridgeCalledWithToken({ nthTime: 2, token: MOCK_NEW_TOKEN }); + } + ); + + it('Запрос, дополнительные параметры передаются в бридж', async () => { + bridge.send.mockImplementation(() => MOCK_SUCCESS); + + const customParams = { + [randomString(5)]: randomNumberUpTo(100), + [randomNumberUpTo(100)]: randomString(10), + }; + + const result = await callVkApi({ + accessToken: MOCK_TOKEN, + method: MOCK_VK_BRIDGE_CUSTOM_METHOD, + params: customParams, + getAccessTokenParams: {}, + }); + + expect(result).toBe(MOCK_SUCCESS); + expect(bridge.send).toBeCalledTimes(1); + expect(bridge.send).toBeCalledWith( + VK_BRIDGE_VK_API_METHOD, + expect.objectContaining({ + params: expect.objectContaining({ ...customParams }), + }) + ); + }); +}); diff --git a/src/__tests__/checkVkUserDenied.test.ts b/src/__tests__/checkVkUserDenied.test.ts index 3a3ad21..719c615 100644 --- a/src/__tests__/checkVkUserDenied.test.ts +++ b/src/__tests__/checkVkUserDenied.test.ts @@ -1,7 +1,9 @@ import { ErrorData } from '@vkontakte/vk-bridge/dist/types/src/types/bridge'; -import { checkVkUserDenied } from '../checkVkUserDenied'; -import { userDeniedErrorReasons } from '../consts'; +import { + checkVkUserDenied, + userDeniedErrorReasons, +} from '../checkVkUserDenied'; import { randomNumberUpTo, randomString, range } from './utils'; diff --git a/src/checkVkUserDenied.ts b/src/checkVkUserDenied.ts index 2ebe146..4f56325 100644 --- a/src/checkVkUserDenied.ts +++ b/src/checkVkUserDenied.ts @@ -1,6 +1,9 @@ import { ErrorData } from '@vkontakte/vk-bridge'; -import { userDeniedErrorReasons } from './consts'; +const userDeniedErrorReasons = new Set([ + 'User denied', + 'Operation denied by user', +]); /** * Утилита для проверки, что пришедшая от API ВКонтакте ошибка, @@ -22,4 +25,4 @@ const checkVkUserDenied = (error: ErrorData): boolean => { return userDeniedErrorReasons.has(error_reason) || error_code === 4; }; -export { checkVkUserDenied }; +export { checkVkUserDenied, userDeniedErrorReasons }; diff --git a/src/consts.ts b/src/consts.ts index 2eb662e..0409a12 100644 --- a/src/consts.ts +++ b/src/consts.ts @@ -6,9 +6,4 @@ const vkErrorTypes = new Set([ 'auth_error', ]); -const userDeniedErrorReasons = new Set([ - 'User denied', - 'Operation denied by user', -]); - -export { vkErrorTypes, userDeniedErrorReasons }; +export { vkErrorTypes }; From f0818328534ff0f83005ae09f9cb79281c734262 Mon Sep 17 00:00:00 2001 From: "d.ragozin" Date: Mon, 15 Jan 2024 14:29:30 +0300 Subject: [PATCH 12/46] =?UTF-8?q?[*]=20=D0=94=D0=BE=D1=80=D0=B0=D0=B1?= =?UTF-8?q?=D0=BE=D1=82=D0=BA=D0=B8=20=D1=83=D1=82=D0=B8=D0=BB=D0=B8=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit checkVkAvatarIsDefault: обработка кейса с пустой строкой вместо ссылки. checkVkPlatform: добавление платформ десктопного вк-мессенджера. getVkAccessToken: обработка запроса пустого скоупа. --- src/checkVkAvatarIsDefault.ts | 2 +- src/checkVkPlatform.ts | 7 ++++++- src/getVkAccessToken.ts | 6 ++++-- src/types/common.ts | 2 ++ 4 files changed, 13 insertions(+), 4 deletions(-) diff --git a/src/checkVkAvatarIsDefault.ts b/src/checkVkAvatarIsDefault.ts index 0857ab4..98842c4 100644 --- a/src/checkVkAvatarIsDefault.ts +++ b/src/checkVkAvatarIsDefault.ts @@ -12,6 +12,6 @@ const checkVkAvatarIsDefault = ({ photo, size = 100, }: CheckVkAvatarIsDefaultParamsType): boolean => - !photo || photo === `https://vk.com/images/camera_${size}.png`; + !!photo && photo === `https://vk.com/images/camera_${size}.png`; export { checkVkAvatarIsDefault }; diff --git a/src/checkVkPlatform.ts b/src/checkVkPlatform.ts index ed5ba17..66742ef 100644 --- a/src/checkVkPlatform.ts +++ b/src/checkVkPlatform.ts @@ -5,7 +5,12 @@ import { VkPlatformType } from './types'; * * @constant {VkPlatformType[]} */ -const DESKTOP_VK_PLATFORMS: VkPlatformType[] = ['desktop_web', 'web_external']; +const DESKTOP_VK_PLATFORMS: VkPlatformType[] = [ + 'desktop_web', + 'web_external', + 'desktop_app_messenger', + 'desktop_web_messenger', +]; /** * Платформы ВКонтакте, для которых можно считать, что приложение открыто на IOS. diff --git a/src/getVkAccessToken.ts b/src/getVkAccessToken.ts index 0ec7db0..a4346c9 100644 --- a/src/getVkAccessToken.ts +++ b/src/getVkAccessToken.ts @@ -49,7 +49,9 @@ const parseVkScopes = (scopes?: string): PersonalAuthScope[] => { }; /** - * Утилита для проверки равенства двух множеств scopes. + * Утилита для проверки того, является ли первое множество scopes подмножеством + * второго множества scopes. + * Внимание: пустое множество является подмножеством любого множества. * * @param {Set} firstScope Первое множество scopes. * @param {Set,} secondScope Второе множество scopes. @@ -145,7 +147,7 @@ const getVkAccessToken = async ({ }); /** Если получен ответ */ - if (data.access_token) { + if (data.access_token || data.access_token === '') { const receivedScopesSet = new Set(parseVkScopes(data.scope)); const allNeededScopesReceived = checkOneScopesSetIncludesAnother( diff --git a/src/types/common.ts b/src/types/common.ts index 339de4d..8129909 100644 --- a/src/types/common.ts +++ b/src/types/common.ts @@ -13,6 +13,8 @@ type VkResponseType = M extends AnyReceiveMethodName */ type InternalVkPlatformType = | 'desktop_web' + | 'desktop_web_messenger' + | 'desktop_app_messenger' | 'mobile_android' | 'mobile_android_messenger' | 'mobile_ipad' From a1bca3c181b7bd54616cb197c03295ac452eb99f Mon Sep 17 00:00:00 2001 From: "d.ragozin" Date: Mon, 15 Jan 2024 14:30:21 +0300 Subject: [PATCH 13/46] =?UTF-8?q?[+]=20=D0=90=D0=B2=D1=82=D0=BE=D1=82?= =?UTF-8?q?=D0=B5=D1=81=D1=82=D1=8B=20=D0=B8=20=D1=83=D1=82=D0=B8=D0=BB?= =?UTF-8?q?=D0=B8=D1=82=D1=8B=20=D0=B4=D0=BB=D1=8F=20=D0=B0=D0=B2=D1=82?= =?UTF-8?q?=D0=BE=D1=82=D0=B5=D1=81=D1=82=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Функции: checkVkAvatarIsDefault, checkVkPlatform, getVkAccessToken --- src/__tests__/checkVkAvatarIsDefault.test.ts | 79 +++ src/__tests__/checkVkPlatform.test.ts | 287 ++++++++ src/__tests__/getVkAccessToken.test.ts | 650 +++++++++++++++++++ src/__tests__/utils/getRandomElements.ts | 4 + src/__tests__/utils/index.ts | 4 + src/__tests__/utils/shuffle.ts | 2 + 6 files changed, 1026 insertions(+) create mode 100644 src/__tests__/checkVkAvatarIsDefault.test.ts create mode 100644 src/__tests__/checkVkPlatform.test.ts create mode 100644 src/__tests__/getVkAccessToken.test.ts create mode 100644 src/__tests__/utils/getRandomElements.ts create mode 100644 src/__tests__/utils/shuffle.ts diff --git a/src/__tests__/checkVkAvatarIsDefault.test.ts b/src/__tests__/checkVkAvatarIsDefault.test.ts new file mode 100644 index 0000000..e0f01e5 --- /dev/null +++ b/src/__tests__/checkVkAvatarIsDefault.test.ts @@ -0,0 +1,79 @@ +import { CheckVkAvatarIsDefaultParamsType } from '../types'; +import { checkVkAvatarIsDefault } from '../checkVkAvatarIsDefault'; + +import { randomString } from './utils'; + +type AvatarSize = Exclude; + +type SizesPair = { sizeA: AvatarSize; sizeB: AvatarSize }; + +const PROPER_SIZES: AvatarSize[] = [400, 200, 100, 50]; + +const createVkPhotoLink = (size: number) => + `https://vk.com/images/camera_${size}.png`; + +const createCorrectArg = ( + size: AvatarSize +): Required => ({ + photo: createVkPhotoLink(size), + size: size, +}); + +const createJpgImageArg = ( + size: AvatarSize +): Required => ({ + photo: `https://vk.com/images/camera_${size}.jpg`, + size, +}); + +const getNotEqualEachOtherSizes = (): SizesPair[] => + PROPER_SIZES.reduce((acc, sizeA) => { + const sizesPairsNotEqualToSizeA = PROPER_SIZES.reduce( + (arr, sizeB) => (sizeA !== sizeB ? [...arr, { sizeA, sizeB }] : arr), + [] + ); + + return [...acc, ...sizesPairsNotEqualToSizeA]; + }, []); + +describe('Функция checkVkAvatarIsDefault', () => { + PROPER_SIZES.map(createCorrectArg).forEach(({ size, photo }) => { + it(`Правильная ссылка: ${photo}`, () => { + expect(checkVkAvatarIsDefault({ photo, size })).toBeTruthy(); + }); + }); + + PROPER_SIZES.map(createJpgImageArg).forEach(({ size, photo }) => { + it(`Имитация ВКшной ссылки, jpg-расширение: ${photo}`, () => { + expect(checkVkAvatarIsDefault({ photo, size })).toBeFalsy(); + }); + }); + + PROPER_SIZES.forEach((size) => { + it(`Случайная строка в поле ссылки. Размер: ${size}`, () => { + expect( + checkVkAvatarIsDefault({ photo: randomString(10), size }) + ).toBeFalsy(); + }); + }); + + getNotEqualEachOtherSizes().forEach(({ sizeA, sizeB }) => { + const link = createVkPhotoLink(sizeB); + + it( + 'Несоответствие размеров в аргументе в поле size и в ссылке. ' + + `Ссылка: ${link}, размер: ${sizeA}`, + () => { + expect( + checkVkAvatarIsDefault({ size: sizeA, photo: link }) + ).toBeFalsy(); + } + ); + }); + + PROPER_SIZES.forEach((size) => { + it(`Пустая строка в поле ссылки. Размер: ${size}`, () => { + expect(checkVkAvatarIsDefault({ photo: '', size })).toBeFalsy(); + }); + }); +}); diff --git a/src/__tests__/checkVkPlatform.test.ts b/src/__tests__/checkVkPlatform.test.ts new file mode 100644 index 0000000..640352e --- /dev/null +++ b/src/__tests__/checkVkPlatform.test.ts @@ -0,0 +1,287 @@ +import { checkVkPlatform, VK_PLATFORM_CLASSNAME } from '../checkVkPlatform'; +import { VkPlatformType } from '../types'; + +type MvkDeviceUnion = 'android' | 'iphone' | 'ipad' | 'ipod' | 'desktop'; + +type PlatformToTest = + | Exclude + | `mobile_web_${MvkDeviceUnion}` + | `mvk_external_${MvkDeviceUnion}`; + +const clearCurrentBodyClassList = () => + document.body.classList.remove(...document.body.classList); + +const getExcludedVkPlatformClasses = (toExclude: string[]) => { + const classesToExclude = new Set(Object.values(toExclude)); + + return Object.values(VK_PLATFORM_CLASSNAME).reduce( + (acc, platformClass) => + classesToExclude.has(platformClass) ? acc : [...acc, platformClass], + [] + ); +}; + +const NO_MATTER_USERAGENT = 'NO_MATTER_USERAGENT'; +const MOCK_ANDROID_USERAGENT = 'Mock Android Useragent'; +const MOCK_IPHONE_USERAGENT = 'Mock iPhone Useragent'; +const MOCK_IPAD_USERAGENT = 'Mock iPad Useragent'; +const MOCK_IPOD_USERAGENT = 'Mock iPod Useragent'; + +// https://dev.vk.com/ru/mini-apps/development/launch-params#vk_platform +const vkPlatformCases: Record< + PlatformToTest, + { + vkPlatform: VkPlatformType; + name: string; + userAgent: string; + bodyClassesToExpect: string[]; + } +> = { + desktop_web: { + vkPlatform: 'desktop_web', + name: 'Десктопная версия сайта ВКонтакте', + userAgent: NO_MATTER_USERAGENT, + bodyClassesToExpect: [VK_PLATFORM_CLASSNAME.desktop], + }, + desktop_web_messenger: { + vkPlatform: 'desktop_web_messenger', + name: 'Десктопная версия VK Мессенджера (сайт)', + userAgent: NO_MATTER_USERAGENT, + bodyClassesToExpect: [VK_PLATFORM_CLASSNAME.desktop], + }, + desktop_app_messenger: { + vkPlatform: 'desktop_app_messenger', + name: 'Десктопное приложение VK Мессенджер', + userAgent: NO_MATTER_USERAGENT, + bodyClassesToExpect: [VK_PLATFORM_CLASSNAME.desktop], + }, + mobile_android: { + vkPlatform: 'mobile_android', + name: 'Мобильное приложение ВКонтакте для Android', + userAgent: MOCK_ANDROID_USERAGENT, + bodyClassesToExpect: [ + VK_PLATFORM_CLASSNAME.mobile, + VK_PLATFORM_CLASSNAME.android, + ], + }, + mobile_android_messenger: { + vkPlatform: 'mobile_android_messenger', + name: 'Мобильное приложение VK Мессенджер для Android', + userAgent: MOCK_ANDROID_USERAGENT, + bodyClassesToExpect: [ + VK_PLATFORM_CLASSNAME.mobile, + VK_PLATFORM_CLASSNAME.android, + ], + }, + mobile_ipad: { + vkPlatform: 'mobile_ipad', + name: 'Мобильное приложение ВКонтакте для iPadOS', + userAgent: MOCK_IPAD_USERAGENT, + bodyClassesToExpect: [ + VK_PLATFORM_CLASSNAME.ios, + VK_PLATFORM_CLASSNAME.mobile, + ], + }, + mobile_iphone: { + vkPlatform: 'mobile_iphone', + name: 'Мобильное приложение ВКонтакте для iOS', + userAgent: MOCK_IPHONE_USERAGENT, + bodyClassesToExpect: [ + VK_PLATFORM_CLASSNAME.ios, + VK_PLATFORM_CLASSNAME.mobile, + ], + }, + mobile_iphone_messenger: { + vkPlatform: 'mobile_iphone_messenger', + name: 'Мобильное приложение VK Мессенджер для iOS', + userAgent: MOCK_IPHONE_USERAGENT, + bodyClassesToExpect: [ + VK_PLATFORM_CLASSNAME.ios, + VK_PLATFORM_CLASSNAME.mobile, + ], + }, + mobile_web_desktop: { + vkPlatform: 'mobile_web', + name: 'Мобильная версия сайта ВКонтакте, открытая в десктопном браузере (mvk)', + userAgent: NO_MATTER_USERAGENT, + bodyClassesToExpect: [ + VK_PLATFORM_CLASSNAME.mvk, + VK_PLATFORM_CLASSNAME.mobile, + ], + }, + mobile_web_android: { + vkPlatform: 'mobile_web', + name: 'Мобильная версия сайта ВКонтакте, открытая в мобильном браузере на андроиде', + userAgent: MOCK_ANDROID_USERAGENT, + bodyClassesToExpect: [ + VK_PLATFORM_CLASSNAME.mvk, + VK_PLATFORM_CLASSNAME.mobile, + VK_PLATFORM_CLASSNAME.android, + ], + }, + mobile_web_iphone: { + vkPlatform: 'mobile_web', + name: 'Мобильная версия сайта ВКонтакте, открытая в мобильном браузере на айфоне', + userAgent: MOCK_IPHONE_USERAGENT, + bodyClassesToExpect: [ + VK_PLATFORM_CLASSNAME.mvk, + VK_PLATFORM_CLASSNAME.mobile, + VK_PLATFORM_CLASSNAME.ios, + ], + }, + mobile_web_ipad: { + vkPlatform: 'mobile_web', + name: 'Мобильная версия сайта ВКонтакте, открытая в мобильном браузере на айпаде', + userAgent: MOCK_IPAD_USERAGENT, + bodyClassesToExpect: [ + VK_PLATFORM_CLASSNAME.mvk, + VK_PLATFORM_CLASSNAME.mobile, + VK_PLATFORM_CLASSNAME.ios, + ], + }, + mobile_web_ipod: { + vkPlatform: 'mobile_web', + name: 'Мобильная версия сайта ВКонтакте, открытая в мобильном браузере на айподе', + userAgent: MOCK_IPOD_USERAGENT, + bodyClassesToExpect: [ + VK_PLATFORM_CLASSNAME.mvk, + VK_PLATFORM_CLASSNAME.mobile, + VK_PLATFORM_CLASSNAME.ios, + ], + }, + android_external: { + vkPlatform: 'android_external', + name: 'Внешнее приложение для Android, на котором запущен миниапп', + userAgent: MOCK_ANDROID_USERAGENT, + bodyClassesToExpect: [ + VK_PLATFORM_CLASSNAME.mobile, + VK_PLATFORM_CLASSNAME.android, + ], + }, + iphone_external: { + vkPlatform: 'iphone_external', + name: 'Внешнее приложение для iOS, на котором запущен миниапп', + userAgent: MOCK_IPHONE_USERAGENT, + bodyClassesToExpect: [ + VK_PLATFORM_CLASSNAME.mobile, + VK_PLATFORM_CLASSNAME.ios, + ], + }, + ipad_external: { + vkPlatform: 'ipad_external', + name: 'Внешнее приложение для iPadOS, на котором запущен миниапп', + userAgent: MOCK_IPAD_USERAGENT, + bodyClassesToExpect: [ + VK_PLATFORM_CLASSNAME.mobile, + VK_PLATFORM_CLASSNAME.ios, + ], + }, + web_external: { + vkPlatform: 'web_external', + name: 'Внешний сайт ВК, запущенный на десктопном браузере', + userAgent: NO_MATTER_USERAGENT, + bodyClassesToExpect: [VK_PLATFORM_CLASSNAME.desktop], + }, + mvk_external_desktop: { + vkPlatform: 'mvk_external', + name: 'Cайт, открытый в мобильном браузере на десктопе (mvk)', + userAgent: NO_MATTER_USERAGENT, + bodyClassesToExpect: [ + VK_PLATFORM_CLASSNAME.mobile, + VK_PLATFORM_CLASSNAME.mvk, + ], + }, + mvk_external_android: { + vkPlatform: 'mvk_external', + name: 'Cайт, открытый в мобильном браузере на андроиде', + userAgent: MOCK_ANDROID_USERAGENT, + bodyClassesToExpect: [ + VK_PLATFORM_CLASSNAME.mobile, + VK_PLATFORM_CLASSNAME.mvk, + VK_PLATFORM_CLASSNAME.android, + ], + }, + mvk_external_iphone: { + vkPlatform: 'mvk_external', + name: 'Cайт, открытый в мобильном браузере на iPhone', + userAgent: MOCK_IPHONE_USERAGENT, + bodyClassesToExpect: [ + VK_PLATFORM_CLASSNAME.mobile, + VK_PLATFORM_CLASSNAME.mvk, + VK_PLATFORM_CLASSNAME.ios, + ], + }, + mvk_external_ipad: { + vkPlatform: 'mvk_external', + name: 'Cайт, открытый в мобильном браузере на iPad', + userAgent: MOCK_IPAD_USERAGENT, + bodyClassesToExpect: [ + VK_PLATFORM_CLASSNAME.mobile, + VK_PLATFORM_CLASSNAME.mvk, + VK_PLATFORM_CLASSNAME.ios, + ], + }, + mvk_external_ipod: { + vkPlatform: 'mvk_external', + name: 'Cайт, открытый в мобильном браузере на iPod', + userAgent: MOCK_IPOD_USERAGENT, + bodyClassesToExpect: [ + VK_PLATFORM_CLASSNAME.mobile, + VK_PLATFORM_CLASSNAME.mvk, + VK_PLATFORM_CLASSNAME.ios, + ], + }, +}; + +describe('Функция checkVkPlatform', () => { + let userAgentGetter: jest.SpyInstance; + let initialBodyClassList: DOMTokenList; + + beforeAll(() => { + initialBodyClassList = document.body.classList; + userAgentGetter = jest.spyOn(window.navigator, 'userAgent', 'get'); + + clearCurrentBodyClassList(); + }); + + afterEach(() => { + userAgentGetter.mockClear(); + clearCurrentBodyClassList(); + }); + + afterAll(() => { + document.body.classList.add(...initialBodyClassList); + }); + + Object.values(vkPlatformCases).forEach( + ({ vkPlatform, name, bodyClassesToExpect, userAgent }) => { + it(name, () => { + userAgentGetter.mockReturnValue(userAgent); + + checkVkPlatform(vkPlatform); + + const bodyClasses = [...document.body.classList]; + + expect(bodyClasses).toEqual( + expect.arrayContaining(bodyClassesToExpect) + ); + + expect(bodyClasses).not.toEqual( + expect.arrayContaining( + getExcludedVkPlatformClasses(bodyClassesToExpect) + ) + ); + }); + } + ); + + it('Непередача вк-платформы', () => { + userAgentGetter.mockReturnValue(NO_MATTER_USERAGENT); + + checkVkPlatform(undefined); + + Object.values(VK_PLATFORM_CLASSNAME).forEach((platformClass) => + expect([...document.body.classList]).not.toContain(platformClass) + ); + }); +}); diff --git a/src/__tests__/getVkAccessToken.test.ts b/src/__tests__/getVkAccessToken.test.ts new file mode 100644 index 0000000..85d5d6a --- /dev/null +++ b/src/__tests__/getVkAccessToken.test.ts @@ -0,0 +1,650 @@ +import originalBridge, { + PersonalAuthScope, + ReceiveData, +} from '@vkontakte/vk-bridge'; +import { + ErrorData, + RequestProps, +} from '@vkontakte/vk-bridge/dist/types/src/types/bridge'; +import { ReceiveDataMap } from '@vkontakte/vk-bridge/dist/types/src/types/data'; + +import { + ALLOWED_VK_SCOPES, + checkOneScopesSetIncludesAnother, + getNewVkAccessToken, + getVkAccessToken, + parseVkScopes, +} from '../getVkAccessToken'; +import { GetVkAccessTokenParamsType } from '../types'; + +import { + getRandomElements, + randomNumberUpTo, + randomString, + range, +} from './utils'; + +jest.mock('@vkontakte/vk-bridge'); + +type ScopesPair = { + available: PersonalAuthScope[]; + toRequest: PersonalAuthScope[]; +}; + +const bridge = originalBridge as jest.Mocked; + +const BRIDGE_GET_TOKEN_METHOD = 'VKWebAppGetAuthToken'; + +const MOCK_APP_ID = 9999999; + +const MOCK_SCOPES: PersonalAuthScope[] = ['docs', 'groups']; + +const MOCK_SCOPES_STRING = 'docs,groups'; + +const MOCK_TOKEN = 'MOCK_TOKEN'; + +const MOCK_AVAILABLE_TOKEN = 'MOCK_AVAILABLE_TOKEN'; + +const MOCK_TOKEN_ANSWER: ReceiveDataMap['VKWebAppGetAuthToken'] = { + access_token: 'MOCK_TOKEN', + scope: 'MOCK_SCOPE', +}; + +const MOCK_ANY_ERROR: ErrorData = { + error_type: 'api_error', + error_data: { + error_code: randomNumberUpTo(100), + error_msg: randomString(10), + request_params: range(3).map(() => randomString(3)), + }, +}; + +const getRandomScopes = (count: number) => + getRandomElements(ALLOWED_VK_SCOPES, count); + +/** + * Получить три количества скоупов для дальнейшего парсинга случайных скоупов: + * * Один скоуп (минимальное количество) + * * Случайное количество от 2 до 11 включительно + * * 12 скоупов (максимальное количество) + */ +const getScopesCounts = () => [ + 1, + 2 + randomNumberUpTo(ALLOWED_VK_SCOPES.length - 2), + ALLOWED_VK_SCOPES.length, +]; + +/** + * Получить полностью непересекающиеся множества имеющихся и запрашиваемых скоупов. + * Исключается случай, когда имеющися скоуп пустой + */ +const getNonOverlappingScopes = (): ScopesPair[] => [ + { available: ['stats'], toRequest: ['docs'] }, + { available: ['docs', 'groups', 'video'], toRequest: ['status'] }, + { available: ['docs'], toRequest: ['status', 'groups', 'stories'] }, +]; + +/** + * Получить множества имеющихся и запрашиваемых скоупов, + * где запрашиваемый скоуп является подмножеством имеющегося. + */ +const getScopesWithRequestPartlyOverlapping = (): ScopesPair[] => [ + { available: ['stats', 'docs'], toRequest: ['docs'] }, + { available: ['stats', 'docs', 'groups'], toRequest: ['docs', 'groups'] }, + { + available: ['stats', 'docs', 'groups', 'market'], + toRequest: ['groups', 'market'], + }, +]; + +/** + * Получить множества имеющихся и запрашиваемых скоупов, + * где имеющийся (доступный) скоуп является подмножеством запрашиваемого. + */ +const getScopesWithAvailablePartlyOverlapping = (): ScopesPair[] => [ + { available: ['docs'], toRequest: ['stats', 'docs'] }, + { available: ['docs', 'groups'], toRequest: ['stats', 'docs', 'groups'] }, + { + available: ['groups', 'market'], + toRequest: ['stats', 'docs', 'groups', 'market'], + }, +]; + +/** + * Получить пары запрашиваемых и получаемых скоупов + */ +const getRequestToResultScopes = (): { + requestScopes: PersonalAuthScope[]; + resultScopes: PersonalAuthScope[]; +}[] => [ + { + requestScopes: ['docs', 'friends', 'status'], + resultScopes: ['docs'], + }, + { + requestScopes: ['docs', 'friends', 'status'], + resultScopes: ['docs', 'friends'], + }, +]; + +const getUserDeniedError = (): ErrorData => ({ + error_type: 'client_error', + error_data: { + error_reason: 'User denied', + error_code: 4, + }, +}); + +describe('Функция parseVkScopes', () => { + getScopesCounts().forEach((count) => { + it(`Правильный парсинг скоупов, количество скоупов: ${count}`, () => { + const randomScopes = getRandomScopes(count); + const scopesString = randomScopes.join(','); + + expect(parseVkScopes(scopesString)).toEqual(randomScopes); + }); + }); + + [', ', ' ,', ' ', ';'].forEach((join) => { + it(`Неправильный разделитель строк: "${join}"`, () => { + const scopes = getRandomScopes(6); + const scopesString = scopes.join(join); + + expect(parseVkScopes(scopesString)).not.toEqual(scopes); + }); + }); + + it('Пустая строка', () => { + expect(parseVkScopes('')).toEqual([]); + }); + + it('Случайная строка', () => { + expect(parseVkScopes(randomString(20))).toEqual([]); + }); + + it('Строка с разделёнными запятыми случайными строками', () => { + const incorrectScopes = range(10) + .map(() => randomString(5)) + .join(','); + + expect(parseVkScopes(incorrectScopes)).not.toEqual(incorrectScopes); + }); +}); + +describe('Функция checkOneScopesSetIncludesAnother', () => { + getScopesCounts().forEach((count) => { + it(`Правильное сравнение одинаковых наборов скоупов, количество скоупов: ${count}`, () => { + const scopes = getRandomScopes(count); + + expect( + checkOneScopesSetIncludesAnother(new Set(scopes), new Set(scopes)) + ).toBeTruthy(); + }); + }); + + it('Один скоуп является подмножеством другого', () => { + const scopeA: PersonalAuthScope[] = ['stats', 'groups', 'stories', 'notes']; + const scopeB = scopeA.slice(-1); + + expect( + checkOneScopesSetIncludesAnother(new Set(scopeA), new Set(scopeB)) + ).toBeFalsy(); + }); + + it('Полностью несовпадающие наборы скоупов', () => { + const scopeA: PersonalAuthScope[] = ['stats', 'groups', 'stories', 'notes']; + const scopeB: PersonalAuthScope[] = ['friends', 'docs', 'video', 'status']; + + expect( + checkOneScopesSetIncludesAnother(new Set(scopeA), new Set(scopeB)) + ).toBeFalsy(); + }); + + it('Первый набор скоупов пустой', () => { + const scopeA: PersonalAuthScope[] = []; + const scopeB: PersonalAuthScope[] = ['friends', 'docs', 'video', 'status']; + + expect( + checkOneScopesSetIncludesAnother(new Set(scopeA), new Set(scopeB)) + ).toBeTruthy(); + }); + + it('Второй набор скоупов пустой', () => { + const scopeA: PersonalAuthScope[] = ['stats', 'groups', 'stories', 'notes']; + const scopeB: PersonalAuthScope[] = []; + + expect( + checkOneScopesSetIncludesAnother(new Set(scopeA), new Set(scopeB)) + ).toBeFalsy(); + }); +}); + +describe('Функция getNewVkAccessToken', () => { + afterEach(() => { + bridge.send.mockClear(); + }); + + beforeEach(() => { + // Гарантированно замокать имплементацию + bridge.send.mockImplementation(() => Promise.resolve()); + }); + + [0, ...getScopesCounts()].forEach((count) => { + it(`Получение токена по переданным скоупам, количество скоупов: ${count}`, async () => { + bridge.send.mockImplementation(() => Promise.resolve(MOCK_TOKEN_ANSWER)); + + const result = await getNewVkAccessToken({ + appId: MOCK_APP_ID, + scopes: getRandomScopes(count), + }); + + expect(result).toEqual(MOCK_TOKEN_ANSWER); + expect(bridge.send).toBeCalledTimes(1); + }); + }); + + [0, ...getScopesCounts()].forEach((count) => { + it('В бридж передаётся строка со скоупами, переданными в массиве в аргументе', async () => { + bridge.send.mockImplementation(() => Promise.resolve(MOCK_TOKEN_ANSWER)); + + const sortedInputScopes = getRandomScopes(count).sort(); + const sortedInputScopesString = sortedInputScopes.join(','); + + const result = await getNewVkAccessToken({ + appId: MOCK_APP_ID, + scopes: sortedInputScopes, + }); + + const bridgeScopesStringCalledWith = bridge.send.mock + .calls[0][1] as RequestProps<'VKWebAppGetAuthToken'>; + const bridgeScopesCalledWith = bridgeScopesStringCalledWith.scope + .split(',') + .sort() + .join(','); + + expect(result).toEqual(MOCK_TOKEN_ANSWER); + expect(bridge.send).toBeCalledTimes(1); + expect(sortedInputScopesString).toEqual(bridgeScopesCalledWith); + }); + }); + + it('Ошибка возвращается', async () => { + bridge.send.mockImplementation(() => { + throw MOCK_ANY_ERROR; + }); + + const result = await getNewVkAccessToken({ + appId: MOCK_APP_ID, + scopes: MOCK_SCOPES, + }); + + expect(result).toEqual(MOCK_ANY_ERROR); + expect(bridge.send).toBeCalledTimes(1); + }); + + it('В бридж передаётся id приложения', async () => { + bridge.send.mockImplementation(() => Promise.resolve(MOCK_TOKEN_ANSWER)); + + const result = await getNewVkAccessToken({ + appId: MOCK_APP_ID, + scopes: MOCK_SCOPES, + }); + + expect(result).toEqual(MOCK_TOKEN_ANSWER); + expect(bridge.send).toBeCalledTimes(1); + expect(bridge.send).toHaveBeenCalledWith( + expect.anything(), + expect.objectContaining({ + app_id: MOCK_APP_ID, + }) + ); + }); + + it('Бридж вызывает метод для получения токена', async () => { + bridge.send.mockImplementation(() => Promise.resolve(MOCK_TOKEN_ANSWER)); + + const result = await getNewVkAccessToken({ + appId: MOCK_APP_ID, + scopes: MOCK_SCOPES, + }); + + expect(result).toEqual(MOCK_TOKEN_ANSWER); + expect(bridge.send).toBeCalledTimes(1); + expect(bridge.send).toHaveBeenCalledWith( + BRIDGE_GET_TOKEN_METHOD, + expect.anything() + ); + }); +}); + +describe('Функция getVkAccessToken', () => { + const mockOnUserDeniedSomeScopes = jest.fn(); + const mockOnUserDeniedAll = jest.fn(); + const mockOnErrorOccurred = jest.fn(); + + const getErrorCallbacks = (): Pick< + GetVkAccessTokenParamsType, + 'onErrorOccurred' | 'onUserDeniedSomeScopes' | 'onUserDeniedAll' + > => ({ + onErrorOccurred: mockOnErrorOccurred, + onUserDeniedAll: mockOnUserDeniedAll, + onUserDeniedSomeScopes: mockOnUserDeniedSomeScopes, + }); + + const expectNoErrorsOccurred = () => { + expect(mockOnUserDeniedSomeScopes).not.toHaveBeenCalled(); + expect(mockOnUserDeniedAll).not.toHaveBeenCalled(); + expect(mockOnErrorOccurred).not.toHaveBeenCalled(); + }; + + beforeAll(() => { + window.access_token = undefined; + window.scope = undefined; + }); + + beforeEach(() => { + // Гарантированно замокать имплементацию + bridge.send.mockImplementation(() => Promise.resolve()); + }); + + afterEach(() => { + bridge.send.mockClear(); + window.access_token = undefined; + window.scope = undefined; + mockOnUserDeniedSomeScopes.mockClear(); + mockOnUserDeniedAll.mockClear(); + mockOnErrorOccurred.mockClear(); + }); + + [0, ...getScopesCounts()].forEach((count) => { + it( + 'Успешный запрос за токеном при отсутствии ' + + 'доступных токена и скоупов (поля в window равны undefined). ' + + `Количество запрашиваемых скоупов: ${count}`, + async () => { + const scopes = getRandomScopes(count).sort(); + const scopesString = scopes.join(','); + + bridge.send.mockImplementation(() => + Promise.resolve>({ + scope: scopesString, + access_token: MOCK_TOKEN, + ...getErrorCallbacks(), + }) + ); + + const result = await getVkAccessToken({ + scopes, + appId: MOCK_APP_ID, + }); + + expect(result).toEqual(MOCK_TOKEN); + expect(window.scope?.split(',').sort().join(',')).toBe(scopesString); + expect(window.access_token).toBe(MOCK_TOKEN); + expect(bridge.send).toHaveBeenCalledTimes(1); + expectNoErrorsOccurred(); + } + ); + }); + + [ + ...getNonOverlappingScopes(), + ...getScopesWithAvailablePartlyOverlapping(), + ].forEach(({ toRequest, available }) => { + it( + 'Успешный запрос. Множество имеющихся скоупов ' + + 'полностью не совпадает с множеством запрашиваемых скоупов ' + + 'или множество имеющихся скоупов является подножеством запрашиваемых. ' + + `Имеющиеся скоупы: ${available}. Запрашиваемые скоупы: ${toRequest}`, + async () => { + window.access_token = MOCK_AVAILABLE_TOKEN; + window.scope = available.join(','); + + const resultScopes = [...new Set([...toRequest, ...available])].sort(); + const resultScopesString = resultScopes.join(','); + + bridge.send.mockImplementation(() => + Promise.resolve>({ + scope: resultScopesString, + access_token: MOCK_TOKEN, + ...getErrorCallbacks(), + }) + ); + + const result = await getVkAccessToken({ + scopes: toRequest, + appId: MOCK_APP_ID, + }); + + expect(result).toEqual(MOCK_TOKEN); + expect(window.scope?.split(',').sort().join(',')).toBe( + resultScopesString + ); + expect(window.access_token).toBe(MOCK_TOKEN); + expect(bridge.send).toHaveBeenCalledTimes(1); + expectNoErrorsOccurred(); + } + ); + }); + + [...getScopesWithRequestPartlyOverlapping()].forEach( + ({ toRequest, available }) => { + it( + 'Успешный запрос. Множество запрашиваемых скоупов ' + + 'является подмножеством имеющихся скоупов. ' + + `Имеющиеся скоупы: ${available}. Запрашиваемые скоупы: ${toRequest}`, + async () => { + window.access_token = MOCK_AVAILABLE_TOKEN; + window.scope = available.join(','); + + const resultScopes = [ + ...new Set([...toRequest, ...available]), + ].sort(); + const resultScopesString = resultScopes.join(','); + + bridge.send.mockImplementation(() => + Promise.resolve>({ + scope: resultScopesString, + access_token: MOCK_AVAILABLE_TOKEN, + }) + ); + + const result = await getVkAccessToken({ + scopes: toRequest, + appId: MOCK_APP_ID, + ...getErrorCallbacks(), + }); + + expect(result).toEqual(MOCK_AVAILABLE_TOKEN); + expect(window.scope?.split(',').sort().join(',')).toBe( + resultScopesString + ); + expect(window.access_token).toBe(MOCK_AVAILABLE_TOKEN); + expect(bridge.send).toHaveBeenCalledTimes(0); + expectNoErrorsOccurred(); + } + ); + } + ); + + getScopesCounts().forEach((count) => { + it( + 'Запрашивается пустое множество скоупов при уже имеющемся множестве скоупов. ' + + `Количество доступных скоупов: ${count}`, + async () => { + const availableScopes = getRandomScopes(count).sort(); + const availableScopesString = availableScopes.join(','); + + window.access_token = MOCK_AVAILABLE_TOKEN; + window.scope = availableScopesString; + + bridge.send.mockImplementation(() => + Promise.resolve>({ + scope: availableScopesString, + access_token: MOCK_AVAILABLE_TOKEN, + }) + ); + + const result = await getVkAccessToken({ + scopes: [], + appId: MOCK_APP_ID, + ...getErrorCallbacks(), + }); + + expect(result).toEqual(MOCK_AVAILABLE_TOKEN); + expect(window.scope?.split(',').sort().join(',')).toBe( + availableScopesString + ); + expect(window.access_token).toBe(MOCK_AVAILABLE_TOKEN); + expect(bridge.send).toHaveBeenCalledTimes(0); + expectNoErrorsOccurred(); + } + ); + }); + + getScopesCounts().forEach((count) => { + it( + 'Запрашивается множество скоупов при уже имеющемся пустом множестве скоупов. ' + + `Количество запрашиваемых скоупов: ${count}`, + async () => { + const requestScopes = getRandomScopes(count).sort(); + const requestScopesString = requestScopes.join(','); + + window.access_token = ''; + window.scope = ''; + + bridge.send.mockImplementation(() => + Promise.resolve>({ + scope: requestScopesString, + access_token: MOCK_TOKEN, + }) + ); + + const result = await getVkAccessToken({ + scopes: requestScopes, + appId: MOCK_APP_ID, + ...getErrorCallbacks(), + }); + + expect(result).toEqual(MOCK_TOKEN); + expect(window.scope?.split(',').sort().join(',')).toBe( + requestScopesString + ); + expect(window.access_token).toBe(MOCK_TOKEN); + expect(bridge.send).toHaveBeenCalledTimes(1); + expectNoErrorsOccurred(); + } + ); + }); + + it('Доступное и запрашиваемое множества скоупов пустые', async () => { + window.access_token = ''; + window.scope = ''; + + bridge.send.mockImplementation(() => + Promise.resolve>({ + scope: '', + access_token: '', + }) + ); + + const result = await getVkAccessToken({ + scopes: [], + appId: MOCK_APP_ID, + ...getErrorCallbacks(), + }); + + expect(result).toEqual(''); + expect(window.scope?.split(',').sort().join(',')).toBe(''); + expect(window.access_token).toBe(''); + expect(bridge.send).toHaveBeenCalledTimes(1); + expectNoErrorsOccurred(); + }); + + getScopesCounts().forEach((count) => { + it(`Отказ от всех скоупов. Количество скоупов: ${count}`, async () => { + const requestScopes = getRandomScopes(count); + + window.access_token = MOCK_AVAILABLE_TOKEN; + window.scope = MOCK_SCOPES_STRING; + + const deniedAllError = getUserDeniedError(); + + bridge.send.mockImplementation(() => { + throw deniedAllError; + }); + + const result = await getVkAccessToken({ + scopes: requestScopes, + appId: MOCK_APP_ID, + ...getErrorCallbacks(), + }); + + expect(result).toEqual(null); + expect(window.scope).toBe(MOCK_SCOPES_STRING); + expect(window.access_token).toBe(MOCK_AVAILABLE_TOKEN); + expect(bridge.send).toHaveBeenCalledTimes(1); + + expect(mockOnUserDeniedSomeScopes).not.toHaveBeenCalled(); + expect(mockOnErrorOccurred).not.toHaveBeenCalled(); + expect(mockOnUserDeniedAll).toHaveBeenCalledWith(deniedAllError); + }); + }); + + getRequestToResultScopes().forEach(({ requestScopes, resultScopes }) => { + it( + 'Отказ от одного или нескольких скоупов. ' + + `Запрашиваемые: ${requestScopes}. Разрешаемые: ${resultScopes}`, + async () => { + window.access_token = MOCK_AVAILABLE_TOKEN; + window.scope = MOCK_SCOPES_STRING; + + bridge.send.mockImplementation(() => + Promise.resolve>({ + access_token: MOCK_AVAILABLE_TOKEN, + scope: resultScopes.join(','), + }) + ); + + const result = await getVkAccessToken({ + scopes: requestScopes, + appId: MOCK_APP_ID, + ...getErrorCallbacks(), + }); + + expect(result).toEqual(null); + expect(window.scope).toBe(MOCK_SCOPES_STRING); + expect(window.access_token).toBe(MOCK_AVAILABLE_TOKEN); + expect(bridge.send).toHaveBeenCalledTimes(1); + + expect(mockOnUserDeniedSomeScopes).toHaveBeenCalledTimes(1); + expect(mockOnErrorOccurred).not.toHaveBeenCalled(); + expect(mockOnUserDeniedAll).not.toHaveBeenCalled(); + } + ); + }); + + it('Неизвестная ошибка', async () => { + window.access_token = MOCK_AVAILABLE_TOKEN; + window.scope = MOCK_SCOPES_STRING; + + bridge.send.mockImplementation(() => { + throw MOCK_ANY_ERROR; + }); + + const result = await getVkAccessToken({ + scopes: ['docs', 'market', 'video'], + appId: MOCK_APP_ID, + ...getErrorCallbacks(), + }); + + expect(result).toEqual(null); + expect(window.scope).toBe(MOCK_SCOPES_STRING); + expect(window.access_token).toBe(MOCK_AVAILABLE_TOKEN); + expect(bridge.send).toHaveBeenCalledTimes(1); + + expect(mockOnUserDeniedSomeScopes).not.toHaveBeenCalled(); + expect(mockOnErrorOccurred).toHaveBeenCalledWith(MOCK_ANY_ERROR); + expect(mockOnUserDeniedAll).not.toHaveBeenCalled(); + }); +}); diff --git a/src/__tests__/utils/getRandomElements.ts b/src/__tests__/utils/getRandomElements.ts new file mode 100644 index 0000000..b58e896 --- /dev/null +++ b/src/__tests__/utils/getRandomElements.ts @@ -0,0 +1,4 @@ +import { shuffle } from './shuffle'; + +export const getRandomElements = (array: T[], count: number): T[] => + shuffle(array).slice(0, Math.min(array.length, count)); diff --git a/src/__tests__/utils/index.ts b/src/__tests__/utils/index.ts index 17e9b2a..05ef6c8 100644 --- a/src/__tests__/utils/index.ts +++ b/src/__tests__/utils/index.ts @@ -3,3 +3,7 @@ export * from './randomNumberUpTo'; export * from './range'; export * from './randomString'; + +export * from './shuffle'; + +export * from './getRandomElements'; diff --git a/src/__tests__/utils/shuffle.ts b/src/__tests__/utils/shuffle.ts new file mode 100644 index 0000000..239e11e --- /dev/null +++ b/src/__tests__/utils/shuffle.ts @@ -0,0 +1,2 @@ +export const shuffle = (array: T[]): T[] => + array.sort(() => 0.5 - Math.random()); From 8327a7ff66d8179239786752726eab597d4a6198 Mon Sep 17 00:00:00 2001 From: "d.ragozin" Date: Mon, 15 Jan 2024 20:45:34 +0300 Subject: [PATCH 14/46] =?UTF-8?q?[+]=20=D0=A2=D0=B5=D1=81=D1=82=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Функция shareVkStory * Функция setVkViewSettings * Хук useEventSubscribe * Хук usePolling --- package.json | 3 + src/__tests__/setVkViewSettings.test.ts | 159 ++++++++ src/__tests__/shareVkStory.test.ts | 129 +++++++ src/__tests__/useEventSubscribe.test.ts | 73 ++++ src/__tests__/usePolling.test.ts | 276 +++++++++++++ src/setVkViewSettings.ts | 9 +- src/shareVkPost.ts | 3 + src/types/shareVkPost.ts | 1 + yarn.lock | 492 +++++++++++++++++++++++- 9 files changed, 1140 insertions(+), 5 deletions(-) create mode 100644 src/__tests__/setVkViewSettings.test.ts create mode 100644 src/__tests__/shareVkStory.test.ts create mode 100644 src/__tests__/useEventSubscribe.test.ts create mode 100644 src/__tests__/usePolling.test.ts diff --git a/package.json b/package.json index 7ec6890..ae7ec82 100644 --- a/package.json +++ b/package.json @@ -56,6 +56,8 @@ "@rollup/plugin-typescript": "^11.0.0", "@swc/core": "^1.3.102", "@swc/jest": "^0.2.29", + "@testing-library/jest-dom": "^6.2.0", + "@testing-library/react": "^14.1.2", "@types/jest": "^29.5.11", "@types/node": "^16.4.0", "@types/react": ">=17", @@ -74,6 +76,7 @@ "lint-staged": "^11.0.0", "prettier": "^2.2.1", "react": ">=17", + "react-dom": ">=17", "rollup": "^3.10.1", "rollup-plugin-peer-deps-external": "^2.2.4", "ts-node": "^10.9.2", diff --git a/src/__tests__/setVkViewSettings.test.ts b/src/__tests__/setVkViewSettings.test.ts new file mode 100644 index 0000000..e21ffda --- /dev/null +++ b/src/__tests__/setVkViewSettings.test.ts @@ -0,0 +1,159 @@ +import originalBridge, { ReceiveData } from '@vkontakte/vk-bridge'; +import { ErrorData } from '@vkontakte/vk-bridge/dist/types/src/types/bridge'; + +import { SetViewSettingsPropsType, VkPlatformType } from '../types'; +import { setVkViewSettings } from '../setVkViewSettings'; + +import { randomNumberUpTo, randomString, range } from './utils'; + +jest.mock('@vkontakte/vk-bridge'); + +const bridge = originalBridge as jest.Mocked; + +const BRIDGE_SET_VIEW_SETTINGS_METHOD = 'VKWebAppSetViewSettings'; + +const VK_PLATFORM_WITH_ALL_VIEW_SETTINGS: VkPlatformType = 'mobile_android'; + +const VK_PLATFORMS_WITHOUT_VIEW_SETTINGS: VkPlatformType[] = [ + 'desktop_web', + 'desktop_web_messenger', + 'desktop_app_messenger', + 'mobile_web', + 'android_external', + 'iphone_external', + 'ipad_external', + 'web_external', + 'mvk_external', +]; + +// Todo: Когда будет ясно, что mobile_android_messenger поддерживает view settings, +// включить эту платформу в этот массив +const VK_ANDROID_PLATFORMS_WITH_VIEW_SETTINGS: VkPlatformType[] = [ + 'mobile_android', +]; + +// Todo: Когда будет ясно, что mobile_iphone_messenger поддерживает view settings, +// включить эту платформу в этот массив +const VK_IOS_PLATFORMS_WITH_VIEW_SETTINGS: VkPlatformType[] = [ + 'mobile_iphone', + 'mobile_ipad', +]; + +const MOCK_VK_VIEW_SETTINGS: SetViewSettingsPropsType = { + status_bar_style: 'light', + navigation_bar_color: '#000000', + action_bar_color: '#000000', +}; + +const MOCK_BRIDGE_SUCCESS_RESULT: ReceiveData<'VKWebAppSetViewSettings'> = { + result: true, +}; + +const MOCK_ANY_ERROR: ErrorData = { + error_type: 'api_error', + error_data: { + error_code: randomNumberUpTo(100), + error_msg: randomString(10), + request_params: range(3).map(() => randomString(3)), + }, +}; + +describe('setVkViewSettings', () => { + afterEach(() => { + bridge.send.mockClear(); + bridge.supports.mockClear(); + }); + + beforeEach(() => { + // Гарантированно замокать имплементацию + bridge.send.mockImplementation(() => Promise.resolve()); + }); + + VK_PLATFORMS_WITHOUT_VIEW_SETTINGS.forEach((platform) => { + it(`Платформа, не поддерживающая view settings: ${platform}`, async () => { + const result = await setVkViewSettings(MOCK_VK_VIEW_SETTINGS, platform); + + expect(result).toBe(undefined); + expect(bridge.send).not.toHaveBeenCalled(); + }); + }); + + VK_ANDROID_PLATFORMS_WITH_VIEW_SETTINGS.forEach((platform) => { + it(`Платформа, поддерживающая все view settings: ${platform}`, async () => { + bridge.supports.mockImplementation(() => true); + + bridge.send.mockImplementation(() => + Promise.resolve(MOCK_BRIDGE_SUCCESS_RESULT) + ); + + const result = await setVkViewSettings(MOCK_VK_VIEW_SETTINGS, platform); + + expect(result).toEqual(MOCK_BRIDGE_SUCCESS_RESULT); + expect(bridge.send).toHaveBeenCalledWith( + BRIDGE_SET_VIEW_SETTINGS_METHOD, + expect.objectContaining(MOCK_VK_VIEW_SETTINGS) + ); + }); + }); + + VK_IOS_PLATFORMS_WITH_VIEW_SETTINGS.forEach((platform) => { + it(`Платформа, поддерживающая view settings (только окраску статусбара): ${platform}`, async () => { + bridge.supports.mockImplementation(() => true); + + bridge.send.mockImplementation(() => + Promise.resolve(MOCK_BRIDGE_SUCCESS_RESULT) + ); + + const result = await setVkViewSettings(MOCK_VK_VIEW_SETTINGS, platform); + + expect(result).toEqual(MOCK_BRIDGE_SUCCESS_RESULT); + + expect(bridge.send).toBeCalled(); + + // eslint-disable-next-line prefer-destructuring + const [firstArg, secondArg] = bridge.send.mock.calls[0]; + + expect(firstArg).toBe(BRIDGE_SET_VIEW_SETTINGS_METHOD); + + expect(secondArg).toEqual< + Pick + >({ + status_bar_style: MOCK_VK_VIEW_SETTINGS.status_bar_style, + }); + }); + }); + + it('Неизвестная ошибка bridge.supports', async () => { + bridge.supports.mockImplementation(() => { + throw MOCK_ANY_ERROR; + }); + + bridge.send.mockImplementation(() => + Promise.resolve(MOCK_BRIDGE_SUCCESS_RESULT) + ); + + const result = await setVkViewSettings( + MOCK_VK_VIEW_SETTINGS, + VK_PLATFORM_WITH_ALL_VIEW_SETTINGS + ); + + expect(result).toEqual(MOCK_ANY_ERROR); + expect(bridge.send).not.toHaveBeenCalled(); + }); + + it('Неизвестная ошибка bridge.send', async () => { + bridge.supports.mockImplementation(() => true); + + bridge.send.mockImplementation(() => { + throw MOCK_ANY_ERROR; + }); + + const result = await setVkViewSettings( + MOCK_VK_VIEW_SETTINGS, + VK_PLATFORM_WITH_ALL_VIEW_SETTINGS + ); + + expect(result).toEqual(MOCK_ANY_ERROR); + expect(bridge.send).toHaveBeenCalled(); + }); +}); diff --git a/src/__tests__/shareVkStory.test.ts b/src/__tests__/shareVkStory.test.ts new file mode 100644 index 0000000..597056c --- /dev/null +++ b/src/__tests__/shareVkStory.test.ts @@ -0,0 +1,129 @@ +import originalBridge, { ReceiveData } from '@vkontakte/vk-bridge'; + +import { ShareVkStoryPropsType } from '../types'; +import { shareVkStory } from '../shareVkStory'; + +jest.mock('@vkontakte/vk-bridge'); + +const bridge = originalBridge as jest.Mocked; + +const VK_BRIDGE_SHARE_STORY_METHOD = 'VKWebAppShowStoryBox'; + +const MOCK_STORY_BACKGROUND_TYPE = 'none'; + +const MOCK_STORY_LOCKED_PARAM = true; + +const MOCK_STORY_BLOB = 'MOCK_STORY_BLOB'; + +const MOCK_STORY_URL = 'MOCK_STORY_URL'; + +const MOCK_STORY_ATTACHMENT: ShareVkStoryPropsType['attachment'] = { + type: 'audio', + url: 'MOCK_STORY_ATTACHMENT.url', + text: 'MOCK_STORY_ATTACHMENT.text', + id: 0, + owner_id: 0, + access_key: 'MOCK_STORY_ATTACHMENT.access_key', +}; + +const getMockShareStoryParams = ( + props: { url: string } | { blob: string } +): ShareVkStoryPropsType => ({ + attachment: MOCK_STORY_ATTACHMENT, + locked: MOCK_STORY_LOCKED_PARAM, + background_type: MOCK_STORY_BACKGROUND_TYPE, + ...props, +}); + +const MOCK_SHARE_STORY_BRIDGE_SUCCESS_RESULT: ReceiveData<'VKWebAppShowStoryBox'> = + { + result: true, + }; + +describe('Функция shareVkStory', () => { + afterEach(() => { + bridge.send.mockClear(); + }); + + beforeEach(() => { + // Гарантированно замокать имплементацию + bridge.send.mockImplementation(() => Promise.resolve()); + }); + + it('Успешное выполнение, источник картинки — URL', async () => { + bridge.send.mockImplementation(() => + Promise.resolve(MOCK_SHARE_STORY_BRIDGE_SUCCESS_RESULT) + ); + + const result = await shareVkStory( + getMockShareStoryParams({ url: MOCK_STORY_URL }) + ); + + expect(result).toEqual(MOCK_SHARE_STORY_BRIDGE_SUCCESS_RESULT); + + expect(bridge.send).toBeCalledWith( + VK_BRIDGE_SHARE_STORY_METHOD, + expect.objectContaining({ + url: MOCK_STORY_URL, + }) + ); + + expect(bridge.send).toBeCalledWith( + VK_BRIDGE_SHARE_STORY_METHOD, + expect.not.objectContaining({ + blob: expect.anything(), + }) + ); + }); + + it('Успешное выполнение, источник картинки — BLOB', async () => { + bridge.send.mockImplementation(() => + Promise.resolve(MOCK_SHARE_STORY_BRIDGE_SUCCESS_RESULT) + ); + + const result = await shareVkStory( + getMockShareStoryParams({ blob: MOCK_STORY_BLOB }) + ); + + expect(result).toEqual(MOCK_SHARE_STORY_BRIDGE_SUCCESS_RESULT); + + expect(bridge.send).toBeCalledWith( + VK_BRIDGE_SHARE_STORY_METHOD, + expect.objectContaining({ + blob: MOCK_STORY_BLOB, + }) + ); + + expect(bridge.send).toBeCalledWith( + VK_BRIDGE_SHARE_STORY_METHOD, + expect.not.objectContaining({ + url: expect.anything(), + }) + ); + }); + + it('Все параметры, кроме источника картинки, передаются в бридж', async () => { + bridge.send.mockImplementation(() => + Promise.resolve(MOCK_SHARE_STORY_BRIDGE_SUCCESS_RESULT) + ); + + const result = await shareVkStory({ + url: MOCK_STORY_URL, + attachment: MOCK_STORY_ATTACHMENT, + locked: MOCK_STORY_LOCKED_PARAM, + background_type: MOCK_STORY_BACKGROUND_TYPE, + }); + + expect(result).toEqual(MOCK_SHARE_STORY_BRIDGE_SUCCESS_RESULT); + + expect(bridge.send).toBeCalledWith( + VK_BRIDGE_SHARE_STORY_METHOD, + expect.objectContaining({ + url: MOCK_STORY_URL, + locked: MOCK_STORY_LOCKED_PARAM, + background_type: MOCK_STORY_BACKGROUND_TYPE, + attachment: MOCK_STORY_ATTACHMENT, + }) + ); + }); +}); diff --git a/src/__tests__/useEventSubscribe.test.ts b/src/__tests__/useEventSubscribe.test.ts new file mode 100644 index 0000000..197113c --- /dev/null +++ b/src/__tests__/useEventSubscribe.test.ts @@ -0,0 +1,73 @@ +import originalBridge from '@vkontakte/vk-bridge'; +import { renderHook } from '@testing-library/react'; + +import { useEventSubscribe } from '../hooks'; + +jest.mock('@vkontakte/vk-bridge'); + +const bridge = originalBridge as jest.Mocked; + +const MOCK_BRIDGE_EVENT = 'VKWebAppInit'; + +describe('Хук useEventSubscribe', () => { + const mockCallback = jest.fn(); + + afterEach(() => { + bridge.subscribe.mockClear(); + bridge.unsubscribe.mockClear(); + mockCallback.mockClear(); + }); + + beforeEach(() => { + // Гарантированно замокать имплементацию + bridge.subscribe.mockImplementation(() => undefined); + bridge.unsubscribe.mockImplementation(() => undefined); + }); + + it('Происходит подписка и отписка при монтировании и размонтировании соответственно', () => { + const { unmount } = renderHook(() => + useEventSubscribe(MOCK_BRIDGE_EVENT, mockCallback) + ); + + expect(bridge.subscribe).toBeCalledTimes(1); + + // eslint-disable-next-line prefer-destructuring + const listener = bridge.subscribe.mock.calls[0][0]; + + unmount(); + + expect(bridge.unsubscribe).toBeCalledTimes(1); + expect(bridge.unsubscribe).toBeCalledWith(listener); + }); + + it('Происходит подписка и отписка при изменении аргумента с зависимостями', () => { + const { rerender } = renderHook( + ({ deps }) => useEventSubscribe(MOCK_BRIDGE_EVENT, mockCallback, deps), + { initialProps: { deps: [1, 2, 3] } } + ); + + expect(bridge.subscribe).toBeCalledTimes(1); + + // eslint-disable-next-line prefer-destructuring + const firstListener = bridge.subscribe.mock.calls[0][0]; + + rerender({ deps: [1, 2, 4] }); + + expect(bridge.unsubscribe).toBeCalledTimes(1); + expect(bridge.unsubscribe).toHaveBeenLastCalledWith(firstListener); + + expect(bridge.subscribe).toBeCalledTimes(2); + expect(bridge.subscribe).not.toHaveBeenLastCalledWith(firstListener); + + // eslint-disable-next-line prefer-destructuring + const secondListener = bridge.subscribe.mock.calls[1][0]; + + rerender({ deps: [1, 2, 5] }); + + expect(bridge.unsubscribe).toBeCalledTimes(2); + expect(bridge.unsubscribe).toBeCalledWith(secondListener); + + expect(bridge.subscribe).toBeCalledTimes(3); + expect(bridge.subscribe).not.toHaveBeenLastCalledWith(secondListener); + }); +}); diff --git a/src/__tests__/usePolling.test.ts b/src/__tests__/usePolling.test.ts new file mode 100644 index 0000000..694f617 --- /dev/null +++ b/src/__tests__/usePolling.test.ts @@ -0,0 +1,276 @@ +import { renderHook } from '@testing-library/react'; +import originalBridge from '@vkontakte/vk-bridge'; + +import { usePolling } from '../hooks'; + +jest.mock('@vkontakte/vk-bridge'); + +const bridge = originalBridge as jest.Mocked; + +const DEFAULT_POLLING_INTERVAL_S = 60; +const DEFAULT_POLLING_INTERVAL_MS = 1000 * DEFAULT_POLLING_INTERVAL_S; + +type UsePollingProps = { + condition?: boolean; + pollingInterval?: number; +}; + +jest.useFakeTimers(); + +beforeEach(() => { + jest.useFakeTimers(); + + // Гарантированно замокать имплементацию + bridge.subscribe.mockImplementation(() => undefined); + bridge.unsubscribe.mockImplementation(() => undefined); +}); + +afterEach(() => { + jest.useRealTimers(); + jest.restoreAllMocks(); + + bridge.subscribe.mockClear(); + bridge.unsubscribe.mockClear(); +}); + +describe('Хук usePolling:', () => { + describe('С параметрами по умолчанию:', () => { + test('должен устанавливать и очищать таймер', () => { + jest.spyOn(global, 'setInterval'); + jest.spyOn(global, 'clearInterval'); + + const callback = jest.fn(); + + const { rerender, unmount } = renderHook(() => usePolling(callback)); + + expect(setInterval).toHaveBeenCalledTimes(1); + expect(setInterval).toHaveBeenCalledWith( + callback, + DEFAULT_POLLING_INTERVAL_MS + ); + expect(clearInterval).not.toBeCalled(); + + rerender(); + + expect(setInterval).toHaveBeenCalledTimes(1); + expect(clearInterval).not.toBeCalled(); + + unmount(); + + expect(setInterval).toHaveBeenCalledTimes(1); + expect(clearInterval).toHaveBeenCalledTimes(1); + expect(clearInterval).toHaveBeenCalledWith(expect.any(Number)); + }); + + test(`должен вызывать переданную функцию с частотой - ${DEFAULT_POLLING_INTERVAL_S} секунд`, () => { + const callback = jest.fn(); + + renderHook(() => usePolling(callback)); + + expect(callback).toHaveBeenCalledTimes(1); + + jest.advanceTimersByTime(DEFAULT_POLLING_INTERVAL_MS - 1); + expect(callback).toHaveBeenCalledTimes(1); + jest.advanceTimersByTime(1); + expect(callback).toHaveBeenCalledTimes(2); + + jest.advanceTimersByTime(DEFAULT_POLLING_INTERVAL_MS - 1); + expect(callback).toHaveBeenCalledTimes(2); + jest.advanceTimersByTime(1); + expect(callback).toHaveBeenCalledTimes(3); + + jest.advanceTimersByTime(DEFAULT_POLLING_INTERVAL_MS * 100_000); + expect(callback).toHaveBeenCalledTimes(3 + 100_000); + }); + }); + + describe('С параметром (condition = false):', () => { + test('не должен устанавливать и очищать таймер', () => { + jest.spyOn(global, 'setInterval'); + jest.spyOn(global, 'clearInterval'); + + const callback = jest.fn(); + + const { rerender, unmount } = renderHook(() => + usePolling(callback, false) + ); + + expect(setInterval).not.toBeCalled(); + expect(clearInterval).not.toBeCalled(); + + rerender(); + + expect(setInterval).not.toBeCalled(); + expect(clearInterval).not.toBeCalled(); + + unmount(); + + expect(setInterval).not.toBeCalled(); + expect(clearInterval).not.toBeCalled(); + }); + + test('не должен вызывать переданную функцию', () => { + const callback = jest.fn(); + + renderHook(() => usePolling(callback, false)); + + expect(callback).not.toBeCalled(); + + jest.advanceTimersByTime(DEFAULT_POLLING_INTERVAL_MS * 100_000); + expect(callback).not.toBeCalled(); + }); + }); + + describe('С переключением параметра condition в жизненном цикле хука:', () => { + test('должен устанавливать и очищать таймер при каждом переключении', () => { + jest.spyOn(global, 'setInterval'); + jest.spyOn(global, 'clearInterval'); + + const callback = jest.fn(); + + const { rerender, unmount } = renderHook((props) => + usePolling(callback, props?.condition) + ); + + expect(setInterval).toHaveBeenCalledTimes(1); + expect(clearInterval).not.toBeCalled(); + + rerender({ condition: false }); + + expect(setInterval).toHaveBeenCalledTimes(1); + expect(clearInterval).toHaveBeenCalledTimes(1); + + rerender({ condition: true }); + + expect(setInterval).toHaveBeenCalledTimes(2); + expect(clearInterval).toHaveBeenCalledTimes(1); + + unmount(); + + expect(setInterval).toHaveBeenCalledTimes(2); + expect(clearInterval).toHaveBeenCalledTimes(2); + }); + + test(`если (condition = true) должен вызывать переданную функцию с частотой - ${DEFAULT_POLLING_INTERVAL_S} секунд`, () => { + const callback = jest.fn(); + + const { rerender } = renderHook( + (props) => usePolling(callback, props?.condition), + { initialProps: { condition: false } } + ); + + jest.advanceTimersByTime(DEFAULT_POLLING_INTERVAL_MS * 100_000); + expect(callback).not.toBeCalled(); + + rerender({ condition: true }); + expect(callback).toHaveBeenCalledTimes(1); + jest.advanceTimersByTime(DEFAULT_POLLING_INTERVAL_MS * 100_000); + expect(callback).toHaveBeenCalledTimes(1 + 100_000); + callback.mockReset(); + + rerender({ condition: false }); + jest.advanceTimersByTime(DEFAULT_POLLING_INTERVAL_MS * 100_000); + expect(callback).not.toBeCalled(); + }); + }); + + describe('Параметр pollingInterval должен задавать промежуток времени между вызовами в миллисекундах:', () => { + const customInterval = 100; + + test(`должен вызывать переданную функцию с частотой - ${customInterval} миллисекунд`, () => { + const callback = jest.fn(); + + renderHook(() => usePolling(callback, undefined, customInterval)); + + expect(callback).toHaveBeenCalledTimes(1); + + jest.advanceTimersByTime(customInterval - 1); + expect(callback).toHaveBeenCalledTimes(1); + jest.advanceTimersByTime(1); + expect(callback).toHaveBeenCalledTimes(2); + + jest.advanceTimersByTime(customInterval - 1); + expect(callback).toHaveBeenCalledTimes(2); + jest.advanceTimersByTime(1); + expect(callback).toHaveBeenCalledTimes(3); + + jest.advanceTimersByTime(customInterval * 100_000); + expect(callback).toHaveBeenCalledTimes(3 + 100_000); + }); + + test('не должен меняться при ререндерах', () => { + const callback = jest.fn(); + + const { rerender } = renderHook( + (props) => usePolling(callback, undefined, props?.pollingInterval), + { initialProps: { pollingInterval: customInterval } } + ); + + expect(callback).toHaveBeenCalledTimes(1); + + jest.advanceTimersByTime(customInterval * 100_000); + expect(callback).toHaveBeenCalledTimes(1 + 100_000); + callback.mockReset(); + + rerender({ pollingInterval: DEFAULT_POLLING_INTERVAL_MS }); + + expect(callback).not.toBeCalled(); + + jest.advanceTimersByTime(customInterval * 100_000); + expect(callback).toHaveBeenCalledTimes(100_000); + }); + }); + + describe('Должен подписываться на событие скрытия приложения и отписываться от него:', () => { + it('при монтировании и размонтировании', () => { + const callback = jest.fn(); + + const { unmount } = renderHook(() => usePolling(callback)); + + expect(bridge.subscribe).toBeCalledTimes(1); + + // eslint-disable-next-line prefer-destructuring + const listener = bridge.subscribe.mock.calls[0][0]; + + unmount(); + + expect(bridge.unsubscribe).toBeCalledTimes(1); + expect(bridge.unsubscribe).toBeCalledWith(listener); + }); + + it('при смене аргумента condition', () => { + const callback = jest.fn(); + + const { rerender } = renderHook( + ({ condition }) => usePolling(callback, condition), + { + initialProps: { condition: true }, + } + ); + + expect(bridge.subscribe).toBeCalledTimes(1); + + // eslint-disable-next-line prefer-destructuring + const firstListener = bridge.subscribe.mock.calls[0][0]; + + rerender({ condition: false }); + + expect(bridge.unsubscribe).toBeCalledTimes(1); + expect(bridge.unsubscribe).toHaveBeenLastCalledWith(firstListener); + + expect(bridge.subscribe).toBeCalledTimes(2); + expect(bridge.subscribe).not.toHaveBeenLastCalledWith(firstListener); + + // eslint-disable-next-line prefer-destructuring + const secondListener = bridge.subscribe.mock.calls[1][0]; + + rerender({ condition: true }); + + expect(bridge.unsubscribe).toBeCalledTimes(2); + expect(bridge.unsubscribe).toBeCalledWith(secondListener); + + expect(bridge.subscribe).toBeCalledTimes(3); + expect(bridge.subscribe).not.toHaveBeenLastCalledWith(secondListener); + }); + }); +}); diff --git a/src/setVkViewSettings.ts b/src/setVkViewSettings.ts index 900d292..0ecd22a 100644 --- a/src/setVkViewSettings.ts +++ b/src/setVkViewSettings.ts @@ -29,21 +29,22 @@ const VK_PLATFORMS_WITH_VIEW_SETTINGS: VkPlatformType[] = [ * @see {@link https://dev.vk.com/bridge/VKWebAppSetViewSettings} */ const setVkViewSettings = async ( - viewSettings: SetViewSettingsPropsType + viewSettings: SetViewSettingsPropsType, + platform: VkPlatformType ): Promise => { try { let settingsForCurrentPlatform = { ...viewSettings }; if ( - window.platform && - VK_PLATFORMS_WITH_VIEW_SETTINGS.includes(window.platform) && + platform && + VK_PLATFORMS_WITH_VIEW_SETTINGS.includes(platform) && bridge.supports('VKWebAppSetViewSettings') ) { /** * Все настройки поддерживаются только на android, * так что если платформа не android, то используем только цвет status bar */ - if (window.platform !== 'mobile_android') { + if (platform !== 'mobile_android') { settingsForCurrentPlatform = { status_bar_style: viewSettings.status_bar_style, }; diff --git a/src/shareVkPost.ts b/src/shareVkPost.ts index ec47513..be688ef 100644 --- a/src/shareVkPost.ts +++ b/src/shareVkPost.ts @@ -65,6 +65,7 @@ const shareVkPostWithUpload = async ({ file, apiUploadUrl, userId, + appId, accessToken = window.access_token, onUserDeniedAccess, onErrorOccurred, @@ -77,6 +78,7 @@ const shareVkPostWithUpload = async ({ method: 'photos.getWallUploadServer', accessToken, getAccessTokenParams: { + appId, scopes: ['photos'], onUserDeniedAll: onUserDeniedAccess, onUserDeniedSomeScopes: onUserDeniedAccess, @@ -139,6 +141,7 @@ const shareVkPostWithUpload = async ({ server: Number(server), user_id: userId, }, + getAccessTokenParams: { appId }, }); if (saveWallPhotoData.error_type || !saveWallPhotoData.response?.[0]) { diff --git a/src/types/shareVkPost.ts b/src/types/shareVkPost.ts index 9b75707..de9dd7b 100644 --- a/src/types/shareVkPost.ts +++ b/src/types/shareVkPost.ts @@ -18,6 +18,7 @@ type ShareVkPostWithUploadParamsType = { file: File; apiUploadUrl: UrlConfigType; userId: number; + appId: number; accessToken?: string; onUserDeniedAccess?: VoidFunction; // eslint-disable-next-line diff --git a/yarn.lock b/yarn.lock index f093d82..24e8548 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,6 +2,11 @@ # yarn lockfile v1 +"@adobe/css-tools@^4.3.2": + version "4.3.2" + resolved "https://registry.yarnpkg.com/@adobe/css-tools/-/css-tools-4.3.2.tgz#a6abc715fb6884851fca9dad37fc34739a04fd11" + integrity sha512-DA5a1C0gD/pLOvhv33YMrbf2FK3oUzwNl9oOJqE4XVjuEtt6XIakRcsd7eLiOSPkp1kTRQGICTA8cKra/vFbjw== + "@ampproject/remapping@^2.1.0": version "2.2.0" resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.0.tgz#56c133824780de3174aed5ab6834f3026790154d" @@ -32,7 +37,7 @@ dependencies: "@babel/highlight" "^7.14.5" -"@babel/code-frame@^7.12.13", "@babel/code-frame@^7.22.13", "@babel/code-frame@^7.23.5": +"@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.22.13", "@babel/code-frame@^7.23.5": version "7.23.5" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.23.5.tgz#9009b69a8c602293476ad598ff53e4562e15c244" integrity sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA== @@ -1077,6 +1082,13 @@ "@babel/types" "^7.4.4" esutils "^2.0.2" +"@babel/runtime@^7.12.5", "@babel/runtime@^7.9.2": + version "7.23.8" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.23.8.tgz#8ee6fe1ac47add7122902f257b8ddf55c898f650" + integrity sha512-Y7KbAP984rn1VGMbGqKmBLio9V7y5Je9GvU4rQPCPinCyNfUcToxIXl06d59URp/F3LwinvODxab5N/G6qggkw== + dependencies: + regenerator-runtime "^0.14.0" + "@babel/runtime@^7.8.4": version "7.20.13" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.20.13.tgz#7055ab8a7cff2b8f6058bf6ae45ff84ad2aded4b" @@ -1685,6 +1697,43 @@ resolved "https://registry.yarnpkg.com/@swc/types/-/types-0.1.5.tgz#043b731d4f56a79b4897a3de1af35e75d56bc63a" integrity sha512-myfUej5naTBWnqOCc/MdVOLVjXUXtIA+NpDrDBKJtLLg2shUjBu3cZmB/85RyitKc55+lUUyl7oRfLOvkr2hsw== +"@testing-library/dom@^9.0.0": + version "9.3.4" + resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-9.3.4.tgz#50696ec28376926fec0a1bf87d9dbac5e27f60ce" + integrity sha512-FlS4ZWlp97iiNWig0Muq8p+3rVDjRiYE+YKGbAqXOu9nwJFFOdL00kFpz42M+4huzYi86vAK1sOOfyOG45muIQ== + dependencies: + "@babel/code-frame" "^7.10.4" + "@babel/runtime" "^7.12.5" + "@types/aria-query" "^5.0.1" + aria-query "5.1.3" + chalk "^4.1.0" + dom-accessibility-api "^0.5.9" + lz-string "^1.5.0" + pretty-format "^27.0.2" + +"@testing-library/jest-dom@^6.2.0": + version "6.2.0" + resolved "https://registry.yarnpkg.com/@testing-library/jest-dom/-/jest-dom-6.2.0.tgz#b572bd5cd6b29314487bac7ba393188e4987b4f7" + integrity sha512-+BVQlJ9cmEn5RDMUS8c2+TU6giLvzaHZ8sU/x0Jj7fk+6/46wPdwlgOPcpxS17CjcanBi/3VmGMqVr2rmbUmNw== + dependencies: + "@adobe/css-tools" "^4.3.2" + "@babel/runtime" "^7.9.2" + aria-query "^5.0.0" + chalk "^3.0.0" + css.escape "^1.5.1" + dom-accessibility-api "^0.6.3" + lodash "^4.17.15" + redent "^3.0.0" + +"@testing-library/react@^14.1.2": + version "14.1.2" + resolved "https://registry.yarnpkg.com/@testing-library/react/-/react-14.1.2.tgz#a2b9e9ee87721ec9ed2d7cfc51cc04e474537c32" + integrity sha512-z4p7DVBTPjKM5qDZ0t5ZjzkpSNb+fZy1u6bzO7kk8oeGagpPCAtgh4cx1syrfp7a+QWkM021jGqjJaxJJnXAZg== + dependencies: + "@babel/runtime" "^7.12.5" + "@testing-library/dom" "^9.0.0" + "@types/react-dom" "^18.0.0" + "@tootallnate/once@2": version "2.0.0" resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-2.0.0.tgz#f544a148d3ab35801c1f633a7441fd87c2e484bf" @@ -1710,6 +1759,11 @@ resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.4.tgz#0b92dcc0cc1c81f6f306a381f28e31b1a56536e9" integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== +"@types/aria-query@^5.0.1": + version "5.0.4" + resolved "https://registry.yarnpkg.com/@types/aria-query/-/aria-query-5.0.4.tgz#1a31c3d378850d2778dabb6374d036dcba4ba708" + integrity sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw== + "@types/babel__core@^7.1.14": version "7.20.5" resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.5.tgz#3df15f27ba85319caa07ba08d0721889bb39c017" @@ -1818,6 +1872,22 @@ resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.5.tgz#5f19d2b85a98e9558036f6a3cacc8819420f05cf" integrity sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w== +"@types/react-dom@^18.0.0": + version "18.2.18" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.2.18.tgz#16946e6cd43971256d874bc3d0a72074bb8571dd" + integrity sha512-TJxDm6OfAX2KJWJdMEVTwWke5Sc/E/RlnPGvGfS0W7+6ocy2xhDVQVh/KvC2Uf7kACs+gDytdusDSdWfWkaNzw== + dependencies: + "@types/react" "*" + +"@types/react@*": + version "18.2.48" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.48.tgz#11df5664642d0bd879c1f58bc1d37205b064e8f1" + integrity sha512-qboRCl6Ie70DQQG9hhNREz81jqC1cs9EVNcjQ1AU+jH6NFfSAhVVbrrY/+nSF+Bsk4AOwm9Qa61InvMCyV+H3w== + dependencies: + "@types/prop-types" "*" + "@types/scheduler" "*" + csstype "^3.0.2" + "@types/react@>=17": version "18.2.12" resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.12.tgz#95d584338610b78bb9ba0415e3180fb03debdf97" @@ -2074,6 +2144,28 @@ argparse@^1.0.7: dependencies: sprintf-js "~1.0.2" +aria-query@5.1.3: + version "5.1.3" + resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.1.3.tgz#19db27cd101152773631396f7a95a3b58c22c35e" + integrity sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ== + dependencies: + deep-equal "^2.0.5" + +aria-query@^5.0.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.3.0.tgz#650c569e41ad90b51b3d7df5e5eed1c7549c103e" + integrity sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A== + dependencies: + dequal "^2.0.3" + +array-buffer-byte-length@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz#fabe8bc193fea865f317fe7807085ee0dee5aead" + integrity sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A== + dependencies: + call-bind "^1.0.2" + is-array-buffer "^3.0.1" + array-includes@^3.1.2, array-includes@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.3.tgz#c7f619b382ad2afaf5326cddfdc0afc61af7690a" @@ -2119,6 +2211,11 @@ asynckit@^0.4.0: resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== +available-typed-arrays@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" + integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== + axios@^0.24.0: version "0.24.0" resolved "https://registry.yarnpkg.com/axios/-/axios-0.24.0.tgz#804e6fa1e4b9c5288501dd9dff56a7a0940d20d6" @@ -2282,6 +2379,15 @@ call-bind@^1.0.0, call-bind@^1.0.2: function-bind "^1.1.1" get-intrinsic "^1.0.2" +call-bind@^1.0.4, call-bind@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.5.tgz#6fa2b7845ce0ea49bf4d8b9ef64727a2c2e2e513" + integrity sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ== + dependencies: + function-bind "^1.1.2" + get-intrinsic "^1.2.1" + set-function-length "^1.1.1" + callsites@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" @@ -2316,6 +2422,14 @@ chalk@^2.0.0, chalk@^2.4.2: escape-string-regexp "^1.0.5" supports-color "^5.3.0" +chalk@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" + integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.1.tgz#c80b3fab28bf6371e6863325eee67e618b77e6ad" @@ -2489,6 +2603,11 @@ cross-spawn@^7.0.2, cross-spawn@^7.0.3: shebang-command "^2.0.0" which "^2.0.1" +css.escape@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/css.escape/-/css.escape-1.5.1.tgz#42e27d4fa04ae32f931a4b4d4191fa9cddee97cb" + integrity sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg== + cssom@^0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.5.0.tgz#d254fa92cd8b6fbd83811b9fbaed34663cc17c36" @@ -2563,6 +2682,30 @@ dedent@^1.0.0: resolved "https://registry.yarnpkg.com/dedent/-/dedent-1.5.1.tgz#4f3fc94c8b711e9bb2800d185cd6ad20f2a90aff" integrity sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg== +deep-equal@^2.0.5: + version "2.2.3" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-2.2.3.tgz#af89dafb23a396c7da3e862abc0be27cf51d56e1" + integrity sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA== + dependencies: + array-buffer-byte-length "^1.0.0" + call-bind "^1.0.5" + es-get-iterator "^1.1.3" + get-intrinsic "^1.2.2" + is-arguments "^1.1.1" + is-array-buffer "^3.0.2" + is-date-object "^1.0.5" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.2" + isarray "^2.0.5" + object-is "^1.1.5" + object-keys "^1.1.1" + object.assign "^4.1.4" + regexp.prototype.flags "^1.5.1" + side-channel "^1.0.4" + which-boxed-primitive "^1.0.2" + which-collection "^1.0.1" + which-typed-array "^1.1.13" + deep-is@^0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" @@ -2573,6 +2716,15 @@ deepmerge@^4.2.2: resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== +define-data-property@^1.0.1, define-data-property@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.1.tgz#c35f7cd0ab09883480d12ac5cb213715587800b3" + integrity sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ== + dependencies: + get-intrinsic "^1.2.1" + gopd "^1.0.1" + has-property-descriptors "^1.0.0" + define-properties@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" @@ -2580,11 +2732,25 @@ define-properties@^1.1.3: dependencies: object-keys "^1.0.12" +define-properties@^1.2.0, define-properties@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" + integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== + dependencies: + define-data-property "^1.0.1" + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" + delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== +dequal@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be" + integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== + detect-newline@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" @@ -2621,6 +2787,16 @@ doctrine@^3.0.0: dependencies: esutils "^2.0.2" +dom-accessibility-api@^0.5.9: + version "0.5.16" + resolved "https://registry.yarnpkg.com/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz#5a7429e6066eb3664d911e33fb0e45de8eb08453" + integrity sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg== + +dom-accessibility-api@^0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz#993e925cc1d73f2c662e7d75dd5a5445259a8fd8" + integrity sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w== + domexception@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/domexception/-/domexception-4.0.0.tgz#4ad1be56ccadc86fc76d033353999a8037d03673" @@ -2689,6 +2865,21 @@ es-abstract@^1.18.0-next.1, es-abstract@^1.18.0-next.2, es-abstract@^1.18.2: string.prototype.trimstart "^1.0.4" unbox-primitive "^1.0.1" +es-get-iterator@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/es-get-iterator/-/es-get-iterator-1.1.3.tgz#3ef87523c5d464d41084b2c3c9c214f1199763d6" + integrity sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.3" + has-symbols "^1.0.3" + is-arguments "^1.1.1" + is-map "^2.0.2" + is-set "^2.0.2" + is-string "^1.0.7" + isarray "^2.0.5" + stop-iteration-iterator "^1.0.0" + es-to-primitive@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" @@ -3056,6 +3247,13 @@ follow-redirects@^1.14.4: resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== +for-each@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" + integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== + dependencies: + is-callable "^1.1.3" + form-data@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" @@ -3085,11 +3283,21 @@ function-bind@^1.1.1: resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== +function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== + functional-red-black-tree@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= +functions-have-names@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" + integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== + gensync@^1.0.0-beta.2: version "1.0.0-beta.2" resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" @@ -3109,6 +3317,16 @@ get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: has "^1.0.3" has-symbols "^1.0.1" +get-intrinsic@^1.1.3, get-intrinsic@^1.2.0, get-intrinsic@^1.2.1, get-intrinsic@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.2.tgz#281b7622971123e1ef4b3c90fd7539306da93f3b" + integrity sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA== + dependencies: + function-bind "^1.1.2" + has-proto "^1.0.1" + has-symbols "^1.0.3" + hasown "^2.0.0" + get-own-enumerable-property-symbols@^3.0.0: version "3.0.2" resolved "https://registry.yarnpkg.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz#b5fde77f22cbe35f390b4e089922c50bce6ef664" @@ -3190,6 +3408,13 @@ globby@^11.0.3: merge2 "^1.3.0" slash "^3.0.0" +gopd@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" + integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== + dependencies: + get-intrinsic "^1.1.3" + graceful-fs@^4.1.2: version "4.2.6" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee" @@ -3215,11 +3440,35 @@ has-flag@^4.0.0: resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== +has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz#52ba30b6c5ec87fd89fa574bc1c39125c6f65340" + integrity sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg== + dependencies: + get-intrinsic "^1.2.2" + +has-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0" + integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== + has-symbols@^1.0.1, has-symbols@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423" integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw== +has-symbols@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + +has-tostringtag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" + integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== + dependencies: + has-symbols "^1.0.2" + has@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" @@ -3227,6 +3476,13 @@ has@^1.0.3: dependencies: function-bind "^1.1.1" +hasown@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.0.tgz#f4c513d454a57b7c7e1650778de226b11700546c" + integrity sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA== + dependencies: + function-bind "^1.1.2" + hosted-git-info@^2.1.4: version "2.8.9" resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" @@ -3336,6 +3592,32 @@ internal-slot@^1.0.3: has "^1.0.3" side-channel "^1.0.4" +internal-slot@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.6.tgz#37e756098c4911c5e912b8edbf71ed3aa116f930" + integrity sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg== + dependencies: + get-intrinsic "^1.2.2" + hasown "^2.0.0" + side-channel "^1.0.4" + +is-arguments@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" + integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-array-buffer@^3.0.1, is-array-buffer@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.2.tgz#f2653ced8412081638ecb0ebbd0c41c6e0aecbbe" + integrity sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.0" + is-typed-array "^1.1.10" + is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" @@ -3360,6 +3642,11 @@ is-builtin-module@^3.2.0: dependencies: builtin-modules "^3.3.0" +is-callable@^1.1.3: + version "1.2.7" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" + integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== + is-callable@^1.1.4, is-callable@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.3.tgz#8b1e0500b73a1d76c70487636f368e519de8db8e" @@ -3384,6 +3671,13 @@ is-date-object@^1.0.1: resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.4.tgz#550cfcc03afada05eea3dd30981c7b09551f73e5" integrity sha512-/b4ZVsG7Z5XVtIxs/h9W8nvfLgSAyKYdtGWQLbqy6jA1icmgjf8WCoTKgeS4wy5tYaPePouzFMANbnj94c2Z+A== +is-date-object@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" + integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== + dependencies: + has-tostringtag "^1.0.0" + is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" @@ -3406,6 +3700,11 @@ is-glob@^4.0.0, is-glob@^4.0.1: dependencies: is-extglob "^2.1.1" +is-map@^2.0.1, is-map@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.2.tgz#00922db8c9bf73e81b7a335827bc2a43f2b91127" + integrity sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg== + is-module@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591" @@ -3451,11 +3750,31 @@ is-regex@^1.1.3: call-bind "^1.0.2" has-symbols "^1.0.2" +is-regex@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" + integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + is-regexp@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069" integrity sha1-/S2INUXEa6xaYz57mgnof6LLUGk= +is-set@^2.0.1, is-set@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.2.tgz#90755fa4c2562dc1c5d4024760d6119b94ca18ec" + integrity sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g== + +is-shared-array-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" + integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== + dependencies: + call-bind "^1.0.2" + is-stream@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3" @@ -3466,6 +3785,13 @@ is-string@^1.0.5, is-string@^1.0.6: resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.6.tgz#3fe5d5992fb0d93404f32584d4b0179a71b54a5f" integrity sha512-2gdzbKUuqtQ3lYNrUTQYoClPhm7oQu4UdpSZMp1/DGgkHBT8E2Z1l0yMdb6D4zNAxwDiMv8MdulKROJGNl0Q0w== +is-string@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" + integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== + dependencies: + has-tostringtag "^1.0.0" + is-symbol@^1.0.2, is-symbol@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" @@ -3473,11 +3799,36 @@ is-symbol@^1.0.2, is-symbol@^1.0.3: dependencies: has-symbols "^1.0.2" +is-typed-array@^1.1.10: + version "1.1.12" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.12.tgz#d0bab5686ef4a76f7a73097b95470ab199c57d4a" + integrity sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg== + dependencies: + which-typed-array "^1.1.11" + is-unicode-supported@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== +is-weakmap@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.1.tgz#5008b59bdc43b698201d18f62b37b2ca243e8cf2" + integrity sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA== + +is-weakset@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.2.tgz#4569d67a747a1ce5a994dfd4ef6dcea76e7c0a1d" + integrity sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.1" + +isarray@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" + integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== + isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" @@ -4115,6 +4466,11 @@ lodash.truncate@^4.4.2: resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" integrity sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM= +lodash@^4.17.15: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + log-symbols@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" @@ -4154,6 +4510,11 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" +lz-string@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/lz-string/-/lz-string-1.5.0.tgz#c1ab50f77887b712621201ba9fd4e3a6ed099941" + integrity sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ== + magic-string@^0.27.0: version "0.27.0" resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.27.0.tgz#e4a3413b4bab6d98d2becffd48b4a257effdbbf3" @@ -4215,6 +4576,11 @@ mimic-fn@^2.1.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== +min-indent@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" + integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== + minimatch@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" @@ -4313,6 +4679,14 @@ object-inspect@^1.10.3, object-inspect@^1.9.0: resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.11.0.tgz#9dceb146cedd4148a0d9e51ab88d34cf509922b1" integrity sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg== +object-is@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac" + integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + object-keys@^1.0.12, object-keys@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" @@ -4328,6 +4702,16 @@ object.assign@^4.1.2: has-symbols "^1.0.1" object-keys "^1.1.1" +object.assign@^4.1.4: + version "4.1.5" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.5.tgz#3a833f9ab7fdb80fc9e8d2300c803d216d8fdbb0" + integrity sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ== + dependencies: + call-bind "^1.0.5" + define-properties "^1.2.1" + has-symbols "^1.0.3" + object-keys "^1.1.1" + object.entries@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.4.tgz#43ccf9a50bc5fd5b649d45ab1a579f24e088cafd" @@ -4573,6 +4957,15 @@ prettier@^2.2.1: resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.3.2.tgz#ef280a05ec253712e486233db5c6f23441e7342d" integrity sha512-lnJzDfJ66zkMy58OL5/NY5zp70S7Nz6KqcKkXYzn2tMVrNxvbqaBpg7H3qHaLxCJ5lNMsGuM8+ohS7cZrthdLQ== +pretty-format@^27.0.2: + version "27.5.1" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-27.5.1.tgz#2181879fdea51a7a5851fb39d920faa63f01d88e" + integrity sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ== + dependencies: + ansi-regex "^5.0.1" + ansi-styles "^5.0.0" + react-is "^17.0.1" + pretty-format@^29.0.0, pretty-format@^29.7.0: version "29.7.0" resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.7.0.tgz#ca42c758310f365bfa71a0bda0a807160b776812" @@ -4641,11 +5034,24 @@ randombytes@^2.1.0: dependencies: safe-buffer "^5.1.0" +react-dom@>=17: + version "18.2.0" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.2.0.tgz#22aaf38708db2674ed9ada224ca4aa708d821e3d" + integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g== + dependencies: + loose-envify "^1.1.0" + scheduler "^0.23.0" + react-is@^16.8.1: version "16.13.1" resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== +react-is@^17.0.1: + version "17.0.2" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" + integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== + react-is@^18.0.0: version "18.2.0" resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" @@ -4675,6 +5081,14 @@ read-pkg@^3.0.0: normalize-package-data "^2.3.2" path-type "^3.0.0" +redent@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f" + integrity sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg== + dependencies: + indent-string "^4.0.0" + strip-indent "^3.0.0" + regenerate-unicode-properties@^10.1.0: version "10.1.0" resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz#7c3192cab6dd24e21cb4461e5ddd7dd24fa8374c" @@ -4692,6 +5106,11 @@ regenerator-runtime@^0.13.11: resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9" integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== +regenerator-runtime@^0.14.0: + version "0.14.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" + integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== + regenerator-transform@^0.15.1: version "0.15.1" resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.1.tgz#f6c4e99fc1b4591f780db2586328e4d9a9d8dc56" @@ -4707,6 +5126,15 @@ regexp.prototype.flags@^1.3.1: call-bind "^1.0.2" define-properties "^1.1.3" +regexp.prototype.flags@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz#90ce989138db209f81492edd734183ce99f9677e" + integrity sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + set-function-name "^2.0.0" + regexpp@^3.1.0: version "3.2.0" resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" @@ -4861,6 +5289,13 @@ saxes@^6.0.0: dependencies: xmlchars "^2.2.0" +scheduler@^0.23.0: + version "0.23.0" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.0.tgz#ba8041afc3d30eb206a487b6b384002e4e61fdfe" + integrity sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw== + dependencies: + loose-envify "^1.1.0" + semver-compare@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc" @@ -4902,6 +5337,26 @@ serialize-javascript@^6.0.0: dependencies: randombytes "^2.1.0" +set-function-length@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.0.tgz#2f81dc6c16c7059bda5ab7c82c11f03a515ed8e1" + integrity sha512-4DBHDoyHlM1IRPGYcoxexgh67y4ueR53FKV1yyxwFMY7aCqcN/38M1+SwZ/qJQ8iLv7+ck385ot4CcisOAPT9w== + dependencies: + define-data-property "^1.1.1" + function-bind "^1.1.2" + get-intrinsic "^1.2.2" + gopd "^1.0.1" + has-property-descriptors "^1.0.1" + +set-function-name@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.1.tgz#12ce38b7954310b9f61faa12701620a0c882793a" + integrity sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA== + dependencies: + define-data-property "^1.0.1" + functions-have-names "^1.2.3" + has-property-descriptors "^1.0.0" + shebang-command@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" @@ -5025,6 +5480,13 @@ stack-utils@^2.0.3: dependencies: escape-string-regexp "^2.0.0" +stop-iteration-iterator@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz#6a60be0b4ee757d1ed5254858ec66b10c49285e4" + integrity sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ== + dependencies: + internal-slot "^1.0.4" + string-argv@0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.1.tgz#95e2fbec0427ae19184935f816d74aaa4c5c19da" @@ -5124,6 +5586,13 @@ strip-final-newline@^2.0.0: resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== +strip-indent@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001" + integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ== + dependencies: + min-indent "^1.0.0" + strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" @@ -5453,6 +5922,27 @@ which-boxed-primitive@^1.0.2: is-string "^1.0.5" is-symbol "^1.0.3" +which-collection@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.1.tgz#70eab71ebbbd2aefaf32f917082fc62cdcb70906" + integrity sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A== + dependencies: + is-map "^2.0.1" + is-set "^2.0.1" + is-weakmap "^2.0.1" + is-weakset "^2.0.1" + +which-typed-array@^1.1.11, which-typed-array@^1.1.13: + version "1.1.13" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.13.tgz#870cd5be06ddb616f504e7b039c4c24898184d36" + integrity sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.4" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.0" + which@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" From 0f87f47db70a4f0419854effcfc9ebf8648f001e Mon Sep 17 00:00:00 2001 From: "d.ragozin" Date: Tue, 16 Jan 2024 10:49:16 +0300 Subject: [PATCH 15/46] =?UTF-8?q?[+]=20=D0=A2=D0=B5=D1=81=D1=82=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Кейсы с ошибками в shareVkStory * Вынесение кода в утилиты --- src/__tests__/callVkApi.test.ts | 16 +++--------- src/__tests__/getVkAccessToken.test.ts | 26 ++++--------------- src/__tests__/setVkViewSettings.test.ts | 12 ++------- src/__tests__/shareVkStory.test.ts | 33 +++++++++++++++++++++++++ src/__tests__/utils/index.ts | 2 ++ src/__tests__/utils/mockErrors.ts | 26 +++++++++++++++++++ 6 files changed, 71 insertions(+), 44 deletions(-) create mode 100644 src/__tests__/utils/mockErrors.ts diff --git a/src/__tests__/callVkApi.test.ts b/src/__tests__/callVkApi.test.ts index f26dd2e..d80d6f4 100644 --- a/src/__tests__/callVkApi.test.ts +++ b/src/__tests__/callVkApi.test.ts @@ -1,14 +1,11 @@ import originalBridge from '@vkontakte/vk-bridge'; -import { - AnyRequestMethodName, - ErrorData, -} from '@vkontakte/vk-bridge/dist/types/src/types/bridge'; +import { AnyRequestMethodName } from '@vkontakte/vk-bridge/dist/types/src/types/bridge'; import { getVkAccessToken as originalGetVkAccessToken } from '../getVkAccessToken'; import { callVkApi, VK_TOKEN_ERRORS } from '../callVkApi'; import { GetVkAccessTokenParamsType } from '../types'; -import { randomNumberUpTo, randomString, range } from './utils'; +import { getRandomVkApiError, randomNumberUpTo, randomString } from './utils'; jest.mock('@vkontakte/vk-bridge'); jest.mock('../getVkAccessToken'); @@ -32,14 +29,7 @@ const MOCK_NEW_TOKEN = 'MOCK_NEW_TOKEN'; const MOCK_SUCCESS = 'MOCK_SUCCESS' as unknown as BridgeSendReturn; -const MOCK_ANY_ERROR: ErrorData = { - error_type: 'api_error', - error_data: { - error_code: randomNumberUpTo(100), - error_msg: randomString(10), - request_params: range(3).map(() => randomString(3)), - }, -}; +const MOCK_ANY_ERROR = getRandomVkApiError(); const MOCK_GET_TOKEN_PARAMS = { [randomString(5)]: randomString(5), diff --git a/src/__tests__/getVkAccessToken.test.ts b/src/__tests__/getVkAccessToken.test.ts index 85d5d6a..65e8b22 100644 --- a/src/__tests__/getVkAccessToken.test.ts +++ b/src/__tests__/getVkAccessToken.test.ts @@ -2,10 +2,7 @@ import originalBridge, { PersonalAuthScope, ReceiveData, } from '@vkontakte/vk-bridge'; -import { - ErrorData, - RequestProps, -} from '@vkontakte/vk-bridge/dist/types/src/types/bridge'; +import { RequestProps } from '@vkontakte/vk-bridge/dist/types/src/types/bridge'; import { ReceiveDataMap } from '@vkontakte/vk-bridge/dist/types/src/types/data'; import { @@ -19,6 +16,8 @@ import { GetVkAccessTokenParamsType } from '../types'; import { getRandomElements, + getRandomVkApiError, + getUserDeniedCommonError, randomNumberUpTo, randomString, range, @@ -50,14 +49,7 @@ const MOCK_TOKEN_ANSWER: ReceiveDataMap['VKWebAppGetAuthToken'] = { scope: 'MOCK_SCOPE', }; -const MOCK_ANY_ERROR: ErrorData = { - error_type: 'api_error', - error_data: { - error_code: randomNumberUpTo(100), - error_msg: randomString(10), - request_params: range(3).map(() => randomString(3)), - }, -}; +const MOCK_ANY_ERROR = getRandomVkApiError(); const getRandomScopes = (count: number) => getRandomElements(ALLOWED_VK_SCOPES, count); @@ -127,14 +119,6 @@ const getRequestToResultScopes = (): { }, ]; -const getUserDeniedError = (): ErrorData => ({ - error_type: 'client_error', - error_data: { - error_reason: 'User denied', - error_code: 4, - }, -}); - describe('Функция parseVkScopes', () => { getScopesCounts().forEach((count) => { it(`Правильный парсинг скоупов, количество скоупов: ${count}`, () => { @@ -568,7 +552,7 @@ describe('Функция getVkAccessToken', () => { window.access_token = MOCK_AVAILABLE_TOKEN; window.scope = MOCK_SCOPES_STRING; - const deniedAllError = getUserDeniedError(); + const deniedAllError = getUserDeniedCommonError(); bridge.send.mockImplementation(() => { throw deniedAllError; diff --git a/src/__tests__/setVkViewSettings.test.ts b/src/__tests__/setVkViewSettings.test.ts index e21ffda..ff6e06e 100644 --- a/src/__tests__/setVkViewSettings.test.ts +++ b/src/__tests__/setVkViewSettings.test.ts @@ -1,10 +1,9 @@ import originalBridge, { ReceiveData } from '@vkontakte/vk-bridge'; -import { ErrorData } from '@vkontakte/vk-bridge/dist/types/src/types/bridge'; import { SetViewSettingsPropsType, VkPlatformType } from '../types'; import { setVkViewSettings } from '../setVkViewSettings'; -import { randomNumberUpTo, randomString, range } from './utils'; +import { getRandomVkApiError } from './utils'; jest.mock('@vkontakte/vk-bridge'); @@ -49,14 +48,7 @@ const MOCK_BRIDGE_SUCCESS_RESULT: ReceiveData<'VKWebAppSetViewSettings'> = { result: true, }; -const MOCK_ANY_ERROR: ErrorData = { - error_type: 'api_error', - error_data: { - error_code: randomNumberUpTo(100), - error_msg: randomString(10), - request_params: range(3).map(() => randomString(3)), - }, -}; +const MOCK_ANY_ERROR = getRandomVkApiError(); describe('setVkViewSettings', () => { afterEach(() => { diff --git a/src/__tests__/shareVkStory.test.ts b/src/__tests__/shareVkStory.test.ts index 597056c..40f6f31 100644 --- a/src/__tests__/shareVkStory.test.ts +++ b/src/__tests__/shareVkStory.test.ts @@ -2,6 +2,9 @@ import originalBridge, { ReceiveData } from '@vkontakte/vk-bridge'; import { ShareVkStoryPropsType } from '../types'; import { shareVkStory } from '../shareVkStory'; +import { userDeniedErrorReasons } from '../checkVkUserDenied'; + +import { getRandomVkApiError, getUserDeniedCommonError } from './utils'; jest.mock('@vkontakte/vk-bridge'); @@ -9,6 +12,8 @@ const bridge = originalBridge as jest.Mocked; const VK_BRIDGE_SHARE_STORY_METHOD = 'VKWebAppShowStoryBox'; +const MOCK_ANY_ERROR = getRandomVkApiError(); + const MOCK_STORY_BACKGROUND_TYPE = 'none'; const MOCK_STORY_LOCKED_PARAM = true; @@ -126,4 +131,32 @@ describe('Функция shareVkStory', () => { }) ); }); + + [...userDeniedErrorReasons].forEach((reason) => { + it(`Отказ пользователя, причина ошибки: "${reason}"`, async () => { + bridge.send.mockImplementation(() => { + throw getUserDeniedCommonError({ reason }); + }); + + const result = await shareVkStory( + getMockShareStoryParams({ url: MOCK_STORY_URL }) + ); + + expect(bridge.send).toBeCalledTimes(1); + expect(result).toBe(undefined); + }); + }); + + it('Неизвестная ошибка', async () => { + bridge.send.mockImplementation(() => { + throw MOCK_ANY_ERROR; + }); + + const result = await shareVkStory( + getMockShareStoryParams({ url: MOCK_STORY_URL }) + ); + + expect(bridge.send).toBeCalledTimes(1); + expect(result).toBe(MOCK_ANY_ERROR); + }); }); diff --git a/src/__tests__/utils/index.ts b/src/__tests__/utils/index.ts index 05ef6c8..4c2f5b6 100644 --- a/src/__tests__/utils/index.ts +++ b/src/__tests__/utils/index.ts @@ -7,3 +7,5 @@ export * from './randomString'; export * from './shuffle'; export * from './getRandomElements'; + +export * from './mockErrors'; diff --git a/src/__tests__/utils/mockErrors.ts b/src/__tests__/utils/mockErrors.ts new file mode 100644 index 0000000..2a1bcee --- /dev/null +++ b/src/__tests__/utils/mockErrors.ts @@ -0,0 +1,26 @@ +import { ErrorData } from '@vkontakte/vk-bridge'; + +import { randomNumberUpTo } from './randomNumberUpTo'; +import { randomString } from './randomString'; +import { range } from './range'; + +export const getUserDeniedCommonError = ({ + reason = 'User denied', +}: { + reason?: string; +} = {}): ErrorData => ({ + error_type: 'client_error', + error_data: { + error_reason: reason, + error_code: 4, + }, +}); + +export const getRandomVkApiError = (): ErrorData => ({ + error_type: 'api_error', + error_data: { + error_code: randomNumberUpTo(100), + error_msg: randomString(10), + request_params: range(3).map(() => randomString(3)), + }, +}); From 10bff39652be08dbb54d087f73ed484e3560d065 Mon Sep 17 00:00:00 2001 From: "d.ragozin" Date: Tue, 16 Jan 2024 12:11:23 +0300 Subject: [PATCH 16/46] =?UTF-8?q?[*]=20=D0=9A=D0=BE=D1=80=D1=80=D0=B5?= =?UTF-8?q?=D0=BA=D1=82=D0=B8=D1=80=D0=BE=D0=B2=D0=BA=D0=B8:=20=D0=B0?= =?UTF-8?q?=D0=B2=D1=82=D0=BE=D1=82=D0=B5=D1=81=D1=82=D1=8B=20=D0=B8=20?= =?UTF-8?q?=D0=BA=D0=BE=D0=BC=D0=BC=D0=B5=D0=BD=D1=82=D1=8B;=20[+]=20todo-?= =?UTF-8?q?=D1=82=D0=B5=D1=81=D1=82=20=D0=B2=20shareVkPost?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/__tests__/callVkApi.test.ts | 2 -- src/__tests__/checkVkUserDenied.test.ts | 38 ++++++++++++------------- src/__tests__/getVkAccessToken.test.ts | 5 ++-- src/__tests__/isVkError.test.ts | 10 ++++--- src/__tests__/shareVkPost.test.ts | 7 +++++ 5 files changed, 35 insertions(+), 27 deletions(-) create mode 100644 src/__tests__/shareVkPost.test.ts diff --git a/src/__tests__/callVkApi.test.ts b/src/__tests__/callVkApi.test.ts index d80d6f4..b90bd10 100644 --- a/src/__tests__/callVkApi.test.ts +++ b/src/__tests__/callVkApi.test.ts @@ -68,8 +68,6 @@ const getMockTokenExpiredErrorCases = () => /** * Проверка на передачу в бридж токена - * @param token - * @param nthTime */ const expectBridgeCalledWithToken = ({ token, diff --git a/src/__tests__/checkVkUserDenied.test.ts b/src/__tests__/checkVkUserDenied.test.ts index 719c615..0e12b59 100644 --- a/src/__tests__/checkVkUserDenied.test.ts +++ b/src/__tests__/checkVkUserDenied.test.ts @@ -44,7 +44,7 @@ const getVkAuthTypeError = ({ const getVKClientTypeError = ({ errorReason = randomString(10), - // +5, чтобы точно не было правильного кода ошибки + // +5, чтобы точно не было ошибки с кодом отказа 4 errorCode = 5 + randomNumberUpTo(100), } = {}): ErrorData => ({ error_type: 'client_error', @@ -63,8 +63,8 @@ describe('Функция checkVkUserDenied', () => { userDeniedErrorReasons.forEach((reason) => { it( - 'Объект ошибки, соответствующий типу ошибки api_error' + - ` но с error_reason "${reason}" и кодом ошибки 4`, + 'Объект ошибки, соответствующий типу ошибки api_error, ' + + `но с error_reason "${reason}" и кодом ошибки 4`, () => { expect( checkVkUserDenied( @@ -81,8 +81,8 @@ describe('Функция checkVkUserDenied', () => { userDeniedErrorReasons.forEach((reason) => { it( - 'Объект ошибки, соответствующий типу ошибки auth_error,' + - ` но с error_reason "${reason}" и кодом ошибки 4`, + 'Объект ошибки, соответствующий типу ошибки auth_error, ' + + `но с error_reason "${reason}" и кодом ошибки 4`, () => { expect( checkVkUserDenied( @@ -95,8 +95,8 @@ describe('Функция checkVkUserDenied', () => { userDeniedErrorReasons.forEach((reason) => { it( - 'Объект ошибки, соответствующий типу ошибки client_error' + - ` с правильным error_reason "${reason}" и кодом ошибки 4`, + 'Объект ошибки, соответствующий типу ошибки client_error ' + + `с правильным error_reason "${reason}" и кодом ошибки 4`, () => { expect( checkVkUserDenied( @@ -109,8 +109,8 @@ describe('Функция checkVkUserDenied', () => { userDeniedErrorReasons.forEach((reason) => { it( - 'Объект ошибки, соответствующий типу ошибки client_error с произвольным кодом ошибки,' + - ` с правильным error_reason "${reason}", но в нижнем регистре`, + 'Объект ошибки, соответствующий типу ошибки client_error с произвольным кодом ошибки, ' + + `с правильным error_reason "${reason}", но в нижнем регистре`, () => { expect( checkVkUserDenied( @@ -125,9 +125,9 @@ describe('Функция checkVkUserDenied', () => { userDeniedErrorReasons.forEach((reason) => { it( - 'Объект ошибки, соответствующий типу ошибки client_error,' + - ' с произвольным кодом ошибки,' + - ` с правильным error_reason "${reason}"`, + 'Объект ошибки, соответствующий типу ошибки client_error, ' + + 'с произвольным кодом ошибки, ' + + `с правильным error_reason "${reason}"`, () => { expect( checkVkUserDenied(getVKClientTypeError({ errorReason: reason })) @@ -137,8 +137,8 @@ describe('Функция checkVkUserDenied', () => { }); it( - 'Объект ошибки, соответствующий типу ошибки client_error с кодом ошибки 4,' + - ' с произвольной причиной ошибки', + 'Объект ошибки, соответствующий типу ошибки client_error с кодом ошибки 4, ' + + 'с произвольной причиной ошибки', () => { expect(checkVkUserDenied(getVKClientTypeError({ errorCode: 4 }))).toBe( true @@ -147,9 +147,9 @@ describe('Функция checkVkUserDenied', () => { ); it( - 'Объект ошибки, соответствующий типу ошибки client_error' + - ' с произвольным кодом ошибки,' + - ' с произвольной причиной ошибки', + 'Объект ошибки, соответствующий типу ошибки client_error ' + + 'с произвольным кодом ошибки, ' + + 'с произвольной причиной ошибки', () => { expect(checkVkUserDenied(getVKClientTypeError())).toBe(false); } @@ -157,8 +157,8 @@ describe('Функция checkVkUserDenied', () => { userDeniedErrorReasons.forEach((reason) => { it( - 'Объект, содержащий минимально достаточные поля, с типом ошибки client_error' + - ` с причиной ошибки "${reason}" и кодом ошибки 4`, + 'Объект, содержащий минимально достаточные поля, с типом ошибки client_error ' + + `с причиной ошибки "${reason}" и кодом ошибки 4`, () => { expect( checkVkUserDenied({ diff --git a/src/__tests__/getVkAccessToken.test.ts b/src/__tests__/getVkAccessToken.test.ts index 65e8b22..6f8c37c 100644 --- a/src/__tests__/getVkAccessToken.test.ts +++ b/src/__tests__/getVkAccessToken.test.ts @@ -103,7 +103,8 @@ const getScopesWithAvailablePartlyOverlapping = (): ScopesPair[] => [ ]; /** - * Получить пары запрашиваемых и получаемых скоупов + * Получить пары запрашиваемых и фактически получаемых скоупов + * для теста поведения пользователя */ const getRequestToResultScopes = (): { requestScopes: PersonalAuthScope[]; @@ -539,7 +540,7 @@ describe('Функция getVkAccessToken', () => { }); expect(result).toEqual(''); - expect(window.scope?.split(',').sort().join(',')).toBe(''); + expect(window.scope).toBe(''); expect(window.access_token).toBe(''); expect(bridge.send).toHaveBeenCalledTimes(1); expectNoErrorsOccurred(); diff --git a/src/__tests__/isVkError.test.ts b/src/__tests__/isVkError.test.ts index 31916e2..9e3fbba 100644 --- a/src/__tests__/isVkError.test.ts +++ b/src/__tests__/isVkError.test.ts @@ -82,18 +82,20 @@ describe('Функция isVkError', () => { }); it('Объект с произвольным значением поля error_data, но отсутствующим error_type', () => { - expect(isVkError({ error_data: randomString(6) })); + expect(isVkError({ error_data: randomString(6) })).toBe(false); }); it('Объект с произвольным значением поля error_data и неправильным error_type', () => { expect( isVkError({ error_data: randomString(6), error_type: randomString(6) }) - ); + ).toBe(false); }); vkErrorTypes.forEach((errorType) => { it(`Объект с произвольным error_data и error_type, равным "${errorType}"`, () => { - expect(isVkError({ error_data: randomString(6), error_type: errorType })); + expect( + isVkError({ error_data: randomString(6), error_type: errorType }) + ).toBe(true); }); }); @@ -108,7 +110,7 @@ describe('Функция isVkError', () => { error_type: errorType, [randomString(6)]: randomNumberUpTo(100), }) - ); + ).toBe(true); } ); }); diff --git a/src/__tests__/shareVkPost.test.ts b/src/__tests__/shareVkPost.test.ts new file mode 100644 index 0000000..9086967 --- /dev/null +++ b/src/__tests__/shareVkPost.test.ts @@ -0,0 +1,7 @@ +describe('Функция shareVkPost', () => { + it.todo( + 'Тесты отваливаются, потому что jest ругается на использование ' + + 'esm в mediaproject-utils. По крайней мере локально это решается сборкой ' + + 'mediaproject-utils на cjs и подключением через npm/yarn link' + ); +}); From d4116bfd6fa55331b6c6f262caeb79e0cdc7d106 Mon Sep 17 00:00:00 2001 From: "d.ragozin" Date: Tue, 16 Jan 2024 12:37:11 +0300 Subject: [PATCH 17/46] =?UTF-8?q?[*]=20=D0=9F=D0=B5=D1=80=D0=B5=D0=B8?= =?UTF-8?q?=D0=BC=D0=B5=D0=BD=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/__tests__/checkVkUserDenied.test.ts | 17 +++++++---------- src/__tests__/shareVkStory.test.ts | 4 ++-- src/checkVkUserDenied.ts | 9 +++------ 3 files changed, 12 insertions(+), 18 deletions(-) diff --git a/src/__tests__/checkVkUserDenied.test.ts b/src/__tests__/checkVkUserDenied.test.ts index 0e12b59..d30b8f5 100644 --- a/src/__tests__/checkVkUserDenied.test.ts +++ b/src/__tests__/checkVkUserDenied.test.ts @@ -1,9 +1,6 @@ import { ErrorData } from '@vkontakte/vk-bridge/dist/types/src/types/bridge'; -import { - checkVkUserDenied, - userDeniedErrorReasons, -} from '../checkVkUserDenied'; +import { checkVkUserDenied, userDeniedReasons } from '../checkVkUserDenied'; import { randomNumberUpTo, randomString, range } from './utils'; @@ -61,7 +58,7 @@ describe('Функция checkVkUserDenied', () => { expect(checkVkUserDenied(getVkApiTypeError())).toBe(false); }); - userDeniedErrorReasons.forEach((reason) => { + userDeniedReasons.forEach((reason) => { it( 'Объект ошибки, соответствующий типу ошибки api_error, ' + `но с error_reason "${reason}" и кодом ошибки 4`, @@ -79,7 +76,7 @@ describe('Функция checkVkUserDenied', () => { expect(checkVkUserDenied(getVkAuthTypeError())).toBe(false); }); - userDeniedErrorReasons.forEach((reason) => { + userDeniedReasons.forEach((reason) => { it( 'Объект ошибки, соответствующий типу ошибки auth_error, ' + `но с error_reason "${reason}" и кодом ошибки 4`, @@ -93,7 +90,7 @@ describe('Функция checkVkUserDenied', () => { ); }); - userDeniedErrorReasons.forEach((reason) => { + userDeniedReasons.forEach((reason) => { it( 'Объект ошибки, соответствующий типу ошибки client_error ' + `с правильным error_reason "${reason}" и кодом ошибки 4`, @@ -107,7 +104,7 @@ describe('Функция checkVkUserDenied', () => { ); }); - userDeniedErrorReasons.forEach((reason) => { + userDeniedReasons.forEach((reason) => { it( 'Объект ошибки, соответствующий типу ошибки client_error с произвольным кодом ошибки, ' + `с правильным error_reason "${reason}", но в нижнем регистре`, @@ -123,7 +120,7 @@ describe('Функция checkVkUserDenied', () => { ); }); - userDeniedErrorReasons.forEach((reason) => { + userDeniedReasons.forEach((reason) => { it( 'Объект ошибки, соответствующий типу ошибки client_error, ' + 'с произвольным кодом ошибки, ' + @@ -155,7 +152,7 @@ describe('Функция checkVkUserDenied', () => { } ); - userDeniedErrorReasons.forEach((reason) => { + userDeniedReasons.forEach((reason) => { it( 'Объект, содержащий минимально достаточные поля, с типом ошибки client_error ' + `с причиной ошибки "${reason}" и кодом ошибки 4`, diff --git a/src/__tests__/shareVkStory.test.ts b/src/__tests__/shareVkStory.test.ts index 40f6f31..a22e404 100644 --- a/src/__tests__/shareVkStory.test.ts +++ b/src/__tests__/shareVkStory.test.ts @@ -2,7 +2,7 @@ import originalBridge, { ReceiveData } from '@vkontakte/vk-bridge'; import { ShareVkStoryPropsType } from '../types'; import { shareVkStory } from '../shareVkStory'; -import { userDeniedErrorReasons } from '../checkVkUserDenied'; +import { userDeniedReasons } from '../checkVkUserDenied'; import { getRandomVkApiError, getUserDeniedCommonError } from './utils'; @@ -132,7 +132,7 @@ describe('Функция shareVkStory', () => { ); }); - [...userDeniedErrorReasons].forEach((reason) => { + [...userDeniedReasons].forEach((reason) => { it(`Отказ пользователя, причина ошибки: "${reason}"`, async () => { bridge.send.mockImplementation(() => { throw getUserDeniedCommonError({ reason }); diff --git a/src/checkVkUserDenied.ts b/src/checkVkUserDenied.ts index 4f56325..0066358 100644 --- a/src/checkVkUserDenied.ts +++ b/src/checkVkUserDenied.ts @@ -1,9 +1,6 @@ import { ErrorData } from '@vkontakte/vk-bridge'; -const userDeniedErrorReasons = new Set([ - 'User denied', - 'Operation denied by user', -]); +const userDeniedReasons = new Set(['User denied', 'Operation denied by user']); /** * Утилита для проверки, что пришедшая от API ВКонтакте ошибка, @@ -22,7 +19,7 @@ const checkVkUserDenied = (error: ErrorData): boolean => { error_data: { error_reason, error_code }, } = error; - return userDeniedErrorReasons.has(error_reason) || error_code === 4; + return userDeniedReasons.has(error_reason) || error_code === 4; }; -export { checkVkUserDenied, userDeniedErrorReasons }; +export { checkVkUserDenied, userDeniedReasons }; From 5a9ed4f1cf43e9dc6d7e5d066b3fb42f1dcbde28 Mon Sep 17 00:00:00 2001 From: "d.ragozin" Date: Tue, 16 Jan 2024 12:49:11 +0300 Subject: [PATCH 18/46] =?UTF-8?q?[*]=20=D0=9F=D1=80=D0=B0=D0=B2=D0=BA?= =?UTF-8?q?=D0=B8=20=D1=82=D0=B5=D1=81=D1=82=D0=BE=D0=B2=20getVkAccessToke?= =?UTF-8?q?n?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/__tests__/getVkAccessToken.test.ts | 6 +++--- src/getVkAccessToken.ts | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/__tests__/getVkAccessToken.test.ts b/src/__tests__/getVkAccessToken.test.ts index 6f8c37c..9b628d0 100644 --- a/src/__tests__/getVkAccessToken.test.ts +++ b/src/__tests__/getVkAccessToken.test.ts @@ -529,7 +529,7 @@ describe('Функция getVkAccessToken', () => { bridge.send.mockImplementation(() => Promise.resolve>({ scope: '', - access_token: '', + access_token: MOCK_TOKEN, }) ); @@ -539,9 +539,9 @@ describe('Функция getVkAccessToken', () => { ...getErrorCallbacks(), }); - expect(result).toEqual(''); + expect(result).toEqual(MOCK_TOKEN); expect(window.scope).toBe(''); - expect(window.access_token).toBe(''); + expect(window.access_token).toBe(MOCK_TOKEN); expect(bridge.send).toHaveBeenCalledTimes(1); expectNoErrorsOccurred(); }); diff --git a/src/getVkAccessToken.ts b/src/getVkAccessToken.ts index a4346c9..7286351 100644 --- a/src/getVkAccessToken.ts +++ b/src/getVkAccessToken.ts @@ -147,7 +147,7 @@ const getVkAccessToken = async ({ }); /** Если получен ответ */ - if (data.access_token || data.access_token === '') { + if (data.access_token) { const receivedScopesSet = new Set(parseVkScopes(data.scope)); const allNeededScopesReceived = checkOneScopesSetIncludesAnother( From 3ff9e1af298716332d4f85b17ed83c259ca6cef0 Mon Sep 17 00:00:00 2001 From: "d.ragozin" Date: Tue, 16 Jan 2024 13:20:14 +0300 Subject: [PATCH 19/46] =?UTF-8?q?[*]=20=D0=9A=D0=BE=D0=BC=D0=BC=D0=B5?= =?UTF-8?q?=D0=BD=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/__tests__/checkVkPlatform.test.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/__tests__/checkVkPlatform.test.ts b/src/__tests__/checkVkPlatform.test.ts index 640352e..4267129 100644 --- a/src/__tests__/checkVkPlatform.test.ts +++ b/src/__tests__/checkVkPlatform.test.ts @@ -233,6 +233,9 @@ const vkPlatformCases: Record< }, }; +// Todo: После мёржа обновлений про запись параметров в window дополнить тесты +// проверкой возвращаемых функцией значений. +// https://github.com/ktsstudio/mediaproject-vk/pull/18 describe('Функция checkVkPlatform', () => { let userAgentGetter: jest.SpyInstance; let initialBodyClassList: DOMTokenList; From a084e17d2aff097f09209065447fc28b9da2078a Mon Sep 17 00:00:00 2001 From: "d.ragozin" Date: Tue, 16 Jan 2024 13:46:14 +0300 Subject: [PATCH 20/46] =?UTF-8?q?[+]=20=D0=9F=D1=80=D0=B0=D0=B2=D0=BA?= =?UTF-8?q?=D0=B0=20=D0=B0=D0=B2=D1=82=D0=BE=D1=82=D0=B5=D1=81=D1=82=D0=BE?= =?UTF-8?q?=D0=B2=20getVkAccessToken?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/__tests__/getVkAccessToken.test.ts | 61 +++++++++++++++----------- 1 file changed, 36 insertions(+), 25 deletions(-) diff --git a/src/__tests__/getVkAccessToken.test.ts b/src/__tests__/getVkAccessToken.test.ts index 9b628d0..27d6eab 100644 --- a/src/__tests__/getVkAccessToken.test.ts +++ b/src/__tests__/getVkAccessToken.test.ts @@ -78,7 +78,8 @@ const getNonOverlappingScopes = (): ScopesPair[] => [ /** * Получить множества имеющихся и запрашиваемых скоупов, - * где запрашиваемый скоуп является подмножеством имеющегося. + * где запрашиваемый скоуп является подмножеством имеющегося + * или полностью совпадает с ним. */ const getScopesWithRequestPartlyOverlapping = (): ScopesPair[] => [ { available: ['stats', 'docs'], toRequest: ['docs'] }, @@ -87,6 +88,10 @@ const getScopesWithRequestPartlyOverlapping = (): ScopesPair[] => [ available: ['stats', 'docs', 'groups', 'market'], toRequest: ['groups', 'market'], }, + { + available: ['stats', 'docs', 'groups', 'market'], + toRequest: ['stats', 'docs', 'groups', 'market'], + }, ]; /** @@ -379,7 +384,7 @@ describe('Функция getVkAccessToken', () => { it( 'Успешный запрос. Множество имеющихся скоупов ' + 'полностью не совпадает с множеством запрашиваемых скоупов ' + - 'или множество имеющихся скоупов является подножеством запрашиваемых. ' + + 'или множество имеющихся скоупов является подмножеством запрашиваемых. ' + `Имеющиеся скоупы: ${available}. Запрашиваемые скоупы: ${toRequest}`, async () => { window.access_token = MOCK_AVAILABLE_TOKEN; @@ -546,34 +551,40 @@ describe('Функция getVkAccessToken', () => { expectNoErrorsOccurred(); }); - getScopesCounts().forEach((count) => { - it(`Отказ от всех скоупов. Количество скоупов: ${count}`, async () => { - const requestScopes = getRandomScopes(count); + getNonOverlappingScopes().forEach(({ toRequest, available }) => { + it( + 'Отказ от всех скоупов (множество запрашиваемых не является подмножеством имеющихся) ' + + `Имеющийся: ${available.join(',')}. Запрашиваемый: ${toRequest.join( + ',' + )}`, + async () => { + const availableScopeString = available.join(','); - window.access_token = MOCK_AVAILABLE_TOKEN; - window.scope = MOCK_SCOPES_STRING; + window.access_token = MOCK_AVAILABLE_TOKEN; + window.scope = availableScopeString; - const deniedAllError = getUserDeniedCommonError(); + const deniedAllError = getUserDeniedCommonError(); - bridge.send.mockImplementation(() => { - throw deniedAllError; - }); + bridge.send.mockImplementation(() => { + throw deniedAllError; + }); - const result = await getVkAccessToken({ - scopes: requestScopes, - appId: MOCK_APP_ID, - ...getErrorCallbacks(), - }); + const result = await getVkAccessToken({ + scopes: toRequest, + appId: MOCK_APP_ID, + ...getErrorCallbacks(), + }); - expect(result).toEqual(null); - expect(window.scope).toBe(MOCK_SCOPES_STRING); - expect(window.access_token).toBe(MOCK_AVAILABLE_TOKEN); - expect(bridge.send).toHaveBeenCalledTimes(1); + expect(result).toEqual(null); + expect(window.scope).toBe(availableScopeString); + expect(window.access_token).toBe(MOCK_AVAILABLE_TOKEN); + expect(bridge.send).toHaveBeenCalledTimes(1); - expect(mockOnUserDeniedSomeScopes).not.toHaveBeenCalled(); - expect(mockOnErrorOccurred).not.toHaveBeenCalled(); - expect(mockOnUserDeniedAll).toHaveBeenCalledWith(deniedAllError); - }); + expect(mockOnUserDeniedSomeScopes).not.toHaveBeenCalled(); + expect(mockOnErrorOccurred).not.toHaveBeenCalled(); + expect(mockOnUserDeniedAll).toHaveBeenCalledWith(deniedAllError); + } + ); }); getRequestToResultScopes().forEach(({ requestScopes, resultScopes }) => { @@ -586,7 +597,7 @@ describe('Функция getVkAccessToken', () => { bridge.send.mockImplementation(() => Promise.resolve>({ - access_token: MOCK_AVAILABLE_TOKEN, + access_token: MOCK_TOKEN, scope: resultScopes.join(','), }) ); From ff0d59a56988a4d6b3f03e2fe70b3932fc694046 Mon Sep 17 00:00:00 2001 From: kurakinasv Date: Fri, 19 Jan 2024 14:06:40 +0300 Subject: [PATCH 21/46] [*] js doc --- src/callVkApi.ts | 2 +- src/setVkViewSettings.ts | 1 + src/shareVkPost.ts | 1 + 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/callVkApi.ts b/src/callVkApi.ts index c8b3928..875e4a1 100644 --- a/src/callVkApi.ts +++ b/src/callVkApi.ts @@ -27,7 +27,7 @@ const VK_TOKEN_ERRORS = [ * @param {string} [props.version='5.131'] Версия API, используемая для запроса. По умолчанию 5.131. * @param {string|null} [props.accessToken=null] Ключ доступа для обращения к API. Если не передан, будет получен вызовом функции {@link getVkAccessToken} с передчаей в нее параметров из getAccessTokenParams. * @param {string} [props.renewTokenIfExpired=true] Нужно ли получить новый токен доступа и повторить запрос в случае, если срок действия токена закончился. Если указан как true, то при получении от API ошибки одной из {@link VK_TOKEN_ERRORS} будет вызван метод {@link getNewVkAccessToken} с аргументом getAccessTokenParams. - * @param {Object} [props.getAccessTokenParams={}] Параметры для получения токена доступа, которые будут переданы в {@link getVkAccessToken} в случае, если токена нет, или в {@link getNewVkAccessToken}, если срок действия токена закончился (если передано значение true для renewTokenIfExpired). + * @param {Object} [props.getAccessTokenParams] Параметры для получения токена доступа, которые будут переданы в {@link getVkAccessToken} в случае, если токена нет, или в {@link getNewVkAccessToken}, если срок действия токена закончился (если передано значение true для renewTokenIfExpired). * @returns {Promise} Возвращает ответ, полученный на запрос VKWebAppCallAPIMethod с переданными параметрами. Поле результата response, присутствующее в случае успешного запроса, может быть типизировано с помощью дженерика * * @see {@link https://dev.vk.com/bridge/VKWebAppCallAPIMethod|VKWebAppCallAPIMethod} diff --git a/src/setVkViewSettings.ts b/src/setVkViewSettings.ts index 0ecd22a..555ea1b 100644 --- a/src/setVkViewSettings.ts +++ b/src/setVkViewSettings.ts @@ -24,6 +24,7 @@ const VK_PLATFORMS_WITH_VIEW_SETTINGS: VkPlatformType[] = [ * @param {light | dark} viewSettings.status_bar_style Тема для значков статус-бара. Возможные значения: light — светлая. dark — тёмная. * @param {string} viewSettings.action_bar_color Цвет экшен-бара в формате HEX-кода (#00ffff). Значение 'none' для прозрачного цвета. Только для Android. * @param {string} viewSettings.navigation_bar_color Цвет навигационного бара в формате HEX-кода (#00ffff). Только для Android. + * @param {VkPlatformType} platform текущая платформа, на которой было запущено приложение. * @returns {Promise} Возвращает ответ, полученный на запрос VKWebAppSetViewSettings с переданными параметрами. * * @see {@link https://dev.vk.com/bridge/VKWebAppSetViewSettings} diff --git a/src/shareVkPost.ts b/src/shareVkPost.ts index be688ef..b4f0e30 100644 --- a/src/shareVkPost.ts +++ b/src/shareVkPost.ts @@ -53,6 +53,7 @@ const shareVkPost = async ( * @param {File} props.file Картинка (в виде файла), которую нужно загрузить. * @param {UrlConfigType} props.apiUploadUrl Endpoint бэкенда KTS, на который нужно отправить запрос для загрузки картинки на сервер ВКонтакте. * @param {number} props.userId ID пользователя, на стену к которому нужно загрузить картинку и пошерить пост. + * @param {number} props.appId ID приложения текущего приложения. * @param {string} props.accessToken Токен доступа для обращения к API ВКонтакте (передается в {@link callVkApi}). По умолчанию берется из window.access_token. * @param {VoidFunction} props.onUserDeniedAccess Коллбэк, вызываемый в случае, если пользователь не дал разрешение на получение прав доступа внутри {@link callVkApi}. * @param {VoidFunction} props.onErrorOccurred Коллбэк, вызываемый в случае, если произошла ошибка. From be37e9854df9e9355b3e6300b4efbd47e7786233 Mon Sep 17 00:00:00 2001 From: kurakinasv Date: Fri, 19 Jan 2024 14:09:58 +0300 Subject: [PATCH 22/46] [*] fix --- src/setVkViewSettings.ts | 2 +- src/shareVkPost.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/setVkViewSettings.ts b/src/setVkViewSettings.ts index 555ea1b..f9df3b0 100644 --- a/src/setVkViewSettings.ts +++ b/src/setVkViewSettings.ts @@ -24,7 +24,7 @@ const VK_PLATFORMS_WITH_VIEW_SETTINGS: VkPlatformType[] = [ * @param {light | dark} viewSettings.status_bar_style Тема для значков статус-бара. Возможные значения: light — светлая. dark — тёмная. * @param {string} viewSettings.action_bar_color Цвет экшен-бара в формате HEX-кода (#00ffff). Значение 'none' для прозрачного цвета. Только для Android. * @param {string} viewSettings.navigation_bar_color Цвет навигационного бара в формате HEX-кода (#00ffff). Только для Android. - * @param {VkPlatformType} platform текущая платформа, на которой было запущено приложение. + * @param {VkPlatformType} platform Текущая платформа, на которой было запущено приложение. * @returns {Promise} Возвращает ответ, полученный на запрос VKWebAppSetViewSettings с переданными параметрами. * * @see {@link https://dev.vk.com/bridge/VKWebAppSetViewSettings} diff --git a/src/shareVkPost.ts b/src/shareVkPost.ts index b4f0e30..d794aba 100644 --- a/src/shareVkPost.ts +++ b/src/shareVkPost.ts @@ -53,7 +53,7 @@ const shareVkPost = async ( * @param {File} props.file Картинка (в виде файла), которую нужно загрузить. * @param {UrlConfigType} props.apiUploadUrl Endpoint бэкенда KTS, на который нужно отправить запрос для загрузки картинки на сервер ВКонтакте. * @param {number} props.userId ID пользователя, на стену к которому нужно загрузить картинку и пошерить пост. - * @param {number} props.appId ID приложения текущего приложения. + * @param {number} props.appId ID текущего приложения. * @param {string} props.accessToken Токен доступа для обращения к API ВКонтакте (передается в {@link callVkApi}). По умолчанию берется из window.access_token. * @param {VoidFunction} props.onUserDeniedAccess Коллбэк, вызываемый в случае, если пользователь не дал разрешение на получение прав доступа внутри {@link callVkApi}. * @param {VoidFunction} props.onErrorOccurred Коллбэк, вызываемый в случае, если произошла ошибка. From 916ac92a8eea215e930ba2ad3031a4de3fd1a031 Mon Sep 17 00:00:00 2001 From: "d.ragozin" Date: Tue, 23 Jan 2024 11:25:58 +0300 Subject: [PATCH 23/46] =?UTF-8?q?[*]=20=D0=9F=D1=80=D0=B0=D0=B2=D0=BA?= =?UTF-8?q?=D0=B8=20=D0=BF=D0=BE=D1=81=D0=BB=D0=B5=20=D1=80=D0=B5=D0=B2?= =?UTF-8?q?=D1=8C=D1=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Уточнение названий тестов * Оптимизация кейсов --- src/__tests__/getVkAccessToken.test.ts | 48 ++++++++------------------ src/__tests__/isVkError.test.ts | 38 +++++++++++++------- src/getVkAccessToken.ts | 2 +- 3 files changed, 41 insertions(+), 47 deletions(-) diff --git a/src/__tests__/getVkAccessToken.test.ts b/src/__tests__/getVkAccessToken.test.ts index 27d6eab..af571cf 100644 --- a/src/__tests__/getVkAccessToken.test.ts +++ b/src/__tests__/getVkAccessToken.test.ts @@ -59,8 +59,11 @@ const getRandomScopes = (count: number) => * * Один скоуп (минимальное количество) * * Случайное количество от 2 до 11 включительно * * 12 скоупов (максимальное количество) + * + * Опционально можно включить ноль */ -const getScopesCounts = () => [ +const getScopesCounts = ({ withZero = true }: { withZero?: boolean } = {}) => [ + ...(withZero ? [0] : []), 1, 2 + randomNumberUpTo(ALLOWED_VK_SCOPES.length - 2), ALLOWED_VK_SCOPES.length, @@ -128,7 +131,10 @@ const getRequestToResultScopes = (): { describe('Функция parseVkScopes', () => { getScopesCounts().forEach((count) => { it(`Правильный парсинг скоупов, количество скоупов: ${count}`, () => { + // Если количество скоупов равно 0, будет пустой массив const randomScopes = getRandomScopes(count); + + // Если количество скоупов равно 0, будет пустая строка const scopesString = randomScopes.join(','); expect(parseVkScopes(scopesString)).toEqual(randomScopes); @@ -144,10 +150,6 @@ describe('Функция parseVkScopes', () => { }); }); - it('Пустая строка', () => { - expect(parseVkScopes('')).toEqual([]); - }); - it('Случайная строка', () => { expect(parseVkScopes(randomString(20))).toEqual([]); }); @@ -164,6 +166,7 @@ describe('Функция parseVkScopes', () => { describe('Функция checkOneScopesSetIncludesAnother', () => { getScopesCounts().forEach((count) => { it(`Правильное сравнение одинаковых наборов скоупов, количество скоупов: ${count}`, () => { + // Если количество скоупов равно 0, будет пустой массив const scopes = getRandomScopes(count); expect( @@ -219,7 +222,7 @@ describe('Функция getNewVkAccessToken', () => { bridge.send.mockImplementation(() => Promise.resolve()); }); - [0, ...getScopesCounts()].forEach((count) => { + getScopesCounts().forEach((count) => { it(`Получение токена по переданным скоупам, количество скоупов: ${count}`, async () => { bridge.send.mockImplementation(() => Promise.resolve(MOCK_TOKEN_ANSWER)); @@ -233,7 +236,7 @@ describe('Функция getNewVkAccessToken', () => { }); }); - [0, ...getScopesCounts()].forEach((count) => { + getScopesCounts().forEach((count) => { it('В бридж передаётся строка со скоупами, переданными в массиве в аргументе', async () => { bridge.send.mockImplementation(() => Promise.resolve(MOCK_TOKEN_ANSWER)); @@ -346,7 +349,7 @@ describe('Функция getVkAccessToken', () => { mockOnErrorOccurred.mockClear(); }); - [0, ...getScopesCounts()].forEach((count) => { + getScopesCounts().forEach((count) => { it( 'Успешный запрос за токеном при отсутствии ' + 'доступных токена и скоупов (поля в window равны undefined). ' + @@ -471,7 +474,7 @@ describe('Функция getVkAccessToken', () => { bridge.send.mockImplementation(() => Promise.resolve>({ scope: availableScopesString, - access_token: MOCK_AVAILABLE_TOKEN, + access_token: MOCK_TOKEN, }) ); @@ -497,7 +500,10 @@ describe('Функция getVkAccessToken', () => { 'Запрашивается множество скоупов при уже имеющемся пустом множестве скоупов. ' + `Количество запрашиваемых скоупов: ${count}`, async () => { + // Если количество запрашиваемых скоупов равно 0, будет пустой массив const requestScopes = getRandomScopes(count).sort(); + + // Если количество запрашиваемых скоупов равно 0, будет пустая строка const requestScopesString = requestScopes.join(','); window.access_token = ''; @@ -527,30 +533,6 @@ describe('Функция getVkAccessToken', () => { ); }); - it('Доступное и запрашиваемое множества скоупов пустые', async () => { - window.access_token = ''; - window.scope = ''; - - bridge.send.mockImplementation(() => - Promise.resolve>({ - scope: '', - access_token: MOCK_TOKEN, - }) - ); - - const result = await getVkAccessToken({ - scopes: [], - appId: MOCK_APP_ID, - ...getErrorCallbacks(), - }); - - expect(result).toEqual(MOCK_TOKEN); - expect(window.scope).toBe(''); - expect(window.access_token).toBe(MOCK_TOKEN); - expect(bridge.send).toHaveBeenCalledTimes(1); - expectNoErrorsOccurred(); - }); - getNonOverlappingScopes().forEach(({ toRequest, available }) => { it( 'Отказ от всех скоупов (множество запрашиваемых не является подмножеством имеющихся) ' + diff --git a/src/__tests__/isVkError.test.ts b/src/__tests__/isVkError.test.ts index 9e3fbba..ed1a17b 100644 --- a/src/__tests__/isVkError.test.ts +++ b/src/__tests__/isVkError.test.ts @@ -61,14 +61,18 @@ describe('Функция isVkError', () => { }); vkErrorTypes.forEach((errorType) => { - it(`Объект с error_type, равным "${errorType}", но с отсутствующим error_data`, () => { - expect(isVkError({ error_type: errorType })).toBe(false); - }); + it( + `Попытка обмана проверки: объект с error_type, равным "${errorType}", ` + + 'но с отсутствующим error_data', + () => { + expect(isVkError({ error_type: errorType })).toBe(false); + } + ); }); vkErrorTypes.forEach((errorType) => { it( - `Объект с error_type, равным "${errorType}", ` + + `Попытка обмана проверки: объект с error_type, равным "${errorType}", ` + 'с произвольным request_id, но с отсутствующим error_data', () => { expect( @@ -81,15 +85,23 @@ describe('Функция isVkError', () => { ); }); - it('Объект с произвольным значением поля error_data, но отсутствующим error_type', () => { - expect(isVkError({ error_data: randomString(6) })).toBe(false); - }); + it( + 'Попытка обмана проверки: объект с произвольным значением поля error_data, ' + + 'но отсутствующим error_type', + () => { + expect(isVkError({ error_data: randomString(6) })).toBe(false); + } + ); - it('Объект с произвольным значением поля error_data и неправильным error_type', () => { - expect( - isVkError({ error_data: randomString(6), error_type: randomString(6) }) - ).toBe(false); - }); + it( + 'Попытка обмана проверки: объект с произвольным значением поля error_data ' + + 'и неправильным error_type', + () => { + expect( + isVkError({ error_data: randomString(6), error_type: randomString(6) }) + ).toBe(false); + } + ); vkErrorTypes.forEach((errorType) => { it(`Объект с произвольным error_data и error_type, равным "${errorType}"`, () => { @@ -101,7 +113,7 @@ describe('Функция isVkError', () => { vkErrorTypes.forEach((errorType) => { it( - 'Объект с произвольным error_data, произвольным полем' + + 'Объект с произвольным error_data, произвольным полем ' + `и error_type, равным "${errorType}"`, () => { expect( diff --git a/src/getVkAccessToken.ts b/src/getVkAccessToken.ts index 7286351..8d4a3fa 100644 --- a/src/getVkAccessToken.ts +++ b/src/getVkAccessToken.ts @@ -54,7 +54,7 @@ const parseVkScopes = (scopes?: string): PersonalAuthScope[] => { * Внимание: пустое множество является подмножеством любого множества. * * @param {Set} firstScope Первое множество scopes. - * @param {Set,} secondScope Второе множество scopes. + * @param {Set} secondScope Второе множество scopes. * @returns {boolean} Если все значения из первого множества встречаются во втором, возвращает true. Иначе возвращает false. */ const checkOneScopesSetIncludesAnother = ( From 0f25208753d0c01615a6d995b2f92bf416e391e8 Mon Sep 17 00:00:00 2001 From: "d.ragozin" Date: Fri, 26 Jan 2024 12:49:25 +0300 Subject: [PATCH 24/46] =?UTF-8?q?[+]=20changelog,=20=D0=BA=D0=BE=D0=BC?= =?UTF-8?q?=D0=B0=D0=BD=D0=B4=D0=B0=20=D0=B4=D0=BB=D1=8F=20=D1=81=D0=B1?= =?UTF-8?q?=D0=BE=D1=80=D0=B0=20=D1=81=D0=BF=D0=B8=D1=81=D0=BA=D0=B0=20?= =?UTF-8?q?=D1=82=D0=B5=D1=81=D1=82=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 7 + package.json | 1 + src/__tests__/testsList.txt | 259 ++++++++++++++++++++++++++++++++++++ 3 files changed, 267 insertions(+) create mode 100644 src/__tests__/testsList.txt diff --git a/CHANGELOG.md b/CHANGELOG.md index 201d94c..56ca772 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +# v3.0.0 +[*] исправлена проверка на пустую строку в функции `checkVkAvatarIsDefault` +[*] в десктоп-платформы добавлены платформы десктопного ВК Мессенджера в функции `checkVkPlatform` +[*] в функции `setVkViewSettings` удалено обращение к `window` +[*] в функции `shareVkPostWithUpload` добавлен аргумент `appId`, прокидываемый в параметры для получения токена в `callVkApi` +[+] добавлены автотесты на функции `callVkApi`, `parseVkScopes`, `checkOneScopesSetIncludesAnother`, `getNewVkAccessToken`, `getVkAccessToken`, `checkVkPlatform`, `callVkApi`, `checkVkAvatarIsDefault`, `setVkViewSettings`, `shareVkStory`, `isVkError`, `checkVkUserDenied`, хуки `usePolling`, `useEventSubscribe` + #### v2.1.1 [-] shareVkPostWithUpload: убрана вложенность response diff --git a/package.json b/package.json index ae7ec82..70a3cd1 100644 --- a/package.json +++ b/package.json @@ -36,6 +36,7 @@ "codestyle": "prettier --write \"src/**/*.{ts,js}?(x)\"", "tsc-check": "tsc --skipLibCheck --noEmit --project tsconfig.json", "test": "jest", + "test:list": "jest --verbose --no-color 2> ./src/__tests__/testsList.txt", "test:cover": "jest --coverage --collectCoverageFrom='src/**/*.{ts,tsx}'", "precommit": "lint-staged" }, diff --git a/src/__tests__/testsList.txt b/src/__tests__/testsList.txt new file mode 100644 index 0000000..e47ffbf --- /dev/null +++ b/src/__tests__/testsList.txt @@ -0,0 +1,259 @@ +PASS src/__tests__/usePolling.test.ts + Хук usePolling: + С параметрами по умолчанию: + ✓ должен устанавливать и очищать таймер (9 ms) + ✓ должен вызывать переданную функцию с частотой - 60 секунд (39 ms) + С параметром (condition = false): + ✓ не должен устанавливать и очищать таймер (1 ms) + ✓ не должен вызывать переданную функцию (1 ms) + С переключением параметра condition в жизненном цикле хука: + ✓ должен устанавливать и очищать таймер при каждом переключении (2 ms) + ✓ если (condition = true) должен вызывать переданную функцию с частотой - 60 секунд (47 ms) + Параметр pollingInterval должен задавать промежуток времени между вызовами в миллисекундах: + ✓ должен вызывать переданную функцию с частотой - 100 миллисекунд (77 ms) + ✓ не должен меняться при ререндерах (117 ms) + Должен подписываться на событие скрытия приложения и отписываться от него: + ✓ при монтировании и размонтировании (1 ms) + ✓ при смене аргумента condition (1 ms) + +PASS src/__tests__/useEventSubscribe.test.ts + Хук useEventSubscribe + ✓ Происходит подписка и отписка при монтировании и размонтировании соответственно (6 ms) + ✓ Происходит подписка и отписка при изменении аргумента с зависимостями (2 ms) + +PASS src/__tests__/getVkAccessToken.test.ts + Функция parseVkScopes + ✓ Правильный парсинг скоупов, количество скоупов: 0 (2 ms) + ✓ Правильный парсинг скоупов, количество скоупов: 1 + ✓ Правильный парсинг скоупов, количество скоупов: 11 (1 ms) + ✓ Правильный парсинг скоупов, количество скоупов: 12 + ✓ Неправильный разделитель строк: ", " + ✓ Неправильный разделитель строк: " ," + ✓ Неправильный разделитель строк: " " + ✓ Неправильный разделитель строк: ";" + ✓ Случайная строка + ✓ Строка с разделёнными запятыми случайными строками + Функция checkOneScopesSetIncludesAnother + ✓ Правильное сравнение одинаковых наборов скоупов, количество скоупов: 0 + ✓ Правильное сравнение одинаковых наборов скоупов, количество скоупов: 1 + ✓ Правильное сравнение одинаковых наборов скоупов, количество скоупов: 11 (1 ms) + ✓ Правильное сравнение одинаковых наборов скоупов, количество скоупов: 12 + ✓ Один скоуп является подмножеством другого + ✓ Полностью несовпадающие наборы скоупов + ✓ Первый набор скоупов пустой + ✓ Второй набор скоупов пустой + Функция getNewVkAccessToken + ✓ Получение токена по переданным скоупам, количество скоупов: 0 + ✓ Получение токена по переданным скоупам, количество скоупов: 1 + ✓ Получение токена по переданным скоупам, количество скоупов: 9 + ✓ Получение токена по переданным скоупам, количество скоупов: 12 + ✓ В бридж передаётся строка со скоупами, переданными в массиве в аргументе + ✓ В бридж передаётся строка со скоупами, переданными в массиве в аргументе (1 ms) + ✓ В бридж передаётся строка со скоупами, переданными в массиве в аргументе + ✓ В бридж передаётся строка со скоупами, переданными в массиве в аргументе + ✓ Ошибка возвращается + ✓ В бридж передаётся id приложения + ✓ Бридж вызывает метод для получения токена (1 ms) + Функция getVkAccessToken + ✓ Успешный запрос за токеном при отсутствии доступных токена и скоупов (поля в window равны undefined). Количество запрашиваемых скоупов: 0 + ✓ Успешный запрос за токеном при отсутствии доступных токена и скоупов (поля в window равны undefined). Количество запрашиваемых скоупов: 1 (1 ms) + ✓ Успешный запрос за токеном при отсутствии доступных токена и скоупов (поля в window равны undefined). Количество запрашиваемых скоупов: 11 + ✓ Успешный запрос за токеном при отсутствии доступных токена и скоупов (поля в window равны undefined). Количество запрашиваемых скоупов: 12 + ✓ Успешный запрос. Множество имеющихся скоупов полностью не совпадает с множеством запрашиваемых скоупов или множество имеющихся скоупов является подмножеством запрашиваемых. Имеющиеся скоупы: stats. Запрашиваемые скоупы: docs + ✓ Успешный запрос. Множество имеющихся скоупов полностью не совпадает с множеством запрашиваемых скоупов или множество имеющихся скоупов является подмножеством запрашиваемых. Имеющиеся скоупы: docs,groups,video. Запрашиваемые скоупы: status (1 ms) + ✓ Успешный запрос. Множество имеющихся скоупов полностью не совпадает с множеством запрашиваемых скоупов или множество имеющихся скоупов является подмножеством запрашиваемых. Имеющиеся скоупы: docs. Запрашиваемые скоупы: status,groups,stories + ✓ Успешный запрос. Множество имеющихся скоупов полностью не совпадает с множеством запрашиваемых скоупов или множество имеющихся скоупов является подмножеством запрашиваемых. Имеющиеся скоупы: docs. Запрашиваемые скоупы: stats,docs + ✓ Успешный запрос. Множество имеющихся скоупов полностью не совпадает с множеством запрашиваемых скоупов или множество имеющихся скоупов является подмножеством запрашиваемых. Имеющиеся скоупы: docs,groups. Запрашиваемые скоупы: stats,docs,groups + ✓ Успешный запрос. Множество имеющихся скоупов полностью не совпадает с множеством запрашиваемых скоупов или множество имеющихся скоупов является подмножеством запрашиваемых. Имеющиеся скоупы: groups,market. Запрашиваемые скоупы: stats,docs,groups,market (1 ms) + ✓ Успешный запрос. Множество запрашиваемых скоупов является подмножеством имеющихся скоупов. Имеющиеся скоупы: stats,docs. Запрашиваемые скоупы: docs + ✓ Успешный запрос. Множество запрашиваемых скоупов является подмножеством имеющихся скоупов. Имеющиеся скоупы: stats,docs,groups. Запрашиваемые скоупы: docs,groups (1 ms) + ✓ Успешный запрос. Множество запрашиваемых скоупов является подмножеством имеющихся скоупов. Имеющиеся скоупы: stats,docs,groups,market. Запрашиваемые скоупы: groups,market (1 ms) + ✓ Успешный запрос. Множество запрашиваемых скоупов является подмножеством имеющихся скоупов. Имеющиеся скоупы: stats,docs,groups,market. Запрашиваемые скоупы: stats,docs,groups,market + ✓ Запрашивается пустое множество скоупов при уже имеющемся множестве скоупов. Количество доступных скоупов: 0 + ✓ Запрашивается пустое множество скоупов при уже имеющемся множестве скоупов. Количество доступных скоупов: 1 (1 ms) + ✓ Запрашивается пустое множество скоупов при уже имеющемся множестве скоупов. Количество доступных скоупов: 6 + ✓ Запрашивается пустое множество скоупов при уже имеющемся множестве скоупов. Количество доступных скоупов: 12 + ✓ Запрашивается множество скоупов при уже имеющемся пустом множестве скоупов. Количество запрашиваемых скоупов: 0 + ✓ Запрашивается множество скоупов при уже имеющемся пустом множестве скоупов. Количество запрашиваемых скоупов: 1 (1 ms) + ✓ Запрашивается множество скоупов при уже имеющемся пустом множестве скоупов. Количество запрашиваемых скоупов: 3 + ✓ Запрашивается множество скоупов при уже имеющемся пустом множестве скоупов. Количество запрашиваемых скоупов: 12 + ✓ Отказ от всех скоупов (множество запрашиваемых не является подмножеством имеющихся) Имеющийся: stats. Запрашиваемый: docs + ✓ Отказ от всех скоупов (множество запрашиваемых не является подмножеством имеющихся) Имеющийся: docs,groups,video. Запрашиваемый: status (1 ms) + ✓ Отказ от всех скоупов (множество запрашиваемых не является подмножеством имеющихся) Имеющийся: docs. Запрашиваемый: status,groups,stories + ✓ Отказ от одного или нескольких скоупов. Запрашиваемые: docs,friends,status. Разрешаемые: docs + ✓ Отказ от одного или нескольких скоупов. Запрашиваемые: docs,friends,status. Разрешаемые: docs,friends (1 ms) + ✓ Неизвестная ошибка + +PASS src/__tests__/isVkError.test.ts + Функция isVkError + ✓ Примитив null + ✓ Примитив undefined + ✓ Примитив false + ✓ Примитив true + ✓ Примитив Symbol() + ✓ Примитив Symbol(named symbol) + ✓ Примитив 3440 + ✓ Примитив 373 (1 ms) + ✓ Примитив 1190 + ✓ Примитив 6928 + ✓ Примитив 3827 + ✓ Примитив 427 + ✓ Примитив YEfYOTBX1s2hORvniGTDx2BN + ✓ Примитив Vcgqd7oBCcUwRz8R7KAoCGt9 + ✓ Примитив o03nUmMkrvRfncjmtzkauPvf + ✓ Функция стрелочная + ✓ Функция не стрелочная (1 ms) + ✓ Пустой объект + ✓ Объект произвольной структуры + ✓ Объект ошибки Error + ✓ Попытка обмана проверки: объект с error_type, равным "client_error", но с отсутствующим error_data + ✓ Попытка обмана проверки: объект с error_type, равным "api_error", но с отсутствующим error_data + ✓ Попытка обмана проверки: объект с error_type, равным "auth_error", но с отсутствующим error_data + ✓ Попытка обмана проверки: объект с error_type, равным "client_error", с произвольным request_id, но с отсутствующим error_data + ✓ Попытка обмана проверки: объект с error_type, равным "api_error", с произвольным request_id, но с отсутствующим error_data + ✓ Попытка обмана проверки: объект с error_type, равным "auth_error", с произвольным request_id, но с отсутствующим error_data + ✓ Попытка обмана проверки: объект с произвольным значением поля error_data, но отсутствующим error_type + ✓ Попытка обмана проверки: объект с произвольным значением поля error_data и неправильным error_type + ✓ Объект с произвольным error_data и error_type, равным "client_error" + ✓ Объект с произвольным error_data и error_type, равным "api_error" + ✓ Объект с произвольным error_data и error_type, равным "auth_error" + ✓ Объект с произвольным error_data, произвольным полем и error_type, равным "client_error" + ✓ Объект с произвольным error_data, произвольным полем и error_type, равным "api_error" + ✓ Объект с произвольным error_data, произвольным полем и error_type, равным "auth_error" + +PASS src/__tests__/callVkApi.test.ts + Функция callVkApi + ✓ Успешный запрос с изначально корректным токеном (1 ms) + ✓ Некоторая ошибка (в том числе из-за возможно некорректного токена) + ✓ Успешный запрос, нет токена, токен должен быть получен один раз (1 ms) + ✓ Некоторая ошибка (в том числе из-за возможного некорректного токена), нет токена, токен должен быть получен один раз + ✓ Успешный запрос, изначально протухший токен, новый токен должен быть получен один раз. Ошибка: User authorization failed: access_token was given to another ip address., веб: true + ✓ Успешный запрос, изначально протухший токен, новый токен должен быть получен один раз. Ошибка: User authorization failed: access_token has expired., веб: true + ✓ Успешный запрос, изначально протухший токен, новый токен должен быть получен один раз. Ошибка: User authorization failed: access_token was given to another ip address., веб: false (1 ms) + ✓ Успешный запрос, изначально протухший токен, новый токен должен быть получен один раз. Ошибка: User authorization failed: access_token has expired., веб: false + ✓ Некоторая ошибка (в том числе из-за возможного некорректного токена) после получения нового токена. Изначально протухший токен, новый токен должен быть получен один раз. Ошибка: User authorization failed: access_token was given to another ip address., веб: true + ✓ Некоторая ошибка (в том числе из-за возможного некорректного токена) после получения нового токена. Изначально протухший токен, новый токен должен быть получен один раз. Ошибка: User authorization failed: access_token has expired., веб: true (1 ms) + ✓ Некоторая ошибка (в том числе из-за возможного некорректного токена) после получения нового токена. Изначально протухший токен, новый токен должен быть получен один раз. Ошибка: User authorization failed: access_token was given to another ip address., веб: false + ✓ Некоторая ошибка (в том числе из-за возможного некорректного токена) после получения нового токена. Изначально протухший токен, новый токен должен быть получен один раз. Ошибка: User authorization failed: access_token has expired., веб: false + ✓ Запрос с некоторым ответом, изначально протухший токен. Новый токен получать не нужно. Ошибка: User authorization failed: access_token was given to another ip address., веб: true + ✓ Запрос с некоторым ответом, изначально протухший токен. Новый токен получать не нужно. Ошибка: User authorization failed: access_token has expired., веб: true (1 ms) + ✓ Запрос с некоторым ответом, изначально протухший токен. Новый токен получать не нужно. Ошибка: User authorization failed: access_token was given to another ip address., веб: false + ✓ Запрос с некоторым ответом, изначально протухший токен. Новый токен получать не нужно. Ошибка: User authorization failed: access_token has expired., веб: false + ✓ Запрос, название метода передаётся в бридж (1 ms) + ✓ Запрос, версия VK API передаётся в параметры + ✓ Запрос, токена нет, параметры для получения токена передаются в getVkAccessToken, новый токен передаётся в бридж + ✓ Запрос, токен передаётся в бридж + ✓ Запрос, протухший токен передаётся в бридж, затем новый токен передаётся в бридж. Параметры получения токена передаются в getVkAccessToken (1 ms) + ✓ Запрос, дополнительные параметры передаются в бридж + +PASS src/__tests__/checkVkPlatform.test.ts + Функция checkVkPlatform + ✓ Десктопная версия сайта ВКонтакте (1 ms) + ✓ Десктопная версия VK Мессенджера (сайт) + ✓ Десктопное приложение VK Мессенджер + ✓ Мобильное приложение ВКонтакте для Android (1 ms) + ✓ Мобильное приложение VK Мессенджер для Android + ✓ Мобильное приложение ВКонтакте для iPadOS + ✓ Мобильное приложение ВКонтакте для iOS (1 ms) + ✓ Мобильное приложение VK Мессенджер для iOS + ✓ Мобильная версия сайта ВКонтакте, открытая в десктопном браузере (mvk) + ✓ Мобильная версия сайта ВКонтакте, открытая в мобильном браузере на андроиде (1 ms) + ✓ Мобильная версия сайта ВКонтакте, открытая в мобильном браузере на айфоне + ✓ Мобильная версия сайта ВКонтакте, открытая в мобильном браузере на айпаде + ✓ Мобильная версия сайта ВКонтакте, открытая в мобильном браузере на айподе (1 ms) + ✓ Внешнее приложение для Android, на котором запущен миниапп + ✓ Внешнее приложение для iOS, на котором запущен миниапп + ✓ Внешнее приложение для iPadOS, на котором запущен миниапп + ✓ Внешний сайт ВК, запущенный на десктопном браузере (1 ms) + ✓ Cайт, открытый в мобильном браузере на десктопе (mvk) + ✓ Cайт, открытый в мобильном браузере на андроиде + ✓ Cайт, открытый в мобильном браузере на iPhone + ✓ Cайт, открытый в мобильном браузере на iPad + ✓ Cайт, открытый в мобильном браузере на iPod + ✓ Непередача вк-платформы (1 ms) + +PASS src/__tests__/setVkViewSettings.test.ts + setVkViewSettings + ✓ Платформа, не поддерживающая view settings: desktop_web (1 ms) + ✓ Платформа, не поддерживающая view settings: desktop_web_messenger + ✓ Платформа, не поддерживающая view settings: desktop_app_messenger + ✓ Платформа, не поддерживающая view settings: mobile_web (1 ms) + ✓ Платформа, не поддерживающая view settings: android_external + ✓ Платформа, не поддерживающая view settings: iphone_external + ✓ Платформа, не поддерживающая view settings: ipad_external + ✓ Платформа, не поддерживающая view settings: web_external + ✓ Платформа, не поддерживающая view settings: mvk_external + ✓ Платформа, поддерживающая все view settings: mobile_android + ✓ Платформа, поддерживающая view settings (только окраску статусбара): mobile_iphone (1 ms) + ✓ Платформа, поддерживающая view settings (только окраску статусбара): mobile_ipad + ✓ Неизвестная ошибка bridge.supports + ✓ Неизвестная ошибка bridge.send + +PASS src/__tests__/checkVkUserDenied.test.ts + Функция checkVkUserDenied + ✓ Объект ошибки, соответствующий типу ошибки api_error (1 ms) + ✓ Объект ошибки, соответствующий типу ошибки api_error, но с error_reason "User denied" и кодом ошибки 4 + ✓ Объект ошибки, соответствующий типу ошибки api_error, но с error_reason "Operation denied by user" и кодом ошибки 4 + ✓ Объект ошибки, соответствующий типу ошибки auth_error + ✓ Объект ошибки, соответствующий типу ошибки auth_error, но с error_reason "User denied" и кодом ошибки 4 + ✓ Объект ошибки, соответствующий типу ошибки auth_error, но с error_reason "Operation denied by user" и кодом ошибки 4 (1 ms) + ✓ Объект ошибки, соответствующий типу ошибки client_error с правильным error_reason "User denied" и кодом ошибки 4 + ✓ Объект ошибки, соответствующий типу ошибки client_error с правильным error_reason "Operation denied by user" и кодом ошибки 4 + ✓ Объект ошибки, соответствующий типу ошибки client_error с произвольным кодом ошибки, с правильным error_reason "User denied", но в нижнем регистре + ✓ Объект ошибки, соответствующий типу ошибки client_error с произвольным кодом ошибки, с правильным error_reason "Operation denied by user", но в нижнем регистре + ✓ Объект ошибки, соответствующий типу ошибки client_error, с произвольным кодом ошибки, с правильным error_reason "User denied" + ✓ Объект ошибки, соответствующий типу ошибки client_error, с произвольным кодом ошибки, с правильным error_reason "Operation denied by user" (1 ms) + ✓ Объект ошибки, соответствующий типу ошибки client_error с кодом ошибки 4, с произвольной причиной ошибки + ✓ Объект ошибки, соответствующий типу ошибки client_error с произвольным кодом ошибки, с произвольной причиной ошибки + ✓ Объект, содержащий минимально достаточные поля, с типом ошибки client_error с причиной ошибки "User denied" и кодом ошибки 4 + ✓ Объект, содержащий минимально достаточные поля, с типом ошибки client_error с причиной ошибки "Operation denied by user" и кодом ошибки 4 + +PASS src/__tests__/checkVkAvatarIsDefault.test.ts + Функция checkVkAvatarIsDefault + ✓ Правильная ссылка: https://vk.com/images/camera_400.png (1 ms) + ✓ Правильная ссылка: https://vk.com/images/camera_200.png + ✓ Правильная ссылка: https://vk.com/images/camera_100.png + ✓ Правильная ссылка: https://vk.com/images/camera_50.png + ✓ Имитация ВКшной ссылки, jpg-расширение: https://vk.com/images/camera_400.jpg (1 ms) + ✓ Имитация ВКшной ссылки, jpg-расширение: https://vk.com/images/camera_200.jpg + ✓ Имитация ВКшной ссылки, jpg-расширение: https://vk.com/images/camera_100.jpg + ✓ Имитация ВКшной ссылки, jpg-расширение: https://vk.com/images/camera_50.jpg + ✓ Случайная строка в поле ссылки. Размер: 400 + ✓ Случайная строка в поле ссылки. Размер: 200 + ✓ Случайная строка в поле ссылки. Размер: 100 (1 ms) + ✓ Случайная строка в поле ссылки. Размер: 50 + ✓ Несоответствие размеров в аргументе в поле size и в ссылке. Ссылка: https://vk.com/images/camera_200.png, размер: 400 + ✓ Несоответствие размеров в аргументе в поле size и в ссылке. Ссылка: https://vk.com/images/camera_100.png, размер: 400 + ✓ Несоответствие размеров в аргументе в поле size и в ссылке. Ссылка: https://vk.com/images/camera_50.png, размер: 400 + ✓ Несоответствие размеров в аргументе в поле size и в ссылке. Ссылка: https://vk.com/images/camera_400.png, размер: 200 + ✓ Несоответствие размеров в аргументе в поле size и в ссылке. Ссылка: https://vk.com/images/camera_100.png, размер: 200 + ✓ Несоответствие размеров в аргументе в поле size и в ссылке. Ссылка: https://vk.com/images/camera_50.png, размер: 200 (1 ms) + ✓ Несоответствие размеров в аргументе в поле size и в ссылке. Ссылка: https://vk.com/images/camera_400.png, размер: 100 + ✓ Несоответствие размеров в аргументе в поле size и в ссылке. Ссылка: https://vk.com/images/camera_200.png, размер: 100 + ✓ Несоответствие размеров в аргументе в поле size и в ссылке. Ссылка: https://vk.com/images/camera_50.png, размер: 100 + ✓ Несоответствие размеров в аргументе в поле size и в ссылке. Ссылка: https://vk.com/images/camera_400.png, размер: 50 + ✓ Несоответствие размеров в аргументе в поле size и в ссылке. Ссылка: https://vk.com/images/camera_200.png, размер: 50 + ✓ Несоответствие размеров в аргументе в поле size и в ссылке. Ссылка: https://vk.com/images/camera_100.png, размер: 50 + ✓ Пустая строка в поле ссылки. Размер: 400 + ✓ Пустая строка в поле ссылки. Размер: 200 + ✓ Пустая строка в поле ссылки. Размер: 100 + ✓ Пустая строка в поле ссылки. Размер: 50 + +PASS src/__tests__/shareVkStory.test.ts + Функция shareVkStory + ✓ Успешное выполнение, источник картинки — URL (2 ms) + ✓ Успешное выполнение, источник картинки — BLOB + ✓ Все параметры, кроме источника картинки, передаются в бридж (1 ms) + ✓ Отказ пользователя, причина ошибки: "User denied" + ✓ Отказ пользователя, причина ошибки: "Operation denied by user" + ✓ Неизвестная ошибка + +PASS src/__tests__/shareVkPost.test.ts + Функция shareVkPost + ✎ todo Тесты отваливаются, потому что jest ругается на использование esm в mediaproject-utils. По крайней мере локально это решается сборкой mediaproject-utils на cjs и подключением через npm/yarn link + +Test Suites: 11 passed, 11 total +Tests: 1 todo, 212 passed, 213 total +Snapshots: 0 total +Time: 1.298 s +Ran all test suites. From f0c4b60ed50b372733fda6b7adbbcd98448103a0 Mon Sep 17 00:00:00 2001 From: "d.ragozin" Date: Mon, 29 Jan 2024 10:29:41 +0300 Subject: [PATCH 25/46] =?UTF-8?q?[+]=20=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B8=D1=8F=20package.json=20=D0=B8=20readme?= =?UTF-8?q?.md=20*=20=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB=D0=B5=D0=BD?= =?UTF-8?q?=D0=B0=20=D0=B2=D0=B5=D1=80=D1=81=D0=B8=D1=8F=20=D0=B2=20packag?= =?UTF-8?q?e.json=20*=20=D0=92=20readme=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B0=20=D1=81=D0=B5=D0=BA=D1=86=D0=B8=D1=8F?= =?UTF-8?q?=20=D0=BF=D1=80=D0=BE=20=D0=BF=D0=BE=D0=BA=D1=80=D1=8B=D1=82?= =?UTF-8?q?=D0=B8=D0=B5=20=D0=B0=D0=B2=D1=82=D0=BE=D1=82=D0=B5=D1=81=D1=82?= =?UTF-8?q?=D0=B0=D0=BC=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 5 ++++- README.md | 20 ++++++++++++++++++++ package.json | 2 +- 3 files changed, 25 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 301cf77..9e13e4b 100644 --- a/.gitignore +++ b/.gitignore @@ -5,4 +5,7 @@ dist/ node_modules/ .DS_Store index.js -index.d.ts \ No newline at end of file +index.d.ts + +# jest +coverage diff --git a/README.md b/README.md index 7a4a746..bb6a06d 100644 --- a/README.md +++ b/README.md @@ -36,6 +36,26 @@ - [checkVkPlatform](./src/checkVkPlatform.ts) - [initializeVkApp](./src/initializeVkApp.ts) +## Покрытие тестами + +Все утилиты покрыты автотестами. Исключениями являются утилиты [initializeVkApp](./src/initializeVkApp.ts) +(вскоре будет удалена в соответствии с обновлениями об [отказе от использования window для записи параметров приложения](https://github.com/ktsstudio/mediaproject-vk/pull/18)) +и [shareVkPost](./src/shareVkPost.ts) (будет покрыта автотестами после внедрения [mediaproject-utils версии 5](https://github.com/ktsstudio/mediaproject-utils/pull/18) + +Для запуска автотестов воспользуйтесь следующей командой: + +`yarn test` + +Для запуска тестов и сбора статистики по покрытию автотестами проекта, запустите команду: + +`yarn test:cover` + +Ниже представлена команда для запуска тестов и сбора списка названий всех выполненных тест-кейсов в файл по пути `./src/__test__/testsList.txt`. +Команда предназначена для удобства обзора всех тест-кейсов. Запускайте её, если меняете названия тест-кейсов, +их структуру или количество: + +`yarn test:list` + ## Обратная связь Любой фидбэк вы можете отправить нам на почту [hello@ktsstudio.ru](mailto:hello@ktsstudio.ru) или в личные сообщения [нашего сообщества ВКонтакте](https://vk.com/kts.specials). diff --git a/package.json b/package.json index 70a3cd1..0fa6ff0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@ktsstudio/mediaproject-vk", - "version": "2.1.1", + "version": "3.0.0", "description": "Package with utils for VK Mini Apps", "author": "KTS Studio (https://kts.studio)", "keywords": [ From bb01ee08adf0b53e7d52aa7c090afe01b63386f5 Mon Sep 17 00:00:00 2001 From: "d.ragozin" Date: Tue, 30 Jan 2024 16:00:19 +0300 Subject: [PATCH 26/46] =?UTF-8?q?[*]=20=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20mediaproject-utils?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 4 +- src/types/shareVkPost.ts | 3 +- yarn.lock | 533 +++++++++++++++++++++++++++++++++++++-- 3 files changed, 516 insertions(+), 24 deletions(-) diff --git a/package.json b/package.json index 5904c1a..83441d5 100644 --- a/package.json +++ b/package.json @@ -46,7 +46,7 @@ "devDependencies": { "@babel/core": "^7.20.12", "@babel/preset-env": "^7.20.2", - "@ktsstudio/mediaproject-utils": "^4.1.1", + "@ktsstudio/mediaproject-utils": "^5.0.0", "@rollup/plugin-babel": "^6.0.3", "@rollup/plugin-commonjs": "^24.0.1", "@rollup/plugin-node-resolve": "^15.0.1", @@ -72,7 +72,7 @@ "typescript": "^4.1.3" }, "peerDependencies": { - "@ktsstudio/mediaproject-utils": "^4.1.1", + "@ktsstudio/mediaproject-utils": "^5.0.0", "@types/react": ">=17", "@vkontakte/vk-bridge": "^2.7.2", "react": ">=17" diff --git a/src/types/shareVkPost.ts b/src/types/shareVkPost.ts index de9dd7b..828c91e 100644 --- a/src/types/shareVkPost.ts +++ b/src/types/shareVkPost.ts @@ -1,6 +1,5 @@ import { RequestPropsMap } from '@vkontakte/vk-bridge'; -import { ApiResponse } from '@ktsstudio/mediaproject-utils'; -import { UrlConfigType } from '@ktsstudio/mediaproject-utils/dist/types/types/api'; +import { ApiResponse, UrlConfigType } from '@ktsstudio/mediaproject-utils'; import { VkResponseType } from './common'; import { CallVkApiResponseType } from './callVkApi'; diff --git a/yarn.lock b/yarn.lock index 6d9bc1c..a4282b0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -10,6 +10,14 @@ "@jridgewell/gen-mapping" "^0.1.0" "@jridgewell/trace-mapping" "^0.3.9" +"@ampproject/remapping@^2.2.0": + version "2.2.1" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.1.tgz#99e8e11851128b8702cd57c33684f1d0f260b630" + integrity sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg== + dependencies: + "@jridgewell/gen-mapping" "^0.3.0" + "@jridgewell/trace-mapping" "^0.3.9" + "@babel/code-frame@7.12.11": version "7.12.11" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.11.tgz#f4ad435aa263db935b8f10f2c552d23fb716a63f" @@ -31,11 +39,24 @@ dependencies: "@babel/highlight" "^7.18.6" +"@babel/code-frame@^7.23.5": + version "7.23.5" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.23.5.tgz#9009b69a8c602293476ad598ff53e4562e15c244" + integrity sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA== + dependencies: + "@babel/highlight" "^7.23.4" + chalk "^2.4.2" + "@babel/compat-data@^7.17.7", "@babel/compat-data@^7.20.1", "@babel/compat-data@^7.20.5": version "7.20.10" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.20.10.tgz#9d92fa81b87542fff50e848ed585b4212c1d34ec" integrity sha512-sEnuDPpOJR/fcafHMjpcpGN5M2jbUGUHwmuWKM/YdPzeEDJg8bgmbcWQFUfE32MQjti1koACvoPVsDe8Uq+idg== +"@babel/compat-data@^7.23.5": + version "7.23.5" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.23.5.tgz#ffb878728bb6bdcb6f4510aa51b1be9afb8cfd98" + integrity sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw== + "@babel/core@^7.20.12": version "7.20.12" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.20.12.tgz#7930db57443c6714ad216953d1356dac0eb8496d" @@ -57,6 +78,27 @@ json5 "^2.2.2" semver "^6.3.0" +"@babel/core@^7.23.7": + version "7.23.9" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.23.9.tgz#b028820718000f267870822fec434820e9b1e4d1" + integrity sha512-5q0175NOjddqpvvzU+kDiSOAk4PfdO6FvwCWoQ6RO7rTzEe8vlo+4HVfcnAREhD4npMs0e9uZypjTwzZPCf/cw== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.23.5" + "@babel/generator" "^7.23.6" + "@babel/helper-compilation-targets" "^7.23.6" + "@babel/helper-module-transforms" "^7.23.3" + "@babel/helpers" "^7.23.9" + "@babel/parser" "^7.23.9" + "@babel/template" "^7.23.9" + "@babel/traverse" "^7.23.9" + "@babel/types" "^7.23.9" + convert-source-map "^2.0.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.3" + semver "^6.3.1" + "@babel/generator@^7.20.7": version "7.20.7" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.20.7.tgz#f8ef57c8242665c5929fe2e8d82ba75460187b4a" @@ -66,6 +108,16 @@ "@jridgewell/gen-mapping" "^0.3.2" jsesc "^2.5.1" +"@babel/generator@^7.23.6": + version "7.23.6" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.23.6.tgz#9e1fca4811c77a10580d17d26b57b036133f3c2e" + integrity sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw== + dependencies: + "@babel/types" "^7.23.6" + "@jridgewell/gen-mapping" "^0.3.2" + "@jridgewell/trace-mapping" "^0.3.17" + jsesc "^2.5.1" + "@babel/helper-annotate-as-pure@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz#eaa49f6f80d5a33f9a5dd2276e6d6e451be0a6bb" @@ -92,6 +144,17 @@ lru-cache "^5.1.1" semver "^6.3.0" +"@babel/helper-compilation-targets@^7.23.6": + version "7.23.6" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz#4d79069b16cbcf1461289eccfbbd81501ae39991" + integrity sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ== + dependencies: + "@babel/compat-data" "^7.23.5" + "@babel/helper-validator-option" "^7.23.5" + browserslist "^4.22.2" + lru-cache "^5.1.1" + semver "^6.3.1" + "@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.20.5", "@babel/helper-create-class-features-plugin@^7.20.7": version "7.20.12" resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.20.12.tgz#4349b928e79be05ed2d1643b20b99bb87c503819" @@ -131,6 +194,11 @@ resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz#0c0cee9b35d2ca190478756865bb3528422f51be" integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg== +"@babel/helper-environment-visitor@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167" + integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA== + "@babel/helper-explode-assignable-expression@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz#41f8228ef0a6f1a036b8dfdfec7ce94f9a6bc096" @@ -146,6 +214,14 @@ "@babel/template" "^7.18.10" "@babel/types" "^7.19.0" +"@babel/helper-function-name@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz#1f9a3cdbd5b2698a670c30d2735f9af95ed52759" + integrity sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw== + dependencies: + "@babel/template" "^7.22.15" + "@babel/types" "^7.23.0" + "@babel/helper-hoist-variables@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz#d4d2c8fb4baeaa5c68b99cc8245c56554f926678" @@ -153,6 +229,13 @@ dependencies: "@babel/types" "^7.18.6" +"@babel/helper-hoist-variables@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb" + integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== + dependencies: + "@babel/types" "^7.22.5" + "@babel/helper-member-expression-to-functions@^7.20.7": version "7.20.7" resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.20.7.tgz#a6f26e919582275a93c3aa6594756d71b0bb7f05" @@ -167,6 +250,13 @@ dependencies: "@babel/types" "^7.18.6" +"@babel/helper-module-imports@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz#16146307acdc40cc00c3b2c647713076464bdbf0" + integrity sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w== + dependencies: + "@babel/types" "^7.22.15" + "@babel/helper-module-transforms@^7.18.6", "@babel/helper-module-transforms@^7.20.11": version "7.20.11" resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.20.11.tgz#df4c7af713c557938c50ea3ad0117a7944b2f1b0" @@ -181,6 +271,17 @@ "@babel/traverse" "^7.20.10" "@babel/types" "^7.20.7" +"@babel/helper-module-transforms@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz#d7d12c3c5d30af5b3c0fcab2a6d5217773e2d0f1" + integrity sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ== + dependencies: + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-module-imports" "^7.22.15" + "@babel/helper-simple-access" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/helper-validator-identifier" "^7.22.20" + "@babel/helper-optimise-call-expression@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz#9369aa943ee7da47edab2cb4e838acf09d290ffe" @@ -222,6 +323,13 @@ dependencies: "@babel/types" "^7.20.2" +"@babel/helper-simple-access@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz#4938357dc7d782b80ed6dbb03a0fba3d22b1d5de" + integrity sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w== + dependencies: + "@babel/types" "^7.22.5" + "@babel/helper-skip-transparent-expression-wrappers@^7.20.0": version "7.20.0" resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz#fbe4c52f60518cab8140d77101f0e63a8a230684" @@ -236,11 +344,23 @@ dependencies: "@babel/types" "^7.18.6" +"@babel/helper-split-export-declaration@^7.22.6": + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz#322c61b7310c0997fe4c323955667f18fcefb91c" + integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g== + dependencies: + "@babel/types" "^7.22.5" + "@babel/helper-string-parser@^7.19.4": version "7.19.4" resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz#38d3acb654b4701a9b77fb0615a96f775c3a9e63" integrity sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw== +"@babel/helper-string-parser@^7.23.4": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz#9478c707febcbbe1ddb38a3d91a2e054ae622d83" + integrity sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ== + "@babel/helper-validator-identifier@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz#d0f0e277c512e0c938277faa85a3968c9a44c0e8" @@ -251,11 +371,21 @@ resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2" integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== +"@babel/helper-validator-identifier@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0" + integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== + "@babel/helper-validator-option@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz#bf0d2b5a509b1f336099e4ff36e1a63aa5db4db8" integrity sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw== +"@babel/helper-validator-option@^7.23.5": + version "7.23.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz#907a3fbd4523426285365d1206c423c4c5520307" + integrity sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw== + "@babel/helper-wrap-function@^7.18.9": version "7.20.5" resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz#75e2d84d499a0ab3b31c33bcfe59d6b8a45f62e3" @@ -275,6 +405,15 @@ "@babel/traverse" "^7.20.13" "@babel/types" "^7.20.7" +"@babel/helpers@^7.23.9": + version "7.23.9" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.23.9.tgz#c3e20bbe7f7a7e10cb9b178384b4affdf5995c7d" + integrity sha512-87ICKgU5t5SzOT7sBMfCOZQ2rHjRU+Pcb9BoILMYz600W6DkVRLFBPwQ18gwUVvggqXivaUakpnxWQGbpywbBQ== + dependencies: + "@babel/template" "^7.23.9" + "@babel/traverse" "^7.23.9" + "@babel/types" "^7.23.9" + "@babel/highlight@^7.10.4", "@babel/highlight@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.14.5.tgz#6861a52f03966405001f6aa534a01a24d99e8cd9" @@ -293,11 +432,25 @@ chalk "^2.0.0" js-tokens "^4.0.0" +"@babel/highlight@^7.23.4": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.23.4.tgz#edaadf4d8232e1a961432db785091207ead0621b" + integrity sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A== + dependencies: + "@babel/helper-validator-identifier" "^7.22.20" + chalk "^2.4.2" + js-tokens "^4.0.0" + "@babel/parser@^7.20.13", "@babel/parser@^7.20.7": version "7.20.13" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.20.13.tgz#ddf1eb5a813588d2fb1692b70c6fce75b945c088" integrity sha512-gFDLKMfpiXCsjt4za2JA9oTMn70CeseCehb11kRZgvd7+F67Hih3OHOK24cRrWECJ/ljfPGac6ygXAs/C8kIvw== +"@babel/parser@^7.23.9": + version "7.23.9" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.9.tgz#7b903b6149b0f8fa7ad564af646c4c38a77fc44b" + integrity sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA== + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz#da5b8f9a580acdfbe53494dba45ea389fb09a4d2" @@ -907,6 +1060,15 @@ "@babel/parser" "^7.20.7" "@babel/types" "^7.20.7" +"@babel/template@^7.22.15", "@babel/template@^7.23.9": + version "7.23.9" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.23.9.tgz#f881d0487cba2828d3259dcb9ef5005a9731011a" + integrity sha512-+xrD2BWLpvHKNmX2QbpdpsBaWnRxahMwJjO+KZk2JOElj5nSmKezyS1B4u+QbHMTX69t4ukm6hh9lsYQ7GHCKA== + dependencies: + "@babel/code-frame" "^7.23.5" + "@babel/parser" "^7.23.9" + "@babel/types" "^7.23.9" + "@babel/traverse@^7.20.10", "@babel/traverse@^7.20.12", "@babel/traverse@^7.20.13", "@babel/traverse@^7.20.5", "@babel/traverse@^7.20.7": version "7.20.13" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.20.13.tgz#817c1ba13d11accca89478bd5481b2d168d07473" @@ -923,6 +1085,22 @@ debug "^4.1.0" globals "^11.1.0" +"@babel/traverse@^7.23.9": + version "7.23.9" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.9.tgz#2f9d6aead6b564669394c5ce0f9302bb65b9d950" + integrity sha512-I/4UJ9vs90OkBtY6iiiTORVMyIhJ4kAVmsKo9KFc8UOxMeUfi2hvtIBsET5u9GizXE6/GFSuKCTNfgCswuEjRg== + dependencies: + "@babel/code-frame" "^7.23.5" + "@babel/generator" "^7.23.6" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-function-name" "^7.23.0" + "@babel/helper-hoist-variables" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/parser" "^7.23.9" + "@babel/types" "^7.23.9" + debug "^4.3.1" + globals "^11.1.0" + "@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.19.0", "@babel/types@^7.20.0", "@babel/types@^7.20.2", "@babel/types@^7.20.5", "@babel/types@^7.20.7", "@babel/types@^7.4.4": version "7.20.7" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.20.7.tgz#54ec75e252318423fc07fb644dc6a58a64c09b7f" @@ -932,6 +1110,22 @@ "@babel/helper-validator-identifier" "^7.19.1" to-fast-properties "^2.0.0" +"@babel/types@^7.22.15", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.23.6", "@babel/types@^7.23.9": + version "7.23.9" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.9.tgz#1dd7b59a9a2b5c87f8b41e52770b5ecbf492e002" + integrity sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q== + dependencies: + "@babel/helper-string-parser" "^7.23.4" + "@babel/helper-validator-identifier" "^7.22.20" + to-fast-properties "^2.0.0" + +"@cspotcode/source-map-support@^0.8.0": + version "0.8.1" + resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" + integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== + dependencies: + "@jridgewell/trace-mapping" "0.3.9" + "@eslint/eslintrc@^0.4.3": version "0.4.3" resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.3.tgz#9e42981ef035beb3dd49add17acb96e8ff6f394c" @@ -983,6 +1177,11 @@ resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== +"@jridgewell/resolve-uri@^3.0.3", "@jridgewell/resolve-uri@^3.1.0": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721" + integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== + "@jridgewell/set-array@^1.0.0", "@jridgewell/set-array@^1.0.1": version "1.1.2" resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" @@ -1001,6 +1200,27 @@ resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== +"@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.4.15": + version "1.4.15" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" + integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== + +"@jridgewell/trace-mapping@0.3.9": + version "0.3.9" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" + integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== + dependencies: + "@jridgewell/resolve-uri" "^3.0.3" + "@jridgewell/sourcemap-codec" "^1.4.10" + +"@jridgewell/trace-mapping@^0.3.17": + version "0.3.22" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.22.tgz#72a621e5de59f5f1ef792d0793a82ee20f645e4c" + integrity sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw== + dependencies: + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" + "@jridgewell/trace-mapping@^0.3.9": version "0.3.17" resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz#793041277af9073b0951a7fe0f0d8c4c98c36985" @@ -1009,12 +1229,20 @@ "@jridgewell/resolve-uri" "3.1.0" "@jridgewell/sourcemap-codec" "1.4.14" -"@ktsstudio/mediaproject-utils@^4.1.1": - version "4.1.1" - resolved "https://registry.yarnpkg.com/@ktsstudio/mediaproject-utils/-/mediaproject-utils-4.1.1.tgz#e14e2c03c1d3222ea537d8eac29880ea7ed9c25a" - integrity sha512-PsOEThipc+IBucRcphdePSJKs0ERFpZEIwpmCbTAYjsSNgHjh0+C+M0ni3DM0V0qNOj4SH9qDwl1jWrpo5o50A== - dependencies: - axios "^0.24.0" +"@ktsstudio/mediaproject-utils@^5.0.0": + version "5.0.0" + resolved "https://registry.yarnpkg.com/@ktsstudio/mediaproject-utils/-/mediaproject-utils-5.0.0.tgz#038c48bdace542095fa61092a2c78adc5a4cfd39" + integrity sha512-WyrrKuMT3b9BXpMbSy9//hwaFv/mfO3lpzlJTfAsaPNNfswYENov9m7JZJ6oPwXg3lFUl4c/RoX/xk5XY4mJxA== + dependencies: + "@babel/core" "^7.23.7" + "@rollup/plugin-babel" "^6.0.4" + "@rollup/plugin-commonjs" "^25.0.7" + "@rollup/plugin-node-resolve" "^15.2.3" + "@rollup/plugin-typescript" "^11.1.6" + rollup "^4.9.5" + rollup-plugin-peer-deps-external "^2.2.4" + ts-node "^10.9.1" + typescript "^4.1.3" "@nodelib/fs.scandir@2.1.5": version "2.1.5" @@ -1045,6 +1273,14 @@ "@babel/helper-module-imports" "^7.18.6" "@rollup/pluginutils" "^5.0.1" +"@rollup/plugin-babel@^6.0.4": + version "6.0.4" + resolved "https://registry.yarnpkg.com/@rollup/plugin-babel/-/plugin-babel-6.0.4.tgz#bd698e351fa9aa9619fcae780aea2a603d98e4c4" + integrity sha512-YF7Y52kFdFT/xVSuVdjkV5ZdX/3YtmX0QulG+x0taQOtJdHYzVU61aSSkAgVJ7NOv6qPkIYiJSgSWWN/DM5sGw== + dependencies: + "@babel/helper-module-imports" "^7.18.6" + "@rollup/pluginutils" "^5.0.1" + "@rollup/plugin-commonjs@^24.0.1": version "24.0.1" resolved "https://registry.yarnpkg.com/@rollup/plugin-commonjs/-/plugin-commonjs-24.0.1.tgz#d54ba26a3e3c495dc332bd27a81f7e9e2df46f90" @@ -1057,6 +1293,18 @@ is-reference "1.2.1" magic-string "^0.27.0" +"@rollup/plugin-commonjs@^25.0.7": + version "25.0.7" + resolved "https://registry.yarnpkg.com/@rollup/plugin-commonjs/-/plugin-commonjs-25.0.7.tgz#145cec7589ad952171aeb6a585bbeabd0fd3b4cf" + integrity sha512-nEvcR+LRjEjsaSsc4x3XZfCCvZIaSMenZu/OiwOKGN2UhQpAYI7ru7czFvyWbErlpoGjnSX3D5Ch5FcMA3kRWQ== + dependencies: + "@rollup/pluginutils" "^5.0.1" + commondir "^1.0.1" + estree-walker "^2.0.2" + glob "^8.0.3" + is-reference "1.2.1" + magic-string "^0.30.3" + "@rollup/plugin-node-resolve@^15.0.1": version "15.0.1" resolved "https://registry.yarnpkg.com/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.0.1.tgz#72be449b8e06f6367168d5b3cd5e2802e0248971" @@ -1069,6 +1317,18 @@ is-module "^1.0.0" resolve "^1.22.1" +"@rollup/plugin-node-resolve@^15.2.3": + version "15.2.3" + resolved "https://registry.yarnpkg.com/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.2.3.tgz#e5e0b059bd85ca57489492f295ce88c2d4b0daf9" + integrity sha512-j/lym8nf5E21LwBT4Df1VD6hRO2L2iwUeUmP7litikRsVp1H6NWx20NEp0Y7su+7XGc476GnXXc4kFeZNGmaSQ== + dependencies: + "@rollup/pluginutils" "^5.0.1" + "@types/resolve" "1.20.2" + deepmerge "^4.2.2" + is-builtin-module "^3.2.1" + is-module "^1.0.0" + resolve "^1.22.1" + "@rollup/plugin-terser@^0.4.0": version "0.4.0" resolved "https://registry.yarnpkg.com/@rollup/plugin-terser/-/plugin-terser-0.4.0.tgz#4c76249ad337f3eb04ab409332f23717af2c1fbf" @@ -1086,6 +1346,14 @@ "@rollup/pluginutils" "^5.0.1" resolve "^1.22.1" +"@rollup/plugin-typescript@^11.1.6": + version "11.1.6" + resolved "https://registry.yarnpkg.com/@rollup/plugin-typescript/-/plugin-typescript-11.1.6.tgz#724237d5ec12609ec01429f619d2a3e7d4d1b22b" + integrity sha512-R92yOmIACgYdJ7dJ97p4K69I8gg6IEHt8M7dUBxN3W6nrO8uUxX5ixl0yU/N3aZTi8WhPuICvOHXQvF6FaykAA== + dependencies: + "@rollup/pluginutils" "^5.1.0" + resolve "^1.22.1" + "@rollup/pluginutils@^5.0.1": version "5.0.2" resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-5.0.2.tgz#012b8f53c71e4f6f9cb317e311df1404f56e7a33" @@ -1095,11 +1363,110 @@ estree-walker "^2.0.2" picomatch "^2.3.1" +"@rollup/pluginutils@^5.1.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-5.1.0.tgz#7e53eddc8c7f483a4ad0b94afb1f7f5fd3c771e0" + integrity sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g== + dependencies: + "@types/estree" "^1.0.0" + estree-walker "^2.0.2" + picomatch "^2.3.1" + +"@rollup/rollup-android-arm-eabi@4.9.6": + version "4.9.6" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.9.6.tgz#66b8d9cb2b3a474d115500f9ebaf43e2126fe496" + integrity sha512-MVNXSSYN6QXOulbHpLMKYi60ppyO13W9my1qogeiAqtjb2yR4LSmfU2+POvDkLzhjYLXz9Rf9+9a3zFHW1Lecg== + +"@rollup/rollup-android-arm64@4.9.6": + version "4.9.6" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.9.6.tgz#46327d5b86420d2307946bec1535fdf00356e47d" + integrity sha512-T14aNLpqJ5wzKNf5jEDpv5zgyIqcpn1MlwCrUXLrwoADr2RkWA0vOWP4XxbO9aiO3dvMCQICZdKeDrFl7UMClw== + +"@rollup/rollup-darwin-arm64@4.9.6": + version "4.9.6" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.9.6.tgz#166987224d2f8b1e2fd28ee90c447d52271d5e90" + integrity sha512-CqNNAyhRkTbo8VVZ5R85X73H3R5NX9ONnKbXuHisGWC0qRbTTxnF1U4V9NafzJbgGM0sHZpdO83pLPzq8uOZFw== + +"@rollup/rollup-darwin-x64@4.9.6": + version "4.9.6" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.9.6.tgz#a2e6e096f74ccea6e2f174454c26aef6bcdd1274" + integrity sha512-zRDtdJuRvA1dc9Mp6BWYqAsU5oeLixdfUvkTHuiYOHwqYuQ4YgSmi6+/lPvSsqc/I0Omw3DdICx4Tfacdzmhog== + +"@rollup/rollup-linux-arm-gnueabihf@4.9.6": + version "4.9.6" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.9.6.tgz#09fcd4c55a2d6160c5865fec708a8e5287f30515" + integrity sha512-oNk8YXDDnNyG4qlNb6is1ojTOGL/tRhbbKeE/YuccItzerEZT68Z9gHrY3ROh7axDc974+zYAPxK5SH0j/G+QQ== + +"@rollup/rollup-linux-arm64-gnu@4.9.6": + version "4.9.6" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.9.6.tgz#19a3c0b6315c747ca9acf86e9b710cc2440f83c9" + integrity sha512-Z3O60yxPtuCYobrtzjo0wlmvDdx2qZfeAWTyfOjEDqd08kthDKexLpV97KfAeUXPosENKd8uyJMRDfFMxcYkDQ== + +"@rollup/rollup-linux-arm64-musl@4.9.6": + version "4.9.6" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.9.6.tgz#94aaf95fdaf2ad9335983a4552759f98e6b2e850" + integrity sha512-gpiG0qQJNdYEVad+1iAsGAbgAnZ8j07FapmnIAQgODKcOTjLEWM9sRb+MbQyVsYCnA0Im6M6QIq6ax7liws6eQ== + +"@rollup/rollup-linux-riscv64-gnu@4.9.6": + version "4.9.6" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.9.6.tgz#160510e63f4b12618af4013bddf1761cf9fc9880" + integrity sha512-+uCOcvVmFUYvVDr27aiyun9WgZk0tXe7ThuzoUTAukZJOwS5MrGbmSlNOhx1j80GdpqbOty05XqSl5w4dQvcOA== + +"@rollup/rollup-linux-x64-gnu@4.9.6": + version "4.9.6" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.9.6.tgz#5ac5d068ce0726bd0a96ca260d5bd93721c0cb98" + integrity sha512-HUNqM32dGzfBKuaDUBqFB7tP6VMN74eLZ33Q9Y1TBqRDn+qDonkAUyKWwF9BR9unV7QUzffLnz9GrnKvMqC/fw== + +"@rollup/rollup-linux-x64-musl@4.9.6": + version "4.9.6" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.9.6.tgz#bafa759ab43e8eab9edf242a8259ffb4f2a57a5d" + integrity sha512-ch7M+9Tr5R4FK40FHQk8VnML0Szi2KRujUgHXd/HjuH9ifH72GUmw6lStZBo3c3GB82vHa0ZoUfjfcM7JiiMrQ== + +"@rollup/rollup-win32-arm64-msvc@4.9.6": + version "4.9.6" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.9.6.tgz#1cc3416682e5a20d8f088f26657e6e47f8db468e" + integrity sha512-VD6qnR99dhmTQ1mJhIzXsRcTBvTjbfbGGwKAHcu+52cVl15AC/kplkhxzW/uT0Xl62Y/meBKDZvoJSJN+vTeGA== + +"@rollup/rollup-win32-ia32-msvc@4.9.6": + version "4.9.6" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.9.6.tgz#7d2251e1aa5e8a1e47c86891fe4547a939503461" + integrity sha512-J9AFDq/xiRI58eR2NIDfyVmTYGyIZmRcvcAoJ48oDld/NTR8wyiPUu2X/v1navJ+N/FGg68LEbX3Ejd6l8B7MQ== + +"@rollup/rollup-win32-x64-msvc@4.9.6": + version "4.9.6" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.9.6.tgz#2c1fb69e02a3f1506f52698cfdc3a8b6386df9a6" + integrity sha512-jqzNLhNDvIZOrt69Ce4UjGRpXJBzhUBzawMwnaDAwyHriki3XollsewxWzOzz+4yOFDkuJHtTsZFwMxhYJWmLQ== + +"@tsconfig/node10@^1.0.7": + version "1.0.9" + resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.9.tgz#df4907fc07a886922637b15e02d4cebc4c0021b2" + integrity sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA== + +"@tsconfig/node12@^1.0.7": + version "1.0.11" + resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" + integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== + +"@tsconfig/node14@^1.0.0": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" + integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== + +"@tsconfig/node16@^1.0.2": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.4.tgz#0b92dcc0cc1c81f6f306a381f28e31b1a56536e9" + integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== + "@types/estree@*", "@types/estree@^1.0.0": version "1.0.0" resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.0.tgz#5fb2e536c1ae9bf35366eed879e827fa59ca41c2" integrity sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ== +"@types/estree@1.0.5": + version "1.0.5" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4" + integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== + "@types/json-schema@^7.0.7": version "7.0.8" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.8.tgz#edf1bf1dbf4e04413ca8e5b17b3b7d7d54b59818" @@ -1218,11 +1585,21 @@ acorn-jsx@^5.3.1: resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== +acorn-walk@^8.1.1: + version "8.3.2" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.2.tgz#7703af9415f1b6db9315d6895503862e231d34aa" + integrity sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A== + acorn@^7.4.0: version "7.4.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== +acorn@^8.4.1: + version "8.11.3" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a" + integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== + acorn@^8.5.0: version "8.8.2" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.2.tgz#1b2f25db02af965399b9776b0c2c391276d37c4a" @@ -1287,6 +1664,11 @@ ansi-styles@^4.0.0, ansi-styles@^4.1.0: dependencies: color-convert "^2.0.1" +arg@^4.1.0: + version "4.1.3" + resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" + integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== + argparse@^1.0.7: version "1.0.10" resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" @@ -1334,13 +1716,6 @@ astral-regex@^2.0.0: resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== -axios@^0.24.0: - version "0.24.0" - resolved "https://registry.yarnpkg.com/axios/-/axios-0.24.0.tgz#804e6fa1e4b9c5288501dd9dff56a7a0940d20d6" - integrity sha512-Q6cWsys88HoPgAaFAVUb0WpPk0O8iTeisR9IMqy9G8AbO4NlpVknrnQS03zzF9PGAWgO3cgletO3VjV/P7VztA== - dependencies: - follow-redirects "^1.14.4" - babel-plugin-polyfill-corejs2@^0.3.3: version "0.3.3" resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz#5d1bd3836d0a19e1b84bbf2d9640ccb6f951c122" @@ -1402,6 +1777,16 @@ browserslist@^4.21.3, browserslist@^4.21.4: node-releases "^2.0.6" update-browserslist-db "^1.0.9" +browserslist@^4.22.2: + version "4.22.3" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.22.3.tgz#299d11b7e947a6b843981392721169e27d60c5a6" + integrity sha512-UAp55yfwNv0klWNapjs/ktHoguxuQNGnOzxYmfnXIS+8AsRDZkSDxg7R1AX3GKzn078SBI5dzwzj/Yx0Or0e3A== + dependencies: + caniuse-lite "^1.0.30001580" + electron-to-chromium "^1.4.648" + node-releases "^2.0.14" + update-browserslist-db "^1.0.13" + buffer-from@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" @@ -1430,7 +1815,12 @@ caniuse-lite@^1.0.30001400: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001448.tgz#ca7550b1587c92a392a2b377cd9c508b3b4395bf" integrity sha512-tq2YI+MJnooG96XpbTRYkBxLxklZPOdLmNIOdIhvf7SNJan6u5vCKum8iT7ZfCt70m1GPkuC7P3TtX6UuhupuA== -chalk@^2.0.0: +caniuse-lite@^1.0.30001580: + version "1.0.30001581" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001581.tgz#0dfd4db9e94edbdca67d57348ebc070dece279f4" + integrity sha512-whlTkwhqV2tUmP3oYhtNfaWGYHDdS3JYFQBKXxcUR9qqPWsRhFHhoISO2Xnl/g0xyKzht9mI1LZpiNWfMzHixQ== + +chalk@^2.0.0, chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -1521,6 +1911,11 @@ convert-source-map@^1.7.0: resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== +convert-source-map@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" + integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== + core-js-compat@^3.25.1: version "3.27.2" resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.27.2.tgz#607c50ad6db8fd8326af0b2883ebb987be3786da" @@ -1539,6 +1934,11 @@ cosmiconfig@^7.0.0: path-type "^4.0.0" yaml "^1.10.0" +create-require@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" + integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== + cross-spawn@^7.0.2, cross-spawn@^7.0.3: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" @@ -1603,6 +2003,11 @@ define-properties@^1.1.3: dependencies: object-keys "^1.0.12" +diff@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" + integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== + dir-glob@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" @@ -1629,6 +2034,11 @@ electron-to-chromium@^1.4.251: resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz#61046d1e4cab3a25238f6bf7413795270f125592" integrity sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA== +electron-to-chromium@^1.4.648: + version "1.4.650" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.650.tgz#b38ef9de16991b9f7b924246770576ab91ab3d64" + integrity sha512-sYSQhJCJa4aGA1wYol5cMQgekDBlbVfTRavlGZVr3WZpDdOPcp6a6xUnFfrt8TqZhsBYYbDxJZCjGfHuGupCRQ== + emoji-regex@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" @@ -1985,11 +2395,6 @@ flatted@^3.1.0: resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.1.tgz#bbef080d95fca6709362c73044a1634f7c6e7d05" integrity sha512-OMQjaErSFHmHqZe+PSidH5n8j3O0F2DdnVh8JB4j4eUQ2k6KvB0qGfrKIhapvez5JerBbmWkaLYUYWISaESoXg== -follow-redirects@^1.14.4: - version "1.15.2" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" - integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== - fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" @@ -2209,6 +2614,13 @@ is-builtin-module@^3.2.0: dependencies: builtin-modules "^3.3.0" +is-builtin-module@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-3.2.1.tgz#f03271717d8654cfcaf07ab0463faa3571581169" + integrity sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A== + dependencies: + builtin-modules "^3.3.0" + is-callable@^1.1.4, is-callable@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.3.tgz#8b1e0500b73a1d76c70487636f368e519de8db8e" @@ -2377,7 +2789,7 @@ json5@^2.2.0: dependencies: minimist "^1.2.5" -json5@^2.2.2: +json5@^2.2.2, json5@^2.2.3: version "2.2.3" resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== @@ -2521,6 +2933,18 @@ magic-string@^0.27.0: dependencies: "@jridgewell/sourcemap-codec" "^1.4.13" +magic-string@^0.30.3: + version "0.30.5" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.5.tgz#1994d980bd1c8835dc6e78db7cbd4ae4f24746f9" + integrity sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA== + dependencies: + "@jridgewell/sourcemap-codec" "^1.4.15" + +make-error@^1.1.1: + version "1.3.6" + resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" + integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== + merge-stream@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" @@ -2583,6 +3007,11 @@ natural-compare@^1.4.0: resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= +node-releases@^2.0.14: + version "2.0.14" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.14.tgz#2ffb053bceb8b2be8495ece1ab6ce600c4461b0b" + integrity sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw== + node-releases@^2.0.6: version "2.0.8" resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.8.tgz#0f349cdc8fcfa39a92ac0be9bc48b7706292b9ae" @@ -3018,6 +3447,28 @@ rollup@^3.10.1: optionalDependencies: fsevents "~2.3.2" +rollup@^4.9.5: + version "4.9.6" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.9.6.tgz#4515facb0318ecca254a2ee1315e22e09efc50a0" + integrity sha512-05lzkCS2uASX0CiLFybYfVkwNbKZG5NFQ6Go0VWyogFTXXbR039UVsegViTntkk4OglHBdF54ccApXRRuXRbsg== + dependencies: + "@types/estree" "1.0.5" + optionalDependencies: + "@rollup/rollup-android-arm-eabi" "4.9.6" + "@rollup/rollup-android-arm64" "4.9.6" + "@rollup/rollup-darwin-arm64" "4.9.6" + "@rollup/rollup-darwin-x64" "4.9.6" + "@rollup/rollup-linux-arm-gnueabihf" "4.9.6" + "@rollup/rollup-linux-arm64-gnu" "4.9.6" + "@rollup/rollup-linux-arm64-musl" "4.9.6" + "@rollup/rollup-linux-riscv64-gnu" "4.9.6" + "@rollup/rollup-linux-x64-gnu" "4.9.6" + "@rollup/rollup-linux-x64-musl" "4.9.6" + "@rollup/rollup-win32-arm64-msvc" "4.9.6" + "@rollup/rollup-win32-ia32-msvc" "4.9.6" + "@rollup/rollup-win32-x64-msvc" "4.9.6" + fsevents "~2.3.2" + run-parallel@^1.1.9: version "1.2.0" resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" @@ -3052,6 +3503,11 @@ semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== +semver@^6.3.1: + version "6.3.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== + semver@^7.2.1, semver@^7.3.5: version "7.3.5" resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" @@ -3302,6 +3758,25 @@ to-regex-range@^5.0.1: dependencies: is-number "^7.0.0" +ts-node@^10.9.1: + version "10.9.2" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.2.tgz#70f021c9e185bccdca820e26dc413805c101c71f" + integrity sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ== + dependencies: + "@cspotcode/source-map-support" "^0.8.0" + "@tsconfig/node10" "^1.0.7" + "@tsconfig/node12" "^1.0.7" + "@tsconfig/node14" "^1.0.0" + "@tsconfig/node16" "^1.0.2" + acorn "^8.4.1" + acorn-walk "^8.1.1" + arg "^4.1.0" + create-require "^1.1.0" + diff "^4.0.1" + make-error "^1.1.1" + v8-compile-cache-lib "^3.0.1" + yn "3.1.1" + tsconfig-paths@^3.9.0: version "3.10.1" resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.10.1.tgz#79ae67a68c15289fdf5c51cb74f397522d795ed7" @@ -3378,6 +3853,14 @@ unicode-property-aliases-ecmascript@^2.0.0: resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz#43d41e3be698bd493ef911077c9b131f827e8ccd" integrity sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w== +update-browserslist-db@^1.0.13: + version "1.0.13" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz#3c5e4f5c083661bd38ef64b6328c26ed6c8248c4" + integrity sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg== + dependencies: + escalade "^3.1.1" + picocolors "^1.0.0" + update-browserslist-db@^1.0.9: version "1.0.10" resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz#0f54b876545726f17d00cd9a2561e6dade943ff3" @@ -3393,6 +3876,11 @@ uri-js@^4.2.2: dependencies: punycode "^2.1.0" +v8-compile-cache-lib@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" + integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== + v8-compile-cache@^2.0.3: version "2.3.0" resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" @@ -3466,3 +3954,8 @@ yaml@^1.10.0: version "1.10.2" resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== + +yn@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" + integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== From 4bcb25271eb652db5835fd9ead1fed5990080dcd Mon Sep 17 00:00:00 2001 From: "d.ragozin" Date: Tue, 30 Jan 2024 18:14:30 +0300 Subject: [PATCH 27/46] =?UTF-8?q?[-]=20=D0=9B=D0=B8=D1=88=D0=BD=D0=B8?= =?UTF-8?q?=D0=B9=20=D1=82=D0=B8=D0=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/types/index.ts | 2 -- src/types/initializeVkApp.ts | 5 ----- 2 files changed, 7 deletions(-) delete mode 100644 src/types/initializeVkApp.ts diff --git a/src/types/index.ts b/src/types/index.ts index 14a08ea..13750d9 100644 --- a/src/types/index.ts +++ b/src/types/index.ts @@ -6,8 +6,6 @@ export * from './common'; export * from './getVkAccessToken'; -export * from './initializeVkApp'; - export * from './setVkViewSettings'; export * from './shareVkPost'; diff --git a/src/types/initializeVkApp.ts b/src/types/initializeVkApp.ts deleted file mode 100644 index 4b4c817..0000000 --- a/src/types/initializeVkApp.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { VkResponseType } from './common'; - -type InitializeVkAppResponseType = VkResponseType<'VKWebAppInit'>; - -export type { InitializeVkAppResponseType }; From 872be03cbf40fe0f7367b04bb58391698a824640 Mon Sep 17 00:00:00 2001 From: "d.ragozin" Date: Wed, 31 Jan 2024 10:12:16 +0300 Subject: [PATCH 28/46] =?UTF-8?q?[*]=20=D0=9A=D0=BE=D0=BC=D0=BC=D0=B5?= =?UTF-8?q?=D0=BD=D1=82=D1=8B,=20=D0=BE=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20readme=20=D0=B8=20changelog?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 2 ++ README.md | 1 + src/consts.ts | 4 ++++ 3 files changed, 7 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5094d5d..0a9c9e5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,9 @@ # v3.0.0 +- [+] добавлена утилита `isVkError` для проверки произвольного значения на соответствие типу ошибки от API ВК ([issue](https://github.com/ktsstudio/mediaproject-vk/issues/16)) - [*] отрефакторены утилиты `checkVkPlatform` и `setVkViewSettings` – удалены обращения к `window` - [*] из `WindowType` убраны поля, которые не должны храниться в `window`: параметры запуска и параметры определения платформы +- [*] расширено количество кейсов, которые подпадают под отказ пользователя, в утилите `checkVkUserDenied` ([issue](https://github.com/ktsstudio/mediaproject-vk/issues/17)) - [-] удалена утилита `initializeVkApp` ### v2.1.1 diff --git a/README.md b/README.md index ec0afd3..ac6cce3 100644 --- a/README.md +++ b/README.md @@ -34,6 +34,7 @@ - [checkVkAvatarIsDefault](./src/checkVkAvatarIsDefault.ts) - [checkVkPlatform](./src/checkVkPlatform.ts) +- [isVkError](./src/isVkError.ts) ## Обратная связь diff --git a/src/consts.ts b/src/consts.ts index 0409a12..a3317f1 100644 --- a/src/consts.ts +++ b/src/consts.ts @@ -1,5 +1,9 @@ import { ErrorData } from '@vkontakte/vk-bridge'; +/** + * Set, состоящий из строк, обозначающих типы ошибки (поле error_type), + * приходящей от VK Bridge + */ const vkErrorTypes = new Set([ 'client_error', 'api_error', From 0e0935d34cc1e56e8fe455b511da5cba8d2e2cfb Mon Sep 17 00:00:00 2001 From: "d.ragozin" Date: Wed, 31 Jan 2024 13:53:45 +0300 Subject: [PATCH 29/46] =?UTF-8?q?[*]=20=D0=A3=D1=82=D0=BE=D1=87=D0=BD?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20=D1=82=D0=B8=D0=BF=D0=B8=D0=B7=D0=B0?= =?UTF-8?q?=D1=86=D0=B8=D0=B8,=20=D1=81=D0=BE=D0=BA=D1=80=D0=B0=D1=89?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BA=D0=BE=D0=B4=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/__tests__/callVkApi.test.ts | 8 ++------ src/__tests__/utils/randomNumberUpTo.ts | 2 +- src/__tests__/utils/randomString.ts | 2 +- src/__tests__/utils/range.ts | 2 +- src/checkVkAvatarIsDefault.ts | 2 +- src/typings/jest.d.ts | 1 + tsconfig.json | 1 + 7 files changed, 8 insertions(+), 10 deletions(-) create mode 100644 src/typings/jest.d.ts diff --git a/src/__tests__/callVkApi.test.ts b/src/__tests__/callVkApi.test.ts index b90bd10..17378a3 100644 --- a/src/__tests__/callVkApi.test.ts +++ b/src/__tests__/callVkApi.test.ts @@ -58,12 +58,8 @@ const getMockTokenExpiredError = ({ * Подготовить кейсы возникновения ошибки о протухшем токене: на вебе/мобиле и с различным сообщением об ошибке */ const getMockTokenExpiredErrorCases = () => - [true, false].reduce<{ isWeb: boolean; message: string }[]>( - (acc, isWeb) => [ - ...acc, - ...VK_TOKEN_ERRORS.map((message) => ({ isWeb, message })), - ], - [] + [true, false].flatMap((isWeb) => + VK_TOKEN_ERRORS.map((message) => ({ isWeb, message })) ); /** diff --git a/src/__tests__/utils/randomNumberUpTo.ts b/src/__tests__/utils/randomNumberUpTo.ts index 7c01d8e..905d6d1 100644 --- a/src/__tests__/utils/randomNumberUpTo.ts +++ b/src/__tests__/utils/randomNumberUpTo.ts @@ -1,2 +1,2 @@ -export const randomNumberUpTo = (max: number) => +export const randomNumberUpTo = (max: number): number => Math.floor(Math.random() * max); diff --git a/src/__tests__/utils/randomString.ts b/src/__tests__/utils/randomString.ts index 3dc1b3e..5c96814 100644 --- a/src/__tests__/utils/randomString.ts +++ b/src/__tests__/utils/randomString.ts @@ -1,4 +1,4 @@ -export const randomString = (length: number) => { +export const randomString = (length: number): string => { let result = ''; const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; diff --git a/src/__tests__/utils/range.ts b/src/__tests__/utils/range.ts index a74c681..e265a1f 100644 --- a/src/__tests__/utils/range.ts +++ b/src/__tests__/utils/range.ts @@ -1 +1 @@ -export const range = (n: number) => Array.from(Array(n).keys()); +export const range = (n: number): number[] => Array.from(Array(n).keys()); diff --git a/src/checkVkAvatarIsDefault.ts b/src/checkVkAvatarIsDefault.ts index 98842c4..0e473f0 100644 --- a/src/checkVkAvatarIsDefault.ts +++ b/src/checkVkAvatarIsDefault.ts @@ -12,6 +12,6 @@ const checkVkAvatarIsDefault = ({ photo, size = 100, }: CheckVkAvatarIsDefaultParamsType): boolean => - !!photo && photo === `https://vk.com/images/camera_${size}.png`; + photo === `https://vk.com/images/camera_${size}.png`; export { checkVkAvatarIsDefault }; diff --git a/src/typings/jest.d.ts b/src/typings/jest.d.ts new file mode 100644 index 0000000..ce16983 --- /dev/null +++ b/src/typings/jest.d.ts @@ -0,0 +1 @@ +/// diff --git a/tsconfig.json b/tsconfig.json index aba473f..1484290 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -9,6 +9,7 @@ "jsx": "react", "strictNullChecks": true, "resolveJsonModule": true, + "lib": ["ES2019.Array"] }, "include": ["src", "jest.config.ts"] } From 26c98e42937c549c4ddefd2388176133fb373461 Mon Sep 17 00:00:00 2001 From: "d.ragozin" Date: Wed, 31 Jan 2024 14:35:27 +0300 Subject: [PATCH 30/46] =?UTF-8?q?[*]=20=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=B0=D0=B2=D1=82=D0=BE=D1=82?= =?UTF-8?q?=D0=B5=D1=81=D1=82=D0=BE=D0=B2=20=D0=B2=20callVkApi=20=D0=B2=20?= =?UTF-8?q?=D1=81=D0=BE=D0=BE=D1=82=D0=B2=D0=B5=D1=82=D1=81=D1=82=D0=B2?= =?UTF-8?q?=D0=B8=D0=B8=20=D1=81=20=D0=BE=D1=82=D0=BA=D0=B0=D0=B7=D0=BE?= =?UTF-8?q?=D0=BC=20=D0=BE=D1=82=20=D0=BF=D0=B0=D1=80=D0=B0=D0=BC=D0=B5?= =?UTF-8?q?=D1=82=D1=80=D0=BE=D0=B2=20=D0=BF=D1=80=D0=B8=D0=BB=D0=BE=D0=B6?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=B2=20window?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/__tests__/callVkApi.test.ts | 47 +++++++++++++++++++++++++-------- 1 file changed, 36 insertions(+), 11 deletions(-) diff --git a/src/__tests__/callVkApi.test.ts b/src/__tests__/callVkApi.test.ts index 17378a3..09111a3 100644 --- a/src/__tests__/callVkApi.test.ts +++ b/src/__tests__/callVkApi.test.ts @@ -31,8 +31,11 @@ const MOCK_SUCCESS = 'MOCK_SUCCESS' as unknown as BridgeSendReturn; const MOCK_ANY_ERROR = getRandomVkApiError(); +const MOCK_APP_ID = 999; + const MOCK_GET_TOKEN_PARAMS = { [randomString(5)]: randomString(5), + appId: MOCK_APP_ID, } as GetVkAccessTokenParamsType; const getMockTokenExpiredError = ({ @@ -142,7 +145,9 @@ describe('Функция callVkApi', () => { accessToken: MOCK_TOKEN, method: MOCK_VK_BRIDGE_CUSTOM_METHOD, renewTokenIfExpired: true, - getAccessTokenParams: {}, + getAccessTokenParams: { + appId: MOCK_APP_ID, + }, }); expect(bridge.send).toBeCalledTimes(1); @@ -158,7 +163,9 @@ describe('Функция callVkApi', () => { method: MOCK_VK_BRIDGE_CUSTOM_METHOD, accessToken: MOCK_TOKEN, renewTokenIfExpired: true, - getAccessTokenParams: {}, + getAccessTokenParams: { + appId: MOCK_APP_ID, + }, }); expect(result).toBe(MOCK_ANY_ERROR); @@ -170,7 +177,9 @@ describe('Функция callVkApi', () => { const result = await callVkApi({ method: MOCK_VK_BRIDGE_CUSTOM_METHOD, renewTokenIfExpired: true, - getAccessTokenParams: {}, + getAccessTokenParams: { + appId: MOCK_APP_ID, + }, }); expect(result).toBe(MOCK_SUCCESS); @@ -189,7 +198,9 @@ describe('Функция callVkApi', () => { const result = await callVkApi({ method: MOCK_VK_BRIDGE_CUSTOM_METHOD, renewTokenIfExpired: true, - getAccessTokenParams: {}, + getAccessTokenParams: { + appId: MOCK_APP_ID, + }, }); expect(result).toBe(MOCK_ANY_ERROR); @@ -220,7 +231,9 @@ describe('Функция callVkApi', () => { method: MOCK_VK_BRIDGE_CUSTOM_METHOD, accessToken: MOCK_TOKEN, renewTokenIfExpired: true, - getAccessTokenParams: {}, + getAccessTokenParams: { + appId: MOCK_APP_ID, + }, }); expect(result).toBe(MOCK_SUCCESS); @@ -254,7 +267,9 @@ describe('Функция callVkApi', () => { method: MOCK_VK_BRIDGE_CUSTOM_METHOD, accessToken: MOCK_TOKEN, renewTokenIfExpired: true, - getAccessTokenParams: {}, + getAccessTokenParams: { + appId: MOCK_APP_ID, + }, }); expect(result).toBe(MOCK_ANY_ERROR); @@ -283,7 +298,9 @@ describe('Функция callVkApi', () => { method: MOCK_VK_BRIDGE_CUSTOM_METHOD, accessToken: MOCK_TOKEN, renewTokenIfExpired: false, - getAccessTokenParams: {}, + getAccessTokenParams: { + appId: MOCK_APP_ID, + }, }); expect(result).toBe(tokenExpiredError); @@ -299,7 +316,9 @@ describe('Функция callVkApi', () => { const result = await callVkApi({ accessToken: MOCK_TOKEN, method: MOCK_VK_BRIDGE_CUSTOM_METHOD, - getAccessTokenParams: {}, + getAccessTokenParams: { + appId: MOCK_APP_ID, + }, }); expect(result).toBe(MOCK_SUCCESS); @@ -319,7 +338,9 @@ describe('Функция callVkApi', () => { version: MOCK_VK_API_VERSION, accessToken: MOCK_TOKEN, method: MOCK_VK_BRIDGE_CUSTOM_METHOD, - getAccessTokenParams: {}, + getAccessTokenParams: { + appId: MOCK_APP_ID, + }, }); expect(result).toBe(MOCK_SUCCESS); @@ -365,7 +386,9 @@ describe('Функция callVkApi', () => { const result = await callVkApi({ accessToken: MOCK_TOKEN, method: MOCK_VK_BRIDGE_CUSTOM_METHOD, - getAccessTokenParams: {}, + getAccessTokenParams: { + appId: MOCK_APP_ID, + }, }); expect(result).toBe(MOCK_SUCCESS); @@ -418,7 +441,9 @@ describe('Функция callVkApi', () => { accessToken: MOCK_TOKEN, method: MOCK_VK_BRIDGE_CUSTOM_METHOD, params: customParams, - getAccessTokenParams: {}, + getAccessTokenParams: { + appId: MOCK_APP_ID, + }, }); expect(result).toBe(MOCK_SUCCESS); From 3a245cbc8aca113a672992addc9c21ff88ad86b1 Mon Sep 17 00:00:00 2001 From: "d.ragozin" Date: Fri, 2 Feb 2024 14:51:51 +0300 Subject: [PATCH 31/46] =?UTF-8?q?[+]=20=D0=90=D0=B2=D1=82=D0=BE=D1=82?= =?UTF-8?q?=D0=B5=D1=81=D1=82=D1=8B=20=D0=B4=D0=BB=D1=8F=20shareVkPost?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 3 + src/__tests__/shareVkPost.test.ts | 903 +++++++++++++++++++++++++++++- src/__tests__/testsList.txt | 308 ++++++---- src/__tests__/utils/mockErrors.ts | 28 + yarn.lock | 39 ++ 5 files changed, 1153 insertions(+), 128 deletions(-) diff --git a/package.json b/package.json index 9341462..6f8911e 100644 --- a/package.json +++ b/package.json @@ -60,11 +60,13 @@ "@testing-library/jest-dom": "^6.2.0", "@testing-library/react": "^14.1.2", "@types/jest": "^29.5.11", + "@types/jest-when": "^3.5.5", "@types/node": "^16.4.0", "@types/react": ">=17", "@typescript-eslint/eslint-plugin": "^4.13.0", "@typescript-eslint/parser": "^4.14.1", "@vkontakte/vk-bridge": "^2.7.2", + "axios": "^1.6.7", "eslint": "^7.31.0", "eslint-config-prettier": "^7.2.0", "eslint-import-resolver-typescript": "^2.3.0", @@ -74,6 +76,7 @@ "husky": "^7.0.1", "jest": "^29.7.0", "jest-environment-jsdom": "^29.7.0", + "jest-when": "^3.6.0", "lint-staged": "^11.0.0", "prettier": "^2.2.1", "react": ">=17", diff --git a/src/__tests__/shareVkPost.test.ts b/src/__tests__/shareVkPost.test.ts index 9086967..9cbb9a1 100644 --- a/src/__tests__/shareVkPost.test.ts +++ b/src/__tests__/shareVkPost.test.ts @@ -1,7 +1,900 @@ +import originalBridge, { + ErrorData, + PersonalAuthScope, + RequestIdProp, + RequestProps, + RequestPropsMap, +} from '@vkontakte/vk-bridge'; +import { ReceiveData } from '@vkontakte/vk-bridge/dist/types/src/types/bridge'; +import { api as originalApi } from '@ktsstudio/mediaproject-utils'; +import { when } from 'jest-when'; +import { + ApiResponse, + UrlConfigType, +} from '@ktsstudio/mediaproject-utils/dist/es/types/api'; + +import { callVkApi as originalCallVkApi } from '../callVkApi'; +import { shareVkPost, shareVkPostWithUpload } from '../shareVkPost'; +import { + CallVkApiPropsType, + CallVkApiResponseType, + GetVkAccessTokenParamsType, + SaveVkWallPhotoResponseType, + ShareVkPostPropsType, + ShareVkPostWithUploadParamsType, + UploadFromApiToVkResponseType, +} from '../types'; + +import { + getRandomVkApiError, + getRandomVkAuthError, + getRandomVkClientError, + getRandomVkErrorEachType, + getUserDeniedCommonError, + randomNumberUpTo, + randomString, + range, +} from './utils'; + +jest.mock('../callVkApi'); +jest.mock('@ktsstudio/mediaproject-utils'); +jest.mock('@vkontakte/vk-bridge'); + +const api = originalApi as jest.MockedFn; +const callVkApi = originalCallVkApi as jest.MockedFn; +const bridge = originalBridge as jest.Mocked; + +// Удобный для тестирования формат аттачей: массив аттачей (массив строк) +// и объединённая строка с аттачами +type ShareVkPostAttachmentData = { + array: string[]; + stringValue: Exclude; +}; + +const getWallPhotoAttachment = (ownerId: number, wallImageId: number): string => + `photo${ownerId}_${wallImageId}`; + +const PHOTOS_VK_SCOPE: PersonalAuthScope = 'photos'; + +const getMockAttachments = (): ShareVkPostAttachmentData => { + const array = range(3).map(() => randomString(10)); + + return { + array, + stringValue: array.join(','), + }; +}; + +const getMockSharingProps = ( + attachments: ShareVkPostPropsType['attachments'] = undefined +): ShareVkPostPropsType => ({ + lat: randomNumberUpTo(1000), + signed: false, + close_comments: false, + services: randomString(10), + long: randomNumberUpTo(1000), + owner_id: randomNumberUpTo(1000), + publish_date: randomNumberUpTo(1000), + place_id: randomNumberUpTo(1000), + link_image: randomString(10), + link_title: randomString(10), + link_button: randomString(10), + copyright: randomString(10), + message: randomString(10), + friends_only: false, + attachments, +}); + +const getMockSharingWithUploadProps = ({ + postProps = getMockSharingProps(), + accessToken, + onUserDeniedAccess, + onErrorOccurred, +}: Partial< + Pick< + ShareVkPostWithUploadParamsType, + 'postProps' | 'accessToken' | 'onUserDeniedAccess' | 'onErrorOccurred' + > +> = {}): ShareVkPostWithUploadParamsType => ({ + appId: randomNumberUpTo(1000), + file: new File([new Blob()], 'file'), + apiUploadUrl: { url: randomString(10), method: 'POST' }, + userId: randomNumberUpTo(10), + postProps, + accessToken, + onUserDeniedAccess, + onErrorOccurred, +}); + +const MOCK_RANDOM_KTS_API_ERROR_DATA = randomString(10); +const MOCK_RANDOM_KTS_API_ERROR = randomString(10); + +const MOCK_SUCCESS_POST_RESULT: ReceiveData<'VKWebAppShowWallPostBox'> = { + post_id: randomNumberUpTo(1000), +}; + +const MOCK_GET_UPLOAD_SERVER_RESPONSE: CallVkApiResponseType<{ + upload_url: string; +}> = { + response: { + upload_url: randomString(10), + }, +}; + +const MOCK_KTS_API_RESPONSE: UploadFromApiToVkResponseType = { + response: { + hash: randomString(10), + photo: randomString(10), + // Предполагается, что от ВК приходит число, но в виде строки + server: String(randomNumberUpTo(1000)), + }, +}; + +const MOCK_SAVE_WALL_PHOTO_RESPONSE: SaveVkWallPhotoResponseType = { + response: range(3).map(() => ({ + id: randomNumberUpTo(100), + owner_id: randomNumberUpTo(100), + album_id: randomNumberUpTo(100), + })), +}; + +const mockCallVkApiResolveValue = ({ + getWallUploadServer = MOCK_GET_UPLOAD_SERVER_RESPONSE, + saveWallPhoto = MOCK_SAVE_WALL_PHOTO_RESPONSE, +}: { + getWallUploadServer?: CallVkApiResponseType<{ + upload_url: string; + }>; + saveWallPhoto?: SaveVkWallPhotoResponseType; +} = {}): void => { + callVkApi.mockImplementation(({ method }) => { + switch (method) { + case 'photos.getWallUploadServer': + return Promise.resolve(getWallUploadServer); + case 'photos.saveWallPhoto': + default: + return Promise.resolve(saveWallPhoto); + } + }); +}; + +const mockVkBridgeResolveWhenPost = ( + mock: ReceiveData<'VKWebAppShowWallPostBox'> = MOCK_SUCCESS_POST_RESULT +): void => { + when(bridge.send) + .calledWith('VKWebAppShowWallPostBox', expect.anything()) + .mockResolvedValue(mock); +}; + +const mockVkBridgeRejectWhenPost = (mock: ErrorData): void => { + when(bridge.send) + .calledWith('VKWebAppShowWallPostBox', expect.anything()) + .mockRejectedValue(mock); +}; + +const MOCK_CLIENT_ERROR = getRandomVkClientError(); +const MOCK_AUTH_ERROR = getRandomVkAuthError(); +const MOCK_API_ERROR = getRandomVkApiError(); + +const ANY_ERROR = randomString(10); + +/** + * Проверить, что определённые методы не были вызваны + */ +const expectMethodsNotToBeCalled = (notToBeCalled: { + getWallUploadServer: boolean; + ktsApi: boolean; + saveWallPhoto: boolean; + VKWebAppShowWallPostBox: boolean; +}): void => { + const callVkApiGetWallUploadServerParams = () => + expect.objectContaining>({ + method: 'photos.getWallUploadServer', + }); + + if (notToBeCalled.getWallUploadServer) { + expect(callVkApi).not.toHaveBeenCalledWith( + callVkApiGetWallUploadServerParams() + ); + } else { + expect(callVkApi).toHaveBeenCalledWith( + callVkApiGetWallUploadServerParams() + ); + } + + if (notToBeCalled.ktsApi) { + expect(api).not.toHaveBeenCalled(); + } else { + expect(api).toHaveBeenCalled(); + } + + const callVkApiSaveWallPhotoParams = () => + expect.objectContaining>({ + method: 'photos.saveWallPhoto', + }); + + if (notToBeCalled.saveWallPhoto) { + expect(callVkApi).not.toHaveBeenCalledWith(callVkApiSaveWallPhotoParams()); + } else { + expect(callVkApi).toHaveBeenCalledWith(callVkApiSaveWallPhotoParams()); + } + + if (notToBeCalled.VKWebAppShowWallPostBox) { + expect(bridge.send).not.toHaveBeenCalledWith('VKWebAppShowWallPostBox'); + } else { + expect(bridge.send).toHaveBeenCalledWith('VKWebAppShowWallPostBox'); + } +}; + describe('Функция shareVkPost', () => { - it.todo( - 'Тесты отваливаются, потому что jest ругается на использование ' + - 'esm в mediaproject-utils. По крайней мере локально это решается сборкой ' + - 'mediaproject-utils на cjs и подключением через npm/yarn link' - ); + beforeEach(() => { + bridge.send.mockResolvedValue(undefined); + }); + + afterEach(() => { + bridge.send.mockClear(); + }); + + it('Вызывается VK Bridge, метод VKWebAppShowWallPostBox, передаются параметры шеринга', async () => { + bridge.send.mockResolvedValue(MOCK_SUCCESS_POST_RESULT); + + const mockSharingProps = getMockSharingProps( + getMockAttachments().stringValue + ); + + const result = await shareVkPost(mockSharingProps); + + expect(result).toBe(MOCK_SUCCESS_POST_RESULT); + expect(bridge.send).toBeCalledWith( + 'VKWebAppShowWallPostBox', + mockSharingProps + ); + }); + + describe('Произошла ошибка', () => { + getRandomVkErrorEachType().forEach((error) => { + it(`Ошибка от ВК, не является отказом пользователя. Тип ошибки: ${error.error_type}`, async () => { + bridge.send.mockRejectedValue(error); + + const result = await shareVkPost(getMockSharingProps()); + + expect(result).toBe(error); + }); + }); + + it('Ошибка от ВК, отказ пользователя', async () => { + bridge.send.mockRejectedValue(getUserDeniedCommonError()); + + const result = await shareVkPost(getMockSharingProps()); + + expect(result).toBe(undefined); + }); + }); +}); + +describe('Функция shareVkPostWithUpload', () => { + beforeEach(() => { + mockVkBridgeResolveWhenPost(); + callVkApi.mockResolvedValue({ + response: true, + }); + api.mockResolvedValue({ + response: true, + }); + }); + + afterEach(() => { + bridge.send.mockClear(); + callVkApi.mockClear(); + api.mockClear(); + }); + + describe('Этап получения сервера для загрузки фото', () => { + it('Вызывается метод VK API photos.getWallUploadServer', async () => { + mockVkBridgeResolveWhenPost(MOCK_SUCCESS_POST_RESULT); + mockCallVkApiResolveValue(); + api.mockResolvedValue(MOCK_KTS_API_RESPONSE); + + const result = await shareVkPostWithUpload( + getMockSharingWithUploadProps() + ); + + expect(callVkApi).toHaveBeenNthCalledWith( + 1, + expect.objectContaining({ + method: 'photos.getWallUploadServer', + getAccessTokenParams: expect.anything(), + }) + ); + expect(result).toBe(MOCK_SUCCESS_POST_RESULT); + }); + + it( + 'В callVkApi передаётся токен, параметры получения токена. ' + + 'В качестве колбэка на отказ от всех скоупов и отказ от части скоупов ' + + 'передаётся функция-аргумент onUserDeniedAccess', + async () => { + mockVkBridgeResolveWhenPost(MOCK_SUCCESS_POST_RESULT); + mockCallVkApiResolveValue(); + api.mockResolvedValue(MOCK_KTS_API_RESPONSE); + + const { accessToken, onUserDeniedAccess, appId, ...rest } = + getMockSharingWithUploadProps({ accessToken: randomString(10) }); + + const result = await shareVkPostWithUpload({ + accessToken, + appId, + onUserDeniedAccess, + ...rest, + }); + + expect(callVkApi).toHaveBeenNthCalledWith( + 1, + expect.objectContaining({ + method: 'photos.getWallUploadServer', + accessToken, + getAccessTokenParams: + expect.objectContaining({ + appId, + scopes: expect.arrayContaining([PHOTOS_VK_SCOPE]), + onUserDeniedSomeScopes: onUserDeniedAccess, + onUserDeniedAll: onUserDeniedAccess, + }), + }) + ); + expect(result).toBe(MOCK_SUCCESS_POST_RESULT); + } + ); + + /** + * Тестирование кейса с возвращением ошибки из функции callVkApi + * на этапе получения сервера для загрузки картинки + */ + const testCallVkApiReturnError = (error: ErrorData) => { + it( + 'Ошибка возвращается из функции и передаётся' + + 'в функцию-аргумент onErrorOccurred', + async () => { + mockVkBridgeResolveWhenPost(MOCK_SUCCESS_POST_RESULT); + mockCallVkApiResolveValue({ + getWallUploadServer: error, + }); + api.mockResolvedValue(MOCK_KTS_API_RESPONSE); + + const spyOnErrorOccurred = jest.fn(); + + const result = await shareVkPostWithUpload({ + ...getMockSharingWithUploadProps(), + onErrorOccurred: spyOnErrorOccurred, + }); + + expect(result).toBe(error); + expect(spyOnErrorOccurred).toBeCalledWith(error); + } + ); + + it( + 'Выполнение не доходит до обращения к бэкенду KTS, ' + + 'методу photos.saveWallPhoto и методу VKWebAppShowWallPostBox', + async () => { + mockVkBridgeResolveWhenPost(MOCK_SUCCESS_POST_RESULT); + mockCallVkApiResolveValue({ + getWallUploadServer: error, + }); + api.mockResolvedValue(MOCK_KTS_API_RESPONSE); + + const result = await shareVkPostWithUpload( + getMockSharingWithUploadProps() + ); + + expect(result).toBe(error); + + expectMethodsNotToBeCalled({ + getWallUploadServer: false, + saveWallPhoto: true, + ktsApi: true, + VKWebAppShowWallPostBox: true, + }); + } + ); + }; + + describe('Утилита callVkApi возвращает ошибку типа client_error', () => { + testCallVkApiReturnError(MOCK_CLIENT_ERROR); + }); + + describe('Утилита callVkApi возвращает ошибку типа auth_error', () => { + testCallVkApiReturnError(MOCK_AUTH_ERROR); + }); + + describe('Утилита callVkApi возвращает ошибку типа api_error', () => { + testCallVkApiReturnError(MOCK_API_ERROR); + }); + }); + // Конец: Этап получения сервера для загрузки фото + + describe('Этап отправки адреса ВК-сервера на бэкенд KTS для загрузки. Все предыдущие этапы выполнены успешно', () => { + it( + 'Используется утилита api из mediaproject-utils. ' + + 'В утилиту передаются эндпоинт API KTS, файл, адрес ВК-сервера, ' + + 'флаг об использовании FormData', + async () => { + mockVkBridgeResolveWhenPost(MOCK_SUCCESS_POST_RESULT); + mockCallVkApiResolveValue({ + getWallUploadServer: MOCK_GET_UPLOAD_SERVER_RESPONSE, + }); + api.mockResolvedValue(MOCK_KTS_API_RESPONSE); + + const { apiUploadUrl, file, ...restParams } = + getMockSharingWithUploadProps(); + + const result = await shareVkPostWithUpload({ + apiUploadUrl, + file, + ...restParams, + }); + + expect(api).toBeCalledWith( + // Первый аргумент — эндпоинт + expect.objectContaining(apiUploadUrl), + + // Второй аргумент — payload, который должен соответствовать заданной структуре + expect.objectContaining({ + image: file, + server_url: MOCK_GET_UPLOAD_SERVER_RESPONSE.response?.upload_url, + }), + + // Третий аргумент — конфиг для axios. Не имеет значения + expect.anything(), + + // Четвёртый аргумент — флаг об использовании FormData + true + ); + expect(result).toBe(MOCK_SUCCESS_POST_RESULT); + } + ); + + describe('Ответ бэкенда KTS, считающийся ошибкой', () => { + const testKtsApiErrorReturn = (resolvedValue: ApiResponse) => { + it('Данные об ошибке передаются в функцию-аргумент onErrorOccurred, а результатом выполнения утилиты является undefined', async () => { + mockVkBridgeResolveWhenPost(MOCK_SUCCESS_POST_RESULT); + mockCallVkApiResolveValue(); + api.mockResolvedValue(resolvedValue); + + const spyOnErrorOccurred = jest.fn(); + + const result = await shareVkPostWithUpload({ + ...getMockSharingWithUploadProps(), + onErrorOccurred: spyOnErrorOccurred, + }); + + expect(result).toBe(undefined); + expect(spyOnErrorOccurred).toBeCalledWith( + MOCK_RANDOM_KTS_API_ERROR, + MOCK_RANDOM_KTS_API_ERROR_DATA + ); + }); + + it('Выполнение не доходит до обращения к методу photos.saveWallPhoto и методу VKWebAppShowWallPostBox', async () => { + mockVkBridgeResolveWhenPost(MOCK_SUCCESS_POST_RESULT); + mockCallVkApiResolveValue(); + api.mockResolvedValue(resolvedValue); + + const result = await shareVkPostWithUpload( + getMockSharingWithUploadProps() + ); + + expect(result).toBe(undefined); + expectMethodsNotToBeCalled({ + getWallUploadServer: false, + ktsApi: false, + saveWallPhoto: true, + VKWebAppShowWallPostBox: true, + }); + }); + }; + + describe('Ответ пустой', () => { + testKtsApiErrorReturn({ + response: undefined, + error: MOCK_RANDOM_KTS_API_ERROR, + errorData: MOCK_RANDOM_KTS_API_ERROR_DATA, + }); + }); + + describe('Вернулась явная ошибка', () => { + testKtsApiErrorReturn({ + response: 'DO_NOT_MATTER', + error: MOCK_RANDOM_KTS_API_ERROR, + errorData: MOCK_RANDOM_KTS_API_ERROR_DATA, + }); + }); + }); + }); + // Конец: Этап отправки адреса ВК-сервера на бэкенд KTS для загрузки + + describe('Этап сохранения картинки в альбом стены пользователя. Все предыдущие этапы выполнены успешно', () => { + it( + 'Вызывается VK API с методом photos.saveWallPhoto. ' + + 'В VK API передаются данные для загрузки картинки, полученные ранее из KTS API ' + + 'поле server приводится к числу', + async () => { + mockVkBridgeResolveWhenPost(MOCK_SUCCESS_POST_RESULT); + mockCallVkApiResolveValue(); + + const mockHash = randomString(10); + const mockPhoto = randomString(10); + // Предполагается, что ВК API отдаёт число в виде строки + const mockServer = String(randomNumberUpTo(1000)); + + const mockKtsApiResponse: UploadFromApiToVkResponseType = { + response: { + hash: mockHash, + photo: mockPhoto, + server: mockServer, + }, + }; + + api.mockResolvedValue(mockKtsApiResponse); + + const { apiUploadUrl, file, userId, ...restParams } = + getMockSharingWithUploadProps(); + + const result = await shareVkPostWithUpload({ + apiUploadUrl, + file, + userId, + ...restParams, + }); + + expect(callVkApi).toHaveBeenCalledWith( + expect.objectContaining>({ + method: 'photos.saveWallPhoto', + params: expect.objectContaining({ + hash: mockHash, + photo: mockPhoto, + server: Number(mockServer), + user_id: userId, + }), + }) + ); + expect(result).toBe(MOCK_SUCCESS_POST_RESULT); + } + ); + + describe('В VK API передаётся токен доступа', () => { + it('Если токен уже был передан, используется он', async () => { + mockVkBridgeResolveWhenPost(MOCK_SUCCESS_POST_RESULT); + mockCallVkApiResolveValue(); + api.mockResolvedValue(MOCK_KTS_API_RESPONSE); + + const { accessToken, ...restParams } = getMockSharingWithUploadProps({ + accessToken: randomString(10), + }); + + const result = await shareVkPostWithUpload({ + accessToken, + ...restParams, + }); + + expect(callVkApi).toHaveBeenCalledWith( + expect.objectContaining>({ + method: 'photos.saveWallPhoto', + accessToken, + }) + ); + expect(result).toBe(MOCK_SUCCESS_POST_RESULT); + }); + + it.todo( + 'Если изначально передан протухший токен, используется обновлённый токен' + ); + // it('Если изначально передан протухший токен, используется обновлённый токен', async () => { + // mockVkBridgeResolveWhenPost(MOCK_SUCCESS_POST_RESULT); + // mockCallVkApiResolveValue(); + // api.mockResolvedValue(MOCK_KTS_API_RESPONSE); + // + // const initialAccessToken = randomString(10); + // + // const result = await shareVkPostWithUpload({ + // ...getMockSharingWithUploadProps(), + // accessToken: initialAccessToken, + // }); + // + // // С каким конфигом в последний раз вызывался метод photos.saveWallPhoto + // const callParams = + // callVkApi.mock.calls.reduce( + // (lastCallSaveWallPhotoParams, [callVkApiParams]) => { + // if (callVkApiParams.method === 'photos.saveWallPhoto') { + // return callVkApiParams; + // } + // + // return lastCallSaveWallPhotoParams; + // }, + // null + // ); + // + // expect(callParams).toBeTruthy(); + // expect(callParams?.accessToken).toBeTruthy(); + // // Todo: Пока из-за проблемы, описанной в issue, это условие не срабатывает + // // https://github.com/ktsstudio/mediaproject-vk/issues/23 + // expect(callParams?.accessToken).not.toBe(initialAccessToken); + // expect(result).toBe(MOCK_SUCCESS_POST_RESULT); + // }); + }); + + describe('Ответ VK API, считающийся ошибкой', () => { + const testSaveWallPhotoReturnError = ( + callVkApiResponse: SaveVkWallPhotoResponseType + ) => { + it( + 'Ответ VK API попадает в функцию-аргумент onErrorOccurred, ' + + 'утилита возвращает undefined', + async () => { + mockVkBridgeResolveWhenPost(MOCK_SUCCESS_POST_RESULT); + mockCallVkApiResolveValue({ + saveWallPhoto: callVkApiResponse, + }); + api.mockResolvedValue(MOCK_KTS_API_RESPONSE); + + const spyOnErrorOccurred = jest.fn(); + + const result = await shareVkPostWithUpload({ + ...getMockSharingWithUploadProps(), + onErrorOccurred: spyOnErrorOccurred, + }); + + expect(spyOnErrorOccurred).toBeCalledWith(callVkApiResponse); + expect(result).toBe(undefined); + } + ); + + it('Выполнение не доходит до обращения к методу VKWebAppShowWallPostBox', async () => { + mockVkBridgeResolveWhenPost(MOCK_SUCCESS_POST_RESULT); + mockCallVkApiResolveValue({ + saveWallPhoto: callVkApiResponse, + }); + api.mockResolvedValue(MOCK_KTS_API_RESPONSE); + + const result = await shareVkPostWithUpload( + getMockSharingWithUploadProps() + ); + + expect(result).toBe(undefined); + expectMethodsNotToBeCalled({ + getWallUploadServer: false, + ktsApi: false, + saveWallPhoto: false, + VKWebAppShowWallPostBox: true, + }); + }); + }; + + getRandomVkErrorEachType().forEach((vkError) => { + describe(`Вернулась ошибка из VK API. Тип ошибки: ${vkError.error_type}`, () => { + testSaveWallPhotoReturnError(vkError); + }); + }); + + describe('Вернулась пустота в ответе в поле response', () => { + testSaveWallPhotoReturnError({ + response: undefined, + }); + }); + + describe('Вернулся пустой массив с данными о загруженных картинках', () => { + testSaveWallPhotoReturnError({ + response: [], + }); + }); + }); + }); + // Конец: Этап сохранения картинки в альбом стены пользователя + + describe('Этап шеринга картинки в пост. Все предыдущие этапы выполнены успешно', () => { + it( + 'Переданные изначально параметры шеринга (кроме attachments) ' + + 'передаются в метод VKWebAppShowWallPostBox', + async () => { + mockVkBridgeResolveWhenPost(MOCK_SUCCESS_POST_RESULT); + mockCallVkApiResolveValue(); + api.mockResolvedValue(MOCK_KTS_API_RESPONSE); + + const mockSharingProps = getMockSharingProps(); + + const result = await shareVkPostWithUpload({ + ...getMockSharingWithUploadProps(), + postProps: mockSharingProps, + }); + + expect(bridge.send).toBeCalledWith( + 'VKWebAppShowWallPostBox', + expect.objectContaining({ + ...mockSharingProps, + attachments: expect.anything(), + }) + ); + expect(result).toBe(MOCK_SUCCESS_POST_RESULT); + } + ); + + // Тестирование тест-кейсов с передачей и непередачей аттачей + const testShareVkPostAttachmentPassing = async ( + attachmentToPass?: ShareVkPostAttachmentData + ) => { + mockVkBridgeResolveWhenPost(MOCK_SUCCESS_POST_RESULT); + api.mockResolvedValue(MOCK_KTS_API_RESPONSE); + + const mockWallImageId = randomNumberUpTo(1000); + const mockWallAlbumId = randomNumberUpTo(1000); + const mockWallOwnerId = randomNumberUpTo(1000); + + mockCallVkApiResolveValue({ + saveWallPhoto: { + response: [ + { + id: mockWallImageId, + album_id: mockWallAlbumId, + owner_id: mockWallOwnerId, + }, + ], + }, + }); + + const result = await shareVkPostWithUpload({ + ...getMockSharingWithUploadProps(), + postProps: getMockSharingProps(attachmentToPass?.stringValue), + }); + + const wallPhotoMockAttachment = getWallPhotoAttachment( + mockWallOwnerId, + mockWallImageId + ); + + // Получить конфиг последнего вызова VK Bridge с методом VKWebAppShowWallPostBox + const bridgeCallConfig = bridge.send.mock.calls.reduce< + (RequestProps & RequestIdProp) | null + >((lastBridgeCallConfig, [methodName, callConfig]) => { + if (methodName === 'VKWebAppShowWallPostBox') { + return callConfig ?? null; + } + + return lastBridgeCallConfig ?? null; + }, null); + + if (!bridgeCallConfig) { + fail('Конфиг вызова VK Bridge не должен быть пустым'); + + return; + } + + const resultAttachments = (bridgeCallConfig as ShareVkPostPropsType) + .attachments; + + if (!resultAttachments) { + fail('Аттачи не должны быть пустыми'); + + return; + } + + const resultAttachmentsArray = resultAttachments.split(','); + + expect( + [...(attachmentToPass?.array ?? []), wallPhotoMockAttachment] + .sort() + .join(',') + ).toEqual(resultAttachmentsArray.sort().join(',')); + + expect(result).toBe(MOCK_SUCCESS_POST_RESULT); + }; + + it('Картинка со стены добавляется к переданным attachments, отправляемым в shareVkPost', async () => { + testShareVkPostAttachmentPassing(getMockAttachments()); + }); + + it( + 'Если дополнительные attachments не переданы, ' + + 'в параметр attachments shareVkPost передаётся только картинка со стены пользователя', + () => { + testShareVkPostAttachmentPassing(undefined); + } + ); + describe( + 'Из функции возвращается результат выполнения VK Bridge ' + + 'с методом VKWebAppShowWallPostBox', + () => { + it('Успешный результат', async () => { + mockVkBridgeResolveWhenPost(MOCK_SUCCESS_POST_RESULT); + api.mockResolvedValue(MOCK_KTS_API_RESPONSE); + mockCallVkApiResolveValue(); + + const result = await shareVkPostWithUpload( + getMockSharingWithUploadProps() + ); + + expect(result).toBe(MOCK_SUCCESS_POST_RESULT); + }); + + describe('Произошла ошибка', () => { + getRandomVkErrorEachType().forEach((vkError) => { + it( + 'Ошибка от ВК, не является отказом пользователя. ' + + 'Ошибка возвращается как результат выполнения утилиты. ' + + `Тип ошибки: ${vkError.error_type}`, + async () => { + mockVkBridgeRejectWhenPost(vkError); + api.mockResolvedValue(MOCK_KTS_API_RESPONSE); + mockCallVkApiResolveValue(); + + const result = await shareVkPostWithUpload( + getMockSharingWithUploadProps() + ); + + expect(result).toBe(vkError); + expect(bridge.send).toBeCalled(); + } + ); + }); + + it('Ошибка от ВК, отказ пользователя', async () => { + const userDeniedError = getUserDeniedCommonError(); + + mockVkBridgeRejectWhenPost(userDeniedError); + api.mockResolvedValue(MOCK_KTS_API_RESPONSE); + mockCallVkApiResolveValue(); + + const result = await shareVkPostWithUpload( + getMockSharingWithUploadProps() + ); + + expect(result).toBe(undefined); + expect(bridge.send).toBeCalled(); + }); + }); + } + ); + }); + // Конец: Этап шеринга картинки в пост + + describe('Обработка ошибки, необработанной на каком-либо этапе', () => { + it('Выброс ошибки, не связанной с отказом пользователя', async () => { + mockCallVkApiResolveValue(); + mockVkBridgeResolveWhenPost(); + + // Несильно важно, где именно выкидывается ошибка. + // Важнее то, что она не обработана на этапах + api.mockRejectedValue(ANY_ERROR); + + const spyOnErrorOccurred = jest.fn(); + + const result = await shareVkPostWithUpload({ + ...getMockSharingWithUploadProps(), + onErrorOccurred: spyOnErrorOccurred, + }); + + expect(result).toBe(ANY_ERROR); + expect(spyOnErrorOccurred).toBeCalledWith(ANY_ERROR); + }); + + it('Выброс ошибки, связанной с отказом пользователя', async () => { + mockCallVkApiResolveValue(); + mockVkBridgeResolveWhenPost(); + + const userDeniedError = getUserDeniedCommonError(); + + // Несильно важно, где именно выкидывается ошибка. + // Важнее то, что она не обработана на этапах + api.mockRejectedValue(userDeniedError); + + const spyOnErrorOccurred = jest.fn(); + + const result = await shareVkPostWithUpload({ + ...getMockSharingWithUploadProps(), + onErrorOccurred: spyOnErrorOccurred, + }); + + expect(result).toBe(userDeniedError); + expect(spyOnErrorOccurred).not.toHaveBeenCalledWith(userDeniedError); + }); + }); }); diff --git a/src/__tests__/testsList.txt b/src/__tests__/testsList.txt index e47ffbf..5de5730 100644 --- a/src/__tests__/testsList.txt +++ b/src/__tests__/testsList.txt @@ -1,32 +1,98 @@ PASS src/__tests__/usePolling.test.ts Хук usePolling: С параметрами по умолчанию: - ✓ должен устанавливать и очищать таймер (9 ms) - ✓ должен вызывать переданную функцию с частотой - 60 секунд (39 ms) + ✓ должен устанавливать и очищать таймер (7 ms) + ✓ должен вызывать переданную функцию с частотой - 60 секунд (47 ms) С параметром (condition = false): - ✓ не должен устанавливать и очищать таймер (1 ms) + ✓ не должен устанавливать и очищать таймер (2 ms) ✓ не должен вызывать переданную функцию (1 ms) С переключением параметра condition в жизненном цикле хука: ✓ должен устанавливать и очищать таймер при каждом переключении (2 ms) ✓ если (condition = true) должен вызывать переданную функцию с частотой - 60 секунд (47 ms) Параметр pollingInterval должен задавать промежуток времени между вызовами в миллисекундах: - ✓ должен вызывать переданную функцию с частотой - 100 миллисекунд (77 ms) - ✓ не должен меняться при ререндерах (117 ms) + ✓ должен вызывать переданную функцию с частотой - 100 миллисекунд (55 ms) + ✓ не должен меняться при ререндерах (114 ms) Должен подписываться на событие скрытия приложения и отписываться от него: ✓ при монтировании и размонтировании (1 ms) - ✓ при смене аргумента condition (1 ms) + ✓ при смене аргумента condition (2 ms) + +PASS src/__tests__/shareVkPost.test.ts + Функция shareVkPost + ✓ Вызывается VK Bridge, метод VKWebAppShowWallPostBox, передаются параметры шеринга (1 ms) + Произошла ошибка + ✓ Ошибка от ВК, не является отказом пользователя. Тип ошибки: client_error + ✓ Ошибка от ВК, не является отказом пользователя. Тип ошибки: api_error + ✓ Ошибка от ВК, не является отказом пользователя. Тип ошибки: auth_error + ✓ Ошибка от ВК, отказ пользователя (1 ms) + Функция shareVkPostWithUpload + Этап получения сервера для загрузки фото + ✓ Вызывается метод VK API photos.getWallUploadServer (6 ms) + ✓ В callVkApi передаётся токен, параметры получения токена. В качестве колбэка на отказ от всех скоупов и отказ от части скоупов передаётся функция-аргумент onUserDeniedAccess (1 ms) + Утилита callVkApi возвращает ошибку типа client_error + ✓ Ошибка возвращается из функции и передаётсяв функцию-аргумент onErrorOccurred (1 ms) + ✓ Выполнение не доходит до обращения к бэкенду KTS, методу photos.saveWallPhoto и методу VKWebAppShowWallPostBox (1 ms) + Утилита callVkApi возвращает ошибку типа auth_error + ✓ Ошибка возвращается из функции и передаётсяв функцию-аргумент onErrorOccurred + ✓ Выполнение не доходит до обращения к бэкенду KTS, методу photos.saveWallPhoto и методу VKWebAppShowWallPostBox + Утилита callVkApi возвращает ошибку типа api_error + ✓ Ошибка возвращается из функции и передаётсяв функцию-аргумент onErrorOccurred (1 ms) + ✓ Выполнение не доходит до обращения к бэкенду KTS, методу photos.saveWallPhoto и методу VKWebAppShowWallPostBox + Этап отправки адреса ВК-сервера на бэкенд KTS для загрузки. Все предыдущие этапы выполнены успешно + ✓ Используется утилита api из mediaproject-utils. В утилиту передаются эндпоинт API KTS, файл, адрес ВК-сервера, флаг об использовании FormData (1 ms) + Ответ бэкенда KTS, считающийся ошибкой + Ответ пустой + ✓ Данные об ошибке передаются в функцию-аргумент onErrorOccurred, а результатом выполнения утилиты является undefined (1 ms) + ✓ Выполнение не доходит до обращения к методу photos.saveWallPhoto и методу VKWebAppShowWallPostBox (1 ms) + Вернулась явная ошибка + ✓ Данные об ошибке передаются в функцию-аргумент onErrorOccurred, а результатом выполнения утилиты является undefined + ✓ Выполнение не доходит до обращения к методу photos.saveWallPhoto и методу VKWebAppShowWallPostBox (2 ms) + Этап сохранения картинки в альбом стены пользователя. Все предыдущие этапы выполнены успешно + ✓ Вызывается VK API с методом photos.saveWallPhoto. В VK API передаются данные для загрузки картинки, полученные ранее из KTS API поле server приводится к числу + В VK API передаётся токен доступа + ✓ Если токен уже был передан, используется он (1 ms) + ✎ todo Если изначально передан протухший токен, используется обновлённый токен + Ответ VK API, считающийся ошибкой + Вернулась ошибка из VK API. Тип ошибки: client_error + ✓ Ответ VK API попадает в функцию-аргумент onErrorOccurred, утилита возвращает undefined + ✓ Выполнение не доходит до обращения к методу VKWebAppShowWallPostBox (1 ms) + Вернулась ошибка из VK API. Тип ошибки: api_error + ✓ Ответ VK API попадает в функцию-аргумент onErrorOccurred, утилита возвращает undefined (1 ms) + ✓ Выполнение не доходит до обращения к методу VKWebAppShowWallPostBox + Вернулась ошибка из VK API. Тип ошибки: auth_error + ✓ Ответ VK API попадает в функцию-аргумент onErrorOccurred, утилита возвращает undefined (1 ms) + ✓ Выполнение не доходит до обращения к методу VKWebAppShowWallPostBox + Вернулась пустота в ответе в поле response + ✓ Ответ VK API попадает в функцию-аргумент onErrorOccurred, утилита возвращает undefined (1 ms) + ✓ Выполнение не доходит до обращения к методу VKWebAppShowWallPostBox + Вернулся пустой массив с данными о загруженных картинках + ✓ Ответ VK API попадает в функцию-аргумент onErrorOccurred, утилита возвращает undefined (1 ms) + ✓ Выполнение не доходит до обращения к методу VKWebAppShowWallPostBox + Этап шеринга картинки в пост. Все предыдущие этапы выполнены успешно + ✓ Переданные изначально параметры шеринга (кроме attachments) передаются в метод VKWebAppShowWallPostBox (1 ms) + ✓ Картинка со стены добавляется к переданным attachments, отправляемым в shareVkPost + ✓ Если дополнительные attachments не переданы, в параметр attachments shareVkPost передаётся только картинка со стены пользователя (1 ms) + Из функции возвращается результат выполнения VK Bridge с методом VKWebAppShowWallPostBox + ✓ Успешный результат + Произошла ошибка + ✓ Ошибка от ВК, не является отказом пользователя. Ошибка возвращается как результат выполнения утилиты. Тип ошибки: client_error (1 ms) + ✓ Ошибка от ВК, не является отказом пользователя. Ошибка возвращается как результат выполнения утилиты. Тип ошибки: api_error + ✓ Ошибка от ВК, не является отказом пользователя. Ошибка возвращается как результат выполнения утилиты. Тип ошибки: auth_error (1 ms) + ✓ Ошибка от ВК, отказ пользователя (1 ms) + Обработка ошибки, необработанной на каком-либо этапе + ✓ Выброс ошибки, не связанной с отказом пользователя (1 ms) + ✓ Выброс ошибки, связанной с отказом пользователя PASS src/__tests__/useEventSubscribe.test.ts Хук useEventSubscribe - ✓ Происходит подписка и отписка при монтировании и размонтировании соответственно (6 ms) - ✓ Происходит подписка и отписка при изменении аргумента с зависимостями (2 ms) + ✓ Происходит подписка и отписка при монтировании и размонтировании соответственно (5 ms) + ✓ Происходит подписка и отписка при изменении аргумента с зависимостями (1 ms) PASS src/__tests__/getVkAccessToken.test.ts Функция parseVkScopes - ✓ Правильный парсинг скоупов, количество скоупов: 0 (2 ms) - ✓ Правильный парсинг скоупов, количество скоупов: 1 - ✓ Правильный парсинг скоупов, количество скоупов: 11 (1 ms) - ✓ Правильный парсинг скоупов, количество скоупов: 12 + ✓ Правильный парсинг скоупов, количество скоупов: 0 (1 ms) + ✓ Правильный парсинг скоупов, количество скоупов: 1 (1 ms) + ✓ Правильный парсинг скоупов, количество скоупов: 7 + ✓ Правильный парсинг скоупов, количество скоупов: 12 (1 ms) ✓ Неправильный разделитель строк: ", " ✓ Неправильный разделитель строк: " ," ✓ Неправильный разделитель строк: " " @@ -36,107 +102,70 @@ PASS src/__tests__/getVkAccessToken.test.ts Функция checkOneScopesSetIncludesAnother ✓ Правильное сравнение одинаковых наборов скоупов, количество скоупов: 0 ✓ Правильное сравнение одинаковых наборов скоупов, количество скоупов: 1 - ✓ Правильное сравнение одинаковых наборов скоупов, количество скоупов: 11 (1 ms) + ✓ Правильное сравнение одинаковых наборов скоупов, количество скоупов: 5 ✓ Правильное сравнение одинаковых наборов скоупов, количество скоупов: 12 - ✓ Один скоуп является подмножеством другого + ✓ Один скоуп является подмножеством другого (1 ms) ✓ Полностью несовпадающие наборы скоупов ✓ Первый набор скоупов пустой ✓ Второй набор скоупов пустой Функция getNewVkAccessToken ✓ Получение токена по переданным скоупам, количество скоупов: 0 ✓ Получение токена по переданным скоупам, количество скоупов: 1 - ✓ Получение токена по переданным скоупам, количество скоупов: 9 + ✓ Получение токена по переданным скоупам, количество скоупов: 8 (1 ms) ✓ Получение токена по переданным скоупам, количество скоупов: 12 ✓ В бридж передаётся строка со скоупами, переданными в массиве в аргументе - ✓ В бридж передаётся строка со скоупами, переданными в массиве в аргументе (1 ms) ✓ В бридж передаётся строка со скоупами, переданными в массиве в аргументе ✓ В бридж передаётся строка со скоупами, переданными в массиве в аргументе + ✓ В бридж передаётся строка со скоупами, переданными в массиве в аргументе (1 ms) ✓ Ошибка возвращается ✓ В бридж передаётся id приложения - ✓ Бридж вызывает метод для получения токена (1 ms) + ✓ Бридж вызывает метод для получения токена Функция getVkAccessToken - ✓ Успешный запрос за токеном при отсутствии доступных токена и скоупов (поля в window равны undefined). Количество запрашиваемых скоупов: 0 - ✓ Успешный запрос за токеном при отсутствии доступных токена и скоупов (поля в window равны undefined). Количество запрашиваемых скоупов: 1 (1 ms) - ✓ Успешный запрос за токеном при отсутствии доступных токена и скоупов (поля в window равны undefined). Количество запрашиваемых скоупов: 11 + ✓ Успешный запрос за токеном при отсутствии доступных токена и скоупов (поля в window равны undefined). Количество запрашиваемых скоупов: 0 (1 ms) + ✓ Успешный запрос за токеном при отсутствии доступных токена и скоупов (поля в window равны undefined). Количество запрашиваемых скоупов: 1 + ✓ Успешный запрос за токеном при отсутствии доступных токена и скоупов (поля в window равны undefined). Количество запрашиваемых скоупов: 7 ✓ Успешный запрос за токеном при отсутствии доступных токена и скоупов (поля в window равны undefined). Количество запрашиваемых скоупов: 12 ✓ Успешный запрос. Множество имеющихся скоупов полностью не совпадает с множеством запрашиваемых скоупов или множество имеющихся скоупов является подмножеством запрашиваемых. Имеющиеся скоупы: stats. Запрашиваемые скоупы: docs - ✓ Успешный запрос. Множество имеющихся скоупов полностью не совпадает с множеством запрашиваемых скоупов или множество имеющихся скоупов является подмножеством запрашиваемых. Имеющиеся скоупы: docs,groups,video. Запрашиваемые скоупы: status (1 ms) - ✓ Успешный запрос. Множество имеющихся скоупов полностью не совпадает с множеством запрашиваемых скоупов или множество имеющихся скоупов является подмножеством запрашиваемых. Имеющиеся скоупы: docs. Запрашиваемые скоупы: status,groups,stories + ✓ Успешный запрос. Множество имеющихся скоупов полностью не совпадает с множеством запрашиваемых скоупов или множество имеющихся скоупов является подмножеством запрашиваемых. Имеющиеся скоупы: docs,groups,video. Запрашиваемые скоупы: status + ✓ Успешный запрос. Множество имеющихся скоупов полностью не совпадает с множеством запрашиваемых скоупов или множество имеющихся скоупов является подмножеством запрашиваемых. Имеющиеся скоупы: docs. Запрашиваемые скоупы: status,groups,stories (1 ms) ✓ Успешный запрос. Множество имеющихся скоупов полностью не совпадает с множеством запрашиваемых скоупов или множество имеющихся скоупов является подмножеством запрашиваемых. Имеющиеся скоупы: docs. Запрашиваемые скоупы: stats,docs ✓ Успешный запрос. Множество имеющихся скоупов полностью не совпадает с множеством запрашиваемых скоупов или множество имеющихся скоупов является подмножеством запрашиваемых. Имеющиеся скоупы: docs,groups. Запрашиваемые скоупы: stats,docs,groups - ✓ Успешный запрос. Множество имеющихся скоупов полностью не совпадает с множеством запрашиваемых скоупов или множество имеющихся скоупов является подмножеством запрашиваемых. Имеющиеся скоупы: groups,market. Запрашиваемые скоупы: stats,docs,groups,market (1 ms) + ✓ Успешный запрос. Множество имеющихся скоупов полностью не совпадает с множеством запрашиваемых скоупов или множество имеющихся скоупов является подмножеством запрашиваемых. Имеющиеся скоупы: groups,market. Запрашиваемые скоупы: stats,docs,groups,market (2 ms) ✓ Успешный запрос. Множество запрашиваемых скоупов является подмножеством имеющихся скоупов. Имеющиеся скоупы: stats,docs. Запрашиваемые скоупы: docs - ✓ Успешный запрос. Множество запрашиваемых скоупов является подмножеством имеющихся скоупов. Имеющиеся скоупы: stats,docs,groups. Запрашиваемые скоупы: docs,groups (1 ms) - ✓ Успешный запрос. Множество запрашиваемых скоупов является подмножеством имеющихся скоупов. Имеющиеся скоупы: stats,docs,groups,market. Запрашиваемые скоупы: groups,market (1 ms) - ✓ Успешный запрос. Множество запрашиваемых скоупов является подмножеством имеющихся скоупов. Имеющиеся скоупы: stats,docs,groups,market. Запрашиваемые скоупы: stats,docs,groups,market + ✓ Успешный запрос. Множество запрашиваемых скоупов является подмножеством имеющихся скоупов. Имеющиеся скоупы: stats,docs,groups. Запрашиваемые скоупы: docs,groups + ✓ Успешный запрос. Множество запрашиваемых скоупов является подмножеством имеющихся скоупов. Имеющиеся скоупы: stats,docs,groups,market. Запрашиваемые скоупы: groups,market + ✓ Успешный запрос. Множество запрашиваемых скоупов является подмножеством имеющихся скоупов. Имеющиеся скоупы: stats,docs,groups,market. Запрашиваемые скоупы: stats,docs,groups,market (1 ms) ✓ Запрашивается пустое множество скоупов при уже имеющемся множестве скоупов. Количество доступных скоупов: 0 - ✓ Запрашивается пустое множество скоупов при уже имеющемся множестве скоупов. Количество доступных скоупов: 1 (1 ms) - ✓ Запрашивается пустое множество скоупов при уже имеющемся множестве скоупов. Количество доступных скоупов: 6 + ✓ Запрашивается пустое множество скоупов при уже имеющемся множестве скоупов. Количество доступных скоупов: 1 + ✓ Запрашивается пустое множество скоупов при уже имеющемся множестве скоупов. Количество доступных скоупов: 3 ✓ Запрашивается пустое множество скоупов при уже имеющемся множестве скоупов. Количество доступных скоупов: 12 ✓ Запрашивается множество скоупов при уже имеющемся пустом множестве скоупов. Количество запрашиваемых скоупов: 0 - ✓ Запрашивается множество скоупов при уже имеющемся пустом множестве скоупов. Количество запрашиваемых скоупов: 1 (1 ms) - ✓ Запрашивается множество скоупов при уже имеющемся пустом множестве скоупов. Количество запрашиваемых скоупов: 3 + ✓ Запрашивается множество скоупов при уже имеющемся пустом множестве скоупов. Количество запрашиваемых скоупов: 1 + ✓ Запрашивается множество скоупов при уже имеющемся пустом множестве скоупов. Количество запрашиваемых скоупов: 10 ✓ Запрашивается множество скоупов при уже имеющемся пустом множестве скоупов. Количество запрашиваемых скоупов: 12 ✓ Отказ от всех скоупов (множество запрашиваемых не является подмножеством имеющихся) Имеющийся: stats. Запрашиваемый: docs - ✓ Отказ от всех скоупов (множество запрашиваемых не является подмножеством имеющихся) Имеющийся: docs,groups,video. Запрашиваемый: status (1 ms) - ✓ Отказ от всех скоупов (множество запрашиваемых не является подмножеством имеющихся) Имеющийся: docs. Запрашиваемый: status,groups,stories + ✓ Отказ от всех скоупов (множество запрашиваемых не является подмножеством имеющихся) Имеющийся: docs,groups,video. Запрашиваемый: status + ✓ Отказ от всех скоупов (множество запрашиваемых не является подмножеством имеющихся) Имеющийся: docs. Запрашиваемый: status,groups,stories (1 ms) ✓ Отказ от одного или нескольких скоупов. Запрашиваемые: docs,friends,status. Разрешаемые: docs - ✓ Отказ от одного или нескольких скоупов. Запрашиваемые: docs,friends,status. Разрешаемые: docs,friends (1 ms) + ✓ Отказ от одного или нескольких скоупов. Запрашиваемые: docs,friends,status. Разрешаемые: docs,friends ✓ Неизвестная ошибка -PASS src/__tests__/isVkError.test.ts - Функция isVkError - ✓ Примитив null - ✓ Примитив undefined - ✓ Примитив false - ✓ Примитив true - ✓ Примитив Symbol() - ✓ Примитив Symbol(named symbol) - ✓ Примитив 3440 - ✓ Примитив 373 (1 ms) - ✓ Примитив 1190 - ✓ Примитив 6928 - ✓ Примитив 3827 - ✓ Примитив 427 - ✓ Примитив YEfYOTBX1s2hORvniGTDx2BN - ✓ Примитив Vcgqd7oBCcUwRz8R7KAoCGt9 - ✓ Примитив o03nUmMkrvRfncjmtzkauPvf - ✓ Функция стрелочная - ✓ Функция не стрелочная (1 ms) - ✓ Пустой объект - ✓ Объект произвольной структуры - ✓ Объект ошибки Error - ✓ Попытка обмана проверки: объект с error_type, равным "client_error", но с отсутствующим error_data - ✓ Попытка обмана проверки: объект с error_type, равным "api_error", но с отсутствующим error_data - ✓ Попытка обмана проверки: объект с error_type, равным "auth_error", но с отсутствующим error_data - ✓ Попытка обмана проверки: объект с error_type, равным "client_error", с произвольным request_id, но с отсутствующим error_data - ✓ Попытка обмана проверки: объект с error_type, равным "api_error", с произвольным request_id, но с отсутствующим error_data - ✓ Попытка обмана проверки: объект с error_type, равным "auth_error", с произвольным request_id, но с отсутствующим error_data - ✓ Попытка обмана проверки: объект с произвольным значением поля error_data, но отсутствующим error_type - ✓ Попытка обмана проверки: объект с произвольным значением поля error_data и неправильным error_type - ✓ Объект с произвольным error_data и error_type, равным "client_error" - ✓ Объект с произвольным error_data и error_type, равным "api_error" - ✓ Объект с произвольным error_data и error_type, равным "auth_error" - ✓ Объект с произвольным error_data, произвольным полем и error_type, равным "client_error" - ✓ Объект с произвольным error_data, произвольным полем и error_type, равным "api_error" - ✓ Объект с произвольным error_data, произвольным полем и error_type, равным "auth_error" - PASS src/__tests__/callVkApi.test.ts Функция callVkApi ✓ Успешный запрос с изначально корректным токеном (1 ms) ✓ Некоторая ошибка (в том числе из-за возможно некорректного токена) - ✓ Успешный запрос, нет токена, токен должен быть получен один раз (1 ms) - ✓ Некоторая ошибка (в том числе из-за возможного некорректного токена), нет токена, токен должен быть получен один раз + ✓ Успешный запрос, нет токена, токен должен быть получен один раз + ✓ Некоторая ошибка (в том числе из-за возможного некорректного токена), нет токена, токен должен быть получен один раз (1 ms) ✓ Успешный запрос, изначально протухший токен, новый токен должен быть получен один раз. Ошибка: User authorization failed: access_token was given to another ip address., веб: true ✓ Успешный запрос, изначально протухший токен, новый токен должен быть получен один раз. Ошибка: User authorization failed: access_token has expired., веб: true - ✓ Успешный запрос, изначально протухший токен, новый токен должен быть получен один раз. Ошибка: User authorization failed: access_token was given to another ip address., веб: false (1 ms) + ✓ Успешный запрос, изначально протухший токен, новый токен должен быть получен один раз. Ошибка: User authorization failed: access_token was given to another ip address., веб: false ✓ Успешный запрос, изначально протухший токен, новый токен должен быть получен один раз. Ошибка: User authorization failed: access_token has expired., веб: false ✓ Некоторая ошибка (в том числе из-за возможного некорректного токена) после получения нового токена. Изначально протухший токен, новый токен должен быть получен один раз. Ошибка: User authorization failed: access_token was given to another ip address., веб: true - ✓ Некоторая ошибка (в том числе из-за возможного некорректного токена) после получения нового токена. Изначально протухший токен, новый токен должен быть получен один раз. Ошибка: User authorization failed: access_token has expired., веб: true (1 ms) + ✓ Некоторая ошибка (в том числе из-за возможного некорректного токена) после получения нового токена. Изначально протухший токен, новый токен должен быть получен один раз. Ошибка: User authorization failed: access_token has expired., веб: true ✓ Некоторая ошибка (в том числе из-за возможного некорректного токена) после получения нового токена. Изначально протухший токен, новый токен должен быть получен один раз. Ошибка: User authorization failed: access_token was given to another ip address., веб: false ✓ Некоторая ошибка (в том числе из-за возможного некорректного токена) после получения нового токена. Изначально протухший токен, новый токен должен быть получен один раз. Ошибка: User authorization failed: access_token has expired., веб: false ✓ Запрос с некоторым ответом, изначально протухший токен. Новый токен получать не нужно. Ошибка: User authorization failed: access_token was given to another ip address., веб: true - ✓ Запрос с некоторым ответом, изначально протухший токен. Новый токен получать не нужно. Ошибка: User authorization failed: access_token has expired., веб: true (1 ms) + ✓ Запрос с некоторым ответом, изначально протухший токен. Новый токен получать не нужно. Ошибка: User authorization failed: access_token has expired., веб: true ✓ Запрос с некоторым ответом, изначально протухший токен. Новый токен получать не нужно. Ошибка: User authorization failed: access_token was given to another ip address., веб: false ✓ Запрос с некоторым ответом, изначально протухший токен. Новый токен получать не нужно. Ошибка: User authorization failed: access_token has expired., веб: false ✓ Запрос, название метода передаётся в бридж (1 ms) @@ -150,23 +179,23 @@ PASS src/__tests__/checkVkPlatform.test.ts Функция checkVkPlatform ✓ Десктопная версия сайта ВКонтакте (1 ms) ✓ Десктопная версия VK Мессенджера (сайт) - ✓ Десктопное приложение VK Мессенджер - ✓ Мобильное приложение ВКонтакте для Android (1 ms) - ✓ Мобильное приложение VK Мессенджер для Android + ✓ Десктопное приложение VK Мессенджер (1 ms) + ✓ Мобильное приложение ВКонтакте для Android + ✓ Мобильное приложение VK Мессенджер для Android (1 ms) ✓ Мобильное приложение ВКонтакте для iPadOS - ✓ Мобильное приложение ВКонтакте для iOS (1 ms) - ✓ Мобильное приложение VK Мессенджер для iOS + ✓ Мобильное приложение ВКонтакте для iOS + ✓ Мобильное приложение VK Мессенджер для iOS (1 ms) ✓ Мобильная версия сайта ВКонтакте, открытая в десктопном браузере (mvk) - ✓ Мобильная версия сайта ВКонтакте, открытая в мобильном браузере на андроиде (1 ms) - ✓ Мобильная версия сайта ВКонтакте, открытая в мобильном браузере на айфоне + ✓ Мобильная версия сайта ВКонтакте, открытая в мобильном браузере на андроиде + ✓ Мобильная версия сайта ВКонтакте, открытая в мобильном браузере на айфоне (1 ms) ✓ Мобильная версия сайта ВКонтакте, открытая в мобильном браузере на айпаде - ✓ Мобильная версия сайта ВКонтакте, открытая в мобильном браузере на айподе (1 ms) + ✓ Мобильная версия сайта ВКонтакте, открытая в мобильном браузере на айподе ✓ Внешнее приложение для Android, на котором запущен миниапп ✓ Внешнее приложение для iOS, на котором запущен миниапп - ✓ Внешнее приложение для iPadOS, на котором запущен миниапп - ✓ Внешний сайт ВК, запущенный на десктопном браузере (1 ms) + ✓ Внешнее приложение для iPadOS, на котором запущен миниапп (1 ms) + ✓ Внешний сайт ВК, запущенный на десктопном браузере ✓ Cайт, открытый в мобильном браузере на десктопе (mvk) - ✓ Cайт, открытый в мобильном браузере на андроиде + ✓ Cайт, открытый в мобильном браузере на андроиде (2 ms) ✓ Cайт, открытый в мобильном браузере на iPhone ✓ Cайт, открытый в мобильном браузере на iPad ✓ Cайт, открытый в мобильном браузере на iPod @@ -174,47 +203,65 @@ PASS src/__tests__/checkVkPlatform.test.ts PASS src/__tests__/setVkViewSettings.test.ts setVkViewSettings - ✓ Платформа, не поддерживающая view settings: desktop_web (1 ms) - ✓ Платформа, не поддерживающая view settings: desktop_web_messenger + ✓ Платформа, не поддерживающая view settings: desktop_web (2 ms) + ✓ Платформа, не поддерживающая view settings: desktop_web_messenger (1 ms) ✓ Платформа, не поддерживающая view settings: desktop_app_messenger - ✓ Платформа, не поддерживающая view settings: mobile_web (1 ms) + ✓ Платформа, не поддерживающая view settings: mobile_web ✓ Платформа, не поддерживающая view settings: android_external - ✓ Платформа, не поддерживающая view settings: iphone_external + ✓ Платформа, не поддерживающая view settings: iphone_external (1 ms) ✓ Платформа, не поддерживающая view settings: ipad_external ✓ Платформа, не поддерживающая view settings: web_external ✓ Платформа, не поддерживающая view settings: mvk_external - ✓ Платформа, поддерживающая все view settings: mobile_android - ✓ Платформа, поддерживающая view settings (только окраску статусбара): mobile_iphone (1 ms) + ✓ Платформа, поддерживающая все view settings: mobile_android (1 ms) + ✓ Платформа, поддерживающая view settings (только окраску статусбара): mobile_iphone ✓ Платформа, поддерживающая view settings (только окраску статусбара): mobile_ipad - ✓ Неизвестная ошибка bridge.supports + ✓ Неизвестная ошибка bridge.supports (1 ms) ✓ Неизвестная ошибка bridge.send -PASS src/__tests__/checkVkUserDenied.test.ts - Функция checkVkUserDenied - ✓ Объект ошибки, соответствующий типу ошибки api_error (1 ms) - ✓ Объект ошибки, соответствующий типу ошибки api_error, но с error_reason "User denied" и кодом ошибки 4 - ✓ Объект ошибки, соответствующий типу ошибки api_error, но с error_reason "Operation denied by user" и кодом ошибки 4 - ✓ Объект ошибки, соответствующий типу ошибки auth_error - ✓ Объект ошибки, соответствующий типу ошибки auth_error, но с error_reason "User denied" и кодом ошибки 4 - ✓ Объект ошибки, соответствующий типу ошибки auth_error, но с error_reason "Operation denied by user" и кодом ошибки 4 (1 ms) - ✓ Объект ошибки, соответствующий типу ошибки client_error с правильным error_reason "User denied" и кодом ошибки 4 - ✓ Объект ошибки, соответствующий типу ошибки client_error с правильным error_reason "Operation denied by user" и кодом ошибки 4 - ✓ Объект ошибки, соответствующий типу ошибки client_error с произвольным кодом ошибки, с правильным error_reason "User denied", но в нижнем регистре - ✓ Объект ошибки, соответствующий типу ошибки client_error с произвольным кодом ошибки, с правильным error_reason "Operation denied by user", но в нижнем регистре - ✓ Объект ошибки, соответствующий типу ошибки client_error, с произвольным кодом ошибки, с правильным error_reason "User denied" - ✓ Объект ошибки, соответствующий типу ошибки client_error, с произвольным кодом ошибки, с правильным error_reason "Operation denied by user" (1 ms) - ✓ Объект ошибки, соответствующий типу ошибки client_error с кодом ошибки 4, с произвольной причиной ошибки - ✓ Объект ошибки, соответствующий типу ошибки client_error с произвольным кодом ошибки, с произвольной причиной ошибки - ✓ Объект, содержащий минимально достаточные поля, с типом ошибки client_error с причиной ошибки "User denied" и кодом ошибки 4 - ✓ Объект, содержащий минимально достаточные поля, с типом ошибки client_error с причиной ошибки "Operation denied by user" и кодом ошибки 4 +PASS src/__tests__/isVkError.test.ts + Функция isVkError + ✓ Примитив null + ✓ Примитив undefined + ✓ Примитив false + ✓ Примитив true + ✓ Примитив Symbol() + ✓ Примитив Symbol(named symbol) + ✓ Примитив 6058 + ✓ Примитив 5460 (1 ms) + ✓ Примитив 9078 + ✓ Примитив 5851 + ✓ Примитив 816 + ✓ Примитив 2068 + ✓ Примитив R0CuinozCSemb6ymMwxRNb1w + ✓ Примитив jRs7g3XJHFYjiHJR35EHXN6s (1 ms) + ✓ Примитив VVxTA4ADEr4AhkupQsqnytgS + ✓ Функция стрелочная + ✓ Функция не стрелочная + ✓ Пустой объект + ✓ Объект произвольной структуры + ✓ Объект ошибки Error + ✓ Попытка обмана проверки: объект с error_type, равным "client_error", но с отсутствующим error_data + ✓ Попытка обмана проверки: объект с error_type, равным "api_error", но с отсутствующим error_data + ✓ Попытка обмана проверки: объект с error_type, равным "auth_error", но с отсутствующим error_data (1 ms) + ✓ Попытка обмана проверки: объект с error_type, равным "client_error", с произвольным request_id, но с отсутствующим error_data + ✓ Попытка обмана проверки: объект с error_type, равным "api_error", с произвольным request_id, но с отсутствующим error_data + ✓ Попытка обмана проверки: объект с error_type, равным "auth_error", с произвольным request_id, но с отсутствующим error_data + ✓ Попытка обмана проверки: объект с произвольным значением поля error_data, но отсутствующим error_type + ✓ Попытка обмана проверки: объект с произвольным значением поля error_data и неправильным error_type + ✓ Объект с произвольным error_data и error_type, равным "client_error" + ✓ Объект с произвольным error_data и error_type, равным "api_error" + ✓ Объект с произвольным error_data и error_type, равным "auth_error" + ✓ Объект с произвольным error_data, произвольным полем и error_type, равным "client_error" + ✓ Объект с произвольным error_data, произвольным полем и error_type, равным "api_error" (1 ms) + ✓ Объект с произвольным error_data, произвольным полем и error_type, равным "auth_error" PASS src/__tests__/checkVkAvatarIsDefault.test.ts Функция checkVkAvatarIsDefault ✓ Правильная ссылка: https://vk.com/images/camera_400.png (1 ms) ✓ Правильная ссылка: https://vk.com/images/camera_200.png ✓ Правильная ссылка: https://vk.com/images/camera_100.png - ✓ Правильная ссылка: https://vk.com/images/camera_50.png - ✓ Имитация ВКшной ссылки, jpg-расширение: https://vk.com/images/camera_400.jpg (1 ms) + ✓ Правильная ссылка: https://vk.com/images/camera_50.png (1 ms) + ✓ Имитация ВКшной ссылки, jpg-расширение: https://vk.com/images/camera_400.jpg ✓ Имитация ВКшной ссылки, jpg-расширение: https://vk.com/images/camera_200.jpg ✓ Имитация ВКшной ссылки, jpg-расширение: https://vk.com/images/camera_100.jpg ✓ Имитация ВКшной ссылки, jpg-расширение: https://vk.com/images/camera_50.jpg @@ -226,8 +273,8 @@ PASS src/__tests__/checkVkAvatarIsDefault.test.ts ✓ Несоответствие размеров в аргументе в поле size и в ссылке. Ссылка: https://vk.com/images/camera_100.png, размер: 400 ✓ Несоответствие размеров в аргументе в поле size и в ссылке. Ссылка: https://vk.com/images/camera_50.png, размер: 400 ✓ Несоответствие размеров в аргументе в поле size и в ссылке. Ссылка: https://vk.com/images/camera_400.png, размер: 200 - ✓ Несоответствие размеров в аргументе в поле size и в ссылке. Ссылка: https://vk.com/images/camera_100.png, размер: 200 - ✓ Несоответствие размеров в аргументе в поле size и в ссылке. Ссылка: https://vk.com/images/camera_50.png, размер: 200 (1 ms) + ✓ Несоответствие размеров в аргументе в поле size и в ссылке. Ссылка: https://vk.com/images/camera_100.png, размер: 200 (1 ms) + ✓ Несоответствие размеров в аргументе в поле size и в ссылке. Ссылка: https://vk.com/images/camera_50.png, размер: 200 ✓ Несоответствие размеров в аргументе в поле size и в ссылке. Ссылка: https://vk.com/images/camera_400.png, размер: 100 ✓ Несоответствие размеров в аргументе в поле size и в ссылке. Ссылка: https://vk.com/images/camera_200.png, размер: 100 ✓ Несоответствие размеров в аргументе в поле size и в ссылке. Ссылка: https://vk.com/images/camera_50.png, размер: 100 @@ -237,23 +284,38 @@ PASS src/__tests__/checkVkAvatarIsDefault.test.ts ✓ Пустая строка в поле ссылки. Размер: 400 ✓ Пустая строка в поле ссылки. Размер: 200 ✓ Пустая строка в поле ссылки. Размер: 100 - ✓ Пустая строка в поле ссылки. Размер: 50 + ✓ Пустая строка в поле ссылки. Размер: 50 (1 ms) PASS src/__tests__/shareVkStory.test.ts Функция shareVkStory - ✓ Успешное выполнение, источник картинки — URL (2 ms) + ✓ Успешное выполнение, источник картинки — URL (1 ms) ✓ Успешное выполнение, источник картинки — BLOB - ✓ Все параметры, кроме источника картинки, передаются в бридж (1 ms) + ✓ Все параметры, кроме источника картинки, передаются в бридж ✓ Отказ пользователя, причина ошибки: "User denied" ✓ Отказ пользователя, причина ошибки: "Operation denied by user" ✓ Неизвестная ошибка -PASS src/__tests__/shareVkPost.test.ts - Функция shareVkPost - ✎ todo Тесты отваливаются, потому что jest ругается на использование esm в mediaproject-utils. По крайней мере локально это решается сборкой mediaproject-utils на cjs и подключением через npm/yarn link +PASS src/__tests__/checkVkUserDenied.test.ts + Функция checkVkUserDenied + ✓ Объект ошибки, соответствующий типу ошибки api_error (1 ms) + ✓ Объект ошибки, соответствующий типу ошибки api_error, но с error_reason "User denied" и кодом ошибки 4 + ✓ Объект ошибки, соответствующий типу ошибки api_error, но с error_reason "Operation denied by user" и кодом ошибки 4 (1 ms) + ✓ Объект ошибки, соответствующий типу ошибки auth_error + ✓ Объект ошибки, соответствующий типу ошибки auth_error, но с error_reason "User denied" и кодом ошибки 4 + ✓ Объект ошибки, соответствующий типу ошибки auth_error, но с error_reason "Operation denied by user" и кодом ошибки 4 + ✓ Объект ошибки, соответствующий типу ошибки client_error с правильным error_reason "User denied" и кодом ошибки 4 + ✓ Объект ошибки, соответствующий типу ошибки client_error с правильным error_reason "Operation denied by user" и кодом ошибки 4 + ✓ Объект ошибки, соответствующий типу ошибки client_error с произвольным кодом ошибки, с правильным error_reason "User denied", но в нижнем регистре + ✓ Объект ошибки, соответствующий типу ошибки client_error с произвольным кодом ошибки, с правильным error_reason "Operation denied by user", но в нижнем регистре + ✓ Объект ошибки, соответствующий типу ошибки client_error, с произвольным кодом ошибки, с правильным error_reason "User denied" + ✓ Объект ошибки, соответствующий типу ошибки client_error, с произвольным кодом ошибки, с правильным error_reason "Operation denied by user" + ✓ Объект ошибки, соответствующий типу ошибки client_error с кодом ошибки 4, с произвольной причиной ошибки + ✓ Объект ошибки, соответствующий типу ошибки client_error с произвольным кодом ошибки, с произвольной причиной ошибки + ✓ Объект, содержащий минимально достаточные поля, с типом ошибки client_error с причиной ошибки "User denied" и кодом ошибки 4 (1 ms) + ✓ Объект, содержащий минимально достаточные поля, с типом ошибки client_error с причиной ошибки "Operation denied by user" и кодом ошибки 4 Test Suites: 11 passed, 11 total -Tests: 1 todo, 212 passed, 213 total +Tests: 1 todo, 252 passed, 253 total Snapshots: 0 total -Time: 1.298 s +Time: 1.359 s Ran all test suites. diff --git a/src/__tests__/utils/mockErrors.ts b/src/__tests__/utils/mockErrors.ts index 2a1bcee..5e51134 100644 --- a/src/__tests__/utils/mockErrors.ts +++ b/src/__tests__/utils/mockErrors.ts @@ -6,14 +6,17 @@ import { range } from './range'; export const getUserDeniedCommonError = ({ reason = 'User denied', + requestId = randomString(10), }: { reason?: string; + requestId?: string | number; } = {}): ErrorData => ({ error_type: 'client_error', error_data: { error_reason: reason, error_code: 4, }, + request_id: requestId, }); export const getRandomVkApiError = (): ErrorData => ({ @@ -24,3 +27,28 @@ export const getRandomVkApiError = (): ErrorData => ({ request_params: range(3).map(() => randomString(3)), }, }); + +export const getRandomVkClientError = (): ErrorData => ({ + error_type: 'client_error', + error_data: { + error_code: randomNumberUpTo(100), + error_reason: randomString(10), + error_description: randomString(10), + }, + request_id: randomNumberUpTo(100), +}); + +export const getRandomVkAuthError = (): ErrorData => ({ + error_type: 'auth_error', + error_data: { + error_code: randomNumberUpTo(100), + error_reason: randomString(10), + }, + request_id: randomNumberUpTo(100), +}); + +export const getRandomVkErrorEachType = (): ErrorData[] => [ + getRandomVkClientError(), + getRandomVkApiError(), + getRandomVkAuthError(), +]; diff --git a/yarn.lock b/yarn.lock index 528eb8a..728ab12 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2032,6 +2032,21 @@ dependencies: "@types/istanbul-lib-report" "*" +"@types/jest-when@^3.5.5": + version "3.5.5" + resolved "https://registry.yarnpkg.com/@types/jest-when/-/jest-when-3.5.5.tgz#c23e97945959277946c15eff2a2fe51d18743045" + integrity sha512-H9MDPIrz7NOu6IXP9OHExNN9LnJbGYAzRsGIDKxWr7Fth9vovemNV8yFbkUWLSEmuA8PREvAEvt9yK0PPLmFHA== + dependencies: + "@types/jest" "*" + +"@types/jest@*": + version "29.5.12" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.5.12.tgz#7f7dc6eb4cf246d2474ed78744b05d06ce025544" + integrity sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw== + dependencies: + expect "^29.0.0" + pretty-format "^29.0.0" + "@types/jest@^29.5.11": version "29.5.11" resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.5.11.tgz#0c13aa0da7d0929f078ab080ae5d4ced80fa2f2c" @@ -2425,6 +2440,15 @@ available-typed-arrays@^1.0.5: resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== +axios@^1.6.7: + version "1.6.7" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.6.7.tgz#7b48c2e27c96f9c68a2f8f31e2ab19f59b06b0a7" + integrity sha512-/hDJGff6/c7u0hDkvkGxR/oy6CbCs8ziCsC7SqmhjfozqiJGc8Z11wrv9z9lYfY4K8l+H9TpjcMDX0xOZmx+RA== + dependencies: + follow-redirects "^1.15.4" + form-data "^4.0.0" + proxy-from-env "^1.1.0" + babel-jest@^29.7.0: version "29.7.0" resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.7.0.tgz#f4369919225b684c56085998ac63dbd05be020d5" @@ -3444,6 +3468,11 @@ flatted@^3.1.0: resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.1.tgz#bbef080d95fca6709362c73044a1634f7c6e7d05" integrity sha512-OMQjaErSFHmHqZe+PSidH5n8j3O0F2DdnVh8JB4j4eUQ2k6KvB0qGfrKIhapvez5JerBbmWkaLYUYWISaESoXg== +follow-redirects@^1.15.4: + version "1.15.5" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.5.tgz#54d4d6d062c0fa7d9d17feb008461550e3ba8020" + integrity sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw== + for-each@^0.3.3: version "0.3.3" resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" @@ -4443,6 +4472,11 @@ jest-watcher@^29.7.0: jest-util "^29.7.0" string-length "^4.0.1" +jest-when@^3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/jest-when/-/jest-when-3.6.0.tgz#b46ee408d68f671447b218f2ae6bd93fb5028acf" + integrity sha512-+cZWTy0ekAJo7M9Om0Scdor1jm3wDiYJWmXE8U22UVnkH54YCXAuaqz3P+up/FdtOg8g4wHOxV7Thd7nKhT6Dg== + jest-worker@^29.7.0: version "29.7.0" resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.7.0.tgz#acad073acbbaeb7262bd5389e1bcf43e10058d4a" @@ -5208,6 +5242,11 @@ prop-types@^15.7.2: object-assign "^4.1.1" react-is "^16.8.1" +proxy-from-env@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" + integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== + psl@^1.1.33: version "1.9.0" resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" From d63e9061f834817fa0e74bdfdfbf4b342877cc0e Mon Sep 17 00:00:00 2001 From: "d.ragozin" Date: Fri, 2 Feb 2024 15:13:10 +0300 Subject: [PATCH 32/46] =?UTF-8?q?[*]=20=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20readme?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 68b4419..e2856a0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,7 @@ [*] исправлена проверка на пустую строку в функции `checkVkAvatarIsDefault` [*] в десктоп-платформы добавлены платформы десктопного ВК Мессенджера в функции `checkVkPlatform` -[+] добавлены автотесты на функции `callVkApi`, `parseVkScopes`, `checkOneScopesSetIncludesAnother`, `getNewVkAccessToken`, `getVkAccessToken`, `checkVkPlatform`, `callVkApi`, `checkVkAvatarIsDefault`, `setVkViewSettings`, `shareVkStory`, `isVkError`, `checkVkUserDenied`, хуки `usePolling`, `useEventSubscribe` +[+] добавлены автотесты на функции `callVkApi`, `parseVkScopes`, `checkOneScopesSetIncludesAnother`, `getNewVkAccessToken`, `getVkAccessToken`, `checkVkPlatform`, `callVkApi`, `checkVkAvatarIsDefault`, `setVkViewSettings`, `shareVkStory`, `isVkError`, `checkVkUserDenied`, `shareVkPost`, `shareVkPostWithUpload`, хуки `usePolling`, `useEventSubscribe` # v3.0.0 From 5b9f0aaa1ed9ffbe60a7087141b7ed49dbc18414 Mon Sep 17 00:00:00 2001 From: "d.ragozin" Date: Fri, 2 Feb 2024 15:16:25 +0300 Subject: [PATCH 33/46] =?UTF-8?q?[*]=20=D0=9F=D1=80=D0=B0=D0=B2=D0=BA?= =?UTF-8?q?=D0=B0=20=D0=BD=D0=B0=D0=B7=D0=B2=D0=B0=D0=BD=D0=B8=D0=B9=20?= =?UTF-8?q?=D0=B0=D0=B2=D1=82=D0=BE=D1=82=D0=B5=D1=81=D1=82=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/__tests__/shareVkPost.test.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/__tests__/shareVkPost.test.ts b/src/__tests__/shareVkPost.test.ts index 9cbb9a1..c6f43e3 100644 --- a/src/__tests__/shareVkPost.test.ts +++ b/src/__tests__/shareVkPost.test.ts @@ -788,13 +788,13 @@ describe('Функция shareVkPostWithUpload', () => { expect(result).toBe(MOCK_SUCCESS_POST_RESULT); }; - it('Картинка со стены добавляется к переданным attachments, отправляемым в shareVkPost', async () => { + it('Картинка со стены добавляется к переданным attachments, отправляемым в VKWebAppShowWallPostBox', async () => { testShareVkPostAttachmentPassing(getMockAttachments()); }); it( 'Если дополнительные attachments не переданы, ' + - 'в параметр attachments shareVkPost передаётся только картинка со стены пользователя', + 'в параметр attachments VKWebAppShowWallPostBox передаётся только картинка со стены пользователя', () => { testShareVkPostAttachmentPassing(undefined); } From 3b098008621d58b11d26a6ea954809c6b56ba15c Mon Sep 17 00:00:00 2001 From: "d.ragozin" Date: Mon, 5 Feb 2024 12:25:19 +0300 Subject: [PATCH 34/46] =?UTF-8?q?[-]=20=D0=A3=D0=B4=D0=B0=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D0=BB=D0=B8=D1=88=D0=BD=D0=B5=D0=B9=20?= =?UTF-8?q?=D0=BF=D1=80=D0=BE=D0=B2=D0=B5=D1=80=D0=BA=D0=B8=20=D0=BD=D0=B0?= =?UTF-8?q?=20=D0=BF=D0=B5=D1=80=D0=B5=D0=B4=D0=B0=D1=87=D1=83=20=D0=B0?= =?UTF-8?q?=D1=80=D0=B3=D1=83=D0=BC=D0=B5=D0=BD=D1=82=D0=B0=20=D1=84=D1=83?= =?UTF-8?q?=D0=BD=D0=BA=D1=86=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/setVkViewSettings.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/setVkViewSettings.ts b/src/setVkViewSettings.ts index f9df3b0..72eef1c 100644 --- a/src/setVkViewSettings.ts +++ b/src/setVkViewSettings.ts @@ -37,7 +37,6 @@ const setVkViewSettings = async ( let settingsForCurrentPlatform = { ...viewSettings }; if ( - platform && VK_PLATFORMS_WITH_VIEW_SETTINGS.includes(platform) && bridge.supports('VKWebAppSetViewSettings') ) { From c6b2475defa251100f0963a855d426c3b626b890 Mon Sep 17 00:00:00 2001 From: "d.ragozin" Date: Mon, 5 Feb 2024 17:41:55 +0300 Subject: [PATCH 35/46] =?UTF-8?q?[+]=20=D0=9E=D0=B1=D1=80=D0=B0=D0=B1?= =?UTF-8?q?=D0=BE=D1=82=D0=BA=D0=B0=20=D0=BF=D0=BB=D0=B0=D1=82=D1=84=D0=BE?= =?UTF-8?q?=D1=80=D0=BC=D1=8B=20=D0=BC=D0=B5=D1=81=D1=81=D0=B5=D0=BD=D0=B4?= =?UTF-8?q?=D0=B6=D0=B5=D1=80=D0=B0,=20=D0=BF=D0=BE=D0=BB=D0=B5=20is=5Fmes?= =?UTF-8?q?senger=20=D0=B2=20window?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/checkVkPlatform.ts | 23 ++++++++++++++++++++++- src/setVkViewSettings.ts | 17 +++++++++++++++-- src/types/common.ts | 2 ++ src/types/window.ts | 1 + 4 files changed, 40 insertions(+), 3 deletions(-) diff --git a/src/checkVkPlatform.ts b/src/checkVkPlatform.ts index ed5ba17..380e2fc 100644 --- a/src/checkVkPlatform.ts +++ b/src/checkVkPlatform.ts @@ -5,7 +5,12 @@ import { VkPlatformType } from './types'; * * @constant {VkPlatformType[]} */ -const DESKTOP_VK_PLATFORMS: VkPlatformType[] = ['desktop_web', 'web_external']; +const DESKTOP_VK_PLATFORMS: VkPlatformType[] = [ + 'desktop_web', + 'web_external', + 'desktop_app_messenger', + 'desktop_web_messenger', +]; /** * Платформы ВКонтакте, для которых можно считать, что приложение открыто на IOS. @@ -31,6 +36,20 @@ const ANDROID_VK_PLATFORMS: VkPlatformType[] = [ 'android_external', ]; +/** + * Платформы ВКонтакте, для которых можно считать, что приложение открыто в мессенджере + * в рамках одной из платформ: нативный Android, нативный iOS, нативный прил для десктопа + * или веб-версия ВК Месседжера + * + * @constant {VkPlatformType[]} + */ +const MESSENGER_VK_PLATFORMS: VkPlatformType[] = [ + 'mobile_android_messenger', + 'mobile_iphone_messenger', + 'desktop_web_messenger', + 'desktop_app_messenger', +]; + /** * Класснеймы, которые могут добавляться тегу body после проверки текущей платформы ВКонтакте. * @@ -103,6 +122,8 @@ const checkVkPlatform = ( return; } + window.is_messenger = MESSENGER_VK_PLATFORMS.includes(platform); + const isMobile = Boolean( platform && !DESKTOP_VK_PLATFORMS.includes(platform) ); diff --git a/src/setVkViewSettings.ts b/src/setVkViewSettings.ts index 900d292..ffe099b 100644 --- a/src/setVkViewSettings.ts +++ b/src/setVkViewSettings.ts @@ -7,7 +7,8 @@ import { } from './types'; /** - * Массив платформ, которые поддерживают view settings. + * Массив платформ, которые поддерживают view settings + * (по крайней мере status_bar) * * @constant {VkPlatformType[]} */ @@ -15,6 +16,18 @@ const VK_PLATFORMS_WITH_VIEW_SETTINGS: VkPlatformType[] = [ 'mobile_iphone', 'mobile_ipad', 'mobile_android', + 'mobile_android_messenger', + 'mobile_iphone_messenger', +]; + +/** + * Массив платформ, которые поддерживают view settings полностью. + * + * @constant {VkPlatformType[]} + */ +const VK_PLATFORMS_WITH_FULL_VIEW_SETTINGS: VkPlatformType[] = [ + 'mobile_android', + 'mobile_android_messenger', ]; /** @@ -43,7 +56,7 @@ const setVkViewSettings = async ( * Все настройки поддерживаются только на android, * так что если платформа не android, то используем только цвет status bar */ - if (window.platform !== 'mobile_android') { + if (!VK_PLATFORMS_WITH_FULL_VIEW_SETTINGS.includes(window.platform)) { settingsForCurrentPlatform = { status_bar_style: viewSettings.status_bar_style, }; diff --git a/src/types/common.ts b/src/types/common.ts index 339de4d..8129909 100644 --- a/src/types/common.ts +++ b/src/types/common.ts @@ -13,6 +13,8 @@ type VkResponseType = M extends AnyReceiveMethodName */ type InternalVkPlatformType = | 'desktop_web' + | 'desktop_web_messenger' + | 'desktop_app_messenger' | 'mobile_android' | 'mobile_android_messenger' | 'mobile_ipad' diff --git a/src/types/window.ts b/src/types/window.ts index 0dfb6e2..74e3d4c 100644 --- a/src/types/window.ts +++ b/src/types/window.ts @@ -18,6 +18,7 @@ export interface WindowType is_ios?: boolean; is_android?: boolean; is_mvk?: boolean; + is_messenger?: boolean; /** Токен доступа и его права */ access_token?: string; From 3c819f6e56b2e5fef26ab53887cb289a4308c770 Mon Sep 17 00:00:00 2001 From: "d.ragozin" Date: Mon, 5 Feb 2024 18:02:44 +0300 Subject: [PATCH 36/46] =?UTF-8?q?[*]=20=D0=9F=D0=BE=D0=B4=D0=BD=D1=8F?= =?UTF-8?q?=D1=82=D0=B8=D0=B5=20=D0=B2=D0=B5=D1=80=D1=81=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 4 ++++ package.json | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 201d94c..def1023 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +#### v2.2.1 +[+] запись в window поля is_messenger, означающего, что приложение открыто в ВК Мессенджере +[*] в перечни ВК-платформ добавлены платформы ВК Мессенджера + #### v2.1.1 [-] shareVkPostWithUpload: убрана вложенность response diff --git a/package.json b/package.json index 04dc85c..91b318d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@ktsstudio/mediaproject-vk", - "version": "2.1.1", + "version": "2.2.1", "description": "Package with utils for VK Mini Apps", "author": "KTS Studio (https://kts.studio)", "keywords": [ From 40d3fc2c835324aedfd8bb7b3c3843004ca8df7c Mon Sep 17 00:00:00 2001 From: "d.ragozin" Date: Mon, 5 Feb 2024 18:42:15 +0300 Subject: [PATCH 37/46] =?UTF-8?q?[+]=20checkVkPlatform:=20=D0=BE=D0=B1?= =?UTF-8?q?=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=BA=D0=B0=20=D1=81=D0=BB=D1=83?= =?UTF-8?q?=D1=87=D0=B0=D1=8F=20=D0=BE=D1=82=D0=BA=D1=80=D1=8B=D1=82=D0=B8?= =?UTF-8?q?=D1=8F=20=D0=BF=D1=80=D0=B8=D0=BB=D0=BE=D0=B6=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D1=8F=20=D0=B8=D0=B7=20=D0=BC=D0=B2=D0=BA=20=D0=BD=D0=B0=20?= =?UTF-8?q?=D0=B4=D0=B5=D1=81=D0=BA=D1=82=D0=BE=D0=BF=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/checkVkPlatform.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/checkVkPlatform.ts b/src/checkVkPlatform.ts index f65d087..a117b70 100644 --- a/src/checkVkPlatform.ts +++ b/src/checkVkPlatform.ts @@ -152,7 +152,7 @@ const checkVkPlatform = ( return { isMobile: true, isIos: false, isAndroid: true, isMvk: true }; } - return null; + return { isMobile: true, isIos: false, isAndroid: false, isMvk: true }; }; export { From 173c7706bfc7e7e3c1c38ea2f039760190e1801a Mon Sep 17 00:00:00 2001 From: "d.ragozin" Date: Mon, 5 Feb 2024 18:46:04 +0300 Subject: [PATCH 38/46] =?UTF-8?q?[*]=20=D0=9A=D0=BE=D1=80=D1=80=D0=B5?= =?UTF-8?q?=D0=BA=D1=82=D0=B8=D1=80=D0=BE=D0=B2=D0=BA=D0=B0=20=D0=B0=D0=B2?= =?UTF-8?q?=D1=82=D0=BE=D1=82=D0=B5=D1=81=D1=82=D0=BE=D0=B2=20checkVkPlatf?= =?UTF-8?q?orm=20=D1=81=20=D1=83=D1=87=D1=91=D1=82=D0=BE=D0=BC=20=D0=B2?= =?UTF-8?q?=D0=BE=D0=B7=D0=B2=D1=80=D0=B0=D1=89=D0=B0=D0=B5=D0=BC=D0=BE?= =?UTF-8?q?=D0=B3=D0=BE=20=D0=B8=D0=B7=20=D1=84=D1=83=D0=BD=D0=BA=D1=86?= =?UTF-8?q?=D0=B8=D0=B8=20=D0=BE=D0=B1=D1=8A=D0=B5=D0=BA=D1=82=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/__tests__/checkVkPlatform.test.ts | 152 +++++++++++++++++++++++++- 1 file changed, 146 insertions(+), 6 deletions(-) diff --git a/src/__tests__/checkVkPlatform.test.ts b/src/__tests__/checkVkPlatform.test.ts index 4267129..4c9e8ed 100644 --- a/src/__tests__/checkVkPlatform.test.ts +++ b/src/__tests__/checkVkPlatform.test.ts @@ -1,5 +1,5 @@ import { checkVkPlatform, VK_PLATFORM_CLASSNAME } from '../checkVkPlatform'; -import { VkPlatformType } from '../types'; +import { DeviceInfo, VkPlatformType } from '../types'; type MvkDeviceUnion = 'android' | 'iphone' | 'ipad' | 'ipod' | 'desktop'; @@ -35,6 +35,7 @@ const vkPlatformCases: Record< name: string; userAgent: string; bodyClassesToExpect: string[]; + deviceInfoToExpect: DeviceInfo; } > = { desktop_web: { @@ -42,18 +43,36 @@ const vkPlatformCases: Record< name: 'Десктопная версия сайта ВКонтакте', userAgent: NO_MATTER_USERAGENT, bodyClassesToExpect: [VK_PLATFORM_CLASSNAME.desktop], + deviceInfoToExpect: { + isAndroid: false, + isIos: false, + isMobile: false, + isMvk: false, + }, }, desktop_web_messenger: { vkPlatform: 'desktop_web_messenger', name: 'Десктопная версия VK Мессенджера (сайт)', userAgent: NO_MATTER_USERAGENT, bodyClassesToExpect: [VK_PLATFORM_CLASSNAME.desktop], + deviceInfoToExpect: { + isAndroid: false, + isIos: false, + isMobile: false, + isMvk: false, + }, }, desktop_app_messenger: { vkPlatform: 'desktop_app_messenger', name: 'Десктопное приложение VK Мессенджер', userAgent: NO_MATTER_USERAGENT, bodyClassesToExpect: [VK_PLATFORM_CLASSNAME.desktop], + deviceInfoToExpect: { + isAndroid: false, + isIos: false, + isMobile: false, + isMvk: false, + }, }, mobile_android: { vkPlatform: 'mobile_android', @@ -63,6 +82,12 @@ const vkPlatformCases: Record< VK_PLATFORM_CLASSNAME.mobile, VK_PLATFORM_CLASSNAME.android, ], + deviceInfoToExpect: { + isAndroid: true, + isIos: false, + isMobile: true, + isMvk: false, + }, }, mobile_android_messenger: { vkPlatform: 'mobile_android_messenger', @@ -72,6 +97,12 @@ const vkPlatformCases: Record< VK_PLATFORM_CLASSNAME.mobile, VK_PLATFORM_CLASSNAME.android, ], + deviceInfoToExpect: { + isAndroid: true, + isIos: false, + isMobile: true, + isMvk: false, + }, }, mobile_ipad: { vkPlatform: 'mobile_ipad', @@ -81,6 +112,12 @@ const vkPlatformCases: Record< VK_PLATFORM_CLASSNAME.ios, VK_PLATFORM_CLASSNAME.mobile, ], + deviceInfoToExpect: { + isAndroid: false, + isIos: true, + isMobile: true, + isMvk: false, + }, }, mobile_iphone: { vkPlatform: 'mobile_iphone', @@ -90,6 +127,12 @@ const vkPlatformCases: Record< VK_PLATFORM_CLASSNAME.ios, VK_PLATFORM_CLASSNAME.mobile, ], + deviceInfoToExpect: { + isAndroid: false, + isIos: true, + isMobile: true, + isMvk: false, + }, }, mobile_iphone_messenger: { vkPlatform: 'mobile_iphone_messenger', @@ -99,6 +142,12 @@ const vkPlatformCases: Record< VK_PLATFORM_CLASSNAME.ios, VK_PLATFORM_CLASSNAME.mobile, ], + deviceInfoToExpect: { + isAndroid: false, + isIos: true, + isMobile: true, + isMvk: false, + }, }, mobile_web_desktop: { vkPlatform: 'mobile_web', @@ -108,6 +157,12 @@ const vkPlatformCases: Record< VK_PLATFORM_CLASSNAME.mvk, VK_PLATFORM_CLASSNAME.mobile, ], + deviceInfoToExpect: { + isAndroid: false, + isIos: false, + isMobile: true, + isMvk: true, + }, }, mobile_web_android: { vkPlatform: 'mobile_web', @@ -118,6 +173,12 @@ const vkPlatformCases: Record< VK_PLATFORM_CLASSNAME.mobile, VK_PLATFORM_CLASSNAME.android, ], + deviceInfoToExpect: { + isAndroid: true, + isIos: false, + isMobile: true, + isMvk: true, + }, }, mobile_web_iphone: { vkPlatform: 'mobile_web', @@ -128,6 +189,12 @@ const vkPlatformCases: Record< VK_PLATFORM_CLASSNAME.mobile, VK_PLATFORM_CLASSNAME.ios, ], + deviceInfoToExpect: { + isAndroid: false, + isIos: true, + isMobile: true, + isMvk: true, + }, }, mobile_web_ipad: { vkPlatform: 'mobile_web', @@ -138,6 +205,12 @@ const vkPlatformCases: Record< VK_PLATFORM_CLASSNAME.mobile, VK_PLATFORM_CLASSNAME.ios, ], + deviceInfoToExpect: { + isAndroid: false, + isIos: true, + isMobile: true, + isMvk: true, + }, }, mobile_web_ipod: { vkPlatform: 'mobile_web', @@ -148,6 +221,12 @@ const vkPlatformCases: Record< VK_PLATFORM_CLASSNAME.mobile, VK_PLATFORM_CLASSNAME.ios, ], + deviceInfoToExpect: { + isAndroid: false, + isIos: true, + isMobile: true, + isMvk: true, + }, }, android_external: { vkPlatform: 'android_external', @@ -157,6 +236,12 @@ const vkPlatformCases: Record< VK_PLATFORM_CLASSNAME.mobile, VK_PLATFORM_CLASSNAME.android, ], + deviceInfoToExpect: { + isAndroid: true, + isIos: false, + isMobile: true, + isMvk: false, + }, }, iphone_external: { vkPlatform: 'iphone_external', @@ -166,6 +251,12 @@ const vkPlatformCases: Record< VK_PLATFORM_CLASSNAME.mobile, VK_PLATFORM_CLASSNAME.ios, ], + deviceInfoToExpect: { + isAndroid: false, + isIos: true, + isMobile: true, + isMvk: false, + }, }, ipad_external: { vkPlatform: 'ipad_external', @@ -175,12 +266,24 @@ const vkPlatformCases: Record< VK_PLATFORM_CLASSNAME.mobile, VK_PLATFORM_CLASSNAME.ios, ], + deviceInfoToExpect: { + isAndroid: false, + isIos: true, + isMobile: true, + isMvk: false, + }, }, web_external: { vkPlatform: 'web_external', name: 'Внешний сайт ВК, запущенный на десктопном браузере', userAgent: NO_MATTER_USERAGENT, bodyClassesToExpect: [VK_PLATFORM_CLASSNAME.desktop], + deviceInfoToExpect: { + isAndroid: false, + isIos: false, + isMobile: false, + isMvk: false, + }, }, mvk_external_desktop: { vkPlatform: 'mvk_external', @@ -190,6 +293,12 @@ const vkPlatformCases: Record< VK_PLATFORM_CLASSNAME.mobile, VK_PLATFORM_CLASSNAME.mvk, ], + deviceInfoToExpect: { + isAndroid: false, + isIos: false, + isMobile: true, + isMvk: true, + }, }, mvk_external_android: { vkPlatform: 'mvk_external', @@ -200,6 +309,12 @@ const vkPlatformCases: Record< VK_PLATFORM_CLASSNAME.mvk, VK_PLATFORM_CLASSNAME.android, ], + deviceInfoToExpect: { + isAndroid: true, + isIos: false, + isMobile: true, + isMvk: true, + }, }, mvk_external_iphone: { vkPlatform: 'mvk_external', @@ -210,6 +325,12 @@ const vkPlatformCases: Record< VK_PLATFORM_CLASSNAME.mvk, VK_PLATFORM_CLASSNAME.ios, ], + deviceInfoToExpect: { + isAndroid: false, + isIos: true, + isMobile: true, + isMvk: true, + }, }, mvk_external_ipad: { vkPlatform: 'mvk_external', @@ -220,6 +341,12 @@ const vkPlatformCases: Record< VK_PLATFORM_CLASSNAME.mvk, VK_PLATFORM_CLASSNAME.ios, ], + deviceInfoToExpect: { + isAndroid: false, + isIos: true, + isMobile: true, + isMvk: true, + }, }, mvk_external_ipod: { vkPlatform: 'mvk_external', @@ -230,12 +357,17 @@ const vkPlatformCases: Record< VK_PLATFORM_CLASSNAME.mvk, VK_PLATFORM_CLASSNAME.ios, ], + deviceInfoToExpect: { + isAndroid: false, + isIos: true, + isMobile: true, + isMvk: true, + }, }, }; -// Todo: После мёржа обновлений про запись параметров в window дополнить тесты -// проверкой возвращаемых функцией значений. -// https://github.com/ktsstudio/mediaproject-vk/pull/18 +// Todo: После мёржа обновлений про ВК Мессенджер, обновить тесты +// (https://github.com/ktsstudio/mediaproject-vk/pull/24) describe('Функция checkVkPlatform', () => { let userAgentGetter: jest.SpyInstance; let initialBodyClassList: DOMTokenList; @@ -257,11 +389,17 @@ describe('Функция checkVkPlatform', () => { }); Object.values(vkPlatformCases).forEach( - ({ vkPlatform, name, bodyClassesToExpect, userAgent }) => { + ({ + vkPlatform, + name, + bodyClassesToExpect, + userAgent, + deviceInfoToExpect, + }) => { it(name, () => { userAgentGetter.mockReturnValue(userAgent); - checkVkPlatform(vkPlatform); + const result = checkVkPlatform(vkPlatform); const bodyClasses = [...document.body.classList]; @@ -274,6 +412,8 @@ describe('Функция checkVkPlatform', () => { getExcludedVkPlatformClasses(bodyClassesToExpect) ) ); + + expect(result).toEqual(deviceInfoToExpect); }); } ); From 2463b1367c4d35e392555fe59e10bee7a2582063 Mon Sep 17 00:00:00 2001 From: "d.ragozin" Date: Tue, 6 Feb 2024 11:19:58 +0300 Subject: [PATCH 39/46] [*] is_mvk -> is_web --- CHANGELOG.md | 3 ++- package.json | 2 +- src/checkVkPlatform.ts | 37 +++++++++++++++++++++---------------- src/types/window.ts | 2 +- 4 files changed, 25 insertions(+), 19 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index def1023..eba4422 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,5 @@ -#### v2.2.1 +#### v3.0.0 +[*] введение в window параметра is_web вместо is_mvk [+] запись в window поля is_messenger, означающего, что приложение открыто в ВК Мессенджере [*] в перечни ВК-платформ добавлены платформы ВК Мессенджера diff --git a/package.json b/package.json index 91b318d..5904c1a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@ktsstudio/mediaproject-vk", - "version": "2.2.1", + "version": "3.0.0", "description": "Package with utils for VK Mini Apps", "author": "KTS Studio (https://kts.studio)", "keywords": [ diff --git a/src/checkVkPlatform.ts b/src/checkVkPlatform.ts index 380e2fc..28d6bac 100644 --- a/src/checkVkPlatform.ts +++ b/src/checkVkPlatform.ts @@ -64,7 +64,8 @@ const VK_PLATFORM_CLASSNAME = { /** * Приложение открыто с какого-то мобильного устройства. * После этого класснейма так же должен добавиться класснейм, - * указывающий, с какой именно мобильной платформы - ios, android или mvk. + * указывающий, с какой именно мобильной платформы: + * ios, android или web (m.vk.com или web.vk.me). */ mobile: 'mobile', @@ -79,9 +80,9 @@ const VK_PLATFORM_CLASSNAME = { android: 'android', /** - * Приложение открыто в браузере мобильного устройства. + * Приложение открыто в браузере мобильного устройства (m.vk.com или web.vk.me) */ - mvk: 'mvk', + web: 'web', }; /** @@ -97,19 +98,20 @@ const VK_PLATFORM_CLASSNAME = { * Если приложение открыто в мобильном приложении ВКонтакте на Android (window.platform одна из {@link ANDROID_VK_PLATFORMS}), * устанавливает в true window.is_mobile и window.is_android и добавляет класснеймы 'mobile android'. * - * Если приложение открыто в браузере на мобильном устройстве (m.vk), - * устанавливает в true window.is_mobile и window.is_mvk = true и добавляет класснеймы 'mobile mvk'. - * Также по регулярным выражениям для UserAgent проверяет, открыт ли m.vk на Android + * Если приложение открыто в браузере на мобильном устройстве (m.vk.com или web.vk.me), + * устанавливает в true window.is_mobile и window.is_web = true и добавляет класснеймы 'mobile web'. + * Также по регулярным выражениям для UserAgent проверяет, открыт ли m.vk.com (или web.vk.me) на Android * (помимо предыдущих значений еще устанавливает в true window.is_android и добавляет класснейм 'android'), * или на IOS (помимо предыдущих значений еще устанавливает в true window.is_ios и добавляет класснейм 'ios'). * * Возможные варианты сочетаний: - * - desktop - браузер на компьютере - * - mobile ios - мобильное приложение ВКонтакте на платформе IOS - * - mobile android - мобильное приложение ВКонтакте на платформе Android - * - mobile mvk - мобильный браузер на неизвестной платформе (например, m.vk открыт с браузера компьютера) - * - mobile mvk ios - мобильный браузер на платформе IOS - * - mobile mvk android - мобильный браузер на платформе Android + * - desktop - браузер или нативный мессенджер на компьютере + * - desktop web - веб-мессенджер на компьютере + * - mobile ios - нативное мобильное приложение ВКонтакте или Мессенджер на платформе IOS + * - mobile android - нативное мобильное приложение ВКонтакте или Мессенджер на платформе Android + * - mobile web - мобильный браузер на неизвестной платформе (например, m.vk.com открыт с браузера компьютера) + * - mobile web ios - мобильный браузер на платформе IOS (m.vk.com или web.vk.me в мобильном браузере на IOS) + * - mobile web android - мобильный браузер на платформе Android (m.vk.com или web.vk.me в мобильном браузере на Android) * * @param {VkPlatformType | undefined} [platform=window.platform] Значение текущей платформы, полученное в параметрах запуска ВКонтакте * @@ -134,6 +136,7 @@ const checkVkPlatform = ( */ if (!isMobile) { document.body.classList.add(VK_PLATFORM_CLASSNAME.desktop); + window.is_web = platform === 'desktop_web_messenger'; return; } @@ -142,7 +145,8 @@ const checkVkPlatform = ( document.body.classList.add(VK_PLATFORM_CLASSNAME.mobile); /** - * Проверяем, открыты ли мобильное приложение или мобильный браузер на IOS + * Проверяем, открыты ли мобильное приложение (ВК или Мессенджер) + * или мобильный браузер на IOS */ if (IOS_VK_PLATFORMS.includes(platform)) { window.is_ios = true; @@ -152,7 +156,8 @@ const checkVkPlatform = ( } /** - * Проверяем, открыты ли мобильное приложение или мобильный браузер на Android + * Проверяем, открыты ли мобильное приложение (ВК или Мессенджер) + * или мобильный браузер на Android */ if (ANDROID_VK_PLATFORMS.includes(platform)) { window.is_android = true; @@ -161,8 +166,8 @@ const checkVkPlatform = ( return; } - window.is_mvk = true; - document.body.classList.add(VK_PLATFORM_CLASSNAME.mvk); + window.is_web = true; + document.body.classList.add(VK_PLATFORM_CLASSNAME.web); if (/(iPad|iPhone|iPod)/g.test(navigator.userAgent)) { window.is_ios = true; diff --git a/src/types/window.ts b/src/types/window.ts index 74e3d4c..5e19a33 100644 --- a/src/types/window.ts +++ b/src/types/window.ts @@ -17,7 +17,7 @@ export interface WindowType /** Параметры текущей платформы */ is_ios?: boolean; is_android?: boolean; - is_mvk?: boolean; + is_web?: boolean; is_messenger?: boolean; /** Токен доступа и его права */ From cbf49efa3fa8a0a0950344f7070b6f37fc739a15 Mon Sep 17 00:00:00 2001 From: "d.ragozin" Date: Tue, 6 Feb 2024 19:39:10 +0300 Subject: [PATCH 40/46] =?UTF-8?q?[+]=20=D0=9E=D1=82=D0=B4=D0=B5=D0=BB?= =?UTF-8?q?=D1=8C=D0=BD=D0=B0=D1=8F=20=D0=BE=D0=B1=D1=80=D0=B0=D0=B1=D0=BE?= =?UTF-8?q?=D1=82=D0=BA=D0=B0=20desktop=5Fweb=5Fmessenger?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/__tests__/checkVkPlatform.test.ts | 139 ++++++++++++++++++++++---- src/checkVkPlatform.ts | 66 ++++++++++-- 2 files changed, 175 insertions(+), 30 deletions(-) diff --git a/src/__tests__/checkVkPlatform.test.ts b/src/__tests__/checkVkPlatform.test.ts index f35ad12..5279aa4 100644 --- a/src/__tests__/checkVkPlatform.test.ts +++ b/src/__tests__/checkVkPlatform.test.ts @@ -1,12 +1,16 @@ import { checkVkPlatform, VK_PLATFORM_CLASSNAME } from '../checkVkPlatform'; import { DeviceInfo, VkPlatformType } from '../types'; -type MvkDeviceUnion = 'android' | 'iphone' | 'ipad' | 'ipod' | 'desktop'; +type DeviceUnion = 'android' | 'iphone' | 'ipad' | 'ipod' | 'desktop'; type PlatformToTest = - | Exclude - | `mobile_web_${MvkDeviceUnion}` - | `mvk_external_${MvkDeviceUnion}`; + | Exclude< + VkPlatformType, + 'mobile_web' | 'mvk_external' | 'desktop_web_messenger' + > + | `mobile_web_${DeviceUnion}` + | `mvk_external_${DeviceUnion}` + | `desktop_web_messenger_on_${DeviceUnion}`; const clearCurrentBodyClassList = () => document.body.classList.remove(...document.body.classList); @@ -47,19 +51,92 @@ const vkPlatformCases: Record< isAndroid: false, isIos: false, isMobile: false, - isWeb: false, + isWeb: true, + isMessenger: false, }, }, - desktop_web_messenger: { + desktop_web_messenger_on_desktop: { vkPlatform: 'desktop_web_messenger', name: 'Десктопная версия VK Мессенджера (сайт)', userAgent: NO_MATTER_USERAGENT, - bodyClassesToExpect: [VK_PLATFORM_CLASSNAME.desktop], + bodyClassesToExpect: [ + VK_PLATFORM_CLASSNAME.desktop, + VK_PLATFORM_CLASSNAME.web, + ], deviceInfoToExpect: { isAndroid: false, isIos: false, isMobile: false, - isWeb: false, + isWeb: true, + isMessenger: true, + }, + }, + desktop_web_messenger_on_android: { + vkPlatform: 'desktop_web_messenger', + name: 'ВК Мессенджер в вебе на Android', + userAgent: MOCK_ANDROID_USERAGENT, + bodyClassesToExpect: [ + VK_PLATFORM_CLASSNAME.mobile, + VK_PLATFORM_CLASSNAME.mobile, + VK_PLATFORM_CLASSNAME.android, + ], + deviceInfoToExpect: { + isAndroid: true, + isIos: false, + isMobile: true, + isWeb: true, + isMessenger: true, + }, + }, + desktop_web_messenger_on_iphone: { + vkPlatform: 'desktop_web_messenger', + name: 'ВК Мессенджер в вебе на iPhone', + userAgent: MOCK_IPHONE_USERAGENT, + bodyClassesToExpect: [ + VK_PLATFORM_CLASSNAME.mobile, + VK_PLATFORM_CLASSNAME.web, + VK_PLATFORM_CLASSNAME.ios, + ], + deviceInfoToExpect: { + isAndroid: false, + isIos: true, + isMobile: true, + isWeb: true, + isMessenger: true, + }, + }, + desktop_web_messenger_on_ipad: { + vkPlatform: 'desktop_web_messenger', + name: 'ВК Мессенджер в вебе на iPad', + userAgent: MOCK_IPAD_USERAGENT, + bodyClassesToExpect: [ + VK_PLATFORM_CLASSNAME.ios, + VK_PLATFORM_CLASSNAME.web, + VK_PLATFORM_CLASSNAME.mobile, + ], + deviceInfoToExpect: { + isAndroid: false, + isIos: true, + isMobile: true, + isWeb: true, + isMessenger: true, + }, + }, + desktop_web_messenger_on_ipod: { + vkPlatform: 'desktop_web_messenger', + name: 'ВК Мессенджер в вебе на iPod', + userAgent: MOCK_IPOD_USERAGENT, + bodyClassesToExpect: [ + VK_PLATFORM_CLASSNAME.ios, + VK_PLATFORM_CLASSNAME.web, + VK_PLATFORM_CLASSNAME.mobile, + ], + deviceInfoToExpect: { + isAndroid: false, + isIos: true, + isMobile: true, + isWeb: true, + isMessenger: true, }, }, desktop_app_messenger: { @@ -72,6 +149,7 @@ const vkPlatformCases: Record< isIos: false, isMobile: false, isWeb: false, + isMessenger: true, }, }, mobile_android: { @@ -87,6 +165,7 @@ const vkPlatformCases: Record< isIos: false, isMobile: true, isWeb: false, + isMessenger: false, }, }, mobile_android_messenger: { @@ -102,6 +181,7 @@ const vkPlatformCases: Record< isIos: false, isMobile: true, isWeb: false, + isMessenger: true, }, }, mobile_ipad: { @@ -117,6 +197,7 @@ const vkPlatformCases: Record< isIos: true, isMobile: true, isWeb: false, + isMessenger: false, }, }, mobile_iphone: { @@ -132,6 +213,7 @@ const vkPlatformCases: Record< isIos: true, isMobile: true, isWeb: false, + isMessenger: false, }, }, mobile_iphone_messenger: { @@ -147,14 +229,15 @@ const vkPlatformCases: Record< isIos: true, isMobile: true, isWeb: false, + isMessenger: true, }, }, mobile_web_desktop: { vkPlatform: 'mobile_web', - name: 'Мобильная версия сайта ВКонтакте, открытая в десктопном браузере (mvk)', + name: 'Мобильная версия сайта ВКонтакте, открытая в десктопном браузере (m.vk.com)', userAgent: NO_MATTER_USERAGENT, bodyClassesToExpect: [ - VK_PLATFORM_CLASSNAME.mvk, + VK_PLATFORM_CLASSNAME.web, VK_PLATFORM_CLASSNAME.mobile, ], deviceInfoToExpect: { @@ -162,6 +245,7 @@ const vkPlatformCases: Record< isIos: false, isMobile: true, isWeb: true, + isMessenger: false, }, }, mobile_web_android: { @@ -169,7 +253,7 @@ const vkPlatformCases: Record< name: 'Мобильная версия сайта ВКонтакте, открытая в мобильном браузере на андроиде', userAgent: MOCK_ANDROID_USERAGENT, bodyClassesToExpect: [ - VK_PLATFORM_CLASSNAME.mvk, + VK_PLATFORM_CLASSNAME.web, VK_PLATFORM_CLASSNAME.mobile, VK_PLATFORM_CLASSNAME.android, ], @@ -178,6 +262,7 @@ const vkPlatformCases: Record< isIos: false, isMobile: true, isWeb: true, + isMessenger: false, }, }, mobile_web_iphone: { @@ -185,7 +270,7 @@ const vkPlatformCases: Record< name: 'Мобильная версия сайта ВКонтакте, открытая в мобильном браузере на айфоне', userAgent: MOCK_IPHONE_USERAGENT, bodyClassesToExpect: [ - VK_PLATFORM_CLASSNAME.mvk, + VK_PLATFORM_CLASSNAME.web, VK_PLATFORM_CLASSNAME.mobile, VK_PLATFORM_CLASSNAME.ios, ], @@ -194,6 +279,7 @@ const vkPlatformCases: Record< isIos: true, isMobile: true, isWeb: true, + isMessenger: false, }, }, mobile_web_ipad: { @@ -201,7 +287,7 @@ const vkPlatformCases: Record< name: 'Мобильная версия сайта ВКонтакте, открытая в мобильном браузере на айпаде', userAgent: MOCK_IPAD_USERAGENT, bodyClassesToExpect: [ - VK_PLATFORM_CLASSNAME.mvk, + VK_PLATFORM_CLASSNAME.web, VK_PLATFORM_CLASSNAME.mobile, VK_PLATFORM_CLASSNAME.ios, ], @@ -210,6 +296,7 @@ const vkPlatformCases: Record< isIos: true, isMobile: true, isWeb: true, + isMessenger: false, }, }, mobile_web_ipod: { @@ -217,7 +304,7 @@ const vkPlatformCases: Record< name: 'Мобильная версия сайта ВКонтакте, открытая в мобильном браузере на айподе', userAgent: MOCK_IPOD_USERAGENT, bodyClassesToExpect: [ - VK_PLATFORM_CLASSNAME.mvk, + VK_PLATFORM_CLASSNAME.web, VK_PLATFORM_CLASSNAME.mobile, VK_PLATFORM_CLASSNAME.ios, ], @@ -226,6 +313,7 @@ const vkPlatformCases: Record< isIos: true, isMobile: true, isWeb: true, + isMessenger: false, }, }, android_external: { @@ -241,6 +329,7 @@ const vkPlatformCases: Record< isIos: false, isMobile: true, isWeb: false, + isMessenger: false, }, }, iphone_external: { @@ -256,6 +345,7 @@ const vkPlatformCases: Record< isIos: true, isMobile: true, isWeb: false, + isMessenger: false, }, }, ipad_external: { @@ -271,6 +361,7 @@ const vkPlatformCases: Record< isIos: true, isMobile: true, isWeb: false, + isMessenger: false, }, }, web_external: { @@ -282,7 +373,8 @@ const vkPlatformCases: Record< isAndroid: false, isIos: false, isMobile: false, - isWeb: false, + isWeb: true, + isMessenger: false, }, }, mvk_external_desktop: { @@ -291,13 +383,14 @@ const vkPlatformCases: Record< userAgent: NO_MATTER_USERAGENT, bodyClassesToExpect: [ VK_PLATFORM_CLASSNAME.mobile, - VK_PLATFORM_CLASSNAME.mvk, + VK_PLATFORM_CLASSNAME.web, ], deviceInfoToExpect: { isAndroid: false, isIos: false, isMobile: true, isWeb: true, + isMessenger: false, }, }, mvk_external_android: { @@ -306,7 +399,7 @@ const vkPlatformCases: Record< userAgent: MOCK_ANDROID_USERAGENT, bodyClassesToExpect: [ VK_PLATFORM_CLASSNAME.mobile, - VK_PLATFORM_CLASSNAME.mvk, + VK_PLATFORM_CLASSNAME.web, VK_PLATFORM_CLASSNAME.android, ], deviceInfoToExpect: { @@ -314,6 +407,7 @@ const vkPlatformCases: Record< isIos: false, isMobile: true, isWeb: true, + isMessenger: false, }, }, mvk_external_iphone: { @@ -322,7 +416,7 @@ const vkPlatformCases: Record< userAgent: MOCK_IPHONE_USERAGENT, bodyClassesToExpect: [ VK_PLATFORM_CLASSNAME.mobile, - VK_PLATFORM_CLASSNAME.mvk, + VK_PLATFORM_CLASSNAME.web, VK_PLATFORM_CLASSNAME.ios, ], deviceInfoToExpect: { @@ -330,6 +424,7 @@ const vkPlatformCases: Record< isIos: true, isMobile: true, isWeb: true, + isMessenger: false, }, }, mvk_external_ipad: { @@ -338,7 +433,7 @@ const vkPlatformCases: Record< userAgent: MOCK_IPAD_USERAGENT, bodyClassesToExpect: [ VK_PLATFORM_CLASSNAME.mobile, - VK_PLATFORM_CLASSNAME.mvk, + VK_PLATFORM_CLASSNAME.web, VK_PLATFORM_CLASSNAME.ios, ], deviceInfoToExpect: { @@ -346,6 +441,7 @@ const vkPlatformCases: Record< isIos: true, isMobile: true, isWeb: true, + isMessenger: false, }, }, mvk_external_ipod: { @@ -354,7 +450,7 @@ const vkPlatformCases: Record< userAgent: MOCK_IPOD_USERAGENT, bodyClassesToExpect: [ VK_PLATFORM_CLASSNAME.mobile, - VK_PLATFORM_CLASSNAME.mvk, + VK_PLATFORM_CLASSNAME.web, VK_PLATFORM_CLASSNAME.ios, ], deviceInfoToExpect: { @@ -362,12 +458,11 @@ const vkPlatformCases: Record< isIos: true, isMobile: true, isWeb: true, + isMessenger: false, }, }, }; -// Todo: После мёржа обновлений про ВК Мессенджер, обновить тесты -// (https://github.com/ktsstudio/mediaproject-vk/pull/24) describe('Функция checkVkPlatform', () => { let userAgentGetter: jest.SpyInstance; let initialBodyClassList: DOMTokenList; diff --git a/src/checkVkPlatform.ts b/src/checkVkPlatform.ts index 3548cc5..0b85bff 100644 --- a/src/checkVkPlatform.ts +++ b/src/checkVkPlatform.ts @@ -86,6 +86,23 @@ const VK_PLATFORM_CLASSNAME = { web: 'web', }; +const isAndroidUserAgent = () => /android/i.test(navigator.userAgent); +const isIosUserAgent = () => /(iPad|iPhone|iPod)/g.test(navigator.userAgent); + +// Todo: В mediaproject-utils в функции checkMobile разделить установку класса в body +// и логику проверки userAgent. Заменить использование этой функции на утилиту из либы +const isMobileUserAgent = () => + ((a) => + /* eslint-disable-next-line */ + /(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino|android|ipad|playbook|silk/i.test( + a + ) || + /* eslint-disable-next-line */ + /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test( + a.substr(0, 4) + // eslint-disable-next-line @typescript-eslint/no-explicit-any + ))(navigator.userAgent || navigator.vendor || (window as any).opera); + /** * Утилита для вычисления информации о текущей платформе, на которой запущено приложение ВКонтакте. * В зависимости от платформы возвращает нужные параметры и добавляет нужные класснеймы на тег body. @@ -128,22 +145,55 @@ const checkVkPlatform = ( const isMessenger = MESSENGER_VK_PLATFORMS.includes(platform); - const isMobile = Boolean( - platform && !DESKTOP_VK_PLATFORMS.includes(platform) - ); + const isDesktopPlatform = DESKTOP_VK_PLATFORMS.includes(platform); /** - * Если обнаружили, что открыта десктопная версия, + * Если обнаружили, что открыта десктопная платформа, * дальнейших проверок на платформу не делаем */ - if (!isMobile) { + if (isDesktopPlatform) { + // Платформа desktop_web_messenger открывается в том числе + // в браузере на мобильном устройстве + if (platform === 'desktop_web_messenger') { + const isAndroid = isAndroidUserAgent(); + const isIos = isIosUserAgent(); + const isMobile = isAndroid || isIos || isMobileUserAgent(); + + if (!isMobile) { + document.body.classList.add(VK_PLATFORM_CLASSNAME.desktop); + } + + if (isMobile) { + document.body.classList.add(VK_PLATFORM_CLASSNAME.mobile); + + if (isAndroid) { + document.body.classList.add(VK_PLATFORM_CLASSNAME.android); + } + + if (isIos) { + document.body.classList.add(VK_PLATFORM_CLASSNAME.ios); + } + } + + document.body.classList.add(VK_PLATFORM_CLASSNAME.web); + + return { + isMobile, + isMessenger: true, + isWeb: true, + isAndroid, + isIos, + }; + } + document.body.classList.add(VK_PLATFORM_CLASSNAME.desktop); return { isMobile: false, isIos: false, isAndroid: false, - isWeb: platform === 'desktop_web_messenger', + // На всех платформах десктоп — это веб, кроме нативного десктоп-месседжера + isWeb: platform !== 'desktop_app_messenger', isMessenger, }; } @@ -184,7 +234,7 @@ const checkVkPlatform = ( document.body.classList.add(VK_PLATFORM_CLASSNAME.web); - if (/(iPad|iPhone|iPod)/g.test(navigator.userAgent)) { + if (isIosUserAgent()) { document.body.classList.add(VK_PLATFORM_CLASSNAME.ios); return { @@ -196,7 +246,7 @@ const checkVkPlatform = ( }; } - if (/android/i.test(navigator.userAgent)) { + if (isAndroidUserAgent()) { document.body.classList.add(VK_PLATFORM_CLASSNAME.android); return { From f1f0f98c210a4853b02b968bddb5e5e81ffc26b2 Mon Sep 17 00:00:00 2001 From: "d.ragozin" Date: Tue, 6 Feb 2024 19:52:39 +0300 Subject: [PATCH 41/46] =?UTF-8?q?[*]=20=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20changelog?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 1 + src/__tests__/checkVkPlatform.test.ts | 2 +- src/__tests__/testsList.txt | 272 +++++++++++++------------- src/checkVkPlatform.ts | 2 +- src/types/window.ts | 23 --- 5 files changed, 141 insertions(+), 159 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2f88087..22e9988 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,6 @@ #### v4.0.0 +[*] переход от понятия isMvk к isWeb [*] в перечни ВК-платформ добавлены платформы ВК Мессенджера ## v3.1.0 diff --git a/src/__tests__/checkVkPlatform.test.ts b/src/__tests__/checkVkPlatform.test.ts index 5279aa4..9f035c6 100644 --- a/src/__tests__/checkVkPlatform.test.ts +++ b/src/__tests__/checkVkPlatform.test.ts @@ -379,7 +379,7 @@ const vkPlatformCases: Record< }, mvk_external_desktop: { vkPlatform: 'mvk_external', - name: 'Cайт, открытый в мобильном браузере на десктопе (mvk)', + name: 'Cайт, открытый в мобильном браузере на десктопе (m.vk.com)', userAgent: NO_MATTER_USERAGENT, bodyClassesToExpect: [ VK_PLATFORM_CLASSNAME.mobile, diff --git a/src/__tests__/testsList.txt b/src/__tests__/testsList.txt index 5de5730..90cd936 100644 --- a/src/__tests__/testsList.txt +++ b/src/__tests__/testsList.txt @@ -1,20 +1,55 @@ PASS src/__tests__/usePolling.test.ts Хук usePolling: С параметрами по умолчанию: - ✓ должен устанавливать и очищать таймер (7 ms) - ✓ должен вызывать переданную функцию с частотой - 60 секунд (47 ms) + ✓ должен устанавливать и очищать таймер (8 ms) + ✓ должен вызывать переданную функцию с частотой - 60 секунд (38 ms) С параметром (condition = false): ✓ не должен устанавливать и очищать таймер (2 ms) ✓ не должен вызывать переданную функцию (1 ms) С переключением параметра condition в жизненном цикле хука: ✓ должен устанавливать и очищать таймер при каждом переключении (2 ms) - ✓ если (condition = true) должен вызывать переданную функцию с частотой - 60 секунд (47 ms) + ✓ если (condition = true) должен вызывать переданную функцию с частотой - 60 секунд (44 ms) Параметр pollingInterval должен задавать промежуток времени между вызовами в миллисекундах: - ✓ должен вызывать переданную функцию с частотой - 100 миллисекунд (55 ms) - ✓ не должен меняться при ререндерах (114 ms) + ✓ должен вызывать переданную функцию с частотой - 100 миллисекунд (54 ms) + ✓ не должен меняться при ререндерах (108 ms) Должен подписываться на событие скрытия приложения и отписываться от него: ✓ при монтировании и размонтировании (1 ms) - ✓ при смене аргумента condition (2 ms) + ✓ при смене аргумента condition (4 ms) + +PASS src/__tests__/useEventSubscribe.test.ts + Хук useEventSubscribe + ✓ Происходит подписка и отписка при монтировании и размонтировании соответственно (6 ms) + ✓ Происходит подписка и отписка при изменении аргумента с зависимостями (4 ms) + +PASS src/__tests__/checkVkPlatform.test.ts + Функция checkVkPlatform + ✓ Десктопная версия сайта ВКонтакте (2 ms) + ✓ Десктопная версия VK Мессенджера (сайт) (2 ms) + ✓ ВК Мессенджер в вебе на Android + ✓ ВК Мессенджер в вебе на iPhone (1 ms) + ✓ ВК Мессенджер в вебе на iPad + ✓ ВК Мессенджер в вебе на iPod (1 ms) + ✓ Десктопное приложение VK Мессенджер + ✓ Мобильное приложение ВКонтакте для Android + ✓ Мобильное приложение VK Мессенджер для Android (2 ms) + ✓ Мобильное приложение ВКонтакте для iPadOS + ✓ Мобильное приложение ВКонтакте для iOS + ✓ Мобильное приложение VK Мессенджер для iOS + ✓ Мобильная версия сайта ВКонтакте, открытая в десктопном браузере (m.vk.com) + ✓ Мобильная версия сайта ВКонтакте, открытая в мобильном браузере на андроиде + ✓ Мобильная версия сайта ВКонтакте, открытая в мобильном браузере на айфоне + ✓ Мобильная версия сайта ВКонтакте, открытая в мобильном браузере на айпаде + ✓ Мобильная версия сайта ВКонтакте, открытая в мобильном браузере на айподе + ✓ Внешнее приложение для Android, на котором запущен миниапп + ✓ Внешнее приложение для iOS, на котором запущен миниапп + ✓ Внешнее приложение для iPadOS, на котором запущен миниапп + ✓ Внешний сайт ВК, запущенный на десктопном браузере (1 ms) + ✓ Cайт, открытый в мобильном браузере на десктопе (m.vk.com) + ✓ Cайт, открытый в мобильном браузере на андроиде + ✓ Cайт, открытый в мобильном браузере на iPhone + ✓ Cайт, открытый в мобильном браузере на iPad + ✓ Cайт, открытый в мобильном браузере на iPod (1 ms) + ✓ Непередача вк-платформы PASS src/__tests__/shareVkPost.test.ts Функция shareVkPost @@ -23,76 +58,71 @@ PASS src/__tests__/shareVkPost.test.ts ✓ Ошибка от ВК, не является отказом пользователя. Тип ошибки: client_error ✓ Ошибка от ВК, не является отказом пользователя. Тип ошибки: api_error ✓ Ошибка от ВК, не является отказом пользователя. Тип ошибки: auth_error - ✓ Ошибка от ВК, отказ пользователя (1 ms) + ✓ Ошибка от ВК, отказ пользователя Функция shareVkPostWithUpload Этап получения сервера для загрузки фото - ✓ Вызывается метод VK API photos.getWallUploadServer (6 ms) + ✓ Вызывается метод VK API photos.getWallUploadServer (4 ms) ✓ В callVkApi передаётся токен, параметры получения токена. В качестве колбэка на отказ от всех скоупов и отказ от части скоупов передаётся функция-аргумент onUserDeniedAccess (1 ms) Утилита callVkApi возвращает ошибку типа client_error ✓ Ошибка возвращается из функции и передаётсяв функцию-аргумент onErrorOccurred (1 ms) ✓ Выполнение не доходит до обращения к бэкенду KTS, методу photos.saveWallPhoto и методу VKWebAppShowWallPostBox (1 ms) Утилита callVkApi возвращает ошибку типа auth_error - ✓ Ошибка возвращается из функции и передаётсяв функцию-аргумент onErrorOccurred - ✓ Выполнение не доходит до обращения к бэкенду KTS, методу photos.saveWallPhoto и методу VKWebAppShowWallPostBox + ✓ Ошибка возвращается из функции и передаётсяв функцию-аргумент onErrorOccurred (1 ms) + ✓ Выполнение не доходит до обращения к бэкенду KTS, методу photos.saveWallPhoto и методу VKWebAppShowWallPostBox (2 ms) Утилита callVkApi возвращает ошибку типа api_error ✓ Ошибка возвращается из функции и передаётсяв функцию-аргумент onErrorOccurred (1 ms) - ✓ Выполнение не доходит до обращения к бэкенду KTS, методу photos.saveWallPhoto и методу VKWebAppShowWallPostBox + ✓ Выполнение не доходит до обращения к бэкенду KTS, методу photos.saveWallPhoto и методу VKWebAppShowWallPostBox (1 ms) Этап отправки адреса ВК-сервера на бэкенд KTS для загрузки. Все предыдущие этапы выполнены успешно - ✓ Используется утилита api из mediaproject-utils. В утилиту передаются эндпоинт API KTS, файл, адрес ВК-сервера, флаг об использовании FormData (1 ms) + ✓ Используется утилита api из mediaproject-utils. В утилиту передаются эндпоинт API KTS, файл, адрес ВК-сервера, флаг об использовании FormData Ответ бэкенда KTS, считающийся ошибкой Ответ пустой - ✓ Данные об ошибке передаются в функцию-аргумент onErrorOccurred, а результатом выполнения утилиты является undefined (1 ms) + ✓ Данные об ошибке передаются в функцию-аргумент onErrorOccurred, а результатом выполнения утилиты является undefined ✓ Выполнение не доходит до обращения к методу photos.saveWallPhoto и методу VKWebAppShowWallPostBox (1 ms) Вернулась явная ошибка ✓ Данные об ошибке передаются в функцию-аргумент onErrorOccurred, а результатом выполнения утилиты является undefined - ✓ Выполнение не доходит до обращения к методу photos.saveWallPhoto и методу VKWebAppShowWallPostBox (2 ms) + ✓ Выполнение не доходит до обращения к методу photos.saveWallPhoto и методу VKWebAppShowWallPostBox (1 ms) Этап сохранения картинки в альбом стены пользователя. Все предыдущие этапы выполнены успешно - ✓ Вызывается VK API с методом photos.saveWallPhoto. В VK API передаются данные для загрузки картинки, полученные ранее из KTS API поле server приводится к числу + ✓ Вызывается VK API с методом photos.saveWallPhoto. В VK API передаются данные для загрузки картинки, полученные ранее из KTS API поле server приводится к числу (1 ms) В VK API передаётся токен доступа - ✓ Если токен уже был передан, используется он (1 ms) + ✓ Если токен уже был передан, используется он ✎ todo Если изначально передан протухший токен, используется обновлённый токен Ответ VK API, считающийся ошибкой Вернулась ошибка из VK API. Тип ошибки: client_error - ✓ Ответ VK API попадает в функцию-аргумент onErrorOccurred, утилита возвращает undefined - ✓ Выполнение не доходит до обращения к методу VKWebAppShowWallPostBox (1 ms) + ✓ Ответ VK API попадает в функцию-аргумент onErrorOccurred, утилита возвращает undefined (1 ms) + ✓ Выполнение не доходит до обращения к методу VKWebAppShowWallPostBox Вернулась ошибка из VK API. Тип ошибки: api_error ✓ Ответ VK API попадает в функцию-аргумент onErrorOccurred, утилита возвращает undefined (1 ms) ✓ Выполнение не доходит до обращения к методу VKWebAppShowWallPostBox Вернулась ошибка из VK API. Тип ошибки: auth_error ✓ Ответ VK API попадает в функцию-аргумент onErrorOccurred, утилита возвращает undefined (1 ms) - ✓ Выполнение не доходит до обращения к методу VKWebAppShowWallPostBox + ✓ Выполнение не доходит до обращения к методу VKWebAppShowWallPostBox (2 ms) Вернулась пустота в ответе в поле response - ✓ Ответ VK API попадает в функцию-аргумент onErrorOccurred, утилита возвращает undefined (1 ms) - ✓ Выполнение не доходит до обращения к методу VKWebAppShowWallPostBox + ✓ Ответ VK API попадает в функцию-аргумент onErrorOccurred, утилита возвращает undefined + ✓ Выполнение не доходит до обращения к методу VKWebAppShowWallPostBox (1 ms) Вернулся пустой массив с данными о загруженных картинках - ✓ Ответ VK API попадает в функцию-аргумент onErrorOccurred, утилита возвращает undefined (1 ms) - ✓ Выполнение не доходит до обращения к методу VKWebAppShowWallPostBox + ✓ Ответ VK API попадает в функцию-аргумент onErrorOccurred, утилита возвращает undefined + ✓ Выполнение не доходит до обращения к методу VKWebAppShowWallPostBox (1 ms) Этап шеринга картинки в пост. Все предыдущие этапы выполнены успешно - ✓ Переданные изначально параметры шеринга (кроме attachments) передаются в метод VKWebAppShowWallPostBox (1 ms) - ✓ Картинка со стены добавляется к переданным attachments, отправляемым в shareVkPost - ✓ Если дополнительные attachments не переданы, в параметр attachments shareVkPost передаётся только картинка со стены пользователя (1 ms) + ✓ Переданные изначально параметры шеринга (кроме attachments) передаются в метод VKWebAppShowWallPostBox + ✓ Картинка со стены добавляется к переданным attachments, отправляемым в VKWebAppShowWallPostBox (1 ms) + ✓ Если дополнительные attachments не переданы, в параметр attachments VKWebAppShowWallPostBox передаётся только картинка со стены пользователя Из функции возвращается результат выполнения VK Bridge с методом VKWebAppShowWallPostBox - ✓ Успешный результат + ✓ Успешный результат (1 ms) Произошла ошибка - ✓ Ошибка от ВК, не является отказом пользователя. Ошибка возвращается как результат выполнения утилиты. Тип ошибки: client_error (1 ms) - ✓ Ошибка от ВК, не является отказом пользователя. Ошибка возвращается как результат выполнения утилиты. Тип ошибки: api_error - ✓ Ошибка от ВК, не является отказом пользователя. Ошибка возвращается как результат выполнения утилиты. Тип ошибки: auth_error (1 ms) + ✓ Ошибка от ВК, не является отказом пользователя. Ошибка возвращается как результат выполнения утилиты. Тип ошибки: client_error + ✓ Ошибка от ВК, не является отказом пользователя. Ошибка возвращается как результат выполнения утилиты. Тип ошибки: api_error (1 ms) + ✓ Ошибка от ВК, не является отказом пользователя. Ошибка возвращается как результат выполнения утилиты. Тип ошибки: auth_error ✓ Ошибка от ВК, отказ пользователя (1 ms) Обработка ошибки, необработанной на каком-либо этапе - ✓ Выброс ошибки, не связанной с отказом пользователя (1 ms) - ✓ Выброс ошибки, связанной с отказом пользователя - -PASS src/__tests__/useEventSubscribe.test.ts - Хук useEventSubscribe - ✓ Происходит подписка и отписка при монтировании и размонтировании соответственно (5 ms) - ✓ Происходит подписка и отписка при изменении аргумента с зависимостями (1 ms) + ✓ Выброс ошибки, не связанной с отказом пользователя + ✓ Выброс ошибки, связанной с отказом пользователя (1 ms) PASS src/__tests__/getVkAccessToken.test.ts Функция parseVkScopes ✓ Правильный парсинг скоупов, количество скоупов: 0 (1 ms) - ✓ Правильный парсинг скоупов, количество скоупов: 1 (1 ms) - ✓ Правильный парсинг скоупов, количество скоупов: 7 - ✓ Правильный парсинг скоупов, количество скоупов: 12 (1 ms) + ✓ Правильный парсинг скоупов, количество скоупов: 1 + ✓ Правильный парсинг скоупов, количество скоупов: 10 (1 ms) + ✓ Правильный парсинг скоупов, количество скоупов: 12 ✓ Неправильный разделитель строк: ", " ✓ Неправильный разделитель строк: " ," ✓ Неправильный разделитель строк: " " @@ -102,47 +132,47 @@ PASS src/__tests__/getVkAccessToken.test.ts Функция checkOneScopesSetIncludesAnother ✓ Правильное сравнение одинаковых наборов скоупов, количество скоупов: 0 ✓ Правильное сравнение одинаковых наборов скоупов, количество скоупов: 1 - ✓ Правильное сравнение одинаковых наборов скоупов, количество скоупов: 5 - ✓ Правильное сравнение одинаковых наборов скоупов, количество скоупов: 12 - ✓ Один скоуп является подмножеством другого (1 ms) + ✓ Правильное сравнение одинаковых наборов скоупов, количество скоупов: 2 + ✓ Правильное сравнение одинаковых наборов скоупов, количество скоупов: 12 (1 ms) + ✓ Один скоуп является подмножеством другого ✓ Полностью несовпадающие наборы скоупов ✓ Первый набор скоупов пустой ✓ Второй набор скоупов пустой Функция getNewVkAccessToken ✓ Получение токена по переданным скоупам, количество скоупов: 0 - ✓ Получение токена по переданным скоупам, количество скоупов: 1 - ✓ Получение токена по переданным скоупам, количество скоупов: 8 (1 ms) + ✓ Получение токена по переданным скоупам, количество скоупов: 1 (1 ms) + ✓ Получение токена по переданным скоупам, количество скоупов: 4 ✓ Получение токена по переданным скоупам, количество скоупов: 12 ✓ В бридж передаётся строка со скоупами, переданными в массиве в аргументе ✓ В бридж передаётся строка со скоупами, переданными в массиве в аргументе ✓ В бридж передаётся строка со скоупами, переданными в массиве в аргументе - ✓ В бридж передаётся строка со скоупами, переданными в массиве в аргументе (1 ms) + ✓ В бридж передаётся строка со скоупами, переданными в массиве в аргументе ✓ Ошибка возвращается ✓ В бридж передаётся id приложения ✓ Бридж вызывает метод для получения токена Функция getVkAccessToken - ✓ Успешный запрос за токеном при отсутствии доступных токена и скоупов (поля в window равны undefined). Количество запрашиваемых скоупов: 0 (1 ms) - ✓ Успешный запрос за токеном при отсутствии доступных токена и скоупов (поля в window равны undefined). Количество запрашиваемых скоупов: 1 - ✓ Успешный запрос за токеном при отсутствии доступных токена и скоупов (поля в window равны undefined). Количество запрашиваемых скоупов: 7 + ✓ Успешный запрос за токеном при отсутствии доступных токена и скоупов (поля в window равны undefined). Количество запрашиваемых скоупов: 0 (2 ms) + ✓ Успешный запрос за токеном при отсутствии доступных токена и скоупов (поля в window равны undefined). Количество запрашиваемых скоупов: 1 (1 ms) + ✓ Успешный запрос за токеном при отсутствии доступных токена и скоупов (поля в window равны undefined). Количество запрашиваемых скоупов: 2 ✓ Успешный запрос за токеном при отсутствии доступных токена и скоупов (поля в window равны undefined). Количество запрашиваемых скоупов: 12 ✓ Успешный запрос. Множество имеющихся скоупов полностью не совпадает с множеством запрашиваемых скоупов или множество имеющихся скоупов является подмножеством запрашиваемых. Имеющиеся скоупы: stats. Запрашиваемые скоупы: docs ✓ Успешный запрос. Множество имеющихся скоупов полностью не совпадает с множеством запрашиваемых скоупов или множество имеющихся скоупов является подмножеством запрашиваемых. Имеющиеся скоупы: docs,groups,video. Запрашиваемые скоупы: status - ✓ Успешный запрос. Множество имеющихся скоупов полностью не совпадает с множеством запрашиваемых скоупов или множество имеющихся скоупов является подмножеством запрашиваемых. Имеющиеся скоупы: docs. Запрашиваемые скоупы: status,groups,stories (1 ms) + ✓ Успешный запрос. Множество имеющихся скоупов полностью не совпадает с множеством запрашиваемых скоупов или множество имеющихся скоупов является подмножеством запрашиваемых. Имеющиеся скоупы: docs. Запрашиваемые скоупы: status,groups,stories ✓ Успешный запрос. Множество имеющихся скоупов полностью не совпадает с множеством запрашиваемых скоупов или множество имеющихся скоупов является подмножеством запрашиваемых. Имеющиеся скоупы: docs. Запрашиваемые скоупы: stats,docs ✓ Успешный запрос. Множество имеющихся скоупов полностью не совпадает с множеством запрашиваемых скоупов или множество имеющихся скоупов является подмножеством запрашиваемых. Имеющиеся скоупы: docs,groups. Запрашиваемые скоупы: stats,docs,groups - ✓ Успешный запрос. Множество имеющихся скоупов полностью не совпадает с множеством запрашиваемых скоупов или множество имеющихся скоупов является подмножеством запрашиваемых. Имеющиеся скоупы: groups,market. Запрашиваемые скоупы: stats,docs,groups,market (2 ms) + ✓ Успешный запрос. Множество имеющихся скоупов полностью не совпадает с множеством запрашиваемых скоупов или множество имеющихся скоупов является подмножеством запрашиваемых. Имеющиеся скоупы: groups,market. Запрашиваемые скоупы: stats,docs,groups,market (1 ms) ✓ Успешный запрос. Множество запрашиваемых скоупов является подмножеством имеющихся скоупов. Имеющиеся скоупы: stats,docs. Запрашиваемые скоупы: docs ✓ Успешный запрос. Множество запрашиваемых скоупов является подмножеством имеющихся скоупов. Имеющиеся скоупы: stats,docs,groups. Запрашиваемые скоупы: docs,groups ✓ Успешный запрос. Множество запрашиваемых скоупов является подмножеством имеющихся скоупов. Имеющиеся скоупы: stats,docs,groups,market. Запрашиваемые скоупы: groups,market ✓ Успешный запрос. Множество запрашиваемых скоупов является подмножеством имеющихся скоупов. Имеющиеся скоупы: stats,docs,groups,market. Запрашиваемые скоупы: stats,docs,groups,market (1 ms) ✓ Запрашивается пустое множество скоупов при уже имеющемся множестве скоупов. Количество доступных скоупов: 0 ✓ Запрашивается пустое множество скоупов при уже имеющемся множестве скоупов. Количество доступных скоупов: 1 - ✓ Запрашивается пустое множество скоупов при уже имеющемся множестве скоупов. Количество доступных скоупов: 3 - ✓ Запрашивается пустое множество скоупов при уже имеющемся множестве скоупов. Количество доступных скоупов: 12 + ✓ Запрашивается пустое множество скоупов при уже имеющемся множестве скоупов. Количество доступных скоупов: 5 + ✓ Запрашивается пустое множество скоупов при уже имеющемся множестве скоупов. Количество доступных скоупов: 12 (1 ms) ✓ Запрашивается множество скоупов при уже имеющемся пустом множестве скоупов. Количество запрашиваемых скоупов: 0 ✓ Запрашивается множество скоупов при уже имеющемся пустом множестве скоупов. Количество запрашиваемых скоупов: 1 - ✓ Запрашивается множество скоупов при уже имеющемся пустом множестве скоупов. Количество запрашиваемых скоупов: 10 - ✓ Запрашивается множество скоупов при уже имеющемся пустом множестве скоупов. Количество запрашиваемых скоупов: 12 + ✓ Запрашивается множество скоупов при уже имеющемся пустом множестве скоупов. Количество запрашиваемых скоупов: 7 (1 ms) + ✓ Запрашивается множество скоупов при уже имеющемся пустом множестве скоупов. Количество запрашиваемых скоупов: 12 (1 ms) ✓ Отказ от всех скоупов (множество запрашиваемых не является подмножеством имеющихся) Имеющийся: stats. Запрашиваемый: docs ✓ Отказ от всех скоупов (множество запрашиваемых не является подмножеством имеющихся) Имеющийся: docs,groups,video. Запрашиваемый: status ✓ Отказ от всех скоупов (множество запрашиваемых не является подмножеством имеющихся) Имеющийся: docs. Запрашиваемый: status,groups,stories (1 ms) @@ -150,99 +180,92 @@ PASS src/__tests__/getVkAccessToken.test.ts ✓ Отказ от одного или нескольких скоупов. Запрашиваемые: docs,friends,status. Разрешаемые: docs,friends ✓ Неизвестная ошибка +PASS src/__tests__/checkVkUserDenied.test.ts + Функция checkVkUserDenied + ✓ Объект ошибки, соответствующий типу ошибки api_error (1 ms) + ✓ Объект ошибки, соответствующий типу ошибки api_error, но с error_reason "User denied" и кодом ошибки 4 + ✓ Объект ошибки, соответствующий типу ошибки api_error, но с error_reason "Operation denied by user" и кодом ошибки 4 + ✓ Объект ошибки, соответствующий типу ошибки auth_error + ✓ Объект ошибки, соответствующий типу ошибки auth_error, но с error_reason "User denied" и кодом ошибки 4 + ✓ Объект ошибки, соответствующий типу ошибки auth_error, но с error_reason "Operation denied by user" и кодом ошибки 4 + ✓ Объект ошибки, соответствующий типу ошибки client_error с правильным error_reason "User denied" и кодом ошибки 4 + ✓ Объект ошибки, соответствующий типу ошибки client_error с правильным error_reason "Operation denied by user" и кодом ошибки 4 + ✓ Объект ошибки, соответствующий типу ошибки client_error с произвольным кодом ошибки, с правильным error_reason "User denied", но в нижнем регистре + ✓ Объект ошибки, соответствующий типу ошибки client_error с произвольным кодом ошибки, с правильным error_reason "Operation denied by user", но в нижнем регистре + ✓ Объект ошибки, соответствующий типу ошибки client_error, с произвольным кодом ошибки, с правильным error_reason "User denied" + ✓ Объект ошибки, соответствующий типу ошибки client_error, с произвольным кодом ошибки, с правильным error_reason "Operation denied by user" (1 ms) + ✓ Объект ошибки, соответствующий типу ошибки client_error с кодом ошибки 4, с произвольной причиной ошибки + ✓ Объект ошибки, соответствующий типу ошибки client_error с произвольным кодом ошибки, с произвольной причиной ошибки (1 ms) + ✓ Объект, содержащий минимально достаточные поля, с типом ошибки client_error с причиной ошибки "User denied" и кодом ошибки 4 + ✓ Объект, содержащий минимально достаточные поля, с типом ошибки client_error с причиной ошибки "Operation denied by user" и кодом ошибки 4 (1 ms) + PASS src/__tests__/callVkApi.test.ts Функция callVkApi ✓ Успешный запрос с изначально корректным токеном (1 ms) ✓ Некоторая ошибка (в том числе из-за возможно некорректного токена) ✓ Успешный запрос, нет токена, токен должен быть получен один раз - ✓ Некоторая ошибка (в том числе из-за возможного некорректного токена), нет токена, токен должен быть получен один раз (1 ms) - ✓ Успешный запрос, изначально протухший токен, новый токен должен быть получен один раз. Ошибка: User authorization failed: access_token was given to another ip address., веб: true + ✓ Некоторая ошибка (в том числе из-за возможного некорректного токена), нет токена, токен должен быть получен один раз (2 ms) + ✓ Успешный запрос, изначально протухший токен, новый токен должен быть получен один раз. Ошибка: User authorization failed: access_token was given to another ip address., веб: true (1 ms) ✓ Успешный запрос, изначально протухший токен, новый токен должен быть получен один раз. Ошибка: User authorization failed: access_token has expired., веб: true ✓ Успешный запрос, изначально протухший токен, новый токен должен быть получен один раз. Ошибка: User authorization failed: access_token was given to another ip address., веб: false - ✓ Успешный запрос, изначально протухший токен, новый токен должен быть получен один раз. Ошибка: User authorization failed: access_token has expired., веб: false + ✓ Успешный запрос, изначально протухший токен, новый токен должен быть получен один раз. Ошибка: User authorization failed: access_token has expired., веб: false (1 ms) ✓ Некоторая ошибка (в том числе из-за возможного некорректного токена) после получения нового токена. Изначально протухший токен, новый токен должен быть получен один раз. Ошибка: User authorization failed: access_token was given to another ip address., веб: true ✓ Некоторая ошибка (в том числе из-за возможного некорректного токена) после получения нового токена. Изначально протухший токен, новый токен должен быть получен один раз. Ошибка: User authorization failed: access_token has expired., веб: true - ✓ Некоторая ошибка (в том числе из-за возможного некорректного токена) после получения нового токена. Изначально протухший токен, новый токен должен быть получен один раз. Ошибка: User authorization failed: access_token was given to another ip address., веб: false + ✓ Некоторая ошибка (в том числе из-за возможного некорректного токена) после получения нового токена. Изначально протухший токен, новый токен должен быть получен один раз. Ошибка: User authorization failed: access_token was given to another ip address., веб: false (1 ms) ✓ Некоторая ошибка (в том числе из-за возможного некорректного токена) после получения нового токена. Изначально протухший токен, новый токен должен быть получен один раз. Ошибка: User authorization failed: access_token has expired., веб: false ✓ Запрос с некоторым ответом, изначально протухший токен. Новый токен получать не нужно. Ошибка: User authorization failed: access_token was given to another ip address., веб: true ✓ Запрос с некоторым ответом, изначально протухший токен. Новый токен получать не нужно. Ошибка: User authorization failed: access_token has expired., веб: true ✓ Запрос с некоторым ответом, изначально протухший токен. Новый токен получать не нужно. Ошибка: User authorization failed: access_token was given to another ip address., веб: false ✓ Запрос с некоторым ответом, изначально протухший токен. Новый токен получать не нужно. Ошибка: User authorization failed: access_token has expired., веб: false - ✓ Запрос, название метода передаётся в бридж (1 ms) - ✓ Запрос, версия VK API передаётся в параметры + ✓ Запрос, название метода передаётся в бридж + ✓ Запрос, версия VK API передаётся в параметры (1 ms) ✓ Запрос, токена нет, параметры для получения токена передаются в getVkAccessToken, новый токен передаётся в бридж ✓ Запрос, токен передаётся в бридж ✓ Запрос, протухший токен передаётся в бридж, затем новый токен передаётся в бридж. Параметры получения токена передаются в getVkAccessToken (1 ms) ✓ Запрос, дополнительные параметры передаются в бридж -PASS src/__tests__/checkVkPlatform.test.ts - Функция checkVkPlatform - ✓ Десктопная версия сайта ВКонтакте (1 ms) - ✓ Десктопная версия VK Мессенджера (сайт) - ✓ Десктопное приложение VK Мессенджер (1 ms) - ✓ Мобильное приложение ВКонтакте для Android - ✓ Мобильное приложение VK Мессенджер для Android (1 ms) - ✓ Мобильное приложение ВКонтакте для iPadOS - ✓ Мобильное приложение ВКонтакте для iOS - ✓ Мобильное приложение VK Мессенджер для iOS (1 ms) - ✓ Мобильная версия сайта ВКонтакте, открытая в десктопном браузере (mvk) - ✓ Мобильная версия сайта ВКонтакте, открытая в мобильном браузере на андроиде - ✓ Мобильная версия сайта ВКонтакте, открытая в мобильном браузере на айфоне (1 ms) - ✓ Мобильная версия сайта ВКонтакте, открытая в мобильном браузере на айпаде - ✓ Мобильная версия сайта ВКонтакте, открытая в мобильном браузере на айподе - ✓ Внешнее приложение для Android, на котором запущен миниапп - ✓ Внешнее приложение для iOS, на котором запущен миниапп - ✓ Внешнее приложение для iPadOS, на котором запущен миниапп (1 ms) - ✓ Внешний сайт ВК, запущенный на десктопном браузере - ✓ Cайт, открытый в мобильном браузере на десктопе (mvk) - ✓ Cайт, открытый в мобильном браузере на андроиде (2 ms) - ✓ Cайт, открытый в мобильном браузере на iPhone - ✓ Cайт, открытый в мобильном браузере на iPad - ✓ Cайт, открытый в мобильном браузере на iPod - ✓ Непередача вк-платформы (1 ms) - PASS src/__tests__/setVkViewSettings.test.ts setVkViewSettings - ✓ Платформа, не поддерживающая view settings: desktop_web (2 ms) - ✓ Платформа, не поддерживающая view settings: desktop_web_messenger (1 ms) - ✓ Платформа, не поддерживающая view settings: desktop_app_messenger + ✓ Платформа, не поддерживающая view settings: desktop_web (1 ms) + ✓ Платформа, не поддерживающая view settings: desktop_web_messenger + ✓ Платформа, не поддерживающая view settings: desktop_app_messenger (1 ms) ✓ Платформа, не поддерживающая view settings: mobile_web ✓ Платформа, не поддерживающая view settings: android_external - ✓ Платформа, не поддерживающая view settings: iphone_external (1 ms) + ✓ Платформа, не поддерживающая view settings: iphone_external ✓ Платформа, не поддерживающая view settings: ipad_external - ✓ Платформа, не поддерживающая view settings: web_external + ✓ Платформа, не поддерживающая view settings: web_external (1 ms) ✓ Платформа, не поддерживающая view settings: mvk_external ✓ Платформа, поддерживающая все view settings: mobile_android (1 ms) ✓ Платформа, поддерживающая view settings (только окраску статусбара): mobile_iphone ✓ Платформа, поддерживающая view settings (только окраску статусбара): mobile_ipad - ✓ Неизвестная ошибка bridge.supports (1 ms) + ✓ Неизвестная ошибка bridge.supports ✓ Неизвестная ошибка bridge.send PASS src/__tests__/isVkError.test.ts Функция isVkError - ✓ Примитив null + ✓ Примитив null (1 ms) ✓ Примитив undefined ✓ Примитив false ✓ Примитив true ✓ Примитив Symbol() ✓ Примитив Symbol(named symbol) - ✓ Примитив 6058 - ✓ Примитив 5460 (1 ms) - ✓ Примитив 9078 - ✓ Примитив 5851 - ✓ Примитив 816 - ✓ Примитив 2068 - ✓ Примитив R0CuinozCSemb6ymMwxRNb1w - ✓ Примитив jRs7g3XJHFYjiHJR35EHXN6s (1 ms) - ✓ Примитив VVxTA4ADEr4AhkupQsqnytgS + ✓ Примитив 7377 (1 ms) + ✓ Примитив 8787 + ✓ Примитив 5676 + ✓ Примитив 7530 + ✓ Примитив 1836 + ✓ Примитив 7487 + ✓ Примитив LMpIlsufmyBhEIqeAlKBCQxO + ✓ Примитив 91JSumViBcE0xrRdOHq8sAlE + ✓ Примитив oUDM5YxuEsQLqBgLbh6Le2Mr ✓ Функция стрелочная ✓ Функция не стрелочная ✓ Пустой объект ✓ Объект произвольной структуры ✓ Объект ошибки Error - ✓ Попытка обмана проверки: объект с error_type, равным "client_error", но с отсутствующим error_data + ✓ Попытка обмана проверки: объект с error_type, равным "client_error", но с отсутствующим error_data (1 ms) ✓ Попытка обмана проверки: объект с error_type, равным "api_error", но с отсутствующим error_data - ✓ Попытка обмана проверки: объект с error_type, равным "auth_error", но с отсутствующим error_data (1 ms) + ✓ Попытка обмана проверки: объект с error_type, равным "auth_error", но с отсутствующим error_data ✓ Попытка обмана проверки: объект с error_type, равным "client_error", с произвольным request_id, но с отсутствующим error_data ✓ Попытка обмана проверки: объект с error_type, равным "api_error", с произвольным request_id, но с отсутствующим error_data ✓ Попытка обмана проверки: объект с error_type, равным "auth_error", с произвольным request_id, но с отсутствующим error_data @@ -251,8 +274,8 @@ PASS src/__tests__/isVkError.test.ts ✓ Объект с произвольным error_data и error_type, равным "client_error" ✓ Объект с произвольным error_data и error_type, равным "api_error" ✓ Объект с произвольным error_data и error_type, равным "auth_error" - ✓ Объект с произвольным error_data, произвольным полем и error_type, равным "client_error" - ✓ Объект с произвольным error_data, произвольным полем и error_type, равным "api_error" (1 ms) + ✓ Объект с произвольным error_data, произвольным полем и error_type, равным "client_error" (1 ms) + ✓ Объект с произвольным error_data, произвольным полем и error_type, равным "api_error" ✓ Объект с произвольным error_data, произвольным полем и error_type, равным "auth_error" PASS src/__tests__/checkVkAvatarIsDefault.test.ts @@ -260,8 +283,8 @@ PASS src/__tests__/checkVkAvatarIsDefault.test.ts ✓ Правильная ссылка: https://vk.com/images/camera_400.png (1 ms) ✓ Правильная ссылка: https://vk.com/images/camera_200.png ✓ Правильная ссылка: https://vk.com/images/camera_100.png - ✓ Правильная ссылка: https://vk.com/images/camera_50.png (1 ms) - ✓ Имитация ВКшной ссылки, jpg-расширение: https://vk.com/images/camera_400.jpg + ✓ Правильная ссылка: https://vk.com/images/camera_50.png + ✓ Имитация ВКшной ссылки, jpg-расширение: https://vk.com/images/camera_400.jpg (1 ms) ✓ Имитация ВКшной ссылки, jpg-расширение: https://vk.com/images/camera_200.jpg ✓ Имитация ВКшной ссылки, jpg-расширение: https://vk.com/images/camera_100.jpg ✓ Имитация ВКшной ссылки, jpg-расширение: https://vk.com/images/camera_50.jpg @@ -283,39 +306,20 @@ PASS src/__tests__/checkVkAvatarIsDefault.test.ts ✓ Несоответствие размеров в аргументе в поле size и в ссылке. Ссылка: https://vk.com/images/camera_100.png, размер: 50 ✓ Пустая строка в поле ссылки. Размер: 400 ✓ Пустая строка в поле ссылки. Размер: 200 - ✓ Пустая строка в поле ссылки. Размер: 100 - ✓ Пустая строка в поле ссылки. Размер: 50 (1 ms) + ✓ Пустая строка в поле ссылки. Размер: 100 (1 ms) + ✓ Пустая строка в поле ссылки. Размер: 50 PASS src/__tests__/shareVkStory.test.ts Функция shareVkStory ✓ Успешное выполнение, источник картинки — URL (1 ms) - ✓ Успешное выполнение, источник картинки — BLOB + ✓ Успешное выполнение, источник картинки — BLOB (1 ms) ✓ Все параметры, кроме источника картинки, передаются в бридж ✓ Отказ пользователя, причина ошибки: "User denied" - ✓ Отказ пользователя, причина ошибки: "Operation denied by user" + ✓ Отказ пользователя, причина ошибки: "Operation denied by user" (1 ms) ✓ Неизвестная ошибка -PASS src/__tests__/checkVkUserDenied.test.ts - Функция checkVkUserDenied - ✓ Объект ошибки, соответствующий типу ошибки api_error (1 ms) - ✓ Объект ошибки, соответствующий типу ошибки api_error, но с error_reason "User denied" и кодом ошибки 4 - ✓ Объект ошибки, соответствующий типу ошибки api_error, но с error_reason "Operation denied by user" и кодом ошибки 4 (1 ms) - ✓ Объект ошибки, соответствующий типу ошибки auth_error - ✓ Объект ошибки, соответствующий типу ошибки auth_error, но с error_reason "User denied" и кодом ошибки 4 - ✓ Объект ошибки, соответствующий типу ошибки auth_error, но с error_reason "Operation denied by user" и кодом ошибки 4 - ✓ Объект ошибки, соответствующий типу ошибки client_error с правильным error_reason "User denied" и кодом ошибки 4 - ✓ Объект ошибки, соответствующий типу ошибки client_error с правильным error_reason "Operation denied by user" и кодом ошибки 4 - ✓ Объект ошибки, соответствующий типу ошибки client_error с произвольным кодом ошибки, с правильным error_reason "User denied", но в нижнем регистре - ✓ Объект ошибки, соответствующий типу ошибки client_error с произвольным кодом ошибки, с правильным error_reason "Operation denied by user", но в нижнем регистре - ✓ Объект ошибки, соответствующий типу ошибки client_error, с произвольным кодом ошибки, с правильным error_reason "User denied" - ✓ Объект ошибки, соответствующий типу ошибки client_error, с произвольным кодом ошибки, с правильным error_reason "Operation denied by user" - ✓ Объект ошибки, соответствующий типу ошибки client_error с кодом ошибки 4, с произвольной причиной ошибки - ✓ Объект ошибки, соответствующий типу ошибки client_error с произвольным кодом ошибки, с произвольной причиной ошибки - ✓ Объект, содержащий минимально достаточные поля, с типом ошибки client_error с причиной ошибки "User denied" и кодом ошибки 4 (1 ms) - ✓ Объект, содержащий минимально достаточные поля, с типом ошибки client_error с причиной ошибки "Operation denied by user" и кодом ошибки 4 - Test Suites: 11 passed, 11 total -Tests: 1 todo, 252 passed, 253 total +Tests: 1 todo, 256 passed, 257 total Snapshots: 0 total -Time: 1.359 s +Time: 1.349 s Ran all test suites. diff --git a/src/checkVkPlatform.ts b/src/checkVkPlatform.ts index 0b85bff..430d7d2 100644 --- a/src/checkVkPlatform.ts +++ b/src/checkVkPlatform.ts @@ -117,7 +117,7 @@ const isMobileUserAgent = () => * устанавливает в true isMobile и isAndroid и добавляет класснеймы 'mobile android'. * * Если приложение открыто в браузере на мобильном устройстве (m.vk.com или web.vk.me), - * устанавливает в true isMobile и isMvk = true и добавляет класснеймы 'mobile web'. + * устанавливает в true isMobile и isWeb = true и добавляет класснеймы 'mobile web'. * Также по регулярным выражениям для UserAgent проверяет, открыт ли m.vk.com (или web.vk.me) на Android * (помимо предыдущих значений еще устанавливает в true isAndroid и добавляет класснейм 'android', * или на IOS устанавливает в true isIos и добавляет класснейм 'ios'). diff --git a/src/types/window.ts b/src/types/window.ts index 4fb8d38..de5d961 100644 --- a/src/types/window.ts +++ b/src/types/window.ts @@ -1,29 +1,6 @@ import { WindowType as CommonWindowType } from '@ktsstudio/mediaproject-utils'; -<<<<<<< HEAD -import { VkPlatformType } from './common'; - -export interface WindowType - extends Omit { - /** Параметры запуска */ - user_id?: number; - notifications_enabled?: boolean; - language?: string; - ref?: string; - group_id?: string; - viewer_group_role?: string; - platform?: VkPlatformType; - is_odr?: boolean; - - /** Параметры текущей платформы */ - is_ios?: boolean; - is_android?: boolean; - is_web?: boolean; - is_messenger?: boolean; - -======= export interface WindowType extends CommonWindowType { ->>>>>>> release-3.1.0 /** Токен доступа и его права */ access_token?: string; scope?: string; From c1d9f4a62fd71c7f4f4163f8744f8a0b0cbf53cd Mon Sep 17 00:00:00 2001 From: "d.ragozin" Date: Wed, 7 Feb 2024 10:53:20 +0300 Subject: [PATCH 42/46] =?UTF-8?q?[*]=20=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=B2=D0=B5=D1=80=D1=81=D0=B8?= =?UTF-8?q?=D0=B8=20=D0=B2=20package.json?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 6f8911e..24ef0ab 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@ktsstudio/mediaproject-vk", - "version": "3.0.0", + "version": "4.0.0", "description": "Package with utils for VK Mini Apps", "author": "KTS Studio (https://kts.studio)", "keywords": [ From eaf1e6e8a0a367f3763b065698755274600c99f7 Mon Sep 17 00:00:00 2001 From: qpounodb Date: Fri, 14 Jun 2024 18:39:19 +0300 Subject: [PATCH 43/46] fix: vk api errors types usage --- package.json | 3 +- src/__tests__/callVkApi.test.ts | 94 +- src/__tests__/checkVkUserDenied.test.ts | 28 +- src/__tests__/getVkAccessToken.test.ts | 4 +- src/callVkApi.ts | 104 +- yarn.lock | 3631 +++++++++-------------- 6 files changed, 1482 insertions(+), 2382 deletions(-) diff --git a/package.json b/package.json index 413ec01..c06e8ee 100644 --- a/package.json +++ b/package.json @@ -75,7 +75,6 @@ "eslint": "^9.4.0", "eslint-config-prettier": "^9.1.0", "eslint-import-resolver-typescript": "^3.6.1", - "eslint-plugin-import": "^2.29.1", "eslint-plugin-import-x": "^0.5.1", "eslint-plugin-prettier": "^5.1.3", "eslint-plugin-react": "^7.34.2", @@ -87,7 +86,7 @@ "prettier": "^3.3.2", "react": ">=17", "react-dom": ">=17", - "rollup": "^3.10.1", + "rollup": "^3.29.4", "rollup-plugin-peer-deps-external": "^2.2.4", "ts-node": "^10.9.2", "typescript": "^5.4.5", diff --git a/src/__tests__/callVkApi.test.ts b/src/__tests__/callVkApi.test.ts index bf8bb49..a2fb049 100644 --- a/src/__tests__/callVkApi.test.ts +++ b/src/__tests__/callVkApi.test.ts @@ -1,5 +1,7 @@ -import originalBridge from '@vkontakte/vk-bridge'; -import { AnyRequestMethodName } from '@vkontakte/vk-bridge/dist/types/src/types/bridge'; +import originalBridge, { + AnyRequestMethodName, + ErrorData, +} from '@vkontakte/vk-bridge'; import { callVkApi, VK_TOKEN_ERRORS } from '../callVkApi'; import { getVkAccessToken as originalGetVkAccessToken } from '../getVkAccessToken'; @@ -39,30 +41,47 @@ const MOCK_GET_TOKEN_PARAMS = { } as GetVkAccessTokenParamsType; const getMockTokenExpiredError = ({ - isWeb = true, - message = VK_TOKEN_ERRORS[0], + errorType = 'client_error', + message = [...VK_TOKEN_ERRORS][0], }: { - isWeb?: boolean; + errorType?: ErrorData['error_type']; message?: string; -} = {}) => ({ - error_type: 'some error type', - error_data: isWeb - ? { - error_reason: { - error_msg: message, - }, - } - : { +} = {}): ErrorData => { + if (errorType === 'api_error') { + return { + error_type: errorType, + error_data: { + error_code: randomNumberUpTo(100), error_msg: message, + request_params: [], }, -}); + }; + } else { + return { + error_type: errorType, + error_data: { + error_code: randomNumberUpTo(100), + error_reason: message, + }, + }; + } +}; + +const errorTypes: readonly ErrorData['error_type'][] = [ + 'api_error', + 'auth_error', + 'client_error', +]; /** * Подготовить кейсы возникновения ошибки о протухшем токене: на вебе/мобиле и с различным сообщением об ошибке */ -const getMockTokenExpiredErrorCases = () => - [true, false].flatMap((isWeb) => - VK_TOKEN_ERRORS.map((message) => ({ isWeb, message })) +const getMockTokenExpiredErrorCases = (): { + errorType: ErrorData['error_type']; + message: string; +}[] => + errorTypes.flatMap((errorType) => + [...VK_TOKEN_ERRORS].map((message) => ({ errorType, message })) ); /** @@ -188,8 +207,8 @@ describe('Функция callVkApi', () => { }); it( - 'Некоторая ошибка (в том числе из-за возможного некорректного токена), ' + - 'нет токена, токен должен быть получен один раз', + 'Некоторая ошибка (в том числе из-за возможного некорректного токена).\n\t' + + 'Нет токена, токен должен быть получен один раз', async () => { bridge.send.mockImplementation(() => { throw MOCK_ANY_ERROR; @@ -209,11 +228,11 @@ describe('Функция callVkApi', () => { } ); - getMockTokenExpiredErrorCases().forEach(({ message, isWeb }) => { + getMockTokenExpiredErrorCases().forEach(({ message, errorType }) => { it( - 'Успешный запрос, изначально протухший токен, ' + - 'новый токен должен быть получен один раз. ' + - `Ошибка: ${message}, веб: ${isWeb}`, + 'Успешный запрос, изначально протухший токен, новый ' + + 'токен должен быть получен один раз.\n\t' + + `Ошибка [${errorType}]: ${message}`, async () => { getVkAccessToken.mockImplementation(() => Promise.resolve(MOCK_TOKEN)); @@ -221,7 +240,7 @@ describe('Функция callVkApi', () => { bridge.send .mockImplementationOnce(() => { throw getMockTokenExpiredError({ - isWeb, + errorType, message, }); }) @@ -243,19 +262,19 @@ describe('Функция callVkApi', () => { ); }); - getMockTokenExpiredErrorCases().forEach(({ message, isWeb }) => { + getMockTokenExpiredErrorCases().forEach(({ message, errorType }) => { it( 'Некоторая ошибка (в том числе из-за возможного некорректного токена) ' + - 'после получения нового токена. Изначально протухший токен, ' + - 'новый токен должен быть получен один раз. ' + - `Ошибка: ${message}, веб: ${isWeb}`, + 'после получения нового токена.\n\t' + + 'Изначально протухший токен, новый токен должен быть получен один раз.\n\t' + + `Ошибка [${errorType}]: ${message}`, async () => { getVkAccessToken.mockImplementation(() => Promise.resolve(MOCK_TOKEN)); bridge.send .mockImplementationOnce(() => { throw getMockTokenExpiredError({ - isWeb, + errorType, message, }); }) @@ -279,14 +298,14 @@ describe('Функция callVkApi', () => { ); }); - getMockTokenExpiredErrorCases().forEach(({ message, isWeb }) => { + getMockTokenExpiredErrorCases().forEach(({ message, errorType }) => { it( 'Запрос с некоторым ответом, изначально протухший токен. ' + - 'Новый токен получать не нужно. ' + - `Ошибка: ${message}, веб: ${isWeb}`, + 'Новый токен получать не нужно.\n\t' + + `Ошибка [${errorType}]: ${message}`, async () => { const tokenExpiredError = getMockTokenExpiredError({ - isWeb, + errorType, message, }); @@ -357,7 +376,8 @@ describe('Функция callVkApi', () => { it( 'Запрос, токена нет, параметры для получения токена ' + - 'передаются в getVkAccessToken, новый токен передаётся в бридж', + 'передаются в getVkAccessToken.\n\t' + + 'Новый токен передаётся в бридж', async () => { getVkAccessToken.mockImplementation(() => Promise.resolve(MOCK_NEW_TOKEN) @@ -398,8 +418,8 @@ describe('Функция callVkApi', () => { it( 'Запрос, протухший токен передаётся в бридж, ' + - 'затем новый токен передаётся в бридж. Параметры получения токена ' + - 'передаются в getVkAccessToken', + 'затем новый токен передаётся в бридж.\n\t' + + 'Параметры получения токена передаются в getVkAccessToken', async () => { getVkAccessToken.mockImplementation(() => Promise.resolve(MOCK_NEW_TOKEN) diff --git a/src/__tests__/checkVkUserDenied.test.ts b/src/__tests__/checkVkUserDenied.test.ts index c988cbc..3944fb3 100644 --- a/src/__tests__/checkVkUserDenied.test.ts +++ b/src/__tests__/checkVkUserDenied.test.ts @@ -1,4 +1,4 @@ -import { ErrorData } from '@vkontakte/vk-bridge/dist/types/src/types/bridge'; +import { ErrorData } from '@vkontakte/vk-bridge'; import { checkVkUserDenied, userDeniedReasons } from '../checkVkUserDenied'; @@ -7,23 +7,15 @@ import { randomNumberUpTo, randomString, range } from './utils'; const getRandomStrings = () => range(3).map(() => randomString(24)); const getVkApiTypeError = ({ - errorReason, + errorMsg = randomString(10), errorCode = randomNumberUpTo(100), -}: { errorReason?: string; errorCode?: number } = {}): ErrorData => ({ +}: { errorMsg?: string; errorCode?: number } = {}): ErrorData => ({ error_type: 'api_error', - error_data: errorReason - ? { - error_code: errorCode, - error_msg: randomString(10), - request_params: getRandomStrings(), - // @ts-expect-error non standard field - error_reason: errorReason, - } - : { - error_code: errorCode, - error_msg: randomString(10), - request_params: getRandomStrings(), - }, + error_data: { + error_code: errorCode, + error_msg: errorMsg, + request_params: getRandomStrings(), + }, request_id: randomNumberUpTo(100), }); @@ -61,11 +53,11 @@ describe('Функция checkVkUserDenied', () => { userDeniedReasons.forEach((reason) => { it( 'Объект ошибки, соответствующий типу ошибки api_error, ' + - `но с error_reason "${reason}" и кодом ошибки 4`, + `но с error_msg "${reason}" и кодом ошибки 4`, () => { expect( checkVkUserDenied( - getVkApiTypeError({ errorReason: reason, errorCode: 4 }) + getVkApiTypeError({ errorMsg: reason, errorCode: 4 }) ) ).toBe(false); } diff --git a/src/__tests__/getVkAccessToken.test.ts b/src/__tests__/getVkAccessToken.test.ts index af571cf..a7d6266 100644 --- a/src/__tests__/getVkAccessToken.test.ts +++ b/src/__tests__/getVkAccessToken.test.ts @@ -1,9 +1,9 @@ import originalBridge, { PersonalAuthScope, ReceiveData, + ReceiveDataMap, + RequestProps, } from '@vkontakte/vk-bridge'; -import { RequestProps } from '@vkontakte/vk-bridge/dist/types/src/types/bridge'; -import { ReceiveDataMap } from '@vkontakte/vk-bridge/dist/types/src/types/data'; import { ALLOWED_VK_SCOPES, diff --git a/src/callVkApi.ts b/src/callVkApi.ts index 875e4a1..458d23a 100644 --- a/src/callVkApi.ts +++ b/src/callVkApi.ts @@ -1,22 +1,18 @@ -import bridge, { - ErrorData, - ErrorDataAPIError, - ErrorDataAuthError, - ErrorDataClientError, -} from '@vkontakte/vk-bridge'; +import bridge, { ErrorData } from '@vkontakte/vk-bridge'; import { getVkAccessToken } from './getVkAccessToken'; +import { isVkError } from './isVkError'; import { CallVkApiPropsType, CallVkApiResponseType } from './types'; /** * Ошибки от API ВКонтакте, в случае возникновения которых нужно обновить токен доступа. * - * @constant {string[]} + * @constant {Set} */ -const VK_TOKEN_ERRORS = [ +const VK_TOKEN_ERRORS = new Set([ 'User authorization failed: access_token was given to another ip address.', 'User authorization failed: access_token has expired.', -]; +]); /** * Утилита для вызова метода API ВКонтакте. @@ -24,7 +20,7 @@ const VK_TOKEN_ERRORS = [ * @param {CallVkApiPropsType} props Параметры для вызова метода API ВКонтакте. * @param {string} props.method Имя вызываемого {@link https://dev.vk.com/methods|метода API}. * @param {Object} [props.params={}] Параметры метода API, специфичные для указанного метода. - * @param {string} [props.version='5.131'] Версия API, используемая для запроса. По умолчанию 5.131. + * @param {string} [props.version='5.199'] Версия API, используемая для запроса. По умолчанию 5.199. * @param {string|null} [props.accessToken=null] Ключ доступа для обращения к API. Если не передан, будет получен вызовом функции {@link getVkAccessToken} с передчаей в нее параметров из getAccessTokenParams. * @param {string} [props.renewTokenIfExpired=true] Нужно ли получить новый токен доступа и повторить запрос в случае, если срок действия токена закончился. Если указан как true, то при получении от API ошибки одной из {@link VK_TOKEN_ERRORS} будет вызван метод {@link getNewVkAccessToken} с аргументом getAccessTokenParams. * @param {Object} [props.getAccessTokenParams] Параметры для получения токена доступа, которые будут переданы в {@link getVkAccessToken} в случае, если токена нет, или в {@link getNewVkAccessToken}, если срок действия токена закончился (если передано значение true для renewTokenIfExpired). @@ -36,7 +32,7 @@ const VK_TOKEN_ERRORS = [ const callVkApi = async ({ method, params = {}, - version = '5.131', + version = '5.199', accessToken = null, renewTokenIfExpired = true, getAccessTokenParams, @@ -66,43 +62,65 @@ const callVkApi = async ({ }, }); } catch (error) { - const errorData = error as ErrorData; + if (!isVkError(error)) { + return makeUnknownVkError(error); + } - if (errorData.error_type) { - /** - * error?.error_data?.error_reason - на вебе - * error?.error_data - на мобильных устройствах - */ - const errorMessage = - ( - (errorData.error_data as ErrorDataClientError | ErrorDataAuthError) - ?.error_reason as any - )?.error_msg || (errorData.error_data as ErrorDataAPIError)?.error_msg; + const errorMessage = getVkErrorMessage(error); - /** - * Если срок действия токена доступа истек, - * запрашиваем новый и повторяем запрос - */ - if ( - renewTokenIfExpired && - errorMessage && - VK_TOKEN_ERRORS.includes(errorMessage) - ) { - window.access_token = undefined; - const newAccessToken = await getVkAccessToken(getAccessTokenParams); + /** + * Если срок действия токена доступа истек, + * запрашиваем новый и повторяем запрос + */ + if ( + renewTokenIfExpired && + errorMessage && + VK_TOKEN_ERRORS.has(errorMessage) + ) { + window.access_token = undefined; + const newAccessToken = await getVkAccessToken(getAccessTokenParams); - return await callVkApi({ - method, - params, - version, - accessToken: newAccessToken, - getAccessTokenParams, - renewTokenIfExpired: false, - }); - } + return await callVkApi({ + method, + params, + version, + accessToken: newAccessToken, + getAccessTokenParams, + renewTokenIfExpired: false, + }); } - return errorData; + return error; + } +}; + +const getVkErrorMessage = (error: ErrorData) => { + if (error.error_type === 'api_error') { + return error.error_data.error_msg; + } + + return error.error_data.error_reason; +}; + +const makeUnknownVkError = (error: unknown): ErrorData => { + return { + error_type: 'client_error', + error_data: { + error_code: -111_000_111, + error_reason: 'unknown', + error_description: toStringInfo(error), + }, + }; +}; + +const toStringInfo = (value: unknown): string => { + if (value instanceof Error) { + return value.message; + } + try { + return JSON.stringify(value); + } catch (error) { + return String(value); } }; diff --git a/yarn.lock b/yarn.lock index 35ad40c..59b73ca 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,637 +2,310 @@ # yarn lockfile v1 -"@adobe/css-tools@^4.3.2": - version "4.3.2" - resolved "https://registry.yarnpkg.com/@adobe/css-tools/-/css-tools-4.3.2.tgz#a6abc715fb6884851fca9dad37fc34739a04fd11" - integrity sha512-DA5a1C0gD/pLOvhv33YMrbf2FK3oUzwNl9oOJqE4XVjuEtt6XIakRcsd7eLiOSPkp1kTRQGICTA8cKra/vFbjw== - -"@ampproject/remapping@^2.1.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.0.tgz#56c133824780de3174aed5ab6834f3026790154d" - integrity sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w== - dependencies: - "@jridgewell/gen-mapping" "^0.1.0" - "@jridgewell/trace-mapping" "^0.3.9" +"@adobe/css-tools@^4.4.0": + version "4.4.0" + resolved "https://registry.yarnpkg.com/@adobe/css-tools/-/css-tools-4.4.0.tgz#728c484f4e10df03d5a3acd0d8adcbbebff8ad63" + integrity sha512-Ff9+ksdQQB3rMncgqDK78uLznstjyfIf2Arnh22pW8kBpLs6rpKDwgnZT46hin5Hl1WzazzK64DOrhSwYpS7bQ== "@ampproject/remapping@^2.2.0": - version "2.2.1" - resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.1.tgz#99e8e11851128b8702cd57c33684f1d0f260b630" - integrity sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg== - dependencies: - "@jridgewell/gen-mapping" "^0.3.0" - "@jridgewell/trace-mapping" "^0.3.9" - -"@babel/code-frame@^7.0.0": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.14.5.tgz#23b08d740e83f49c5e59945fbf1b43e80bbf4edb" - integrity sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw== - dependencies: - "@babel/highlight" "^7.14.5" - -"@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.22.13", "@babel/code-frame@^7.23.5": - version "7.23.5" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.23.5.tgz#9009b69a8c602293476ad598ff53e4562e15c244" - integrity sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA== - dependencies: - "@babel/highlight" "^7.23.4" - chalk "^2.4.2" - -"@babel/code-frame@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.18.6.tgz#3b25d38c89600baa2dcc219edfa88a74eb2c427a" - integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q== + version "2.3.0" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.3.0.tgz#ed441b6fa600072520ce18b43d2c8cc8caecc7f4" + integrity sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw== dependencies: - "@babel/highlight" "^7.18.6" - -"@babel/compat-data@^7.17.7", "@babel/compat-data@^7.20.1", "@babel/compat-data@^7.20.5": - version "7.20.10" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.20.10.tgz#9d92fa81b87542fff50e848ed585b4212c1d34ec" - integrity sha512-sEnuDPpOJR/fcafHMjpcpGN5M2jbUGUHwmuWKM/YdPzeEDJg8bgmbcWQFUfE32MQjti1koACvoPVsDe8Uq+idg== + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.24" -"@babel/compat-data@^7.23.5": - version "7.23.5" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.23.5.tgz#ffb878728bb6bdcb6f4510aa51b1be9afb8cfd98" - integrity sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw== - -"@babel/core@^7.11.6", "@babel/core@^7.12.3": - version "7.23.7" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.23.7.tgz#4d8016e06a14b5f92530a13ed0561730b5c6483f" - integrity sha512-+UpDgowcmqe36d4NwqvKsyPMlOLNGMsfMmQ5WGCu+siCe3t3dfe9njrzGfdN4qq+bcNUt0+Vw6haRxBOycs4dw== +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.24.7.tgz#882fd9e09e8ee324e496bd040401c6f046ef4465" + integrity sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA== dependencies: - "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.23.5" - "@babel/generator" "^7.23.6" - "@babel/helper-compilation-targets" "^7.23.6" - "@babel/helper-module-transforms" "^7.23.3" - "@babel/helpers" "^7.23.7" - "@babel/parser" "^7.23.6" - "@babel/template" "^7.22.15" - "@babel/traverse" "^7.23.7" - "@babel/types" "^7.23.6" - convert-source-map "^2.0.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.2.3" - semver "^6.3.1" + "@babel/highlight" "^7.24.7" + picocolors "^1.0.0" -"@babel/core@^7.20.12": - version "7.20.12" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.20.12.tgz#7930db57443c6714ad216953d1356dac0eb8496d" - integrity sha512-XsMfHovsUYHFMdrIHkZphTN/2Hzzi78R08NuHfDBehym2VsPDL6Zn/JAD/JQdnRvbSsbQc4mVaU1m6JgtTEElg== - dependencies: - "@ampproject/remapping" "^2.1.0" - "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.20.7" - "@babel/helper-compilation-targets" "^7.20.7" - "@babel/helper-module-transforms" "^7.20.11" - "@babel/helpers" "^7.20.7" - "@babel/parser" "^7.20.7" - "@babel/template" "^7.20.7" - "@babel/traverse" "^7.20.12" - "@babel/types" "^7.20.7" - convert-source-map "^1.7.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.2.2" - semver "^6.3.0" +"@babel/compat-data@^7.22.6", "@babel/compat-data@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.24.7.tgz#d23bbea508c3883ba8251fb4164982c36ea577ed" + integrity sha512-qJzAIcv03PyaWqxRgO4mSU3lihncDT296vnyuE2O8uA4w3UHWI4S3hgeZd1L8W1Bft40w9JxJ2b412iDUFFRhw== -"@babel/core@^7.23.7": - version "7.23.9" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.23.9.tgz#b028820718000f267870822fec434820e9b1e4d1" - integrity sha512-5q0175NOjddqpvvzU+kDiSOAk4PfdO6FvwCWoQ6RO7rTzEe8vlo+4HVfcnAREhD4npMs0e9uZypjTwzZPCf/cw== +"@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.20.12", "@babel/core@^7.23.7", "@babel/core@^7.23.9": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.24.7.tgz#b676450141e0b52a3d43bc91da86aa608f950ac4" + integrity sha512-nykK+LEK86ahTkX/3TgauT0ikKoNCfKHEaZYTUVupJdTLzGNvrblu4u6fa7DhZONAltdf8e662t/abY8idrd/g== dependencies: "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.23.5" - "@babel/generator" "^7.23.6" - "@babel/helper-compilation-targets" "^7.23.6" - "@babel/helper-module-transforms" "^7.23.3" - "@babel/helpers" "^7.23.9" - "@babel/parser" "^7.23.9" - "@babel/template" "^7.23.9" - "@babel/traverse" "^7.23.9" - "@babel/types" "^7.23.9" + "@babel/code-frame" "^7.24.7" + "@babel/generator" "^7.24.7" + "@babel/helper-compilation-targets" "^7.24.7" + "@babel/helper-module-transforms" "^7.24.7" + "@babel/helpers" "^7.24.7" + "@babel/parser" "^7.24.7" + "@babel/template" "^7.24.7" + "@babel/traverse" "^7.24.7" + "@babel/types" "^7.24.7" convert-source-map "^2.0.0" debug "^4.1.0" gensync "^1.0.0-beta.2" json5 "^2.2.3" semver "^6.3.1" -"@babel/generator@^7.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.20.7.tgz#f8ef57c8242665c5929fe2e8d82ba75460187b4a" - integrity sha512-7wqMOJq8doJMZmP4ApXTzLxSr7+oO2jroJURrVEp6XShrQUObV8Tq/D0NCcoYg2uHqUrjzO0zwBjoYzelxK+sw== - dependencies: - "@babel/types" "^7.20.7" - "@jridgewell/gen-mapping" "^0.3.2" - jsesc "^2.5.1" - -"@babel/generator@^7.23.6", "@babel/generator@^7.7.2": - version "7.23.6" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.23.6.tgz#9e1fca4811c77a10580d17d26b57b036133f3c2e" - integrity sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw== +"@babel/generator@^7.24.7", "@babel/generator@^7.7.2": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.24.7.tgz#1654d01de20ad66b4b4d99c135471bc654c55e6d" + integrity sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA== dependencies: - "@babel/types" "^7.23.6" - "@jridgewell/gen-mapping" "^0.3.2" - "@jridgewell/trace-mapping" "^0.3.17" + "@babel/types" "^7.24.7" + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.25" jsesc "^2.5.1" -"@babel/helper-annotate-as-pure@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz#eaa49f6f80d5a33f9a5dd2276e6d6e451be0a6bb" - integrity sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA== +"@babel/helper-annotate-as-pure@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz#5373c7bc8366b12a033b4be1ac13a206c6656aab" + integrity sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg== dependencies: - "@babel/types" "^7.18.6" + "@babel/types" "^7.24.7" -"@babel/helper-builder-binary-assignment-operator-visitor@^7.18.6": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz#acd4edfd7a566d1d51ea975dff38fd52906981bb" - integrity sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw== +"@babel/helper-builder-binary-assignment-operator-visitor@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.24.7.tgz#37d66feb012024f2422b762b9b2a7cfe27c7fba3" + integrity sha512-xZeCVVdwb4MsDBkkyZ64tReWYrLRHlMN72vP7Bdm3OUOuyFZExhsHUUnuWnm2/XOlAJzR0LfPpB56WXZn0X/lA== dependencies: - "@babel/helper-explode-assignable-expression" "^7.18.6" - "@babel/types" "^7.18.9" + "@babel/traverse" "^7.24.7" + "@babel/types" "^7.24.7" -"@babel/helper-compilation-targets@^7.17.7", "@babel/helper-compilation-targets@^7.18.9", "@babel/helper-compilation-targets@^7.20.0", "@babel/helper-compilation-targets@^7.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz#a6cd33e93629f5eb473b021aac05df62c4cd09bb" - integrity sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ== +"@babel/helper-compilation-targets@^7.22.6", "@babel/helper-compilation-targets@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.7.tgz#4eb6c4a80d6ffeac25ab8cd9a21b5dfa48d503a9" + integrity sha512-ctSdRHBi20qWOfy27RUb4Fhp07KSJ3sXcuSvTrXrc4aG8NSYDo1ici3Vhg9bg69y5bj0Mr1lh0aeEgTvc12rMg== dependencies: - "@babel/compat-data" "^7.20.5" - "@babel/helper-validator-option" "^7.18.6" - browserslist "^4.21.3" - lru-cache "^5.1.1" - semver "^6.3.0" - -"@babel/helper-compilation-targets@^7.23.6": - version "7.23.6" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz#4d79069b16cbcf1461289eccfbbd81501ae39991" - integrity sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ== - dependencies: - "@babel/compat-data" "^7.23.5" - "@babel/helper-validator-option" "^7.23.5" + "@babel/compat-data" "^7.24.7" + "@babel/helper-validator-option" "^7.24.7" browserslist "^4.22.2" lru-cache "^5.1.1" semver "^6.3.1" -"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.20.5", "@babel/helper-create-class-features-plugin@^7.20.7": - version "7.20.12" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.20.12.tgz#4349b928e79be05ed2d1643b20b99bb87c503819" - integrity sha512-9OunRkbT0JQcednL0UFvbfXpAsUXiGjUk0a7sN8fUXX7Mue79cUSMjHGDRRi/Vz9vYlpIhLV5fMD5dKoMhhsNQ== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.19.0" - "@babel/helper-member-expression-to-functions" "^7.20.7" - "@babel/helper-optimise-call-expression" "^7.18.6" - "@babel/helper-replace-supers" "^7.20.7" - "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" - "@babel/helper-split-export-declaration" "^7.18.6" - -"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.20.5": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.20.5.tgz#5ea79b59962a09ec2acf20a963a01ab4d076ccca" - integrity sha512-m68B1lkg3XDGX5yCvGO0kPx3v9WIYLnzjKfPcQiwntEQa5ZeRkPmo2X/ISJc8qxWGfwUr+kvZAeEzAwLec2r2w== +"@babel/helper-create-class-features-plugin@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.7.tgz#2eaed36b3a1c11c53bdf80d53838b293c52f5b3b" + integrity sha512-kTkaDl7c9vO80zeX1rJxnuRpEsD5tA81yh11X1gQo+PhSti3JS+7qeZo9U4RHobKRiFPKaGK3svUAeb8D0Q7eg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.24.7" + "@babel/helper-environment-visitor" "^7.24.7" + "@babel/helper-function-name" "^7.24.7" + "@babel/helper-member-expression-to-functions" "^7.24.7" + "@babel/helper-optimise-call-expression" "^7.24.7" + "@babel/helper-replace-supers" "^7.24.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7" + "@babel/helper-split-export-declaration" "^7.24.7" + semver "^6.3.1" + +"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.24.7.tgz#be4f435a80dc2b053c76eeb4b7d16dd22cfc89da" + integrity sha512-03TCmXy2FtXJEZfbXDTSqq1fRJArk7lX9DOFC/47VthYcxyIOx+eXQmdo6DOQvrbpIix+KfXwvuXdFDZHxt+rA== dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - regexpu-core "^5.2.1" + "@babel/helper-annotate-as-pure" "^7.24.7" + regexpu-core "^5.3.1" + semver "^6.3.1" -"@babel/helper-define-polyfill-provider@^0.3.3": - version "0.3.3" - resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz#8612e55be5d51f0cd1f36b4a5a83924e89884b7a" - integrity sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww== +"@babel/helper-define-polyfill-provider@^0.6.1", "@babel/helper-define-polyfill-provider@^0.6.2": + version "0.6.2" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz#18594f789c3594acb24cfdb4a7f7b7d2e8bd912d" + integrity sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ== dependencies: - "@babel/helper-compilation-targets" "^7.17.7" - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-compilation-targets" "^7.22.6" + "@babel/helper-plugin-utils" "^7.22.5" debug "^4.1.1" lodash.debounce "^4.0.8" resolve "^1.14.2" - semver "^6.1.2" - -"@babel/helper-environment-visitor@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz#0c0cee9b35d2ca190478756865bb3528422f51be" - integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg== - -"@babel/helper-environment-visitor@^7.22.20": - version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167" - integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA== - -"@babel/helper-explode-assignable-expression@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz#41f8228ef0a6f1a036b8dfdfec7ce94f9a6bc096" - integrity sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-function-name@^7.18.9", "@babel/helper-function-name@^7.19.0": - version "7.19.0" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz#941574ed5390682e872e52d3f38ce9d1bef4648c" - integrity sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w== - dependencies: - "@babel/template" "^7.18.10" - "@babel/types" "^7.19.0" - -"@babel/helper-function-name@^7.23.0": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz#1f9a3cdbd5b2698a670c30d2735f9af95ed52759" - integrity sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw== - dependencies: - "@babel/template" "^7.22.15" - "@babel/types" "^7.23.0" - -"@babel/helper-hoist-variables@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz#d4d2c8fb4baeaa5c68b99cc8245c56554f926678" - integrity sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-hoist-variables@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb" - integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== - dependencies: - "@babel/types" "^7.22.5" -"@babel/helper-member-expression-to-functions@^7.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.20.7.tgz#a6f26e919582275a93c3aa6594756d71b0bb7f05" - integrity sha512-9J0CxJLq315fEdi4s7xK5TQaNYjZw+nDVpVqr1axNGKzdrdwYBD5b4uKv3n75aABG0rCCTK8Im8Ww7eYfMrZgw== +"@babel/helper-environment-visitor@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.7.tgz#4b31ba9551d1f90781ba83491dd59cf9b269f7d9" + integrity sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ== dependencies: - "@babel/types" "^7.20.7" - -"@babel/helper-module-imports@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz#1e3ebdbbd08aad1437b428c50204db13c5a3ca6e" - integrity sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-module-imports@^7.22.15": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz#16146307acdc40cc00c3b2c647713076464bdbf0" - integrity sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w== - dependencies: - "@babel/types" "^7.22.15" - -"@babel/helper-module-transforms@^7.18.6", "@babel/helper-module-transforms@^7.20.11": - version "7.20.11" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.20.11.tgz#df4c7af713c557938c50ea3ad0117a7944b2f1b0" - integrity sha512-uRy78kN4psmji1s2QtbtcCSaj/LILFDp0f/ymhpQH5QY3nljUZCaNWz9X1dEj/8MBdBEFECs7yRhKn8i7NjZgg== - dependencies: - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-simple-access" "^7.20.2" - "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/helper-validator-identifier" "^7.19.1" - "@babel/template" "^7.20.7" - "@babel/traverse" "^7.20.10" - "@babel/types" "^7.20.7" - -"@babel/helper-module-transforms@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz#d7d12c3c5d30af5b3c0fcab2a6d5217773e2d0f1" - integrity sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ== - dependencies: - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-module-imports" "^7.22.15" - "@babel/helper-simple-access" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/helper-validator-identifier" "^7.22.20" - -"@babel/helper-optimise-call-expression@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz#9369aa943ee7da47edab2cb4e838acf09d290ffe" - integrity sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.18.9", "@babel/helper-plugin-utils@^7.19.0", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": - version "7.20.2" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz#d1b9000752b18d0877cff85a5c376ce5c3121629" - integrity sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ== - -"@babel/helper-plugin-utils@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz#dd7ee3735e8a313b9f7b05a773d892e88e6d7295" - integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg== - -"@babel/helper-remap-async-to-generator@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz#997458a0e3357080e54e1d79ec347f8a8cd28519" - integrity sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-wrap-function" "^7.18.9" - "@babel/types" "^7.18.9" - -"@babel/helper-replace-supers@^7.18.6", "@babel/helper-replace-supers@^7.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.20.7.tgz#243ecd2724d2071532b2c8ad2f0f9f083bcae331" - integrity sha512-vujDMtB6LVfNW13jhlCrp48QNslK6JXi7lQG736HVbHz/mbf4Dc7tIRh1Xf5C0rF7BP8iiSxGMCmY6Ci1ven3A== - dependencies: - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-member-expression-to-functions" "^7.20.7" - "@babel/helper-optimise-call-expression" "^7.18.6" - "@babel/template" "^7.20.7" - "@babel/traverse" "^7.20.7" - "@babel/types" "^7.20.7" - -"@babel/helper-simple-access@^7.20.2": - version "7.20.2" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz#0ab452687fe0c2cfb1e2b9e0015de07fc2d62dd9" - integrity sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA== - dependencies: - "@babel/types" "^7.20.2" - -"@babel/helper-simple-access@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz#4938357dc7d782b80ed6dbb03a0fba3d22b1d5de" - integrity sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w== - dependencies: - "@babel/types" "^7.22.5" - -"@babel/helper-skip-transparent-expression-wrappers@^7.20.0": - version "7.20.0" - resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz#fbe4c52f60518cab8140d77101f0e63a8a230684" - integrity sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg== - dependencies: - "@babel/types" "^7.20.0" - -"@babel/helper-split-export-declaration@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz#7367949bc75b20c6d5a5d4a97bba2824ae8ef075" - integrity sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-split-export-declaration@^7.22.6": - version "7.22.6" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz#322c61b7310c0997fe4c323955667f18fcefb91c" - integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g== - dependencies: - "@babel/types" "^7.22.5" - -"@babel/helper-string-parser@^7.19.4": - version "7.19.4" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz#38d3acb654b4701a9b77fb0615a96f775c3a9e63" - integrity sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw== - -"@babel/helper-string-parser@^7.23.4": - version "7.23.4" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz#9478c707febcbbe1ddb38a3d91a2e054ae622d83" - integrity sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ== - -"@babel/helper-validator-identifier@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz#d0f0e277c512e0c938277faa85a3968c9a44c0e8" - integrity sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg== + "@babel/types" "^7.24.7" -"@babel/helper-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.19.1": - version "7.19.1" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2" - integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== - -"@babel/helper-validator-identifier@^7.22.20": - version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0" - integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== - -"@babel/helper-validator-option@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz#bf0d2b5a509b1f336099e4ff36e1a63aa5db4db8" - integrity sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw== - -"@babel/helper-validator-option@^7.23.5": - version "7.23.5" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz#907a3fbd4523426285365d1206c423c4c5520307" - integrity sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw== - -"@babel/helper-wrap-function@^7.18.9": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz#75e2d84d499a0ab3b31c33bcfe59d6b8a45f62e3" - integrity sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q== - dependencies: - "@babel/helper-function-name" "^7.19.0" - "@babel/template" "^7.18.10" - "@babel/traverse" "^7.20.5" - "@babel/types" "^7.20.5" - -"@babel/helpers@^7.20.7": - version "7.20.13" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.20.13.tgz#e3cb731fb70dc5337134cadc24cbbad31cc87ad2" - integrity sha512-nzJ0DWCL3gB5RCXbUO3KIMMsBY2Eqbx8mBpKGE/02PgyRQFcPQLbkQ1vyy596mZLaP+dAfD+R4ckASzNVmW3jg== - dependencies: - "@babel/template" "^7.20.7" - "@babel/traverse" "^7.20.13" - "@babel/types" "^7.20.7" - -"@babel/helpers@^7.23.7": - version "7.23.8" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.23.8.tgz#fc6b2d65b16847fd50adddbd4232c76378959e34" - integrity sha512-KDqYz4PiOWvDFrdHLPhKtCThtIcKVy6avWD2oG4GEvyQ+XDZwHD4YQd+H2vNMnq2rkdxsDkU82T+Vk8U/WXHRQ== - dependencies: - "@babel/template" "^7.22.15" - "@babel/traverse" "^7.23.7" - "@babel/types" "^7.23.6" - -"@babel/helpers@^7.23.9": - version "7.23.9" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.23.9.tgz#c3e20bbe7f7a7e10cb9b178384b4affdf5995c7d" - integrity sha512-87ICKgU5t5SzOT7sBMfCOZQ2rHjRU+Pcb9BoILMYz600W6DkVRLFBPwQ18gwUVvggqXivaUakpnxWQGbpywbBQ== - dependencies: - "@babel/template" "^7.23.9" - "@babel/traverse" "^7.23.9" - "@babel/types" "^7.23.9" - -"@babel/highlight@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.14.5.tgz#6861a52f03966405001f6aa534a01a24d99e8cd9" - integrity sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg== - dependencies: - "@babel/helper-validator-identifier" "^7.14.5" - chalk "^2.0.0" - js-tokens "^4.0.0" - -"@babel/highlight@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf" - integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== +"@babel/helper-function-name@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.24.7.tgz#75f1e1725742f39ac6584ee0b16d94513da38dd2" + integrity sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA== dependencies: - "@babel/helper-validator-identifier" "^7.18.6" - chalk "^2.0.0" - js-tokens "^4.0.0" + "@babel/template" "^7.24.7" + "@babel/types" "^7.24.7" + +"@babel/helper-hoist-variables@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.7.tgz#b4ede1cde2fd89436397f30dc9376ee06b0f25ee" + integrity sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ== + dependencies: + "@babel/types" "^7.24.7" -"@babel/highlight@^7.23.4": - version "7.23.4" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.23.4.tgz#edaadf4d8232e1a961432db785091207ead0621b" - integrity sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A== - dependencies: - "@babel/helper-validator-identifier" "^7.22.20" +"@babel/helper-member-expression-to-functions@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.7.tgz#67613d068615a70e4ed5101099affc7a41c5225f" + integrity sha512-LGeMaf5JN4hAT471eJdBs/GK1DoYIJ5GCtZN/EsL6KUiiDZOvO/eKE11AMZJa2zP4zk4qe9V2O/hxAmkRc8p6w== + dependencies: + "@babel/traverse" "^7.24.7" + "@babel/types" "^7.24.7" + +"@babel/helper-module-imports@^7.18.6", "@babel/helper-module-imports@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz#f2f980392de5b84c3328fc71d38bd81bbb83042b" + integrity sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA== + dependencies: + "@babel/traverse" "^7.24.7" + "@babel/types" "^7.24.7" + +"@babel/helper-module-transforms@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.24.7.tgz#31b6c9a2930679498db65b685b1698bfd6c7daf8" + integrity sha512-1fuJEwIrp+97rM4RWdO+qrRsZlAeL1lQJoPqtCYWv0NL115XM93hIH4CSRln2w52SqvmY5hqdtauB6QFCDiZNQ== + dependencies: + "@babel/helper-environment-visitor" "^7.24.7" + "@babel/helper-module-imports" "^7.24.7" + "@babel/helper-simple-access" "^7.24.7" + "@babel/helper-split-export-declaration" "^7.24.7" + "@babel/helper-validator-identifier" "^7.24.7" + +"@babel/helper-optimise-call-expression@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.24.7.tgz#8b0a0456c92f6b323d27cfd00d1d664e76692a0f" + integrity sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A== + dependencies: + "@babel/types" "^7.24.7" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.24.7", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.7.tgz#98c84fe6fe3d0d3ae7bfc3a5e166a46844feb2a0" + integrity sha512-Rq76wjt7yz9AAc1KnlRKNAi/dMSVWgDRx43FHoJEbcYU6xOWaE2dVPwcdTukJrjxS65GITyfbvEYHvkirZ6uEg== + +"@babel/helper-remap-async-to-generator@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.24.7.tgz#b3f0f203628522713849d49403f1a414468be4c7" + integrity sha512-9pKLcTlZ92hNZMQfGCHImUpDOlAgkkpqalWEeftW5FBya75k8Li2ilerxkM/uBEj01iBZXcCIB/bwvDYgWyibA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.24.7" + "@babel/helper-environment-visitor" "^7.24.7" + "@babel/helper-wrap-function" "^7.24.7" + +"@babel/helper-replace-supers@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.24.7.tgz#f933b7eed81a1c0265740edc91491ce51250f765" + integrity sha512-qTAxxBM81VEyoAY0TtLrx1oAEJc09ZK67Q9ljQToqCnA+55eNwCORaxlKyu+rNfX86o8OXRUSNUnrtsAZXM9sg== + dependencies: + "@babel/helper-environment-visitor" "^7.24.7" + "@babel/helper-member-expression-to-functions" "^7.24.7" + "@babel/helper-optimise-call-expression" "^7.24.7" + +"@babel/helper-simple-access@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz#bcade8da3aec8ed16b9c4953b74e506b51b5edb3" + integrity sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg== + dependencies: + "@babel/traverse" "^7.24.7" + "@babel/types" "^7.24.7" + +"@babel/helper-skip-transparent-expression-wrappers@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.24.7.tgz#5f8fa83b69ed5c27adc56044f8be2b3ea96669d9" + integrity sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ== + dependencies: + "@babel/traverse" "^7.24.7" + "@babel/types" "^7.24.7" + +"@babel/helper-split-export-declaration@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz#83949436890e07fa3d6873c61a96e3bbf692d856" + integrity sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA== + dependencies: + "@babel/types" "^7.24.7" + +"@babel/helper-string-parser@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.7.tgz#4d2d0f14820ede3b9807ea5fc36dfc8cd7da07f2" + integrity sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg== + +"@babel/helper-validator-identifier@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz#75b889cfaf9e35c2aaf42cf0d72c8e91719251db" + integrity sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w== + +"@babel/helper-validator-option@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.24.7.tgz#24c3bb77c7a425d1742eec8fb433b5a1b38e62f6" + integrity sha512-yy1/KvjhV/ZCL+SM7hBrvnZJ3ZuT9OuZgIJAGpPEToANvc3iM6iDvBnRjtElWibHU6n8/LPR/EjX9EtIEYO3pw== + +"@babel/helper-wrap-function@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.24.7.tgz#52d893af7e42edca7c6d2c6764549826336aae1f" + integrity sha512-N9JIYk3TD+1vq/wn77YnJOqMtfWhNewNE+DJV4puD2X7Ew9J4JvrzrFDfTfyv5EgEXVy9/Wt8QiOErzEmv5Ifw== + dependencies: + "@babel/helper-function-name" "^7.24.7" + "@babel/template" "^7.24.7" + "@babel/traverse" "^7.24.7" + "@babel/types" "^7.24.7" + +"@babel/helpers@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.24.7.tgz#aa2ccda29f62185acb5d42fb4a3a1b1082107416" + integrity sha512-NlmJJtvcw72yRJRcnCmGvSi+3jDEg8qFu3z0AFoymmzLx5ERVWyzd9kVXr7Th9/8yIJi2Zc6av4Tqz3wFs8QWg== + dependencies: + "@babel/template" "^7.24.7" + "@babel/types" "^7.24.7" + +"@babel/highlight@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.7.tgz#a05ab1df134b286558aae0ed41e6c5f731bf409d" + integrity sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw== + dependencies: + "@babel/helper-validator-identifier" "^7.24.7" chalk "^2.4.2" js-tokens "^4.0.0" + picocolors "^1.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.22.15", "@babel/parser@^7.23.6": - version "7.23.6" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.6.tgz#ba1c9e512bda72a47e285ae42aff9d2a635a9e3b" - integrity sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ== - -"@babel/parser@^7.20.13", "@babel/parser@^7.20.7": - version "7.20.13" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.20.13.tgz#ddf1eb5a813588d2fb1692b70c6fce75b945c088" - integrity sha512-gFDLKMfpiXCsjt4za2JA9oTMn70CeseCehb11kRZgvd7+F67Hih3OHOK24cRrWECJ/ljfPGac6ygXAs/C8kIvw== - -"@babel/parser@^7.23.9": - version "7.23.9" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.9.tgz#7b903b6149b0f8fa7ad564af646c4c38a77fc44b" - integrity sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA== - -"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz#da5b8f9a580acdfbe53494dba45ea389fb09a4d2" - integrity sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.18.9": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.20.7.tgz#d9c85589258539a22a901033853101a6198d4ef1" - integrity sha512-sbr9+wNE5aXMBBFBICk01tt7sBf2Oc9ikRFEcem/ZORup9IMUdNhW7/wVLEbbtlWOsEubJet46mHAL2C8+2jKQ== - dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" - "@babel/plugin-proposal-optional-chaining" "^7.20.7" - -"@babel/plugin-proposal-async-generator-functions@^7.20.1": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz#bfb7276d2d573cb67ba379984a2334e262ba5326" - integrity sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA== - dependencies: - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-remap-async-to-generator" "^7.18.9" - "@babel/plugin-syntax-async-generators" "^7.8.4" - -"@babel/plugin-proposal-class-properties@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz#b110f59741895f7ec21a6fff696ec46265c446a3" - integrity sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-proposal-class-static-block@^7.18.6": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.20.7.tgz#92592e9029b13b15be0f7ce6a7aedc2879ca45a7" - integrity sha512-AveGOoi9DAjUYYuUAG//Ig69GlazLnoyzMw68VCDux+c1tsnnH/OkYcpz/5xzMkEFC6UxjR5Gw1c+iY2wOGVeQ== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.20.7" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/plugin-syntax-class-static-block" "^7.14.5" - -"@babel/plugin-proposal-dynamic-import@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz#72bcf8d408799f547d759298c3c27c7e7faa4d94" - integrity sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/plugin-syntax-dynamic-import" "^7.8.3" - -"@babel/plugin-proposal-export-namespace-from@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz#5f7313ab348cdb19d590145f9247540e94761203" - integrity sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA== - dependencies: - "@babel/helper-plugin-utils" "^7.18.9" - "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - -"@babel/plugin-proposal-json-strings@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz#7e8788c1811c393aff762817e7dbf1ebd0c05f0b" - integrity sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/plugin-syntax-json-strings" "^7.8.3" - -"@babel/plugin-proposal-logical-assignment-operators@^7.18.9": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz#dfbcaa8f7b4d37b51e8bfb46d94a5aea2bb89d83" - integrity sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug== - dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" - -"@babel/plugin-proposal-nullish-coalescing-operator@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz#fdd940a99a740e577d6c753ab6fbb43fdb9467e1" - integrity sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - -"@babel/plugin-proposal-numeric-separator@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz#899b14fbafe87f053d2c5ff05b36029c62e13c75" - integrity sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/plugin-syntax-numeric-separator" "^7.10.4" +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.23.9", "@babel/parser@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.7.tgz#9a5226f92f0c5c8ead550b750f5608e766c8ce85" + integrity sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw== -"@babel/plugin-proposal-object-rest-spread@^7.20.2": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz#aa662940ef425779c75534a5c41e9d936edc390a" - integrity sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg== +"@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.7.tgz#fd059fd27b184ea2b4c7e646868a9a381bbc3055" + integrity sha512-TiT1ss81W80eQsN+722OaeQMY/G4yTb4G9JrqeiDADs3N8lbPMGldWi9x8tyqCW5NLx1Jh2AvkE6r6QvEltMMQ== dependencies: - "@babel/compat-data" "^7.20.5" - "@babel/helper-compilation-targets" "^7.20.7" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.20.7" + "@babel/helper-environment-visitor" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-proposal-optional-catch-binding@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz#f9400d0e6a3ea93ba9ef70b09e72dd6da638a2cb" - integrity sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw== +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.7.tgz#468096ca44bbcbe8fcc570574e12eb1950e18107" + integrity sha512-unaQgZ/iRu/By6tsjMZzpeBZjChYfLYry6HrEXPoz3KmfF0sVBQ1l8zKMQ4xRGLWVsjuvB8nQfjNP/DcfEOCsg== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-proposal-optional-chaining@^7.18.9", "@babel/plugin-proposal-optional-chaining@^7.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.20.7.tgz#49f2b372519ab31728cc14115bb0998b15bfda55" - integrity sha512-T+A7b1kfjtRM51ssoOfS1+wbyCVqorfyZhT99TvxxLMirPShD8CzKMRepMlCBGM5RpHMbn8s+5MMHnPstJH6mQ== - dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" - -"@babel/plugin-proposal-private-methods@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz#5209de7d213457548a98436fa2882f52f4be6bea" - integrity sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA== +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.7.tgz#e4eabdd5109acc399b38d7999b2ef66fc2022f89" + integrity sha512-+izXIbke1T33mY4MSNnrqhPXDz01WYhEf3yF5NbnUtkiNnm+XBZJl3kNfoK6NKmYlz/D07+l2GWVK/QfDkNCuQ== dependencies: - "@babel/helper-create-class-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7" + "@babel/plugin-transform-optional-chaining" "^7.24.7" -"@babel/plugin-proposal-private-property-in-object@^7.18.6": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.20.5.tgz#309c7668f2263f1c711aa399b5a9a6291eef6135" - integrity sha512-Vq7b9dUA12ByzB4EjQTPo25sFhY+08pQDBSZRtUAkj7lb7jahaHR5igera16QZ+3my1nYR4dKsNdYj5IjPHilQ== +"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.24.7.tgz#71b21bb0286d5810e63a1538aa901c58e87375ec" + integrity sha512-utA4HuR6F4Vvcr+o4DnjL8fCOlgRFGbeeBEGNg3ZTrLFw6VWG5XmUrvcQ0FjIYMU2ST4XcR2Wsp7t9qOAPnxMg== dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-create-class-features-plugin" "^7.20.5" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + "@babel/helper-environment-visitor" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-proposal-unicode-property-regex@^7.18.6", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz#af613d2cd5e643643b65cded64207b15c85cb78e" - integrity sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" +"@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2": + version "7.21.0-placeholder-for-preset-env.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz#7844f9289546efa9febac2de4cfe358a050bd703" + integrity sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w== "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" @@ -676,14 +349,21 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-syntax-import-assertions@^7.20.0": - version "7.20.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz#bb50e0d4bea0957235390641209394e87bdb9cc4" - integrity sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ== +"@babel/plugin-syntax-import-assertions@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.7.tgz#2a0b406b5871a20a841240586b1300ce2088a778" + integrity sha512-Ec3NRUMoi8gskrkBe3fNmEQfxDvY8bgfQpz6jlk/41kX9eUjvpyqWU7PBP/pLAvMaSQjbMNKJmvX57jP+M6bPg== dependencies: - "@babel/helper-plugin-utils" "^7.19.0" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-syntax-import-meta@^7.8.3": +"@babel/plugin-syntax-import-attributes@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.7.tgz#b4f9ea95a79e6912480c4b626739f86a076624ca" + integrity sha512-hbX+lKKeUMGihnK8nvKqmXBInriT3GVjzXKFriV3YC6APGxMbP8RZNFwy91+hocLXq90Mta+HshoB31802bb8A== + dependencies: + "@babel/helper-plugin-utils" "^7.24.7" + +"@babel/plugin-syntax-import-meta@^7.10.4", "@babel/plugin-syntax-import-meta@^7.8.3": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== @@ -698,11 +378,11 @@ "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-jsx@^7.7.2": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz#8f2e4f8a9b5f9aa16067e142c1ac9cd9f810f473" - integrity sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg== + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.7.tgz#39a1fa4a7e3d3d7f34e2acc6be585b718d30e02d" + integrity sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-syntax-logical-assignment-operators@^7.10.4", "@babel/plugin-syntax-logical-assignment-operators@^7.8.3": version "7.10.4" @@ -761,295 +441,429 @@ "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-typescript@^7.7.2": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.23.3.tgz#24f460c85dbbc983cd2b9c4994178bcc01df958f" - integrity sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ== + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.7.tgz#58d458271b4d3b6bb27ee6ac9525acbb259bad1c" + integrity sha512-c/+fVeJBB0FeKsFvwytYiUD+LBvhHjGSI0g446PRGdSVGZLRNArBUno2PETbAly3tpiNAQR5XaZ+JslxkotsbA== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-arrow-functions@^7.18.6": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.20.7.tgz#bea332b0e8b2dab3dafe55a163d8227531ab0551" - integrity sha512-3poA5E7dzDomxj9WXWwuD6A5F3kc7VXwIJO+E+J8qtDtS+pXPAhrgEyh+9GBwBgPq1Z+bB+/JD60lp5jsN7JPQ== +"@babel/plugin-syntax-unicode-sets-regex@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz#d49a3b3e6b52e5be6740022317580234a6a47357" + integrity sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-create-regexp-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-async-to-generator@^7.18.6": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.20.7.tgz#dfee18623c8cb31deb796aa3ca84dda9cea94354" - integrity sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q== +"@babel/plugin-transform-arrow-functions@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.7.tgz#4f6886c11e423bd69f3ce51dbf42424a5f275514" + integrity sha512-Dt9LQs6iEY++gXUwY03DNFat5C2NbO48jj+j/bSAz6b3HgPs39qcPiYt77fDObIcFwj3/C2ICX9YMwGflUoSHQ== dependencies: - "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-remap-async-to-generator" "^7.18.9" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-block-scoped-functions@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz#9187bf4ba302635b9d70d986ad70f038726216a8" - integrity sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ== +"@babel/plugin-transform-async-generator-functions@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.24.7.tgz#7330a5c50e05181ca52351b8fd01642000c96cfd" + integrity sha512-o+iF77e3u7ZS4AoAuJvapz9Fm001PuD2V3Lp6OSE4FYQke+cSewYtnek+THqGRWyQloRCyvWL1OkyfNEl9vr/g== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-environment-visitor" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-remap-async-to-generator" "^7.24.7" + "@babel/plugin-syntax-async-generators" "^7.8.4" + +"@babel/plugin-transform-async-to-generator@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.7.tgz#72a3af6c451d575842a7e9b5a02863414355bdcc" + integrity sha512-SQY01PcJfmQ+4Ash7NE+rpbLFbmqA2GPIgqzxfFTL4t1FKRq4zTms/7htKpoCUI9OcFYgzqfmCdH53s6/jn5fA== + dependencies: + "@babel/helper-module-imports" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-remap-async-to-generator" "^7.24.7" + +"@babel/plugin-transform-block-scoped-functions@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.7.tgz#a4251d98ea0c0f399dafe1a35801eaba455bbf1f" + integrity sha512-yO7RAz6EsVQDaBH18IDJcMB1HnrUn2FJ/Jslc/WtPPWcjhpUJXU/rjbwmluzp7v/ZzWcEhTMXELnnsz8djWDwQ== + dependencies: + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-block-scoping@^7.20.2": - version "7.20.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.20.11.tgz#9f5a3424bd112a3f32fe0cf9364fbb155cff262a" - integrity sha512-tA4N427a7fjf1P0/2I4ScsHGc5jcHPbb30xMbaTke2gxDuWpUfXDuX1FEymJwKk4tuGUvGcejAR6HdZVqmmPyw== - dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - -"@babel/plugin-transform-classes@^7.20.2": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.20.7.tgz#f438216f094f6bb31dc266ebfab8ff05aecad073" - integrity sha512-LWYbsiXTPKl+oBlXUGlwNlJZetXD5Am+CyBdqhPsDVjM9Jc8jwBJFrKhHf900Kfk2eZG1y9MAG3UNajol7A4VQ== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-compilation-targets" "^7.20.7" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.19.0" - "@babel/helper-optimise-call-expression" "^7.18.6" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-replace-supers" "^7.20.7" - "@babel/helper-split-export-declaration" "^7.18.6" +"@babel/plugin-transform-block-scoping@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.7.tgz#42063e4deb850c7bd7c55e626bf4e7ab48e6ce02" + integrity sha512-Nd5CvgMbWc+oWzBsuaMcbwjJWAcp5qzrbg69SZdHSP7AMY0AbWFqFO0WTFCA1jxhMCwodRwvRec8k0QUbZk7RQ== + dependencies: + "@babel/helper-plugin-utils" "^7.24.7" + +"@babel/plugin-transform-class-properties@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.7.tgz#256879467b57b0b68c7ddfc5b76584f398cd6834" + integrity sha512-vKbfawVYayKcSeSR5YYzzyXvsDFWU2mD8U5TFeXtbCPLFUqe7GyCgvO6XDHzje862ODrOwy6WCPmKeWHbCFJ4w== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" + +"@babel/plugin-transform-class-static-block@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.7.tgz#c82027ebb7010bc33c116d4b5044fbbf8c05484d" + integrity sha512-HMXK3WbBPpZQufbMG4B46A90PkuuhN9vBCb5T8+VAHqvAqvcLi+2cKoukcpmUYkszLhScU3l1iudhrks3DggRQ== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + +"@babel/plugin-transform-classes@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.7.tgz#4ae6ef43a12492134138c1e45913f7c46c41b4bf" + integrity sha512-CFbbBigp8ln4FU6Bpy6g7sE8B/WmCmzvivzUC6xDAdWVsjYTXijpuuGJmYkAaoWAzcItGKT3IOAbxRItZ5HTjw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.24.7" + "@babel/helper-compilation-targets" "^7.24.7" + "@babel/helper-environment-visitor" "^7.24.7" + "@babel/helper-function-name" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-replace-supers" "^7.24.7" + "@babel/helper-split-export-declaration" "^7.24.7" globals "^11.1.0" -"@babel/plugin-transform-computed-properties@^7.18.9": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.20.7.tgz#704cc2fd155d1c996551db8276d55b9d46e4d0aa" - integrity sha512-Lz7MvBK6DTjElHAmfu6bfANzKcxpyNPeYBGEafyA6E5HtRpjpZwU+u7Qrgz/2OR0z+5TvKYbPdphfSaAcZBrYQ== +"@babel/plugin-transform-computed-properties@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.7.tgz#4cab3214e80bc71fae3853238d13d097b004c707" + integrity sha512-25cS7v+707Gu6Ds2oY6tCkUwsJ9YIDbggd9+cu9jzzDgiNq7hR/8dkzxWfKWnTic26vsI3EsCXNd4iEB6e8esQ== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/template" "^7.20.7" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/template" "^7.24.7" -"@babel/plugin-transform-destructuring@^7.20.2": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.20.7.tgz#8bda578f71620c7de7c93af590154ba331415454" - integrity sha512-Xwg403sRrZb81IVB79ZPqNQME23yhugYVqgTxAhT99h485F4f+GMELFhhOsscDUB7HCswepKeCKLn/GZvUKoBA== +"@babel/plugin-transform-destructuring@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.7.tgz#a097f25292defb6e6cc16d6333a4cfc1e3c72d9e" + integrity sha512-19eJO/8kdCQ9zISOf+SEUJM/bAUIsvY3YDnXZTupUCQ8LgrWnsG/gFB9dvXqdXnRXMAM8fvt7b0CBKQHNGy1mw== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-dotall-regex@^7.18.6", "@babel/plugin-transform-dotall-regex@^7.4.4": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz#b286b3e7aae6c7b861e45bed0a2fafd6b1a4fef8" - integrity sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg== +"@babel/plugin-transform-dotall-regex@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.7.tgz#5f8bf8a680f2116a7207e16288a5f974ad47a7a0" + integrity sha512-ZOA3W+1RRTSWvyqcMJDLqbchh7U4NRGqwRfFSVbOLS/ePIP4vHB5e8T8eXcuqyN1QkgKyj5wuW0lcS85v4CrSw== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-create-regexp-features-plugin" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-duplicate-keys@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz#687f15ee3cdad6d85191eb2a372c4528eaa0ae0e" - integrity sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw== +"@babel/plugin-transform-duplicate-keys@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.7.tgz#dd20102897c9a2324e5adfffb67ff3610359a8ee" + integrity sha512-JdYfXyCRihAe46jUIliuL2/s0x0wObgwwiGxw/UbgJBr20gQBThrokO4nYKgWkD7uBaqM7+9x5TU7NkExZJyzw== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-exponentiation-operator@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz#421c705f4521888c65e91fdd1af951bfefd4dacd" - integrity sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw== +"@babel/plugin-transform-dynamic-import@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.7.tgz#4d8b95e3bae2b037673091aa09cd33fecd6419f4" + integrity sha512-sc3X26PhZQDb3JhORmakcbvkeInvxz+A8oda99lj7J60QRuPZvNAk9wQlTBS1ZynelDrDmTU4pw1tyc5d5ZMUg== dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" -"@babel/plugin-transform-for-of@^7.18.8": - version "7.18.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.8.tgz#6ef8a50b244eb6a0bdbad0c7c61877e4e30097c1" - integrity sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ== +"@babel/plugin-transform-exponentiation-operator@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.7.tgz#b629ee22645f412024297d5245bce425c31f9b0d" + integrity sha512-Rqe/vSc9OYgDajNIK35u7ot+KeCoetqQYFXM4Epf7M7ez3lWlOjrDjrwMei6caCVhfdw+mIKD4cgdGNy5JQotQ== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-function-name@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz#cc354f8234e62968946c61a46d6365440fc764e0" - integrity sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ== +"@babel/plugin-transform-export-namespace-from@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.7.tgz#176d52d8d8ed516aeae7013ee9556d540c53f197" + integrity sha512-v0K9uNYsPL3oXZ/7F9NNIbAj2jv1whUEtyA6aujhekLs56R++JDQuzRcP2/z4WX5Vg/c5lE9uWZA0/iUoFhLTA== dependencies: - "@babel/helper-compilation-targets" "^7.18.9" - "@babel/helper-function-name" "^7.18.9" - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" -"@babel/plugin-transform-literals@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz#72796fdbef80e56fba3c6a699d54f0de557444bc" - integrity sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg== +"@babel/plugin-transform-for-of@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.7.tgz#f25b33f72df1d8be76399e1b8f3f9d366eb5bc70" + integrity sha512-wo9ogrDG1ITTTBsy46oGiN1dS9A7MROBTcYsfS8DtsImMkHk9JXJ3EWQM6X2SUw4x80uGPlwj0o00Uoc6nEE3g== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7" -"@babel/plugin-transform-member-expression-literals@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz#ac9fdc1a118620ac49b7e7a5d2dc177a1bfee88e" - integrity sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA== +"@babel/plugin-transform-function-name@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.7.tgz#6d8601fbffe665c894440ab4470bc721dd9131d6" + integrity sha512-U9FcnA821YoILngSmYkW6FjyQe2TyZD5pHt4EVIhmcTkrJw/3KqcrRSxuOo5tFZJi7TE19iDyI1u+weTI7bn2w== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-compilation-targets" "^7.24.7" + "@babel/helper-function-name" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-modules-amd@^7.19.6": - version "7.20.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.20.11.tgz#3daccca8e4cc309f03c3a0c4b41dc4b26f55214a" - integrity sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g== +"@babel/plugin-transform-json-strings@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.7.tgz#f3e9c37c0a373fee86e36880d45b3664cedaf73a" + integrity sha512-2yFnBGDvRuxAaE/f0vfBKvtnvvqU8tGpMHqMNpTN2oWMKIR3NqFkjaAgGwawhqK/pIN2T3XdjGPdaG0vDhOBGw== dependencies: - "@babel/helper-module-transforms" "^7.20.11" - "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/plugin-syntax-json-strings" "^7.8.3" -"@babel/plugin-transform-modules-commonjs@^7.19.6": - version "7.20.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.20.11.tgz#8cb23010869bf7669fd4b3098598b6b2be6dc607" - integrity sha512-S8e1f7WQ7cimJQ51JkAaDrEtohVEitXjgCGAS2N8S31Y42E+kWwfSz83LYz57QdBm7q9diARVqanIaH2oVgQnw== +"@babel/plugin-transform-literals@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.7.tgz#36b505c1e655151a9d7607799a9988fc5467d06c" + integrity sha512-vcwCbb4HDH+hWi8Pqenwnjy+UiklO4Kt1vfspcQYFhJdpthSnW8XvWGyDZWKNVrVbVViI/S7K9PDJZiUmP2fYQ== dependencies: - "@babel/helper-module-transforms" "^7.20.11" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-simple-access" "^7.20.2" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-modules-systemjs@^7.19.6": - version "7.20.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.20.11.tgz#467ec6bba6b6a50634eea61c9c232654d8a4696e" - integrity sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw== +"@babel/plugin-transform-logical-assignment-operators@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.7.tgz#a58fb6eda16c9dc8f9ff1c7b1ba6deb7f4694cb0" + integrity sha512-4D2tpwlQ1odXmTEIFWy9ELJcZHqrStlzK/dAOWYyxX3zT0iXQB6banjgeOJQXzEc4S0E0a5A+hahxPaEFYftsw== dependencies: - "@babel/helper-hoist-variables" "^7.18.6" - "@babel/helper-module-transforms" "^7.20.11" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-validator-identifier" "^7.19.1" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" -"@babel/plugin-transform-modules-umd@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz#81d3832d6034b75b54e62821ba58f28ed0aab4b9" - integrity sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ== +"@babel/plugin-transform-member-expression-literals@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.7.tgz#3b4454fb0e302e18ba4945ba3246acb1248315df" + integrity sha512-T/hRC1uqrzXMKLQ6UCwMT85S3EvqaBXDGf0FaMf4446Qx9vKwlghvee0+uuZcDUCZU5RuNi4781UQ7R308zzBw== dependencies: - "@babel/helper-module-transforms" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-named-capturing-groups-regex@^7.19.1": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.20.5.tgz#626298dd62ea51d452c3be58b285d23195ba69a8" - integrity sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA== +"@babel/plugin-transform-modules-amd@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.7.tgz#65090ed493c4a834976a3ca1cde776e6ccff32d7" + integrity sha512-9+pB1qxV3vs/8Hdmz/CulFB8w2tuu6EB94JZFsjdqxQokwGa9Unap7Bo2gGBGIvPmDIVvQrom7r5m/TCDMURhg== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.20.5" - "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-module-transforms" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-new-target@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz#d128f376ae200477f37c4ddfcc722a8a1b3246a8" - integrity sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw== +"@babel/plugin-transform-modules-commonjs@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.7.tgz#9fd5f7fdadee9085886b183f1ad13d1ab260f4ab" + integrity sha512-iFI8GDxtevHJ/Z22J5xQpVqFLlMNstcLXh994xifFwxxGslr2ZXXLWgtBeLctOD63UFDArdvN6Tg8RFw+aEmjQ== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-module-transforms" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-simple-access" "^7.24.7" -"@babel/plugin-transform-object-super@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz#fb3c6ccdd15939b6ff7939944b51971ddc35912c" - integrity sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA== +"@babel/plugin-transform-modules-systemjs@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.7.tgz#f8012316c5098f6e8dee6ecd58e2bc6f003d0ce7" + integrity sha512-GYQE0tW7YoaN13qFh3O1NCY4MPkUiAH3fiF7UcV/I3ajmDKEdG3l+UOcbAm4zUE3gnvUU+Eni7XrVKo9eO9auw== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/helper-replace-supers" "^7.18.6" + "@babel/helper-hoist-variables" "^7.24.7" + "@babel/helper-module-transforms" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-validator-identifier" "^7.24.7" -"@babel/plugin-transform-parameters@^7.20.1", "@babel/plugin-transform-parameters@^7.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.20.7.tgz#0ee349e9d1bc96e78e3b37a7af423a4078a7083f" - integrity sha512-WiWBIkeHKVOSYPO0pWkxGPfKeWrCJyD3NJ53+Lrp/QMSZbsVPovrVl2aWZ19D/LTVnaDv5Ap7GJ/B2CTOZdrfA== +"@babel/plugin-transform-modules-umd@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.7.tgz#edd9f43ec549099620df7df24e7ba13b5c76efc8" + integrity sha512-3aytQvqJ/h9z4g8AsKPLvD4Zqi2qT+L3j7XoFFu1XBlZWEl2/1kWnhmAbxpLgPrHSY0M6UA02jyTiwUVtiKR6A== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-module-transforms" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-property-literals@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz#e22498903a483448e94e032e9bbb9c5ccbfc93a3" - integrity sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg== +"@babel/plugin-transform-named-capturing-groups-regex@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.24.7.tgz#9042e9b856bc6b3688c0c2e4060e9e10b1460923" + integrity sha512-/jr7h/EWeJtk1U/uz2jlsCioHkZk1JJZVcc8oQsJ1dUlaJD83f4/6Zeh2aHt9BIFokHIsSeDfhUmju0+1GPd6g== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-create-regexp-features-plugin" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-regenerator@^7.18.6": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.20.5.tgz#57cda588c7ffb7f4f8483cc83bdcea02a907f04d" - integrity sha512-kW/oO7HPBtntbsahzQ0qSE3tFvkFwnbozz3NWFhLGqH75vLEg+sCGngLlhVkePlCs3Jv0dBBHDzCHxNiFAQKCQ== +"@babel/plugin-transform-new-target@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.7.tgz#31ff54c4e0555cc549d5816e4ab39241dfb6ab00" + integrity sha512-RNKwfRIXg4Ls/8mMTza5oPF5RkOW8Wy/WgMAp1/F1yZ8mMbtwXW+HDoJiOsagWrAhI5f57Vncrmr9XeT4CVapA== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - regenerator-transform "^0.15.1" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-reserved-words@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz#b1abd8ebf8edaa5f7fe6bbb8d2133d23b6a6f76a" - integrity sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA== +"@babel/plugin-transform-nullish-coalescing-operator@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.7.tgz#1de4534c590af9596f53d67f52a92f12db984120" + integrity sha512-Ts7xQVk1OEocqzm8rHMXHlxvsfZ0cEF2yomUqpKENHWMF4zKk175Y4q8H5knJes6PgYad50uuRmt3UJuhBw8pQ== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" -"@babel/plugin-transform-shorthand-properties@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz#6d6df7983d67b195289be24909e3f12a8f664dc9" - integrity sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw== +"@babel/plugin-transform-numeric-separator@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.7.tgz#bea62b538c80605d8a0fac9b40f48e97efa7de63" + integrity sha512-e6q1TiVUzvH9KRvicuxdBTUj4AdKSRwzIyFFnfnezpCfP2/7Qmbb8qbU2j7GODbl4JMkblitCQjKYUaX/qkkwA== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" -"@babel/plugin-transform-spread@^7.19.0": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.20.7.tgz#c2d83e0b99d3bf83e07b11995ee24bf7ca09401e" - integrity sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw== +"@babel/plugin-transform-object-rest-spread@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.7.tgz#d13a2b93435aeb8a197e115221cab266ba6e55d6" + integrity sha512-4QrHAr0aXQCEFni2q4DqKLD31n2DL+RxcwnNjDFkSG0eNQ/xCavnRkfCUjsyqGC2OviNJvZOF/mQqZBw7i2C5Q== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" + "@babel/helper-compilation-targets" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-transform-parameters" "^7.24.7" -"@babel/plugin-transform-sticky-regex@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz#c6706eb2b1524028e317720339583ad0f444adcc" - integrity sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q== +"@babel/plugin-transform-object-super@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.7.tgz#66eeaff7830bba945dd8989b632a40c04ed625be" + integrity sha512-A/vVLwN6lBrMFmMDmPPz0jnE6ZGx7Jq7d6sT/Ev4H65RER6pZ+kczlf1DthF5N0qaPHBsI7UXiE8Zy66nmAovg== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-replace-supers" "^7.24.7" -"@babel/plugin-transform-template-literals@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz#04ec6f10acdaa81846689d63fae117dd9c243a5e" - integrity sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA== +"@babel/plugin-transform-optional-catch-binding@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.7.tgz#00eabd883d0dd6a60c1c557548785919b6e717b4" + integrity sha512-uLEndKqP5BfBbC/5jTwPxLh9kqPWWgzN/f8w6UwAIirAEqiIVJWWY312X72Eub09g5KF9+Zn7+hT7sDxmhRuKA== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" -"@babel/plugin-transform-typeof-symbol@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz#c8cea68263e45addcd6afc9091429f80925762c0" - integrity sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw== +"@babel/plugin-transform-optional-chaining@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.7.tgz#b8f6848a80cf2da98a8a204429bec04756c6d454" + integrity sha512-tK+0N9yd4j+x/4hxF3F0e0fu/VdcxU18y5SevtyM/PCFlQvXbR0Zmlo2eBrKtVipGNFzpq56o8WsIIKcJFUCRQ== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" -"@babel/plugin-transform-unicode-escapes@^7.18.10": - version "7.18.10" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz#1ecfb0eda83d09bbcb77c09970c2dd55832aa246" - integrity sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ== +"@babel/plugin-transform-parameters@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.7.tgz#5881f0ae21018400e320fc7eb817e529d1254b68" + integrity sha512-yGWW5Rr+sQOhK0Ot8hjDJuxU3XLRQGflvT4lhlSY0DFvdb3TwKaY26CJzHtYllU0vT9j58hc37ndFPsqT1SrzA== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-unicode-regex@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz#194317225d8c201bbae103364ffe9e2cea36cdca" - integrity sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA== +"@babel/plugin-transform-private-methods@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.7.tgz#e6318746b2ae70a59d023d5cc1344a2ba7a75f5e" + integrity sha512-COTCOkG2hn4JKGEKBADkA8WNb35TGkkRbI5iT845dB+NyqgO8Hn+ajPbSnIQznneJTa3d30scb6iz/DhH8GsJQ== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-create-class-features-plugin" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" + +"@babel/plugin-transform-private-property-in-object@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.7.tgz#4eec6bc701288c1fab5f72e6a4bbc9d67faca061" + integrity sha512-9z76mxwnwFxMyxZWEgdgECQglF2Q7cFLm0kMf8pGwt+GSJsY0cONKj/UuO4bOH0w/uAel3ekS4ra5CEAyJRmDA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.24.7" + "@babel/helper-create-class-features-plugin" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + +"@babel/plugin-transform-property-literals@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.7.tgz#f0d2ed8380dfbed949c42d4d790266525d63bbdc" + integrity sha512-EMi4MLQSHfd2nrCqQEWxFdha2gBCqU4ZcCng4WBGZ5CJL4bBRW0ptdqqDdeirGZcpALazVVNJqRmsO8/+oNCBA== + dependencies: + "@babel/helper-plugin-utils" "^7.24.7" + +"@babel/plugin-transform-regenerator@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.7.tgz#021562de4534d8b4b1851759fd7af4e05d2c47f8" + integrity sha512-lq3fvXPdimDrlg6LWBoqj+r/DEWgONuwjuOuQCSYgRroXDH/IdM1C0IZf59fL5cHLpjEH/O6opIRBbqv7ELnuA== + dependencies: + "@babel/helper-plugin-utils" "^7.24.7" + regenerator-transform "^0.15.2" + +"@babel/plugin-transform-reserved-words@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.7.tgz#80037fe4fbf031fc1125022178ff3938bb3743a4" + integrity sha512-0DUq0pHcPKbjFZCfTss/pGkYMfy3vFWydkUBd9r0GHpIyfs2eCDENvqadMycRS9wZCXR41wucAfJHJmwA0UmoQ== + dependencies: + "@babel/helper-plugin-utils" "^7.24.7" + +"@babel/plugin-transform-shorthand-properties@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.7.tgz#85448c6b996e122fa9e289746140aaa99da64e73" + integrity sha512-KsDsevZMDsigzbA09+vacnLpmPH4aWjcZjXdyFKGzpplxhbeB4wYtury3vglQkg6KM/xEPKt73eCjPPf1PgXBA== + dependencies: + "@babel/helper-plugin-utils" "^7.24.7" + +"@babel/plugin-transform-spread@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.7.tgz#e8a38c0fde7882e0fb8f160378f74bd885cc7bb3" + integrity sha512-x96oO0I09dgMDxJaANcRyD4ellXFLLiWhuwDxKZX5g2rWP1bTPkBSwCYv96VDXVT1bD9aPj8tppr5ITIh8hBng== + dependencies: + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7" + +"@babel/plugin-transform-sticky-regex@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.7.tgz#96ae80d7a7e5251f657b5cf18f1ea6bf926f5feb" + integrity sha512-kHPSIJc9v24zEml5geKg9Mjx5ULpfncj0wRpYtxbvKyTtHCYDkVE3aHQ03FrpEo4gEe2vrJJS1Y9CJTaThA52g== + dependencies: + "@babel/helper-plugin-utils" "^7.24.7" + +"@babel/plugin-transform-template-literals@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.7.tgz#a05debb4a9072ae8f985bcf77f3f215434c8f8c8" + integrity sha512-AfDTQmClklHCOLxtGoP7HkeMw56k1/bTQjwsfhL6pppo/M4TOBSq+jjBUBLmV/4oeFg4GWMavIl44ZeCtmmZTw== + dependencies: + "@babel/helper-plugin-utils" "^7.24.7" + +"@babel/plugin-transform-typeof-symbol@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.7.tgz#f074be466580d47d6e6b27473a840c9f9ca08fb0" + integrity sha512-VtR8hDy7YLB7+Pet9IarXjg/zgCMSF+1mNS/EQEiEaUPoFXCVsHG64SIxcaaI2zJgRiv+YmgaQESUfWAdbjzgg== + dependencies: + "@babel/helper-plugin-utils" "^7.24.7" + +"@babel/plugin-transform-unicode-escapes@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.7.tgz#2023a82ced1fb4971630a2e079764502c4148e0e" + integrity sha512-U3ap1gm5+4edc2Q/P+9VrBNhGkfnf+8ZqppY71Bo/pzZmXhhLdqgaUl6cuB07O1+AQJtCLfaOmswiNbSQ9ivhw== + dependencies: + "@babel/helper-plugin-utils" "^7.24.7" + +"@babel/plugin-transform-unicode-property-regex@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.7.tgz#9073a4cd13b86ea71c3264659590ac086605bbcd" + integrity sha512-uH2O4OV5M9FZYQrwc7NdVmMxQJOCCzFeYudlZSzUAHRFeOujQefa92E74TQDVskNHCzOXoigEuoyzHDhaEaK5w== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" + +"@babel/plugin-transform-unicode-regex@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.7.tgz#dfc3d4a51127108099b19817c0963be6a2adf19f" + integrity sha512-hlQ96MBZSAXUq7ltkjtu3FJCCSMx/j629ns3hA3pXnBXjanNP0LHi+JpPeA81zaWgVK1VGH95Xuy7u0RyQ8kMg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" + +"@babel/plugin-transform-unicode-sets-regex@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.7.tgz#d40705d67523803a576e29c63cef6e516b858ed9" + integrity sha512-2G8aAvF4wy1w/AGZkemprdGMRg5o6zPNhbHVImRz3lss55TYCBd6xStN19rt8XJHq20sqV0JbyWjOWwQRwV/wg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" "@babel/preset-env@^7.20.2": - version "7.20.2" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.20.2.tgz#9b1642aa47bb9f43a86f9630011780dab7f86506" - integrity sha512-1G0efQEWR1EHkKvKHqbG+IN/QdgwfByUpM5V5QroDzGV2t3S/WXNQd693cHiHTlCFMpr9B6FkPFXDA2lQcKoDg== - dependencies: - "@babel/compat-data" "^7.20.1" - "@babel/helper-compilation-targets" "^7.20.0" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-validator-option" "^7.18.6" - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.18.6" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.18.9" - "@babel/plugin-proposal-async-generator-functions" "^7.20.1" - "@babel/plugin-proposal-class-properties" "^7.18.6" - "@babel/plugin-proposal-class-static-block" "^7.18.6" - "@babel/plugin-proposal-dynamic-import" "^7.18.6" - "@babel/plugin-proposal-export-namespace-from" "^7.18.9" - "@babel/plugin-proposal-json-strings" "^7.18.6" - "@babel/plugin-proposal-logical-assignment-operators" "^7.18.9" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.18.6" - "@babel/plugin-proposal-numeric-separator" "^7.18.6" - "@babel/plugin-proposal-object-rest-spread" "^7.20.2" - "@babel/plugin-proposal-optional-catch-binding" "^7.18.6" - "@babel/plugin-proposal-optional-chaining" "^7.18.9" - "@babel/plugin-proposal-private-methods" "^7.18.6" - "@babel/plugin-proposal-private-property-in-object" "^7.18.6" - "@babel/plugin-proposal-unicode-property-regex" "^7.18.6" + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.24.7.tgz#ff067b4e30ba4a72f225f12f123173e77b987f37" + integrity sha512-1YZNsc+y6cTvWlDHidMBsQZrZfEFjRIo/BZCT906PMdzOyXtSLTgqGdrpcuTDCXyd11Am5uQULtDIcCfnTc8fQ== + dependencies: + "@babel/compat-data" "^7.24.7" + "@babel/helper-compilation-targets" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-validator-option" "^7.24.7" + "@babel/plugin-bugfix-firefox-class-in-computed-class-key" "^7.24.7" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.24.7" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.24.7" + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly" "^7.24.7" + "@babel/plugin-proposal-private-property-in-object" "7.21.0-placeholder-for-preset-env.2" "@babel/plugin-syntax-async-generators" "^7.8.4" "@babel/plugin-syntax-class-properties" "^7.12.13" "@babel/plugin-syntax-class-static-block" "^7.14.5" "@babel/plugin-syntax-dynamic-import" "^7.8.3" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - "@babel/plugin-syntax-import-assertions" "^7.20.0" + "@babel/plugin-syntax-import-assertions" "^7.24.7" + "@babel/plugin-syntax-import-attributes" "^7.24.7" + "@babel/plugin-syntax-import-meta" "^7.10.4" "@babel/plugin-syntax-json-strings" "^7.8.3" "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" @@ -1059,171 +873,115 @@ "@babel/plugin-syntax-optional-chaining" "^7.8.3" "@babel/plugin-syntax-private-property-in-object" "^7.14.5" "@babel/plugin-syntax-top-level-await" "^7.14.5" - "@babel/plugin-transform-arrow-functions" "^7.18.6" - "@babel/plugin-transform-async-to-generator" "^7.18.6" - "@babel/plugin-transform-block-scoped-functions" "^7.18.6" - "@babel/plugin-transform-block-scoping" "^7.20.2" - "@babel/plugin-transform-classes" "^7.20.2" - "@babel/plugin-transform-computed-properties" "^7.18.9" - "@babel/plugin-transform-destructuring" "^7.20.2" - "@babel/plugin-transform-dotall-regex" "^7.18.6" - "@babel/plugin-transform-duplicate-keys" "^7.18.9" - "@babel/plugin-transform-exponentiation-operator" "^7.18.6" - "@babel/plugin-transform-for-of" "^7.18.8" - "@babel/plugin-transform-function-name" "^7.18.9" - "@babel/plugin-transform-literals" "^7.18.9" - "@babel/plugin-transform-member-expression-literals" "^7.18.6" - "@babel/plugin-transform-modules-amd" "^7.19.6" - "@babel/plugin-transform-modules-commonjs" "^7.19.6" - "@babel/plugin-transform-modules-systemjs" "^7.19.6" - "@babel/plugin-transform-modules-umd" "^7.18.6" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.19.1" - "@babel/plugin-transform-new-target" "^7.18.6" - "@babel/plugin-transform-object-super" "^7.18.6" - "@babel/plugin-transform-parameters" "^7.20.1" - "@babel/plugin-transform-property-literals" "^7.18.6" - "@babel/plugin-transform-regenerator" "^7.18.6" - "@babel/plugin-transform-reserved-words" "^7.18.6" - "@babel/plugin-transform-shorthand-properties" "^7.18.6" - "@babel/plugin-transform-spread" "^7.19.0" - "@babel/plugin-transform-sticky-regex" "^7.18.6" - "@babel/plugin-transform-template-literals" "^7.18.9" - "@babel/plugin-transform-typeof-symbol" "^7.18.9" - "@babel/plugin-transform-unicode-escapes" "^7.18.10" - "@babel/plugin-transform-unicode-regex" "^7.18.6" - "@babel/preset-modules" "^0.1.5" - "@babel/types" "^7.20.2" - babel-plugin-polyfill-corejs2 "^0.3.3" - babel-plugin-polyfill-corejs3 "^0.6.0" - babel-plugin-polyfill-regenerator "^0.4.1" - core-js-compat "^3.25.1" - semver "^6.3.0" + "@babel/plugin-syntax-unicode-sets-regex" "^7.18.6" + "@babel/plugin-transform-arrow-functions" "^7.24.7" + "@babel/plugin-transform-async-generator-functions" "^7.24.7" + "@babel/plugin-transform-async-to-generator" "^7.24.7" + "@babel/plugin-transform-block-scoped-functions" "^7.24.7" + "@babel/plugin-transform-block-scoping" "^7.24.7" + "@babel/plugin-transform-class-properties" "^7.24.7" + "@babel/plugin-transform-class-static-block" "^7.24.7" + "@babel/plugin-transform-classes" "^7.24.7" + "@babel/plugin-transform-computed-properties" "^7.24.7" + "@babel/plugin-transform-destructuring" "^7.24.7" + "@babel/plugin-transform-dotall-regex" "^7.24.7" + "@babel/plugin-transform-duplicate-keys" "^7.24.7" + "@babel/plugin-transform-dynamic-import" "^7.24.7" + "@babel/plugin-transform-exponentiation-operator" "^7.24.7" + "@babel/plugin-transform-export-namespace-from" "^7.24.7" + "@babel/plugin-transform-for-of" "^7.24.7" + "@babel/plugin-transform-function-name" "^7.24.7" + "@babel/plugin-transform-json-strings" "^7.24.7" + "@babel/plugin-transform-literals" "^7.24.7" + "@babel/plugin-transform-logical-assignment-operators" "^7.24.7" + "@babel/plugin-transform-member-expression-literals" "^7.24.7" + "@babel/plugin-transform-modules-amd" "^7.24.7" + "@babel/plugin-transform-modules-commonjs" "^7.24.7" + "@babel/plugin-transform-modules-systemjs" "^7.24.7" + "@babel/plugin-transform-modules-umd" "^7.24.7" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.24.7" + "@babel/plugin-transform-new-target" "^7.24.7" + "@babel/plugin-transform-nullish-coalescing-operator" "^7.24.7" + "@babel/plugin-transform-numeric-separator" "^7.24.7" + "@babel/plugin-transform-object-rest-spread" "^7.24.7" + "@babel/plugin-transform-object-super" "^7.24.7" + "@babel/plugin-transform-optional-catch-binding" "^7.24.7" + "@babel/plugin-transform-optional-chaining" "^7.24.7" + "@babel/plugin-transform-parameters" "^7.24.7" + "@babel/plugin-transform-private-methods" "^7.24.7" + "@babel/plugin-transform-private-property-in-object" "^7.24.7" + "@babel/plugin-transform-property-literals" "^7.24.7" + "@babel/plugin-transform-regenerator" "^7.24.7" + "@babel/plugin-transform-reserved-words" "^7.24.7" + "@babel/plugin-transform-shorthand-properties" "^7.24.7" + "@babel/plugin-transform-spread" "^7.24.7" + "@babel/plugin-transform-sticky-regex" "^7.24.7" + "@babel/plugin-transform-template-literals" "^7.24.7" + "@babel/plugin-transform-typeof-symbol" "^7.24.7" + "@babel/plugin-transform-unicode-escapes" "^7.24.7" + "@babel/plugin-transform-unicode-property-regex" "^7.24.7" + "@babel/plugin-transform-unicode-regex" "^7.24.7" + "@babel/plugin-transform-unicode-sets-regex" "^7.24.7" + "@babel/preset-modules" "0.1.6-no-external-plugins" + babel-plugin-polyfill-corejs2 "^0.4.10" + babel-plugin-polyfill-corejs3 "^0.10.4" + babel-plugin-polyfill-regenerator "^0.6.1" + core-js-compat "^3.31.0" + semver "^6.3.1" -"@babel/preset-modules@^0.1.5": - version "0.1.5" - resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.5.tgz#ef939d6e7f268827e1841638dc6ff95515e115d9" - integrity sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA== +"@babel/preset-modules@0.1.6-no-external-plugins": + version "0.1.6-no-external-plugins" + resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz#ccb88a2c49c817236861fee7826080573b8a923a" + integrity sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA== dependencies: "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" - "@babel/plugin-transform-dotall-regex" "^7.4.4" "@babel/types" "^7.4.4" esutils "^2.0.2" -"@babel/runtime@^7.12.5", "@babel/runtime@^7.9.2": - version "7.23.8" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.23.8.tgz#8ee6fe1ac47add7122902f257b8ddf55c898f650" - integrity sha512-Y7KbAP984rn1VGMbGqKmBLio9V7y5Je9GvU4rQPCPinCyNfUcToxIXl06d59URp/F3LwinvODxab5N/G6qggkw== - dependencies: - regenerator-runtime "^0.14.0" - -"@babel/runtime@^7.8.4": - version "7.20.13" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.20.13.tgz#7055ab8a7cff2b8f6058bf6ae45ff84ad2aded4b" - integrity sha512-gt3PKXs0DBoL9xCvOIIZ2NEqAGZqHjAnmVbfQtB620V0uReIQutpel14KcneZuer7UioY8ALKZ7iocavvzTNFA== - dependencies: - regenerator-runtime "^0.13.11" +"@babel/regjsgen@^0.8.0": + version "0.8.0" + resolved "https://registry.yarnpkg.com/@babel/regjsgen/-/regjsgen-0.8.0.tgz#f0ba69b075e1f05fb2825b7fad991e7adbb18310" + integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== -"@babel/template@^7.18.10", "@babel/template@^7.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.20.7.tgz#a15090c2839a83b02aa996c0b4994005841fd5a8" - integrity sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw== +"@babel/runtime@^7.12.5", "@babel/runtime@^7.8.4", "@babel/runtime@^7.9.2": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.7.tgz#f4f0d5530e8dbdf59b3451b9b3e594b6ba082e12" + integrity sha512-UwgBRMjJP+xv857DCngvqXI3Iq6J4v0wXmwc6sapg+zyhbwmQX67LUEFrkK5tbyJ30jGuG3ZvWpBiB9LCy1kWw== dependencies: - "@babel/code-frame" "^7.18.6" - "@babel/parser" "^7.20.7" - "@babel/types" "^7.20.7" - -"@babel/template@^7.22.15", "@babel/template@^7.23.9": - version "7.23.9" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.23.9.tgz#f881d0487cba2828d3259dcb9ef5005a9731011a" - integrity sha512-+xrD2BWLpvHKNmX2QbpdpsBaWnRxahMwJjO+KZk2JOElj5nSmKezyS1B4u+QbHMTX69t4ukm6hh9lsYQ7GHCKA== - dependencies: - "@babel/code-frame" "^7.23.5" - "@babel/parser" "^7.23.9" - "@babel/types" "^7.23.9" - -"@babel/template@^7.3.3": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.15.tgz#09576efc3830f0430f4548ef971dde1350ef2f38" - integrity sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w== - dependencies: - "@babel/code-frame" "^7.22.13" - "@babel/parser" "^7.22.15" - "@babel/types" "^7.22.15" - -"@babel/traverse@^7.20.10", "@babel/traverse@^7.20.12", "@babel/traverse@^7.20.13", "@babel/traverse@^7.20.5", "@babel/traverse@^7.20.7": - version "7.20.13" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.20.13.tgz#817c1ba13d11accca89478bd5481b2d168d07473" - integrity sha512-kMJXfF0T6DIS9E8cgdLCSAL+cuCK+YEZHWiLK0SXpTo8YRj5lpJu3CDNKiIBCne4m9hhTIqUg6SYTAI39tAiVQ== - dependencies: - "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.20.7" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.19.0" - "@babel/helper-hoist-variables" "^7.18.6" - "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/parser" "^7.20.13" - "@babel/types" "^7.20.7" - debug "^4.1.0" - globals "^11.1.0" - -"@babel/traverse@^7.23.7": - version "7.23.7" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.7.tgz#9a7bf285c928cb99b5ead19c3b1ce5b310c9c305" - integrity sha512-tY3mM8rH9jM0YHFGyfC0/xf+SB5eKUu7HPj7/k3fpi9dAlsMc5YbQvDi0Sh2QTPXqMhyaAtzAr807TIyfQrmyg== - dependencies: - "@babel/code-frame" "^7.23.5" - "@babel/generator" "^7.23.6" - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-function-name" "^7.23.0" - "@babel/helper-hoist-variables" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/parser" "^7.23.6" - "@babel/types" "^7.23.6" - debug "^4.3.1" - globals "^11.1.0" + regenerator-runtime "^0.14.0" -"@babel/traverse@^7.23.9": - version "7.23.9" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.9.tgz#2f9d6aead6b564669394c5ce0f9302bb65b9d950" - integrity sha512-I/4UJ9vs90OkBtY6iiiTORVMyIhJ4kAVmsKo9KFc8UOxMeUfi2hvtIBsET5u9GizXE6/GFSuKCTNfgCswuEjRg== - dependencies: - "@babel/code-frame" "^7.23.5" - "@babel/generator" "^7.23.6" - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-function-name" "^7.23.0" - "@babel/helper-hoist-variables" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/parser" "^7.23.9" - "@babel/types" "^7.23.9" +"@babel/template@^7.24.7", "@babel/template@^7.3.3": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.24.7.tgz#02efcee317d0609d2c07117cb70ef8fb17ab7315" + integrity sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig== + dependencies: + "@babel/code-frame" "^7.24.7" + "@babel/parser" "^7.24.7" + "@babel/types" "^7.24.7" + +"@babel/traverse@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.24.7.tgz#de2b900163fa741721ba382163fe46a936c40cf5" + integrity sha512-yb65Ed5S/QAcewNPh0nZczy9JdYXkkAbIsEo+P7BE7yO3txAY30Y/oPa3QkQ5It3xVG2kpKMg9MsdxZaO31uKA== + dependencies: + "@babel/code-frame" "^7.24.7" + "@babel/generator" "^7.24.7" + "@babel/helper-environment-visitor" "^7.24.7" + "@babel/helper-function-name" "^7.24.7" + "@babel/helper-hoist-variables" "^7.24.7" + "@babel/helper-split-export-declaration" "^7.24.7" + "@babel/parser" "^7.24.7" + "@babel/types" "^7.24.7" debug "^4.3.1" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.3.3": - version "7.23.6" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.6.tgz#be33fdb151e1f5a56877d704492c240fc71c7ccd" - integrity sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg== +"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.24.7", "@babel/types@^7.3.3", "@babel/types@^7.4.4": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.24.7.tgz#6027fe12bc1aa724cd32ab113fb7f1988f1f66f2" + integrity sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q== dependencies: - "@babel/helper-string-parser" "^7.23.4" - "@babel/helper-validator-identifier" "^7.22.20" - to-fast-properties "^2.0.0" - -"@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.19.0", "@babel/types@^7.20.0", "@babel/types@^7.20.2", "@babel/types@^7.20.5", "@babel/types@^7.20.7", "@babel/types@^7.4.4": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.20.7.tgz#54ec75e252318423fc07fb644dc6a58a64c09b7f" - integrity sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg== - dependencies: - "@babel/helper-string-parser" "^7.19.4" - "@babel/helper-validator-identifier" "^7.19.1" - to-fast-properties "^2.0.0" - -"@babel/types@^7.22.15", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.23.6", "@babel/types@^7.23.9": - version "7.23.9" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.9.tgz#1dd7b59a9a2b5c87f8b41e52770b5ecbf492e002" - integrity sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q== - dependencies: - "@babel/helper-string-parser" "^7.23.4" - "@babel/helper-validator-identifier" "^7.22.20" + "@babel/helper-string-parser" "^7.24.7" + "@babel/helper-validator-identifier" "^7.24.7" to-fast-properties "^2.0.0" "@bcoe/v8-coverage@^0.2.3": @@ -1305,7 +1063,7 @@ js-yaml "^3.13.1" resolve-from "^5.0.0" -"@istanbuljs/schema@^0.1.2": +"@istanbuljs/schema@^0.1.2", "@istanbuljs/schema@^0.1.3": version "0.1.3" resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== @@ -1356,12 +1114,12 @@ slash "^3.0.0" strip-ansi "^6.0.0" -"@jest/create-cache-key-function@^27.4.2": - version "27.5.1" - resolved "https://registry.yarnpkg.com/@jest/create-cache-key-function/-/create-cache-key-function-27.5.1.tgz#7448fae15602ea95c828f5eceed35c202a820b31" - integrity sha512-dmH1yW+makpTSURTy8VzdUwFnfQh1G8R+DxO2Ho2FFmBbKFEVm+3jWdvFhE2VqB/LATCTokkP0dotjyQyw5/AQ== +"@jest/create-cache-key-function@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/create-cache-key-function/-/create-cache-key-function-29.7.0.tgz#793be38148fab78e65f40ae30c36785f4ad859f0" + integrity sha512-4QqS3LY5PBmTRHj9sAg1HLoPzqAI0uOX6wI/TRqHIcOxlFidy6YEmCQJk6FSZjNLGCeubDMfmkWL+qaLKhSGQA== dependencies: - "@jest/types" "^27.5.1" + "@jest/types" "^29.6.3" "@jest/environment@^29.7.0": version "29.7.0" @@ -1497,17 +1255,6 @@ slash "^3.0.0" write-file-atomic "^4.0.2" -"@jest/types@^27.5.1": - version "27.5.1" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-27.5.1.tgz#3c79ec4a8ba61c170bf937bcf9e98a9df175ec80" - integrity sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw== - dependencies: - "@types/istanbul-lib-coverage" "^2.0.0" - "@types/istanbul-reports" "^3.0.0" - "@types/node" "*" - "@types/yargs" "^16.0.0" - chalk "^4.0.0" - "@jest/types@^29.6.3": version "29.6.3" resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.6.3.tgz#1131f8cf634e7e84c5e77bab12f052af585fba59" @@ -1520,52 +1267,34 @@ "@types/yargs" "^17.0.8" chalk "^4.0.0" -"@jridgewell/gen-mapping@^0.1.0": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz#e5d2e450306a9491e3bd77e323e38d7aff315996" - integrity sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w== +"@jridgewell/gen-mapping@^0.3.5": + version "0.3.5" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz#dcce6aff74bdf6dad1a95802b69b04a2fcb1fb36" + integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg== dependencies: - "@jridgewell/set-array" "^1.0.0" + "@jridgewell/set-array" "^1.2.1" "@jridgewell/sourcemap-codec" "^1.4.10" - -"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": - version "0.3.2" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9" - integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A== - dependencies: - "@jridgewell/set-array" "^1.0.1" - "@jridgewell/sourcemap-codec" "^1.4.10" - "@jridgewell/trace-mapping" "^0.3.9" - -"@jridgewell/resolve-uri@3.1.0": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" - integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== + "@jridgewell/trace-mapping" "^0.3.24" "@jridgewell/resolve-uri@^3.0.3", "@jridgewell/resolve-uri@^3.1.0": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721" - integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== + version "3.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" + integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== -"@jridgewell/set-array@^1.0.0", "@jridgewell/set-array@^1.0.1": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" - integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== +"@jridgewell/set-array@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280" + integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== -"@jridgewell/source-map@^0.3.2": - version "0.3.2" - resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.2.tgz#f45351aaed4527a298512ec72f81040c998580fb" - integrity sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw== +"@jridgewell/source-map@^0.3.3": + version "0.3.6" + resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.6.tgz#9d71ca886e32502eb9362c9a74a46787c36df81a" + integrity sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ== dependencies: - "@jridgewell/gen-mapping" "^0.3.0" - "@jridgewell/trace-mapping" "^0.3.9" + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.25" -"@jridgewell/sourcemap-codec@1.4.14", "@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.13": - version "1.4.14" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" - integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== - -"@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.4.15": +"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.13", "@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.4.15": version "1.4.15" resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== @@ -1578,30 +1307,14 @@ "@jridgewell/resolve-uri" "^3.0.3" "@jridgewell/sourcemap-codec" "^1.4.10" -"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.18": - version "0.3.20" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz#72e45707cf240fa6b081d0366f8265b0cd10197f" - integrity sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q== - dependencies: - "@jridgewell/resolve-uri" "^3.1.0" - "@jridgewell/sourcemap-codec" "^1.4.14" - -"@jridgewell/trace-mapping@^0.3.17": - version "0.3.22" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.22.tgz#72a621e5de59f5f1ef792d0793a82ee20f645e4c" - integrity sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw== +"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.18", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": + version "0.3.25" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" + integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== dependencies: "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" -"@jridgewell/trace-mapping@^0.3.9": - version "0.3.17" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz#793041277af9073b0951a7fe0f0d8c4c98c36985" - integrity sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g== - dependencies: - "@jridgewell/resolve-uri" "3.1.0" - "@jridgewell/sourcemap-codec" "1.4.14" - "@ktsstudio/mediaproject-utils@^6.0.0": version "6.0.0" resolved "https://registry.yarnpkg.com/@ktsstudio/mediaproject-utils/-/mediaproject-utils-6.0.0.tgz#a1cb1f4f381b5346cd2edcca46f7bb71c4a68d86" @@ -1643,15 +1356,7 @@ resolved "https://registry.yarnpkg.com/@pkgr/core/-/core-0.1.1.tgz#1ec17e2edbec25c8306d424ecfbf13c7de1aaa31" integrity sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA== -"@rollup/plugin-babel@^6.0.3": - version "6.0.3" - resolved "https://registry.yarnpkg.com/@rollup/plugin-babel/-/plugin-babel-6.0.3.tgz#07ccde15de278c581673034ad6accdb4a153dfeb" - integrity sha512-fKImZKppa1A/gX73eg4JGo+8kQr/q1HBQaCGKECZ0v4YBBv3lFqi14+7xyApECzvkLTHCifx+7ntcrvtBIRcpg== - dependencies: - "@babel/helper-module-imports" "^7.18.6" - "@rollup/pluginutils" "^5.0.1" - -"@rollup/plugin-babel@^6.0.4": +"@rollup/plugin-babel@^6.0.3", "@rollup/plugin-babel@^6.0.4": version "6.0.4" resolved "https://registry.yarnpkg.com/@rollup/plugin-babel/-/plugin-babel-6.0.4.tgz#bd698e351fa9aa9619fcae780aea2a603d98e4c4" integrity sha512-YF7Y52kFdFT/xVSuVdjkV5ZdX/3YtmX0QulG+x0taQOtJdHYzVU61aSSkAgVJ7NOv6qPkIYiJSgSWWN/DM5sGw== @@ -1660,9 +1365,9 @@ "@rollup/pluginutils" "^5.0.1" "@rollup/plugin-commonjs@^24.0.1": - version "24.0.1" - resolved "https://registry.yarnpkg.com/@rollup/plugin-commonjs/-/plugin-commonjs-24.0.1.tgz#d54ba26a3e3c495dc332bd27a81f7e9e2df46f90" - integrity sha512-15LsiWRZk4eOGqvrJyu3z3DaBu5BhXIMeWnijSRvd8irrrg9SHpQ1pH+BUK4H6Z9wL9yOxZJMTLU+Au86XHxow== + version "24.1.0" + resolved "https://registry.yarnpkg.com/@rollup/plugin-commonjs/-/plugin-commonjs-24.1.0.tgz#79e54bd83bb64396761431eee6c44152ef322100" + integrity sha512-eSL45hjhCWI0jCCXcNtLVqM5N1JlBGvlFfY0m6oOYnLCJ6N0qEXoZql4sY2MOUArzhH4SA/qBpTxvvZp2Sc+DQ== dependencies: "@rollup/pluginutils" "^5.0.1" commondir "^1.0.1" @@ -1672,9 +1377,9 @@ magic-string "^0.27.0" "@rollup/plugin-commonjs@^25.0.7": - version "25.0.7" - resolved "https://registry.yarnpkg.com/@rollup/plugin-commonjs/-/plugin-commonjs-25.0.7.tgz#145cec7589ad952171aeb6a585bbeabd0fd3b4cf" - integrity sha512-nEvcR+LRjEjsaSsc4x3XZfCCvZIaSMenZu/OiwOKGN2UhQpAYI7ru7czFvyWbErlpoGjnSX3D5Ch5FcMA3kRWQ== + version "25.0.8" + resolved "https://registry.yarnpkg.com/@rollup/plugin-commonjs/-/plugin-commonjs-25.0.8.tgz#c77e608ab112a666b7f2a6bea625c73224f7dd34" + integrity sha512-ZEZWTK5n6Qde0to4vS9Mr5x/0UZoqCxPVR9KRUjU4kA2sO7GEUn1fop0DAwpO6z0Nw/kJON9bDmSxdWxO/TT1A== dependencies: "@rollup/pluginutils" "^5.0.1" commondir "^1.0.1" @@ -1683,19 +1388,7 @@ is-reference "1.2.1" magic-string "^0.30.3" -"@rollup/plugin-node-resolve@^15.0.1": - version "15.0.1" - resolved "https://registry.yarnpkg.com/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.0.1.tgz#72be449b8e06f6367168d5b3cd5e2802e0248971" - integrity sha512-ReY88T7JhJjeRVbfCyNj+NXAG3IIsVMsX9b5/9jC98dRP8/yxlZdz7mHZbHk5zHr24wZZICS5AcXsFZAXYUQEg== - dependencies: - "@rollup/pluginutils" "^5.0.1" - "@types/resolve" "1.20.2" - deepmerge "^4.2.2" - is-builtin-module "^3.2.0" - is-module "^1.0.0" - resolve "^1.22.1" - -"@rollup/plugin-node-resolve@^15.2.3": +"@rollup/plugin-node-resolve@^15.0.1", "@rollup/plugin-node-resolve@^15.2.3": version "15.2.3" resolved "https://registry.yarnpkg.com/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.2.3.tgz#e5e0b059bd85ca57489492f295ce88c2d4b0daf9" integrity sha512-j/lym8nf5E21LwBT4Df1VD6hRO2L2iwUeUmP7litikRsVp1H6NWx20NEp0Y7su+7XGc476GnXXc4kFeZNGmaSQ== @@ -1708,23 +1401,15 @@ resolve "^1.22.1" "@rollup/plugin-terser@^0.4.0": - version "0.4.0" - resolved "https://registry.yarnpkg.com/@rollup/plugin-terser/-/plugin-terser-0.4.0.tgz#4c76249ad337f3eb04ab409332f23717af2c1fbf" - integrity sha512-Ipcf3LPNerey1q9ZMjiaWHlNPEHNU/B5/uh9zXLltfEQ1lVSLLeZSgAtTPWGyw8Ip1guOeq+mDtdOlEj/wNxQw== + version "0.4.4" + resolved "https://registry.yarnpkg.com/@rollup/plugin-terser/-/plugin-terser-0.4.4.tgz#15dffdb3f73f121aa4fbb37e7ca6be9aeea91962" + integrity sha512-XHeJC5Bgvs8LfukDwWZp7yeqin6ns8RTl2B9avbejt6tZqsqvVoWI7ZTQrcNsfKEDWBTnTxM8nMDkO2IFFbd0A== dependencies: - serialize-javascript "^6.0.0" - smob "^0.0.6" - terser "^5.15.1" + serialize-javascript "^6.0.1" + smob "^1.0.0" + terser "^5.17.4" -"@rollup/plugin-typescript@^11.0.0": - version "11.0.0" - resolved "https://registry.yarnpkg.com/@rollup/plugin-typescript/-/plugin-typescript-11.0.0.tgz#f136272d1df5209daca0cb6f171c574b1d505545" - integrity sha512-goPyCWBiimk1iJgSTgsehFD5OOFHiAknrRJjqFCudcW8JtWiBlK284Xnn4flqMqg6YAjVG/EE+3aVzrL5qNSzQ== - dependencies: - "@rollup/pluginutils" "^5.0.1" - resolve "^1.22.1" - -"@rollup/plugin-typescript@^11.1.6": +"@rollup/plugin-typescript@^11.0.0", "@rollup/plugin-typescript@^11.1.6": version "11.1.6" resolved "https://registry.yarnpkg.com/@rollup/plugin-typescript/-/plugin-typescript-11.1.6.tgz#724237d5ec12609ec01429f619d2a3e7d4d1b22b" integrity sha512-R92yOmIACgYdJ7dJ97p4K69I8gg6IEHt8M7dUBxN3W6nrO8uUxX5ixl0yU/N3aZTi8WhPuICvOHXQvF6FaykAA== @@ -1732,16 +1417,7 @@ "@rollup/pluginutils" "^5.1.0" resolve "^1.22.1" -"@rollup/pluginutils@^5.0.1": - version "5.0.2" - resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-5.0.2.tgz#012b8f53c71e4f6f9cb317e311df1404f56e7a33" - integrity sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA== - dependencies: - "@types/estree" "^1.0.0" - estree-walker "^2.0.2" - picomatch "^2.3.1" - -"@rollup/pluginutils@^5.1.0": +"@rollup/pluginutils@^5.0.1", "@rollup/pluginutils@^5.1.0": version "5.1.0" resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-5.1.0.tgz#7e53eddc8c7f483a4ad0b94afb1f7f5fd3c771e0" integrity sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g== @@ -1750,70 +1426,85 @@ estree-walker "^2.0.2" picomatch "^2.3.1" -"@rollup/rollup-android-arm-eabi@4.9.6": - version "4.9.6" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.9.6.tgz#66b8d9cb2b3a474d115500f9ebaf43e2126fe496" - integrity sha512-MVNXSSYN6QXOulbHpLMKYi60ppyO13W9my1qogeiAqtjb2yR4LSmfU2+POvDkLzhjYLXz9Rf9+9a3zFHW1Lecg== - -"@rollup/rollup-android-arm64@4.9.6": - version "4.9.6" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.9.6.tgz#46327d5b86420d2307946bec1535fdf00356e47d" - integrity sha512-T14aNLpqJ5wzKNf5jEDpv5zgyIqcpn1MlwCrUXLrwoADr2RkWA0vOWP4XxbO9aiO3dvMCQICZdKeDrFl7UMClw== - -"@rollup/rollup-darwin-arm64@4.9.6": - version "4.9.6" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.9.6.tgz#166987224d2f8b1e2fd28ee90c447d52271d5e90" - integrity sha512-CqNNAyhRkTbo8VVZ5R85X73H3R5NX9ONnKbXuHisGWC0qRbTTxnF1U4V9NafzJbgGM0sHZpdO83pLPzq8uOZFw== - -"@rollup/rollup-darwin-x64@4.9.6": - version "4.9.6" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.9.6.tgz#a2e6e096f74ccea6e2f174454c26aef6bcdd1274" - integrity sha512-zRDtdJuRvA1dc9Mp6BWYqAsU5oeLixdfUvkTHuiYOHwqYuQ4YgSmi6+/lPvSsqc/I0Omw3DdICx4Tfacdzmhog== - -"@rollup/rollup-linux-arm-gnueabihf@4.9.6": - version "4.9.6" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.9.6.tgz#09fcd4c55a2d6160c5865fec708a8e5287f30515" - integrity sha512-oNk8YXDDnNyG4qlNb6is1ojTOGL/tRhbbKeE/YuccItzerEZT68Z9gHrY3ROh7axDc974+zYAPxK5SH0j/G+QQ== - -"@rollup/rollup-linux-arm64-gnu@4.9.6": - version "4.9.6" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.9.6.tgz#19a3c0b6315c747ca9acf86e9b710cc2440f83c9" - integrity sha512-Z3O60yxPtuCYobrtzjo0wlmvDdx2qZfeAWTyfOjEDqd08kthDKexLpV97KfAeUXPosENKd8uyJMRDfFMxcYkDQ== - -"@rollup/rollup-linux-arm64-musl@4.9.6": - version "4.9.6" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.9.6.tgz#94aaf95fdaf2ad9335983a4552759f98e6b2e850" - integrity sha512-gpiG0qQJNdYEVad+1iAsGAbgAnZ8j07FapmnIAQgODKcOTjLEWM9sRb+MbQyVsYCnA0Im6M6QIq6ax7liws6eQ== - -"@rollup/rollup-linux-riscv64-gnu@4.9.6": - version "4.9.6" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.9.6.tgz#160510e63f4b12618af4013bddf1761cf9fc9880" - integrity sha512-+uCOcvVmFUYvVDr27aiyun9WgZk0tXe7ThuzoUTAukZJOwS5MrGbmSlNOhx1j80GdpqbOty05XqSl5w4dQvcOA== - -"@rollup/rollup-linux-x64-gnu@4.9.6": - version "4.9.6" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.9.6.tgz#5ac5d068ce0726bd0a96ca260d5bd93721c0cb98" - integrity sha512-HUNqM32dGzfBKuaDUBqFB7tP6VMN74eLZ33Q9Y1TBqRDn+qDonkAUyKWwF9BR9unV7QUzffLnz9GrnKvMqC/fw== - -"@rollup/rollup-linux-x64-musl@4.9.6": - version "4.9.6" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.9.6.tgz#bafa759ab43e8eab9edf242a8259ffb4f2a57a5d" - integrity sha512-ch7M+9Tr5R4FK40FHQk8VnML0Szi2KRujUgHXd/HjuH9ifH72GUmw6lStZBo3c3GB82vHa0ZoUfjfcM7JiiMrQ== - -"@rollup/rollup-win32-arm64-msvc@4.9.6": - version "4.9.6" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.9.6.tgz#1cc3416682e5a20d8f088f26657e6e47f8db468e" - integrity sha512-VD6qnR99dhmTQ1mJhIzXsRcTBvTjbfbGGwKAHcu+52cVl15AC/kplkhxzW/uT0Xl62Y/meBKDZvoJSJN+vTeGA== - -"@rollup/rollup-win32-ia32-msvc@4.9.6": - version "4.9.6" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.9.6.tgz#7d2251e1aa5e8a1e47c86891fe4547a939503461" - integrity sha512-J9AFDq/xiRI58eR2NIDfyVmTYGyIZmRcvcAoJ48oDld/NTR8wyiPUu2X/v1navJ+N/FGg68LEbX3Ejd6l8B7MQ== - -"@rollup/rollup-win32-x64-msvc@4.9.6": - version "4.9.6" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.9.6.tgz#2c1fb69e02a3f1506f52698cfdc3a8b6386df9a6" - integrity sha512-jqzNLhNDvIZOrt69Ce4UjGRpXJBzhUBzawMwnaDAwyHriki3XollsewxWzOzz+4yOFDkuJHtTsZFwMxhYJWmLQ== +"@rollup/rollup-android-arm-eabi@4.18.0": + version "4.18.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.18.0.tgz#bbd0e616b2078cd2d68afc9824d1fadb2f2ffd27" + integrity sha512-Tya6xypR10giZV1XzxmH5wr25VcZSncG0pZIjfePT0OVBvqNEurzValetGNarVrGiq66EBVAFn15iYX4w6FKgQ== + +"@rollup/rollup-android-arm64@4.18.0": + version "4.18.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.18.0.tgz#97255ef6384c5f73f4800c0de91f5f6518e21203" + integrity sha512-avCea0RAP03lTsDhEyfy+hpfr85KfyTctMADqHVhLAF3MlIkq83CP8UfAHUssgXTYd+6er6PaAhx/QGv4L1EiA== + +"@rollup/rollup-darwin-arm64@4.18.0": + version "4.18.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.18.0.tgz#b6dd74e117510dfe94541646067b0545b42ff096" + integrity sha512-IWfdwU7KDSm07Ty0PuA/W2JYoZ4iTj3TUQjkVsO/6U+4I1jN5lcR71ZEvRh52sDOERdnNhhHU57UITXz5jC1/w== + +"@rollup/rollup-darwin-x64@4.18.0": + version "4.18.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.18.0.tgz#e07d76de1cec987673e7f3d48ccb8e106d42c05c" + integrity sha512-n2LMsUz7Ynu7DoQrSQkBf8iNrjOGyPLrdSg802vk6XT3FtsgX6JbE8IHRvposskFm9SNxzkLYGSq9QdpLYpRNA== + +"@rollup/rollup-linux-arm-gnueabihf@4.18.0": + version "4.18.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.18.0.tgz#9f1a6d218b560c9d75185af4b8bb42f9f24736b8" + integrity sha512-C/zbRYRXFjWvz9Z4haRxcTdnkPt1BtCkz+7RtBSuNmKzMzp3ZxdM28Mpccn6pt28/UWUCTXa+b0Mx1k3g6NOMA== + +"@rollup/rollup-linux-arm-musleabihf@4.18.0": + version "4.18.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.18.0.tgz#53618b92e6ffb642c7b620e6e528446511330549" + integrity sha512-l3m9ewPgjQSXrUMHg93vt0hYCGnrMOcUpTz6FLtbwljo2HluS4zTXFy2571YQbisTnfTKPZ01u/ukJdQTLGh9A== + +"@rollup/rollup-linux-arm64-gnu@4.18.0": + version "4.18.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.18.0.tgz#99a7ba5e719d4f053761a698f7b52291cefba577" + integrity sha512-rJ5D47d8WD7J+7STKdCUAgmQk49xuFrRi9pZkWoRD1UeSMakbcepWXPF8ycChBoAqs1pb2wzvbY6Q33WmN2ftw== + +"@rollup/rollup-linux-arm64-musl@4.18.0": + version "4.18.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.18.0.tgz#f53db99a45d9bc00ce94db8a35efa7c3c144a58c" + integrity sha512-be6Yx37b24ZwxQ+wOQXXLZqpq4jTckJhtGlWGZs68TgdKXJgw54lUUoFYrg6Zs/kjzAQwEwYbp8JxZVzZLRepQ== + +"@rollup/rollup-linux-powerpc64le-gnu@4.18.0": + version "4.18.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.18.0.tgz#cbb0837408fe081ce3435cf3730e090febafc9bf" + integrity sha512-hNVMQK+qrA9Todu9+wqrXOHxFiD5YmdEi3paj6vP02Kx1hjd2LLYR2eaN7DsEshg09+9uzWi2W18MJDlG0cxJA== + +"@rollup/rollup-linux-riscv64-gnu@4.18.0": + version "4.18.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.18.0.tgz#8ed09c1d1262ada4c38d791a28ae0fea28b80cc9" + integrity sha512-ROCM7i+m1NfdrsmvwSzoxp9HFtmKGHEqu5NNDiZWQtXLA8S5HBCkVvKAxJ8U+CVctHwV2Gb5VUaK7UAkzhDjlg== + +"@rollup/rollup-linux-s390x-gnu@4.18.0": + version "4.18.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.18.0.tgz#938138d3c8e0c96f022252a28441dcfb17afd7ec" + integrity sha512-0UyyRHyDN42QL+NbqevXIIUnKA47A+45WyasO+y2bGJ1mhQrfrtXUpTxCOrfxCR4esV3/RLYyucGVPiUsO8xjg== + +"@rollup/rollup-linux-x64-gnu@4.18.0": + version "4.18.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.18.0.tgz#1a7481137a54740bee1ded4ae5752450f155d942" + integrity sha512-xuglR2rBVHA5UsI8h8UbX4VJ470PtGCf5Vpswh7p2ukaqBGFTnsfzxUBetoWBWymHMxbIG0Cmx7Y9qDZzr648w== + +"@rollup/rollup-linux-x64-musl@4.18.0": + version "4.18.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.18.0.tgz#f1186afc601ac4f4fc25fac4ca15ecbee3a1874d" + integrity sha512-LKaqQL9osY/ir2geuLVvRRs+utWUNilzdE90TpyoX0eNqPzWjRm14oMEE+YLve4k/NAqCdPkGYDaDF5Sw+xBfg== + +"@rollup/rollup-win32-arm64-msvc@4.18.0": + version "4.18.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.18.0.tgz#ed6603e93636a96203c6915be4117245c1bd2daf" + integrity sha512-7J6TkZQFGo9qBKH0pk2cEVSRhJbL6MtfWxth7Y5YmZs57Pi+4x6c2dStAUvaQkHQLnEQv1jzBUW43GvZW8OFqA== + +"@rollup/rollup-win32-ia32-msvc@4.18.0": + version "4.18.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.18.0.tgz#14e0b404b1c25ebe6157a15edb9c46959ba74c54" + integrity sha512-Txjh+IxBPbkUB9+SXZMpv+b/vnTEtFyfWZgJ6iyCmt2tdx0OF5WhFowLmnh8ENGNpfUlUZkdI//4IEmhwPieNg== + +"@rollup/rollup-win32-x64-msvc@4.18.0": + version "4.18.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.18.0.tgz#5d694d345ce36b6ecf657349e03eb87297e68da4" + integrity sha512-UOo5FdvOL0+eIVTgS4tIdbW+TtnBLWg1YBCcU2KWM7nuNwRz9bksDX1bekJJCpu25N1DVWaCwnT39dVQxzqS8g== "@sinclair/typebox@^0.27.8": version "0.27.8" @@ -1821,9 +1512,9 @@ integrity sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA== "@sinonjs/commons@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-3.0.0.tgz#beb434fe875d965265e04722ccfc21df7f755d72" - integrity sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA== + version "3.0.1" + resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-3.0.1.tgz#1029357e44ca901a615585f6d27738dbc89084cd" + integrity sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ== dependencies: type-detect "4.0.8" @@ -1834,92 +1525,95 @@ dependencies: "@sinonjs/commons" "^3.0.0" -"@swc/core-darwin-arm64@1.3.102": - version "1.3.102" - resolved "https://registry.yarnpkg.com/@swc/core-darwin-arm64/-/core-darwin-arm64-1.3.102.tgz#2bbd90a8751e6eee981f857ec3f0b6233208da37" - integrity sha512-CJDxA5Wd2cUMULj3bjx4GEoiYyyiyL8oIOu4Nhrs9X+tlg8DnkCm4nI57RJGP8Mf6BaXPIJkHX8yjcefK2RlDA== - -"@swc/core-darwin-x64@1.3.102": - version "1.3.102" - resolved "https://registry.yarnpkg.com/@swc/core-darwin-x64/-/core-darwin-x64-1.3.102.tgz#df16d51f45771d3c9cca8554b28a3190cdb075cf" - integrity sha512-X5akDkHwk6oAer49oER0qZMjNMkLH3IOZaV1m98uXIasAGyjo5WH1MKPeMLY1sY6V6TrufzwiSwD4ds571ytcg== - -"@swc/core-linux-arm-gnueabihf@1.3.102": - version "1.3.102" - resolved "https://registry.yarnpkg.com/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.3.102.tgz#eb71697590c56ea261fa9a4b198c45304c7ece39" - integrity sha512-kJH3XtZP9YQdjq/wYVBeFuiVQl4HaC4WwRrIxAHwe2OyvrwUI43dpW3LpxSggBnxXcVCXYWf36sTnv8S75o2Gw== - -"@swc/core-linux-arm64-gnu@1.3.102": - version "1.3.102" - resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.3.102.tgz#75d72d5253d56723fa7054e1a8f313bf3d17b1a2" - integrity sha512-flQP2WDyCgO24WmKA1wjjTx+xfCmavUete2Kp6yrM+631IHLGnr17eu7rYJ/d4EnDBId/ytMyrnWbTVkaVrpbQ== - -"@swc/core-linux-arm64-musl@1.3.102": - version "1.3.102" - resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.3.102.tgz#7db86022fec57c1e06c573d45cef5e911bcc420e" - integrity sha512-bQEQSnC44DyoIGLw1+fNXKVGoCHi7eJOHr8BdH0y1ooy9ArskMjwobBFae3GX4T1AfnrTaejyr0FvLYIb0Zkog== - -"@swc/core-linux-x64-gnu@1.3.102": - version "1.3.102" - resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.3.102.tgz#298a25aa854924bedc7e4b69da52da19f84fc7a8" - integrity sha512-dFvnhpI478svQSxqISMt00MKTDS0e4YtIr+ioZDG/uJ/q+RpcNy3QI2KMm05Fsc8Y0d4krVtvCKWgfUMsJZXAg== - -"@swc/core-linux-x64-musl@1.3.102": - version "1.3.102" - resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.3.102.tgz#1bcd911aaa88b96f3bb665b0fd84ef4d21adf886" - integrity sha512-+a0M3CvjeIRNA/jTCzWEDh2V+mhKGvLreHOL7J97oULZy5yg4gf7h8lQX9J8t9QLbf6fsk+0F8bVH1Ie/PbXjA== - -"@swc/core-win32-arm64-msvc@1.3.102": - version "1.3.102" - resolved "https://registry.yarnpkg.com/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.3.102.tgz#59084786364d03fa4a120bdd589a557a00caedeb" - integrity sha512-w76JWLjkZNOfkB25nqdWUNCbt0zJ41CnWrJPZ+LxEai3zAnb2YtgB/cCIrwxDebRuMgE9EJXRj7gDDaTEAMOOQ== - -"@swc/core-win32-ia32-msvc@1.3.102": - version "1.3.102" - resolved "https://registry.yarnpkg.com/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.3.102.tgz#27954889d940a63796d58ff7753f5f27ed381a1f" - integrity sha512-vlDb09HiGqKwz+2cxDS9T5/461ipUQBplvuhW+cCbzzGuPq8lll2xeyZU0N1E4Sz3MVdSPx1tJREuRvlQjrwNg== - -"@swc/core-win32-x64-msvc@1.3.102": - version "1.3.102" - resolved "https://registry.yarnpkg.com/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.3.102.tgz#477da542e6b01b3eb64476ec9a78f497a9b87807" - integrity sha512-E/jfSD7sShllxBwwgDPeXp1UxvIqehj/ShSUqq1pjR/IDRXngcRSXKJK92mJkNFY7suH6BcCWwzrxZgkO7sWmw== +"@swc/core-darwin-arm64@1.5.29": + version "1.5.29" + resolved "https://registry.yarnpkg.com/@swc/core-darwin-arm64/-/core-darwin-arm64-1.5.29.tgz#707602a44b43b856318d69e538b6edc4b56caa98" + integrity sha512-6F/sSxpHaq3nzg2ADv9FHLi4Fu2A8w8vP8Ich8gIl16D2htStlwnaPmCLjRswO+cFkzgVqy/l01gzNGWd4DFqA== + +"@swc/core-darwin-x64@1.5.29": + version "1.5.29" + resolved "https://registry.yarnpkg.com/@swc/core-darwin-x64/-/core-darwin-x64-1.5.29.tgz#1d3e781d1519e98b544f5ab3fdaf0335c082f252" + integrity sha512-rF/rXkvUOTdTIfoYbmszbSUGsCyvqACqy1VeP3nXONS+LxFl4bRmRcUTRrblL7IE5RTMCKUuPbqbQSE2hK7bqg== + +"@swc/core-linux-arm-gnueabihf@1.5.29": + version "1.5.29" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.5.29.tgz#121e7a1de2e3eb8d501536266e43d21189c1e680" + integrity sha512-2OAPL8iWBsmmwkjGXqvuUhbmmoLxS1xNXiMq87EsnCNMAKohGc7wJkdAOUL6J/YFpean/vwMWg64rJD4pycBeg== + +"@swc/core-linux-arm64-gnu@1.5.29": + version "1.5.29" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.5.29.tgz#8c17e577db244390f458b4019f2cb81949e93ef2" + integrity sha512-eH/Q9+8O5qhSxMestZnhuS1xqQMr6M7SolZYxiXJqxArXYILLCF+nq2R9SxuMl0CfjHSpb6+hHPk/HXy54eIRA== + +"@swc/core-linux-arm64-musl@1.5.29": + version "1.5.29" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.5.29.tgz#f13f5acb5e03596de7ca0bc4dc8da1457aebd8f9" + integrity sha512-TERh2OICAJz+SdDIK9+0GyTUwF6r4xDlFmpoiHKHrrD/Hh3u+6Zue0d7jQ/he/i80GDn4tJQkHlZys+RZL5UZg== + +"@swc/core-linux-x64-gnu@1.5.29": + version "1.5.29" + resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.5.29.tgz#ef3506314272184b3e4381ffea3a9f4d5689d15d" + integrity sha512-WMDPqU7Ji9dJpA+Llek2p9t7pcy7Bob8ggPUvgsIlv3R/eesF9DIzSbrgl6j3EAEPB9LFdSafsgf6kT/qnvqFg== + +"@swc/core-linux-x64-musl@1.5.29": + version "1.5.29" + resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.5.29.tgz#4495e6375d0e217324f8fee72b3859c7bcec8e37" + integrity sha512-DO14glwpdKY4POSN0201OnGg1+ziaSVr6/RFzuSLggshwXeeyVORiHv3baj7NENhJhWhUy3NZlDsXLnRFkmhHQ== + +"@swc/core-win32-arm64-msvc@1.5.29": + version "1.5.29" + resolved "https://registry.yarnpkg.com/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.5.29.tgz#8b9fb01cac33389613e33f1088ade78b4928ab26" + integrity sha512-V3Y1+a1zG1zpYXUMqPIHEMEOd+rHoVnIpO/KTyFwAmKVu8v+/xPEVx/AGoYE67x4vDAAvPQrKI3Aokilqa5yVg== + +"@swc/core-win32-ia32-msvc@1.5.29": + version "1.5.29" + resolved "https://registry.yarnpkg.com/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.5.29.tgz#0dc4dfba7bd0f505162eee7f2f76ad1b2cd1c9e3" + integrity sha512-OrM6yfXw4wXhnVFosOJzarw0Fdz5Y0okgHfn9oFbTPJhoqxV5Rdmd6kXxWu2RiVKs6kGSJFZXHDeUq2w5rTIMg== + +"@swc/core-win32-x64-msvc@1.5.29": + version "1.5.29" + resolved "https://registry.yarnpkg.com/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.5.29.tgz#1931b87c39166f2323e5cbafe7919490580024ee" + integrity sha512-eD/gnxqKyZQQR0hR7TMkIlJ+nCF9dzYmVVNbYZWuA1Xy94aBPUsEk3Uw3oG7q6R3ErrEUPP0FNf2ztEnv+I+dw== "@swc/core@^1.3.102": - version "1.3.102" - resolved "https://registry.yarnpkg.com/@swc/core/-/core-1.3.102.tgz#870874bcf1d78cd7bb1bc66b31bf2b1a87c1a667" - integrity sha512-OAjNLY/f6QWKSDzaM3bk31A+OYHu6cPa9P/rFIx8X5d24tHXUpRiiq6/PYI6SQRjUPlB72GjsjoEU8F+ALadHg== + version "1.5.29" + resolved "https://registry.yarnpkg.com/@swc/core/-/core-1.5.29.tgz#57e4b3500eac922396e9b83544d196934b07f1d1" + integrity sha512-nvTtHJI43DUSOAf3h9XsqYg8YXKc0/N4il9y4j0xAkO0ekgDNo+3+jbw6MInawjKJF9uulyr+f5bAutTsOKVlw== dependencies: - "@swc/counter" "^0.1.1" - "@swc/types" "^0.1.5" + "@swc/counter" "^0.1.3" + "@swc/types" "^0.1.8" optionalDependencies: - "@swc/core-darwin-arm64" "1.3.102" - "@swc/core-darwin-x64" "1.3.102" - "@swc/core-linux-arm-gnueabihf" "1.3.102" - "@swc/core-linux-arm64-gnu" "1.3.102" - "@swc/core-linux-arm64-musl" "1.3.102" - "@swc/core-linux-x64-gnu" "1.3.102" - "@swc/core-linux-x64-musl" "1.3.102" - "@swc/core-win32-arm64-msvc" "1.3.102" - "@swc/core-win32-ia32-msvc" "1.3.102" - "@swc/core-win32-x64-msvc" "1.3.102" - -"@swc/counter@^0.1.1": - version "0.1.2" - resolved "https://registry.yarnpkg.com/@swc/counter/-/counter-0.1.2.tgz#bf06d0770e47c6f1102270b744e17b934586985e" - integrity sha512-9F4ys4C74eSTEUNndnER3VJ15oru2NumfQxS8geE+f3eB5xvfxpWyqE5XlVnxb/R14uoXi6SLbBwwiDSkv+XEw== + "@swc/core-darwin-arm64" "1.5.29" + "@swc/core-darwin-x64" "1.5.29" + "@swc/core-linux-arm-gnueabihf" "1.5.29" + "@swc/core-linux-arm64-gnu" "1.5.29" + "@swc/core-linux-arm64-musl" "1.5.29" + "@swc/core-linux-x64-gnu" "1.5.29" + "@swc/core-linux-x64-musl" "1.5.29" + "@swc/core-win32-arm64-msvc" "1.5.29" + "@swc/core-win32-ia32-msvc" "1.5.29" + "@swc/core-win32-x64-msvc" "1.5.29" + +"@swc/counter@^0.1.3": + version "0.1.3" + resolved "https://registry.yarnpkg.com/@swc/counter/-/counter-0.1.3.tgz#cc7463bd02949611c6329596fccd2b0ec782b0e9" + integrity sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ== "@swc/jest@^0.2.29": - version "0.2.29" - resolved "https://registry.yarnpkg.com/@swc/jest/-/jest-0.2.29.tgz#b27d647ec430c909f9bb567d1df2a47eaa3841f4" - integrity sha512-8reh5RvHBsSikDC3WGCd5ZTd2BXKkyOdK7QwynrCH58jk2cQFhhHhFBg/jvnWZehUQe/EoOImLENc9/DwbBFow== + version "0.2.36" + resolved "https://registry.yarnpkg.com/@swc/jest/-/jest-0.2.36.tgz#2797450a30d28b471997a17e901ccad946fe693e" + integrity sha512-8X80dp81ugxs4a11z1ka43FPhP+/e+mJNXJSxiNYk8gIX/jPBtY4gQTrKu/KIoco8bzKuPI5lUxjfLiGsfvnlw== dependencies: - "@jest/create-cache-key-function" "^27.4.2" + "@jest/create-cache-key-function" "^29.7.0" + "@swc/counter" "^0.1.3" jsonc-parser "^3.2.0" -"@swc/types@^0.1.5": - version "0.1.5" - resolved "https://registry.yarnpkg.com/@swc/types/-/types-0.1.5.tgz#043b731d4f56a79b4897a3de1af35e75d56bc63a" - integrity sha512-myfUej5naTBWnqOCc/MdVOLVjXUXtIA+NpDrDBKJtLLg2shUjBu3cZmB/85RyitKc55+lUUyl7oRfLOvkr2hsw== +"@swc/types@^0.1.8": + version "0.1.8" + resolved "https://registry.yarnpkg.com/@swc/types/-/types-0.1.8.tgz#2c81d107c86cfbd0c3a05ecf7bb54c50dfa58a95" + integrity sha512-RNFA3+7OJFNYY78x0FYwi1Ow+iF1eF5WvmfY1nXPOEH4R2p/D4Cr1vzje7dNAI2aLFqpv8Wyz4oKSWqIZArpQA== + dependencies: + "@swc/counter" "^0.1.3" "@testing-library/dom@^9.0.0": version "9.3.4" @@ -1936,23 +1630,23 @@ pretty-format "^27.0.2" "@testing-library/jest-dom@^6.2.0": - version "6.2.0" - resolved "https://registry.yarnpkg.com/@testing-library/jest-dom/-/jest-dom-6.2.0.tgz#b572bd5cd6b29314487bac7ba393188e4987b4f7" - integrity sha512-+BVQlJ9cmEn5RDMUS8c2+TU6giLvzaHZ8sU/x0Jj7fk+6/46wPdwlgOPcpxS17CjcanBi/3VmGMqVr2rmbUmNw== + version "6.4.6" + resolved "https://registry.yarnpkg.com/@testing-library/jest-dom/-/jest-dom-6.4.6.tgz#ec1df8108651bed5475534955565bed88c6732ce" + integrity sha512-8qpnGVincVDLEcQXWaHOf6zmlbwTKc6Us6PPu4CRnPXCzo2OGBS5cwgMMOWdxDpEz1mkbvXHpEy99M5Yvt682w== dependencies: - "@adobe/css-tools" "^4.3.2" + "@adobe/css-tools" "^4.4.0" "@babel/runtime" "^7.9.2" aria-query "^5.0.0" chalk "^3.0.0" css.escape "^1.5.1" dom-accessibility-api "^0.6.3" - lodash "^4.17.15" + lodash "^4.17.21" redent "^3.0.0" "@testing-library/react@^14.1.2": - version "14.1.2" - resolved "https://registry.yarnpkg.com/@testing-library/react/-/react-14.1.2.tgz#a2b9e9ee87721ec9ed2d7cfc51cc04e474537c32" - integrity sha512-z4p7DVBTPjKM5qDZ0t5ZjzkpSNb+fZy1u6bzO7kk8oeGagpPCAtgh4cx1syrfp7a+QWkM021jGqjJaxJJnXAZg== + version "14.3.1" + resolved "https://registry.yarnpkg.com/@testing-library/react/-/react-14.3.1.tgz#29513fc3770d6fb75245c4e1245c470e4ffdd830" + integrity sha512-H99XjUhWQw0lTgyMN05W3xQG1Nh4lq574D8keFf1dDoNTJgp66VbJozRaczoF+wsiaPJNt/TcnfpLGufGxSrZQ== dependencies: "@babel/runtime" "^7.12.5" "@testing-library/dom" "^9.0.0" @@ -1964,9 +1658,9 @@ integrity sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A== "@tsconfig/node10@^1.0.7": - version "1.0.9" - resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.9.tgz#df4907fc07a886922637b15e02d4cebc4c0021b2" - integrity sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA== + version "1.0.11" + resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.11.tgz#6ee46400685f130e278128c7b38b7e031ff5b2f2" + integrity sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw== "@tsconfig/node12@^1.0.7": version "1.0.11" @@ -2015,9 +1709,9 @@ "@babel/types" "^7.0.0" "@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.5.tgz#7b7502be0aa80cc4ef22978846b983edaafcd4dd" - integrity sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ== + version "7.20.6" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.6.tgz#8dc9f0ae0f202c08d8d4dab648912c8d6038e3f7" + integrity sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg== dependencies: "@babel/types" "^7.20.7" @@ -2036,12 +1730,7 @@ dependencies: "@types/eslint" "*" -"@types/estree@*", "@types/estree@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.0.tgz#5fb2e536c1ae9bf35366eed879e827fa59ca41c2" - integrity sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ== - -"@types/estree@1.0.5": +"@types/estree@*", "@types/estree@1.0.5", "@types/estree@^1.0.0": version "1.0.5" resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4" integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== @@ -2079,7 +1768,7 @@ dependencies: "@types/jest" "*" -"@types/jest@*": +"@types/jest@*", "@types/jest@^29.5.11": version "29.5.12" resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.5.12.tgz#7f7dc6eb4cf246d2474ed78744b05d06ce025544" integrity sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw== @@ -2087,14 +1776,6 @@ expect "^29.0.0" pretty-format "^29.0.0" -"@types/jest@^29.5.11": - version "29.5.11" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.5.11.tgz#0c13aa0da7d0929f078ab080ae5d4ced80fa2f2c" - integrity sha512-S2mHmYIVe13vrm6q4kN6fLYYAka15ALQki/vgDC3mIukEOx8WJlv0kQPM+d4w8Gp6u0uSdKND04IlTXBv0rwnQ== - dependencies: - expect "^29.0.0" - pretty-format "^29.0.0" - "@types/jsdom@^20.0.0": version "20.0.1" resolved "https://registry.yarnpkg.com/@types/jsdom/-/jsdom-20.0.1.tgz#07c14bc19bd2f918c1929541cdaacae894744808" @@ -2109,56 +1790,41 @@ resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== -"@types/json5@^0.0.29": - version "0.0.29" - resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" - integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== - "@types/node@*": - version "20.11.0" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.11.0.tgz#8e0b99e70c0c1ade1a86c4a282f7b7ef87c9552f" - integrity sha512-o9bjXmDNcF7GbM4CNQpmi+TutCgap/K3w1JyKgxAjqx41zp9qlIAVFi0IhCNsJcXolEqLWhbFbEeL0PvYm4pcQ== + version "20.14.2" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.14.2.tgz#a5f4d2bcb4b6a87bffcaa717718c5a0f208f4a18" + integrity sha512-xyu6WAMVwv6AKFLB+e/7ySZVr/0zLCzOa7rSpq6jNwpqOrUbcACDWC+53d4n2QHOnDou0fbIsg8wZu/sxrnI4Q== dependencies: undici-types "~5.26.4" "@types/node@^16.4.0": - version "16.4.0" - resolved "https://registry.yarnpkg.com/@types/node/-/node-16.4.0.tgz#2c219eaa3b8d1e4d04f4dd6e40bc68c7467d5272" - integrity sha512-HrJuE7Mlqcjj+00JqMWpZ3tY8w7EUd+S0U3L1+PQSWiXZbOgyQDvi+ogoUxaHApPJq5diKxYBQwA3iIlNcPqOg== + version "16.18.98" + resolved "https://registry.yarnpkg.com/@types/node/-/node-16.18.98.tgz#3554bb7911ea2bbc3a528be0776d6ab16b7674d2" + integrity sha512-fpiC20NvLpTLAzo3oVBKIqBGR6Fx/8oAK/SSf7G+fydnXMY1x4x9RZ6sBXhqKlCU21g2QapUsbLlhv3+a7wS+Q== "@types/parse-json@^4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" - integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== + version "4.0.2" + resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.2.tgz#5950e50960793055845e956c427fc2b0d70c5239" + integrity sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw== "@types/prop-types@*": - version "15.7.5" - resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.5.tgz#5f19d2b85a98e9558036f6a3cacc8819420f05cf" - integrity sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w== + version "15.7.12" + resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.12.tgz#12bb1e2be27293c1406acb6af1c3f3a1481d98c6" + integrity sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q== "@types/react-dom@^18.0.0": - version "18.2.18" - resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.2.18.tgz#16946e6cd43971256d874bc3d0a72074bb8571dd" - integrity sha512-TJxDm6OfAX2KJWJdMEVTwWke5Sc/E/RlnPGvGfS0W7+6ocy2xhDVQVh/KvC2Uf7kACs+gDytdusDSdWfWkaNzw== + version "18.3.0" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.3.0.tgz#0cbc818755d87066ab6ca74fbedb2547d74a82b0" + integrity sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg== dependencies: "@types/react" "*" -"@types/react@*": - version "18.2.48" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.48.tgz#11df5664642d0bd879c1f58bc1d37205b064e8f1" - integrity sha512-qboRCl6Ie70DQQG9hhNREz81jqC1cs9EVNcjQ1AU+jH6NFfSAhVVbrrY/+nSF+Bsk4AOwm9Qa61InvMCyV+H3w== - dependencies: - "@types/prop-types" "*" - "@types/scheduler" "*" - csstype "^3.0.2" - -"@types/react@>=17": - version "18.2.12" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.12.tgz#95d584338610b78bb9ba0415e3180fb03debdf97" - integrity sha512-ndmBMLCgn38v3SntMeoJaIrO6tGHYKMEBohCUmw8HoLLQdRMOIGXfeYaBTLe2lsFaSB3MOK1VXscYFnmLtTSmw== +"@types/react@*", "@types/react@>=17": + version "18.3.3" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.3.3.tgz#9679020895318b0915d7a3ab004d92d33375c45f" + integrity sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw== dependencies: "@types/prop-types" "*" - "@types/scheduler" "*" csstype "^3.0.2" "@types/resolve@1.20.2": @@ -2166,11 +1832,6 @@ resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-1.20.2.tgz#97d26e00cd4a0423b4af620abecf3e6f442b7975" integrity sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q== -"@types/scheduler@*": - version "0.16.2" - resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.2.tgz#1a62f89525723dde24ba1b01b092bf5df8ad4d39" - integrity sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew== - "@types/stack-utils@^2.0.0": version "2.0.3" resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.3.tgz#6209321eb2c1712a7e7466422b8cb1fc0d9dd5d8" @@ -2186,13 +1847,6 @@ resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.3.tgz#815e30b786d2e8f0dcd85fd5bcf5e1a04d008f15" integrity sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ== -"@types/yargs@^16.0.0": - version "16.0.9" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-16.0.9.tgz#ba506215e45f7707e6cbcaf386981155b7ab956e" - integrity sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA== - dependencies: - "@types/yargs-parser" "*" - "@types/yargs@^17.0.8": version "17.0.32" resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.32.tgz#030774723a2f7faafebf645f4e5a48371dca6229" @@ -2304,31 +1958,18 @@ acorn-jsx@^5.3.2: resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== -acorn-walk@^8.0.2: - version "8.3.1" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.1.tgz#2f10f5b69329d90ae18c58bf1fa8fccd8b959a43" - integrity sha512-TgUZgYvqZprrl7YldZNoa9OciCAyZR+Ejm9eXzKCmjsF5IKp/wgQ7Z/ZpjpGTIUPwrHQIcYeI8qDh4PsEwxMbw== - -acorn-walk@^8.1.1: - version "8.3.2" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.2.tgz#7703af9415f1b6db9315d6895503862e231d34aa" - integrity sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A== - -acorn@^8.1.0, acorn@^8.4.1, acorn@^8.8.1: - version "8.11.3" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a" - integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== +acorn-walk@^8.0.2, acorn-walk@^8.1.1: + version "8.3.3" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.3.tgz#9caeac29eefaa0c41e3d4c65137de4d6f34df43e" + integrity sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw== + dependencies: + acorn "^8.11.0" -acorn@^8.11.3: +acorn@^8.1.0, acorn@^8.11.0, acorn@^8.11.3, acorn@^8.4.1, acorn@^8.8.1, acorn@^8.8.2: version "8.12.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.12.0.tgz#1627bfa2e058148036133b8d9b51a700663c294c" integrity sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw== -acorn@^8.5.0: - version "8.8.2" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.2.tgz#1b2f25db02af965399b9776b0c2c391276d37c4a" - integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== - agent-base@6: version "6.0.2" resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" @@ -2355,9 +1996,9 @@ ajv@^6.12.4: uri-js "^4.2.2" ansi-colors@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" - integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== + version "4.1.3" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" + integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== ansi-escapes@^4.2.1, ansi-escapes@^4.3.0: version "4.3.2" @@ -2366,11 +2007,6 @@ ansi-escapes@^4.2.1, ansi-escapes@^4.3.0: dependencies: type-fest "^0.21.3" -ansi-regex@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" - integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== - ansi-regex@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" @@ -2434,15 +2070,7 @@ aria-query@^5.0.0: dependencies: dequal "^2.0.3" -array-buffer-byte-length@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz#fabe8bc193fea865f317fe7807085ee0dee5aead" - integrity sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A== - dependencies: - call-bind "^1.0.2" - is-array-buffer "^3.0.1" - -array-buffer-byte-length@^1.0.1: +array-buffer-byte-length@^1.0.0, array-buffer-byte-length@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz#1e5583ec16763540a27ae52eed99ff899223568f" integrity sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg== @@ -2450,18 +2078,7 @@ array-buffer-byte-length@^1.0.1: call-bind "^1.0.5" is-array-buffer "^3.0.4" -array-includes@^3.1.2: - version "3.1.3" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.3.tgz#c7f619b382ad2afaf5326cddfdc0afc61af7690a" - integrity sha512-gcem1KlBU7c9rB+Rq8/3PPKsK2kjqeEBa3bD5kkQo4nYlOHQCJqIJFqBXDEfwaRuYTT4E+FxA9xez7Gf/e3Q7A== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.18.0-next.2" - get-intrinsic "^1.1.1" - is-string "^1.0.5" - -array-includes@^3.1.7, array-includes@^3.1.8: +array-includes@^3.1.6, array-includes@^3.1.8: version "3.1.8" resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.8.tgz#5e370cbe172fdd5dd6530c1d4aadda25281ba97d" integrity sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ== @@ -2490,19 +2107,7 @@ array.prototype.findlast@^1.2.5: es-object-atoms "^1.0.0" es-shim-unscopables "^1.0.2" -array.prototype.findlastindex@^1.2.3: - version "1.2.5" - resolved "https://registry.yarnpkg.com/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz#8c35a755c72908719453f87145ca011e39334d0d" - integrity sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.2" - es-errors "^1.3.0" - es-object-atoms "^1.0.0" - es-shim-unscopables "^1.0.2" - -array.prototype.flat@^1.3.2: +array.prototype.flat@^1.3.1: version "1.3.2" resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz#1476217df8cff17d72ee8f3ba06738db5b387d18" integrity sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA== @@ -2567,11 +2172,6 @@ asynckit@^0.4.0: resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== -available-typed-arrays@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" - integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== - available-typed-arrays@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846" @@ -2622,29 +2222,29 @@ babel-plugin-jest-hoist@^29.6.3: "@types/babel__core" "^7.1.14" "@types/babel__traverse" "^7.0.6" -babel-plugin-polyfill-corejs2@^0.3.3: - version "0.3.3" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz#5d1bd3836d0a19e1b84bbf2d9640ccb6f951c122" - integrity sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q== +babel-plugin-polyfill-corejs2@^0.4.10: + version "0.4.11" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz#30320dfe3ffe1a336c15afdcdafd6fd615b25e33" + integrity sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q== dependencies: - "@babel/compat-data" "^7.17.7" - "@babel/helper-define-polyfill-provider" "^0.3.3" - semver "^6.1.1" + "@babel/compat-data" "^7.22.6" + "@babel/helper-define-polyfill-provider" "^0.6.2" + semver "^6.3.1" -babel-plugin-polyfill-corejs3@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz#56ad88237137eade485a71b52f72dbed57c6230a" - integrity sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA== +babel-plugin-polyfill-corejs3@^0.10.4: + version "0.10.4" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.4.tgz#789ac82405ad664c20476d0233b485281deb9c77" + integrity sha512-25J6I8NGfa5YkCDogHRID3fVCadIR8/pGl1/spvCkzb6lVn6SR3ojpx9nOn9iEBcUsjY24AmdKm5khcfKdylcg== dependencies: - "@babel/helper-define-polyfill-provider" "^0.3.3" - core-js-compat "^3.25.1" + "@babel/helper-define-polyfill-provider" "^0.6.1" + core-js-compat "^3.36.1" -babel-plugin-polyfill-regenerator@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz#390f91c38d90473592ed43351e801a9d3e0fd747" - integrity sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw== +babel-plugin-polyfill-regenerator@^0.6.1: + version "0.6.2" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.2.tgz#addc47e240edd1da1058ebda03021f382bba785e" + integrity sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg== dependencies: - "@babel/helper-define-polyfill-provider" "^0.3.3" + "@babel/helper-define-polyfill-provider" "^0.6.2" babel-preset-current-node-syntax@^1.0.0: version "1.0.1" @@ -2692,32 +2292,22 @@ brace-expansion@^2.0.1: dependencies: balanced-match "^1.0.0" -braces@^3.0.1: - version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== - dependencies: - fill-range "^7.0.1" - -browserslist@^4.21.3, browserslist@^4.21.4: - version "4.21.4" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.4.tgz#e7496bbc67b9e39dd0f98565feccdcb0d4ff6987" - integrity sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw== +braces@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" + integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== dependencies: - caniuse-lite "^1.0.30001400" - electron-to-chromium "^1.4.251" - node-releases "^2.0.6" - update-browserslist-db "^1.0.9" + fill-range "^7.1.1" -browserslist@^4.22.2: - version "4.22.3" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.22.3.tgz#299d11b7e947a6b843981392721169e27d60c5a6" - integrity sha512-UAp55yfwNv0klWNapjs/ktHoguxuQNGnOzxYmfnXIS+8AsRDZkSDxg7R1AX3GKzn078SBI5dzwzj/Yx0Or0e3A== +browserslist@^4.22.2, browserslist@^4.23.0: + version "4.23.1" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.23.1.tgz#ce4af0534b3d37db5c1a4ca98b9080f985041e96" + integrity sha512-TUfofFo/KsK/bWZ9TWQ5O26tsWW4Uhmt8IYklbnUa70udB6P2wA7w7o4PY4muaEPBQaAX+CEnmmIA41NVHtPVw== dependencies: - caniuse-lite "^1.0.30001580" - electron-to-chromium "^1.4.648" + caniuse-lite "^1.0.30001629" + electron-to-chromium "^1.4.796" node-releases "^2.0.14" - update-browserslist-db "^1.0.13" + update-browserslist-db "^1.0.16" bser@2.1.1: version "2.1.1" @@ -2736,24 +2326,7 @@ builtin-modules@^3.3.0: resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.3.0.tgz#cae62812b89801e9656336e46223e030386be7b6" integrity sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw== -call-bind@^1.0.0, call-bind@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" - integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== - dependencies: - function-bind "^1.1.1" - get-intrinsic "^1.0.2" - -call-bind@^1.0.4, call-bind@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.5.tgz#6fa2b7845ce0ea49bf4d8b9ef64727a2c2e2e513" - integrity sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ== - dependencies: - function-bind "^1.1.2" - get-intrinsic "^1.2.1" - set-function-length "^1.1.1" - -call-bind@^1.0.6, call-bind@^1.0.7: +call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== @@ -2779,17 +2352,12 @@ camelcase@^6.2.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== -caniuse-lite@^1.0.30001400: - version "1.0.30001448" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001448.tgz#ca7550b1587c92a392a2b377cd9c508b3b4395bf" - integrity sha512-tq2YI+MJnooG96XpbTRYkBxLxklZPOdLmNIOdIhvf7SNJan6u5vCKum8iT7ZfCt70m1GPkuC7P3TtX6UuhupuA== - -caniuse-lite@^1.0.30001580: - version "1.0.30001581" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001581.tgz#0dfd4db9e94edbdca67d57348ebc070dece279f4" - integrity sha512-whlTkwhqV2tUmP3oYhtNfaWGYHDdS3JYFQBKXxcUR9qqPWsRhFHhoISO2Xnl/g0xyKzht9mI1LZpiNWfMzHixQ== +caniuse-lite@^1.0.30001629: + version "1.0.30001634" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001634.tgz#aa563c8e7aeaf552f7ead60371bc8d803425deaa" + integrity sha512-fbBYXQ9q3+yp1q1gBk86tOFs4pyn/yxFm5ZNP18OXJDfA3txImOY9PhfxVggZ4vRHDqoU8NrKU81eN0OtzOgRA== -chalk@^2.0.0, chalk@^2.4.2: +chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -2806,10 +2374,10 @@ chalk@^3.0.0: ansi-styles "^4.1.0" supports-color "^7.1.0" -chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.1.tgz#c80b3fab28bf6371e6863325eee67e618b77e6ad" - integrity sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg== +chalk@^4.0.0, chalk@^4.1.0: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== dependencies: ansi-styles "^4.1.0" supports-color "^7.1.0" @@ -2825,9 +2393,9 @@ ci-info@^3.2.0: integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== cjs-module-lexer@^1.0.0: - version "1.2.3" - resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz#6c370ab19f8a3394e318fe682686ec0ac684d107" - integrity sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ== + version "1.3.1" + resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.3.1.tgz#c485341ae8fd999ca4ee5af2d7a1c9ae01e0099c" + integrity sha512-a3KdPAANPbNE4ZUv9h6LckSl9zLsYOP4MBmhIPkRaeyybt+r4UghLvq+xw/YwUcC1gqylCkL4rdVs3Lwupjm4Q== clean-stack@^2.0.0: version "2.2.0" @@ -2841,7 +2409,7 @@ cli-cursor@^3.1.0: dependencies: restore-cursor "^3.1.0" -cli-truncate@^2.1.0: +cli-truncate@2.1.0, cli-truncate@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-2.1.0.tgz#c39e28bf05edcde5be3b98992a22deed5a2b93c7" integrity sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg== @@ -2885,17 +2453,22 @@ color-convert@^2.0.1: color-name@1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== color-name@~1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== -colorette@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.2.tgz#cbcc79d5e99caea2dbf10eb3a26fd8b3e6acfa94" - integrity sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w== +colorette@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.4.0.tgz#5190fbb87276259a86ad700bff2c6d6faa3fca40" + integrity sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g== + +colorette@^2.0.16: + version "2.0.20" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" + integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== combined-stream@^1.0.8: version "1.0.8" @@ -2909,10 +2482,10 @@ commander@^2.20.0: resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== -commander@^7.2.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" - integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== +commander@^8.2.0: + version "8.3.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" + integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== commondir@^1.0.1: version "1.0.1" @@ -2922,29 +2495,24 @@ commondir@^1.0.1: concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= - -convert-source-map@^1.7.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" - integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== convert-source-map@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== -core-js-compat@^3.25.1: - version "3.27.2" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.27.2.tgz#607c50ad6db8fd8326af0b2883ebb987be3786da" - integrity sha512-welaYuF7ZtbYKGrIy7y3eb40d37rG1FvzEOfe7hSLd2iD6duMDqUhRfSvCGyC46HhR6Y8JXXdZ2lnRUMkPBpvg== +core-js-compat@^3.31.0, core-js-compat@^3.36.1: + version "3.37.1" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.37.1.tgz#c844310c7852f4bdf49b8d339730b97e17ff09ee" + integrity sha512-9TNiImhKvQqSUkOvk/mMRZzOANTiEVC7WaBNhHcKM7x+/5E1l5NvsysR19zuDQScE8k+kfQXWRN3AtS/eOSHpg== dependencies: - browserslist "^4.21.4" + browserslist "^4.23.0" -cosmiconfig@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.0.tgz#ef9b44d773959cae63ddecd122de23853b60f8d3" - integrity sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA== +cosmiconfig@^7.0.1: + version "7.1.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.1.0.tgz#1443b9afa596b670082ea46cbd8f6a62b84635f6" + integrity sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA== dependencies: "@types/parse-json" "^4.0.0" import-fresh "^3.2.1" @@ -3002,9 +2570,9 @@ cssstyle@^2.3.0: cssom "~0.3.6" csstype@^3.0.2: - version "3.1.1" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.1.tgz#841b532c45c758ee546a11d5bd7b7b473c8c30b9" - integrity sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw== + version "3.1.3" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81" + integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== data-urls@^3.0.2: version "3.0.2" @@ -3042,10 +2610,10 @@ data-view-byte-offset@^1.0.0: es-errors "^1.3.0" is-data-view "^1.0.1" -debug@4, debug@^4.1.0: - version "4.3.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== +debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: + version "4.3.5" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.5.tgz#e83444eceb9fedd4a1da56d671ae2446a01a6e1e" + integrity sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg== dependencies: ms "2.1.2" @@ -3056,34 +2624,15 @@ debug@^3.2.7: dependencies: ms "^2.1.1" -debug@^4.1.1, debug@^4.3.1: - version "4.3.2" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.2.tgz#f0a49c18ac8779e31d4a0c6029dfb76873c7428b" - integrity sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw== - dependencies: - ms "2.1.2" - -debug@^4.3.2, debug@^4.3.4: - version "4.3.5" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.5.tgz#e83444eceb9fedd4a1da56d671ae2446a01a6e1e" - integrity sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg== - dependencies: - ms "2.1.2" - decimal.js@^10.4.2: version "10.4.3" resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.4.3.tgz#1044092884d245d1b7f65725fa4ad4c6f781cc23" integrity sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA== -dedent@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" - integrity sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw= - dedent@^1.0.0: - version "1.5.1" - resolved "https://registry.yarnpkg.com/dedent/-/dedent-1.5.1.tgz#4f3fc94c8b711e9bb2800d185cd6ad20f2a90aff" - integrity sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg== + version "1.5.3" + resolved "https://registry.yarnpkg.com/dedent/-/dedent-1.5.3.tgz#99aee19eb9bae55a67327717b6e848d0bf777e5a" + integrity sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ== deep-equal@^2.0.5: version "2.2.3" @@ -3110,25 +2659,16 @@ deep-equal@^2.0.5: which-typed-array "^1.1.13" deep-is@^0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" - integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= + version "0.1.4" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== deepmerge@^4.2.2: - version "4.2.2" - resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" - integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== - -define-data-property@^1.0.1, define-data-property@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.1.tgz#c35f7cd0ab09883480d12ac5cb213715587800b3" - integrity sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ== - dependencies: - get-intrinsic "^1.2.1" - gopd "^1.0.1" - has-property-descriptors "^1.0.0" + version "4.3.1" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" + integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== -define-data-property@^1.1.4: +define-data-property@^1.0.1, define-data-property@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== @@ -3137,13 +2677,6 @@ define-data-property@^1.1.4: es-errors "^1.3.0" gopd "^1.0.1" -define-properties@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" - integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== - dependencies: - object-keys "^1.0.12" - define-properties@^1.2.0, define-properties@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" @@ -3216,15 +2749,10 @@ domexception@^4.0.0: dependencies: webidl-conversions "^7.0.0" -electron-to-chromium@^1.4.251: - version "1.4.284" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz#61046d1e4cab3a25238f6bf7413795270f125592" - integrity sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA== - -electron-to-chromium@^1.4.648: - version "1.4.650" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.650.tgz#b38ef9de16991b9f7b924246770576ab91ab3d64" - integrity sha512-sYSQhJCJa4aGA1wYol5cMQgekDBlbVfTRavlGZVr3WZpDdOPcp6a6xUnFfrt8TqZhsBYYbDxJZCjGfHuGupCRQ== +electron-to-chromium@^1.4.796: + version "1.4.802" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.802.tgz#49b397eadc95a49b1ac33eebee146b8e5a93773f" + integrity sha512-TnTMUATbgNdPXVSHsxvNVSG0uEd6cSZsANjm8c9HbvflZVVn1yTRcmVXYT1Ma95/ssB/Dcd30AHweH2TE+dNpA== emittery@^0.13.1: version "0.13.1" @@ -3245,11 +2773,12 @@ enhanced-resolve@^5.12.0: tapable "^2.2.0" enquirer@^2.3.6: - version "2.3.6" - resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" - integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== + version "2.4.1" + resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.4.1.tgz#93334b3fbd74fc7097b224ab4a8fb7e40bf4ae56" + integrity sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ== dependencies: ansi-colors "^4.1.1" + strip-ansi "^6.0.1" entities@^4.4.0: version "4.5.0" @@ -3263,28 +2792,6 @@ error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" -es-abstract@^1.18.0-next.2: - version "1.18.3" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.3.tgz#25c4c3380a27aa203c44b2b685bba94da31b63e0" - integrity sha512-nQIr12dxV7SSxE6r6f1l3DtAeEYdsGpps13dR0TwJg1S8gyp4ZPgy3FZcHBgbiQqnoqSTb+oC+kO4UQ0C/J8vw== - dependencies: - call-bind "^1.0.2" - es-to-primitive "^1.2.1" - function-bind "^1.1.1" - get-intrinsic "^1.1.1" - has "^1.0.3" - has-symbols "^1.0.2" - is-callable "^1.2.3" - is-negative-zero "^2.0.1" - is-regex "^1.1.3" - is-string "^1.0.6" - object-inspect "^1.10.3" - object-keys "^1.1.1" - object.assign "^4.1.2" - string.prototype.trimend "^1.0.4" - string.prototype.trimstart "^1.0.4" - unbox-primitive "^1.0.1" - es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23.1, es-abstract@^1.23.2, es-abstract@^1.23.3: version "1.23.3" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.23.3.tgz#8f0c5a35cd215312573c5a27c87dfd6c881a0aa0" @@ -3416,15 +2923,15 @@ es-to-primitive@^1.2.1: is-date-object "^1.0.1" is-symbol "^1.0.2" -escalade@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" - integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== +escalade@^3.1.1, escalade@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.2.tgz#54076e9ab29ea5bf3d8f1ed62acffbb88272df27" + integrity sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA== escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== escape-string-regexp@^2.0.0: version "2.0.0" @@ -3474,7 +2981,7 @@ eslint-import-resolver-typescript@^3.6.1: is-core-module "^2.11.0" is-glob "^4.0.3" -eslint-module-utils@^2.7.4, eslint-module-utils@^2.8.0: +eslint-module-utils@^2.7.4: version "2.8.1" resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz#52f2404300c3bd33deece9d7372fb337cc1d7c34" integrity sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q== @@ -3496,29 +3003,6 @@ eslint-plugin-import-x@^0.5.1: semver "^7.6.0" tslib "^2.6.2" -eslint-plugin-import@^2.29.1: - version "2.29.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz#d45b37b5ef5901d639c15270d74d46d161150643" - integrity sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw== - dependencies: - array-includes "^3.1.7" - array.prototype.findlastindex "^1.2.3" - array.prototype.flat "^1.3.2" - array.prototype.flatmap "^1.3.2" - debug "^3.2.7" - doctrine "^2.1.0" - eslint-import-resolver-node "^0.3.9" - eslint-module-utils "^2.8.0" - hasown "^2.0.0" - is-core-module "^2.13.1" - is-glob "^4.0.3" - minimatch "^3.1.2" - object.fromentries "^2.0.7" - object.groupby "^1.0.1" - object.values "^1.1.7" - semver "^6.3.1" - tsconfig-paths "^3.15.0" - eslint-plugin-prettier@^5.1.3: version "5.1.3" resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-5.1.3.tgz#17cfade9e732cef32b5f5be53bd4e07afd8e67e1" @@ -3637,12 +3121,7 @@ esrecurse@^4.3.0: dependencies: estraverse "^5.2.0" -estraverse@^5.1.0, estraverse@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.2.0.tgz#307df42547e6cc7324d3cf03c155d5cdb8c53880" - integrity sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ== - -estraverse@^5.3.0: +estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0: version "5.3.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== @@ -3657,7 +3136,7 @@ esutils@^2.0.2: resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== -execa@^5.0.0: +execa@^5.0.0, execa@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== @@ -3694,9 +3173,9 @@ fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== fast-diff@^1.1.2: - version "1.2.0" - resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03" - integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== + version "1.3.0" + resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.3.0.tgz#ece407fa550a64d638536cd727e129c61616e0f0" + integrity sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw== fast-glob@^3.2.9, fast-glob@^3.3.1: version "3.3.2" @@ -3717,12 +3196,12 @@ fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0: fast-levenshtein@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" - integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= + integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== fastq@^1.6.0: - version "1.11.1" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.11.1.tgz#5d8175aae17db61947f8b162cfc7f63264d22807" - integrity sha512-HOnr8Mc60eNYl1gzwp6r5RoUyAn5/glBolUzP/Ez6IFVPMPirxn/9phgL6zhOtaTy7ISwPvQ+wT+hfcRZh/bzw== + version "1.17.1" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.17.1.tgz#2a523f07a4e7b1e81a42b91b8bf2254107753b47" + integrity sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w== dependencies: reusify "^1.0.4" @@ -3740,10 +3219,10 @@ file-entry-cache@^8.0.0: dependencies: flat-cache "^4.0.0" -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== +fill-range@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" + integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== dependencies: to-regex-range "^5.0.1" @@ -3800,23 +3279,13 @@ form-data@^4.0.0: fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== -fsevents@^2.3.2: +fsevents@^2.3.2, fsevents@~2.3.2: version "2.3.3" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== -fsevents@~2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" - integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== - -function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== - function-bind@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" @@ -3847,26 +3316,7 @@ get-caller-file@^2.0.5: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== -get-intrinsic@^1.0.2, get-intrinsic@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" - integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== - dependencies: - function-bind "^1.1.1" - has "^1.0.3" - has-symbols "^1.0.1" - -get-intrinsic@^1.1.3, get-intrinsic@^1.2.0, get-intrinsic@^1.2.1, get-intrinsic@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.2.tgz#281b7622971123e1ef4b3c90fd7539306da93f3b" - integrity sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA== - dependencies: - function-bind "^1.1.2" - has-proto "^1.0.1" - has-symbols "^1.0.3" - hasown "^2.0.0" - -get-intrinsic@^1.2.3, get-intrinsic@^1.2.4: +get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.2, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== @@ -3920,21 +3370,9 @@ glob-parent@^6.0.2: resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== dependencies: - is-glob "^4.0.3" - -glob@^7.1.3: - version "7.1.7" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" - integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" + is-glob "^4.0.3" -glob@^7.1.4: +glob@^7.1.3, glob@^7.1.4: version "7.2.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== @@ -4004,12 +3442,7 @@ graphemer@^1.4.0: resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== -has-bigints@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.1.tgz#64fe6acb020673e3b78db035a5af69aa9d07b113" - integrity sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA== - -has-bigints@^1.0.2: +has-bigints@^1.0.1, has-bigints@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== @@ -4017,76 +3450,38 @@ has-bigints@^1.0.2: has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== has-flag@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== -has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz#52ba30b6c5ec87fd89fa574bc1c39125c6f65340" - integrity sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg== - dependencies: - get-intrinsic "^1.2.2" - -has-property-descriptors@^1.0.2: +has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== dependencies: es-define-property "^1.0.0" -has-proto@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0" - integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== - -has-proto@^1.0.3: +has-proto@^1.0.1, has-proto@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.3.tgz#b31ddfe9b0e6e9914536a6ab286426d0214f77fd" integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q== -has-symbols@^1.0.1, has-symbols@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423" - integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw== - -has-symbols@^1.0.3: +has-symbols@^1.0.2, has-symbols@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== -has-tostringtag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" - integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== - dependencies: - has-symbols "^1.0.2" - -has-tostringtag@^1.0.2: +has-tostringtag@^1.0.0, has-tostringtag@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== dependencies: has-symbols "^1.0.3" -has@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== - dependencies: - function-bind "^1.1.1" - -hasown@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.0.tgz#f4c513d454a57b7c7e1650778de226b11700546c" - integrity sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA== - dependencies: - function-bind "^1.1.2" - -hasown@^2.0.1, hasown@^2.0.2: +hasown@^2.0.0, hasown@^2.0.1, hasown@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== @@ -4128,9 +3523,9 @@ human-signals@^2.1.0: integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== husky@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/husky/-/husky-7.0.1.tgz#579f4180b5da4520263e8713cc832942b48e1f1c" - integrity sha512-gceRaITVZ+cJH9sNHqx5tFwbzlLCVxtVZcusME8JYQ8Edy5mpGDOqD8QBCdMhpyo9a+JXddnujQ4rpY2Ff9SJA== + version "7.0.4" + resolved "https://registry.yarnpkg.com/husky/-/husky-7.0.4.tgz#242048245dc49c8fb1bf0cc7cfb98dd722531535" + integrity sha512-vbaCKN2QLtP/vD4yvs6iz6hBEo6wkSzs8HpRah1Z6aGmF2KW5PdYuAd7uX5a+OyBZHBhd+TFLqgjUgytQr4RvQ== iconv-lite@0.6.3: version "0.6.3" @@ -4163,7 +3558,7 @@ import-local@^3.0.2: imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== indent-string@^4.0.0: version "4.0.0" @@ -4173,7 +3568,7 @@ indent-string@^4.0.0: inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== dependencies: once "^1.3.0" wrappy "1" @@ -4183,16 +3578,7 @@ inherits@2: resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== -internal-slot@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.6.tgz#37e756098c4911c5e912b8edbf71ed3aa116f930" - integrity sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg== - dependencies: - get-intrinsic "^1.2.2" - hasown "^2.0.0" - side-channel "^1.0.4" - -internal-slot@^1.0.7: +internal-slot@^1.0.4, internal-slot@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.7.tgz#c06dcca3ed874249881007b0a5523b172a190802" integrity sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g== @@ -4209,16 +3595,7 @@ is-arguments@^1.1.1: call-bind "^1.0.2" has-tostringtag "^1.0.0" -is-array-buffer@^3.0.1, is-array-buffer@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.2.tgz#f2653ced8412081638ecb0ebbd0c41c6e0aecbbe" - integrity sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.2.0" - is-typed-array "^1.1.10" - -is-array-buffer@^3.0.4: +is-array-buffer@^3.0.2, is-array-buffer@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.4.tgz#7a1f92b3d61edd2bc65d24f130530ea93d7fae98" integrity sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw== @@ -4229,7 +3606,7 @@ is-array-buffer@^3.0.4: is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= + integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== is-async-function@^2.0.0: version "2.0.0" @@ -4239,23 +3616,19 @@ is-async-function@^2.0.0: has-tostringtag "^1.0.0" is-bigint@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.2.tgz#ffb381442503235ad245ea89e45b3dbff040ee5a" - integrity sha512-0JV5+SOCQkIdzjBK9buARcV804Ddu7A0Qet6sHi3FimE9ne6m4BGQZfRn+NZiXbBk4F4XmHfDZIipLj9pX8dSA== + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" + integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== + dependencies: + has-bigints "^1.0.1" is-boolean-object@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.1.tgz#3c0878f035cb821228d350d2e1e36719716a3de8" - integrity sha512-bXdQWkECBUIAcCkeH1unwJLIpZYaa5VvuygSyS/c2lf719mTKZDU5UdDRlpd01UjADgmW8RfqaP+mRaVPdr/Ng== + version "1.1.2" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" + integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== dependencies: call-bind "^1.0.2" - -is-builtin-module@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-3.2.0.tgz#bb0310dfe881f144ca83f30100ceb10cf58835e0" - integrity sha512-phDA4oSGt7vl1n5tJvTWooWWAsXLY+2xCnxNqvKhGEzujg+A43wPlPOyDg3C8XQHN+6k/JTQWJ/j0dQh/qr+Hw== - dependencies: - builtin-modules "^3.3.0" + has-tostringtag "^1.0.0" is-builtin-module@^3.2.1: version "3.2.1" @@ -4264,37 +3637,18 @@ is-builtin-module@^3.2.1: dependencies: builtin-modules "^3.3.0" -is-callable@^1.1.3, is-callable@^1.2.7: +is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: version "1.2.7" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== -is-callable@^1.1.4, is-callable@^1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.3.tgz#8b1e0500b73a1d76c70487636f368e519de8db8e" - integrity sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ== - -is-core-module@^2.11.0, is-core-module@^2.13.0, is-core-module@^2.13.1: +is-core-module@^2.11.0, is-core-module@^2.13.0: version "2.13.1" resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384" integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw== dependencies: hasown "^2.0.0" -is-core-module@^2.2.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.5.0.tgz#f754843617c70bfd29b7bd87327400cda5c18491" - integrity sha512-TXCMSDsEHMEEZ6eCA8rwRDbLu55MRGmrctljsBX/2v1d9/GzqHOxW5c5oPSgrUt2vBFXebu9rGqckXGPWOlYpg== - dependencies: - has "^1.0.3" - -is-core-module@^2.9.0: - version "2.11.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.11.0.tgz#ad4cb3e3863e814523c96f3f58d26cc570ff0144" - integrity sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw== - dependencies: - has "^1.0.3" - is-data-view@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-data-view/-/is-data-view-1.0.1.tgz#4b4d3a511b70f3dc26d42c03ca9ca515d847759f" @@ -4302,12 +3656,7 @@ is-data-view@^1.0.1: dependencies: is-typed-array "^1.1.13" -is-date-object@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.4.tgz#550cfcc03afada05eea3dd30981c7b09551f73e5" - integrity sha512-/b4ZVsG7Z5XVtIxs/h9W8nvfLgSAyKYdtGWQLbqy6jA1icmgjf8WCoTKgeS4wy5tYaPePouzFMANbnj94c2Z+A== - -is-date-object@^1.0.5: +is-date-object@^1.0.1, is-date-object@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== @@ -4317,7 +3666,7 @@ is-date-object@^1.0.5: is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== is-finalizationregistry@^1.0.2: version "1.0.2" @@ -4343,44 +3692,34 @@ is-generator-function@^1.0.10: dependencies: has-tostringtag "^1.0.0" -is-glob@^4.0.0, is-glob@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" - integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== - dependencies: - is-extglob "^2.1.1" - -is-glob@^4.0.3: +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== dependencies: is-extglob "^2.1.1" -is-map@^2.0.1, is-map@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.2.tgz#00922db8c9bf73e81b7a335827bc2a43f2b91127" - integrity sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg== +is-map@^2.0.2, is-map@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.3.tgz#ede96b7fe1e270b3c4465e3a465658764926d62e" + integrity sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw== is-module@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591" integrity sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g== -is-negative-zero@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.1.tgz#3de746c18dda2319241a53675908d8f766f11c24" - integrity sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w== - is-negative-zero@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.3.tgz#ced903a027aca6381b777a5743069d7376a49747" integrity sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw== is-number-object@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.5.tgz#6edfaeed7950cff19afedce9fbfca9ee6dd289eb" - integrity sha512-RU0lI/n95pMoUKu9v1BZP5MBcZuNSVJkMkAG2dJqC4z2GlkGUNeH68SuHuBKBD/XFe+LHZ+f9BKkLET60Niedw== + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" + integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== + dependencies: + has-tostringtag "^1.0.0" is-number@^7.0.0: version "7.0.0" @@ -4390,7 +3729,7 @@ is-number@^7.0.0: is-obj@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" - integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8= + integrity sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg== is-path-inside@^3.0.3: version "3.0.3" @@ -4409,14 +3748,6 @@ is-reference@1.2.1: dependencies: "@types/estree" "*" -is-regex@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.3.tgz#d029f9aff6448b93ebbe3f33dac71511fdcbef9f" - integrity sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ== - dependencies: - call-bind "^1.0.2" - has-symbols "^1.0.2" - is-regex@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" @@ -4428,21 +3759,14 @@ is-regex@^1.1.4: is-regexp@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069" - integrity sha1-/S2INUXEa6xaYz57mgnof6LLUGk= - -is-set@^2.0.1, is-set@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.2.tgz#90755fa4c2562dc1c5d4024760d6119b94ca18ec" - integrity sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g== + integrity sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA== -is-shared-array-buffer@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" - integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== - dependencies: - call-bind "^1.0.2" +is-set@^2.0.2, is-set@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.3.tgz#8ab209ea424608141372ded6e0cb200ef1d9d01d" + integrity sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg== -is-shared-array-buffer@^1.0.3: +is-shared-array-buffer@^1.0.2, is-shared-array-buffer@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz#1237f1cba059cdb62431d378dcc37d9680181688" integrity sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg== @@ -4450,16 +3774,11 @@ is-shared-array-buffer@^1.0.3: call-bind "^1.0.7" is-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3" - integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw== - -is-string@^1.0.5, is-string@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.6.tgz#3fe5d5992fb0d93404f32584d4b0179a71b54a5f" - integrity sha512-2gdzbKUuqtQ3lYNrUTQYoClPhm7oQu4UdpSZMp1/DGgkHBT8E2Z1l0yMdb6D4zNAxwDiMv8MdulKROJGNl0Q0w== + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== -is-string@^1.0.7: +is-string@^1.0.5, is-string@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== @@ -4473,13 +3792,6 @@ is-symbol@^1.0.2, is-symbol@^1.0.3: dependencies: has-symbols "^1.0.2" -is-typed-array@^1.1.10: - version "1.1.12" - resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.12.tgz#d0bab5686ef4a76f7a73097b95470ab199c57d4a" - integrity sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg== - dependencies: - which-typed-array "^1.1.11" - is-typed-array@^1.1.13: version "1.1.13" resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.13.tgz#d6c5ca56df62334959322d7d7dd1cca50debe229" @@ -4487,15 +3799,10 @@ is-typed-array@^1.1.13: dependencies: which-typed-array "^1.1.14" -is-unicode-supported@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" - integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== - -is-weakmap@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.1.tgz#5008b59bdc43b698201d18f62b37b2ca243e8cf2" - integrity sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA== +is-weakmap@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.2.tgz#bf72615d649dfe5f699079c54b83e47d1ae19cfd" + integrity sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w== is-weakref@^1.0.2: version "1.0.2" @@ -4504,13 +3811,13 @@ is-weakref@^1.0.2: dependencies: call-bind "^1.0.2" -is-weakset@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.2.tgz#4569d67a747a1ce5a994dfd4ef6dcea76e7c0a1d" - integrity sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg== +is-weakset@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.3.tgz#e801519df8c0c43e12ff2834eead84ec9e624007" + integrity sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ== dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.1.1" + call-bind "^1.0.7" + get-intrinsic "^1.2.4" isarray@^2.0.5: version "2.0.5" @@ -4520,7 +3827,7 @@ isarray@^2.0.5: isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: version "3.2.2" @@ -4539,13 +3846,13 @@ istanbul-lib-instrument@^5.0.4: semver "^6.3.0" istanbul-lib-instrument@^6.0.0: - version "6.0.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.1.tgz#71e87707e8041428732518c6fb5211761753fbdf" - integrity sha512-EAMEJBsYuyyztxMxW3g7ugGPkrZsV57v0Hmv3mm1uQsmB+QnZuepg731CRaIgeUVSdmsTngOkSnauNF8p7FIhA== + version "6.0.2" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.2.tgz#91655936cf7380e4e473383081e38478b69993b1" + integrity sha512-1WUsZ9R1lA0HtBSohTkm39WTPlNKSJ5iFk7UwqXkBLoHQT+hfqPsfsTDVuZdKGaBwn7din9bS7SsnoAr943hvw== dependencies: - "@babel/core" "^7.12.3" - "@babel/parser" "^7.14.7" - "@istanbuljs/schema" "^0.1.2" + "@babel/core" "^7.23.9" + "@babel/parser" "^7.23.9" + "@istanbuljs/schema" "^0.1.3" istanbul-lib-coverage "^3.2.0" semver "^7.5.4" @@ -4568,9 +3875,9 @@ istanbul-lib-source-maps@^4.0.0: source-map "^0.6.1" istanbul-reports@^3.1.3: - version "3.1.6" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.6.tgz#2544bcab4768154281a2f0870471902704ccaa1a" - integrity sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg== + version "3.1.7" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.7.tgz#daed12b9e1dca518e15c056e1e537e741280fa0b" + integrity sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g== dependencies: html-escaper "^2.0.0" istanbul-lib-report "^3.0.0" @@ -5043,32 +4350,27 @@ json-schema-traverse@^0.4.1: json-stable-stringify-without-jsonify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" - integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= - -json5@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" - integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== - dependencies: - minimist "^1.2.0" + integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== -json5@^2.2.2, json5@^2.2.3: +json5@^2.2.3: version "2.2.3" resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== jsonc-parser@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.2.0.tgz#31ff3f4c2b9793f89c67212627c51c6394f88e76" - integrity sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w== + version "3.2.1" + resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.2.1.tgz#031904571ccf929d7670ee8c547545081cb37f1a" + integrity sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA== "jsx-ast-utils@^2.4.1 || ^3.0.0": - version "3.2.0" - resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.2.0.tgz#41108d2cec408c3453c1bbe8a4aae9e1e2bd8f82" - integrity sha512-EIsmt3O3ljsU6sot/J4E1zDRxfBNrhjyf/OKjlydwgEimQuznlM4Wv7U+ueONJMyEn1WRE0K8dhi3dVAXYT24Q== + version "3.3.5" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz#4766bd05a8e2a11af222becd19e15575e52a853a" + integrity sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ== dependencies: - array-includes "^3.1.2" - object.assign "^4.1.2" + array-includes "^3.1.6" + array.prototype.flat "^1.3.1" + object.assign "^4.1.4" + object.values "^1.1.6" keyv@^4.5.4: version "4.5.4" @@ -5096,41 +4398,41 @@ levn@^0.4.1: type-check "~0.4.0" lines-and-columns@^1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00" - integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA= + version "1.2.4" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== lint-staged@^11.0.0: - version "11.0.1" - resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-11.0.1.tgz#1b8ae8ed5a52ed87252db95fe008c2618c85f55a" - integrity sha512-RkTA1ulE6jAGFskxpGAwxfVRXjHp7D9gFg/+KMARUWMPiVFP0t28Em2u0gL8sA0w3/ck3TC57F2v2RNeQ5XPnw== - dependencies: - chalk "^4.1.1" - cli-truncate "^2.1.0" - commander "^7.2.0" - cosmiconfig "^7.0.0" - debug "^4.3.1" - dedent "^0.7.0" + version "11.2.6" + resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-11.2.6.tgz#f477b1af0294db054e5937f171679df63baa4c43" + integrity sha512-Vti55pUnpvPE0J9936lKl0ngVeTdSZpEdTNhASbkaWX7J5R9OEifo1INBGQuGW4zmy6OG+TcWPJ3m5yuy5Q8Tg== + dependencies: + cli-truncate "2.1.0" + colorette "^1.4.0" + commander "^8.2.0" + cosmiconfig "^7.0.1" + debug "^4.3.2" enquirer "^2.3.6" - execa "^5.0.0" - listr2 "^3.8.2" - log-symbols "^4.1.0" + execa "^5.1.1" + listr2 "^3.12.2" micromatch "^4.0.4" normalize-path "^3.0.0" please-upgrade-node "^3.2.0" string-argv "0.3.1" - stringify-object "^3.3.0" + stringify-object "3.3.0" + supports-color "8.1.1" -listr2@^3.8.2: - version "3.10.0" - resolved "https://registry.yarnpkg.com/listr2/-/listr2-3.10.0.tgz#58105a53ed7fa1430d1b738c6055ef7bb006160f" - integrity sha512-eP40ZHihu70sSmqFNbNy2NL1YwImmlMmPh9WO5sLmPDleurMHt3n+SwEWNu2kzKScexZnkyFtc1VI0z/TGlmpw== +listr2@^3.12.2: + version "3.14.0" + resolved "https://registry.yarnpkg.com/listr2/-/listr2-3.14.0.tgz#23101cc62e1375fd5836b248276d1d2b51fdbe9e" + integrity sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g== dependencies: cli-truncate "^2.1.0" - colorette "^1.2.2" + colorette "^2.0.16" log-update "^4.0.0" p-map "^4.0.0" - rxjs "^6.6.7" + rfdc "^1.3.0" + rxjs "^7.5.1" through "^2.3.8" wrap-ansi "^7.0.0" @@ -5158,19 +4460,11 @@ lodash.merge@^4.6.2: resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== -lodash@^4.17.15: +lodash@^4.17.21: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== -log-symbols@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" - integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== - dependencies: - chalk "^4.1.0" - is-unicode-supported "^0.1.0" - log-update@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/log-update/-/log-update-4.0.0.tgz#589ecd352471f2a1c0c570287543a64dfd20e0a1" @@ -5195,13 +4489,6 @@ lru-cache@^5.1.1: dependencies: yallist "^3.0.2" -lru-cache@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" - integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== - dependencies: - yallist "^4.0.0" - lz-string@^1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/lz-string/-/lz-string-1.5.0.tgz#c1ab50f77887b712621201ba9fd4e3a6ed099941" @@ -5215,9 +4502,9 @@ magic-string@^0.27.0: "@jridgewell/sourcemap-codec" "^1.4.13" magic-string@^0.30.3: - version "0.30.5" - resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.5.tgz#1994d980bd1c8835dc6e78db7cbd4ae4f24746f9" - integrity sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA== + version "0.30.10" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.10.tgz#123d9c41a0cb5640c892b041d4cfb3bd0aa4b39e" + integrity sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ== dependencies: "@jridgewell/sourcemap-codec" "^1.4.15" @@ -5251,12 +4538,12 @@ merge2@^1.3.0, merge2@^1.4.1: integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== micromatch@^4.0.4: - version "4.0.4" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9" - integrity sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg== + version "4.0.7" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.7.tgz#33e8190d9fe474a9895525f5618eee136d46c2e5" + integrity sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q== dependencies: - braces "^3.0.1" - picomatch "^2.2.3" + braces "^3.0.3" + picomatch "^2.3.1" mime-db@1.52.0: version "1.52.0" @@ -5280,14 +4567,7 @@ min-indent@^1.0.0: resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== -minimatch@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" - integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== - dependencies: - brace-expansion "^1.1.7" - -minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: +minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== @@ -5308,16 +4588,6 @@ minimatch@^9.0.3, minimatch@^9.0.4: dependencies: brace-expansion "^2.0.1" -minimist@^1.2.0: - version "1.2.5" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" - integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== - -minimist@^1.2.6: - version "1.2.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" - integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== - ms@2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" @@ -5331,7 +4601,7 @@ ms@^2.1.1: natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" - integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= + integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== node-int64@^0.4.0: version "0.4.0" @@ -5343,11 +4613,6 @@ node-releases@^2.0.14: resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.14.tgz#2ffb053bceb8b2be8495ece1ab6ce600c4461b0b" integrity sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw== -node-releases@^2.0.6: - version "2.0.8" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.8.tgz#0f349cdc8fcfa39a92ac0be9bc48b7706292b9ae" - integrity sha512-dFSmB8fFHEH/s81Xi+Y/15DQY6VHW81nXRj86EMSL3lmuTmK1e+aT4wrFCkTbm+gSwkw4KpX+rT/pMM2c1mF+A== - normalize-path@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" @@ -5361,19 +4626,14 @@ npm-run-path@^4.0.1: path-key "^3.0.0" nwsapi@^2.2.2: - version "2.2.7" - resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.7.tgz#738e0707d3128cb750dddcfe90e4610482df0f30" - integrity sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ== + version "2.2.10" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.10.tgz#0b77a68e21a0b483db70b11fad055906e867cda8" + integrity sha512-QK0sRs7MKv0tKe1+5uZIQk/C8XGza4DAnztJG8iD+TpJIORARrCxczA738awHrZoHeTjSSoHqao2teO0dC/gFQ== object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= - -object-inspect@^1.10.3, object-inspect@^1.9.0: - version "1.11.0" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.11.0.tgz#9dceb146cedd4148a0d9e51ab88d34cf509922b1" - integrity sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg== + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== object-inspect@^1.13.1: version "1.13.1" @@ -5381,28 +4641,18 @@ object-inspect@^1.13.1: integrity sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ== object-is@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac" - integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw== + version "1.1.6" + resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.6.tgz#1a6a53aed2dd8f7e6775ff870bea58545956ab07" + integrity sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q== dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" + call-bind "^1.0.7" + define-properties "^1.2.1" -object-keys@^1.0.12, object-keys@^1.1.1: +object-keys@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== -object.assign@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" - integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== - dependencies: - call-bind "^1.0.0" - define-properties "^1.1.3" - has-symbols "^1.0.1" - object-keys "^1.1.1" - object.assign@^4.1.4, object.assign@^4.1.5: version "4.1.5" resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.5.tgz#3a833f9ab7fdb80fc9e8d2300c803d216d8fdbb0" @@ -5422,7 +4672,7 @@ object.entries@^1.1.8: define-properties "^1.2.1" es-object-atoms "^1.0.0" -object.fromentries@^2.0.7, object.fromentries@^2.0.8: +object.fromentries@^2.0.8: version "2.0.8" resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.8.tgz#f7195d8a9b97bd95cbc1999ea939ecd1a2b00c65" integrity sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ== @@ -5432,15 +4682,6 @@ object.fromentries@^2.0.7, object.fromentries@^2.0.8: es-abstract "^1.23.2" es-object-atoms "^1.0.0" -object.groupby@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/object.groupby/-/object.groupby-1.0.3.tgz#9b125c36238129f6f7b61954a1e7176148d5002e" - integrity sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.2" - object.hasown@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.4.tgz#e270ae377e4c120cdcb7656ce66884a6218283dc" @@ -5450,7 +4691,7 @@ object.hasown@^1.1.4: es-abstract "^1.23.2" es-object-atoms "^1.0.0" -object.values@^1.1.7, object.values@^1.2.0: +object.values@^1.1.6, object.values@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.2.0.tgz#65405a9d92cee68ac2d303002e0b8470a4d9ab1b" integrity sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ== @@ -5462,7 +4703,7 @@ object.values@^1.1.7, object.values@^1.2.0: once@^1.3.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== dependencies: wrappy "1" @@ -5557,14 +4798,14 @@ path-exists@^4.0.0: path-is-absolute@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== path-key@^3.0.0, path-key@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== -path-parse@^1.0.6, path-parse@^1.0.7: +path-parse@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== @@ -5574,21 +4815,16 @@ path-type@^4.0.0: resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== -picocolors@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" - integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== +picocolors@^1.0.0, picocolors@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.1.tgz#a8ad579b571952f0e5d25892de5445bcfe25aaa1" + integrity sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew== -picomatch@^2.0.4, picomatch@^2.3.1: +picomatch@^2.0.4, picomatch@^2.2.3, picomatch@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== -picomatch@^2.2.3: - version "2.3.0" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972" - integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw== - pirates@^4.0.4: version "4.0.6" resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.6.tgz#3018ae32ecfcff6c29ba2267cbf21166ac1f36b9" @@ -5625,7 +4861,7 @@ prettier-linter-helpers@^1.0.0: dependencies: fast-diff "^1.1.2" -prettier@3.3.2: +prettier@^3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.3.2.tgz#03ff86dc7c835f2d2559ee76876a3914cec4a90a" integrity sha512-rAVeHYMcv8ATV5d508CFdn+8/pHPpXeIid1DdrPwXnaAdH7cqjVbpJaT5eq4yRAFU/lsbwYwSF/n5iNrdJHPQA== @@ -5675,20 +4911,15 @@ psl@^1.1.33: resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== -punycode@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" - integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== - -punycode@^2.1.1: +punycode@^2.1.0, punycode@^2.1.1: version "2.3.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== pure-rand@^6.0.0: - version "6.0.4" - resolved "https://registry.yarnpkg.com/pure-rand/-/pure-rand-6.0.4.tgz#50b737f6a925468679bff00ad20eade53f37d5c7" - integrity sha512-LA0Y9kxMYv47GIPJy6MI84fqTd2HmYZI83W/kM/SkKfDlajnZYfmXFTxkbY+xSBPkLJxltMa9hIkmdc29eguMA== + version "6.1.0" + resolved "https://registry.yarnpkg.com/pure-rand/-/pure-rand-6.1.0.tgz#d173cf23258231976ccbdb05247c9787957604f2" + integrity sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA== querystringify@^2.1.1: version "2.2.0" @@ -5708,12 +4939,12 @@ randombytes@^2.1.0: safe-buffer "^5.1.0" react-dom@>=17: - version "18.2.0" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.2.0.tgz#22aaf38708db2674ed9ada224ca4aa708d821e3d" - integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g== + version "18.3.1" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.3.1.tgz#c2265d79511b57d479b3dd3fdfa51536494c5cb4" + integrity sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw== dependencies: loose-envify "^1.1.0" - scheduler "^0.23.0" + scheduler "^0.23.2" react-is@^16.13.1: version "16.13.1" @@ -5726,14 +4957,14 @@ react-is@^17.0.1: integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== react-is@^18.0.0: - version "18.2.0" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" - integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== + version "18.3.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.3.1.tgz#e83557dc12eae63a99e003a46388b1dcbb44db7e" + integrity sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg== react@>=17: - version "18.2.0" - resolved "https://registry.yarnpkg.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5" - integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ== + version "18.3.1" + resolved "https://registry.yarnpkg.com/react/-/react-18.3.1.tgz#49ab892009c53933625bd16b2533fc754cab2891" + integrity sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ== dependencies: loose-envify "^1.1.0" @@ -5759,9 +4990,9 @@ reflect.getprototypeof@^1.0.4: which-builtin-type "^1.1.3" regenerate-unicode-properties@^10.1.0: - version "10.1.0" - resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz#7c3192cab6dd24e21cb4461e5ddd7dd24fa8374c" - integrity sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ== + version "10.1.1" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz#6b0e05489d9076b04c436f318d9b067bba459480" + integrity sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q== dependencies: regenerate "^1.4.2" @@ -5770,33 +5001,19 @@ regenerate@^1.4.2: resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== -regenerator-runtime@^0.13.11: - version "0.13.11" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9" - integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== - regenerator-runtime@^0.14.0: version "0.14.1" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== -regenerator-transform@^0.15.1: - version "0.15.1" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.1.tgz#f6c4e99fc1b4591f780db2586328e4d9a9d8dc56" - integrity sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg== +regenerator-transform@^0.15.2: + version "0.15.2" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.2.tgz#5bbae58b522098ebdf09bca2f83838929001c7a4" + integrity sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg== dependencies: "@babel/runtime" "^7.8.4" -regexp.prototype.flags@^1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz#90ce989138db209f81492edd734183ce99f9677e" - integrity sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - set-function-name "^2.0.0" - -regexp.prototype.flags@^1.5.2: +regexp.prototype.flags@^1.5.1, regexp.prototype.flags@^1.5.2: version "1.5.2" resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz#138f644a3350f981a858c44f6bb1a61ff59be334" integrity sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw== @@ -5806,23 +5023,18 @@ regexp.prototype.flags@^1.5.2: es-errors "^1.3.0" set-function-name "^2.0.1" -regexpu-core@^5.2.1: - version "5.2.2" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.2.2.tgz#3e4e5d12103b64748711c3aad69934d7718e75fc" - integrity sha512-T0+1Zp2wjF/juXMrMxHxidqGYn8U4R+zleSJhX9tQ1PUsS8a9UtYfbsF9LdiVgNX3kiX8RNaKM42nfSgvFJjmw== +regexpu-core@^5.3.1: + version "5.3.2" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.3.2.tgz#11a2b06884f3527aec3e93dbbf4a3b958a95546b" + integrity sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ== dependencies: + "@babel/regjsgen" "^0.8.0" regenerate "^1.4.2" regenerate-unicode-properties "^10.1.0" - regjsgen "^0.7.1" regjsparser "^0.9.1" unicode-match-property-ecmascript "^2.0.0" unicode-match-property-value-ecmascript "^2.1.0" -regjsgen@^0.7.1: - version "0.7.1" - resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.7.1.tgz#ee5ef30e18d3f09b7c369b76e7c2373ed25546f6" - integrity sha512-RAt+8H2ZEzHeYWxZ3H2z6tF18zyyOnlcdaafLrm21Bguj7uZy6ULibiAFdXEtKQY4Sy7wDTwDiOazasMLc4KPA== - regjsparser@^0.9.1: version "0.9.1" resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.9.1.tgz#272d05aa10c7c1f67095b1ff0addae8442fc5709" @@ -5867,24 +5079,7 @@ resolve.exports@^2.0.0: resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-2.0.2.tgz#f8c934b8e6a13f539e38b7098e2e36134f01e800" integrity sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg== -resolve@^1.14.2, resolve@^1.22.1: - version "1.22.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" - integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== - dependencies: - is-core-module "^2.9.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - -resolve@^1.20.0: - version "1.20.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" - integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== - dependencies: - is-core-module "^2.2.0" - path-parse "^1.0.6" - -resolve@^1.22.4: +resolve@^1.14.2, resolve@^1.20.0, resolve@^1.22.1, resolve@^1.22.4: version "1.22.8" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== @@ -5915,38 +5110,46 @@ reusify@^1.0.4: resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== +rfdc@^1.3.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.4.1.tgz#778f76c4fb731d93414e8f925fbecf64cce7f6ca" + integrity sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA== + rollup-plugin-peer-deps-external@^2.2.4: version "2.2.4" resolved "https://registry.yarnpkg.com/rollup-plugin-peer-deps-external/-/rollup-plugin-peer-deps-external-2.2.4.tgz#8a420bbfd6dccc30aeb68c9bf57011f2f109570d" integrity sha512-AWdukIM1+k5JDdAqV/Cxd+nejvno2FVLVeZ74NKggm3Q5s9cbbcOgUPGdbxPi4BXu7xGaZ8HG12F+thImYu/0g== -rollup@^3.10.1: - version "3.10.1" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-3.10.1.tgz#56278901ed11fc2898421e8e3e2c8155bc7b40b4" - integrity sha512-3Er+yel3bZbZX1g2kjVM+FW+RUWDxbG87fcqFM5/9HbPCTpbVp6JOLn7jlxnNlbu7s/N/uDA4EV/91E2gWnxzw== +rollup@3.29.4: + version "3.29.4" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-3.29.4.tgz#4d70c0f9834146df8705bfb69a9a19c9e1109981" + integrity sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw== optionalDependencies: fsevents "~2.3.2" rollup@^4.9.5: - version "4.9.6" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.9.6.tgz#4515facb0318ecca254a2ee1315e22e09efc50a0" - integrity sha512-05lzkCS2uASX0CiLFybYfVkwNbKZG5NFQ6Go0VWyogFTXXbR039UVsegViTntkk4OglHBdF54ccApXRRuXRbsg== + version "4.18.0" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.18.0.tgz#497f60f0c5308e4602cf41136339fbf87d5f5dda" + integrity sha512-QmJz14PX3rzbJCN1SG4Xe/bAAX2a6NpCP8ab2vfu2GiUr8AQcr2nCV/oEO3yneFarB67zk8ShlIyWb2LGTb3Sg== dependencies: "@types/estree" "1.0.5" optionalDependencies: - "@rollup/rollup-android-arm-eabi" "4.9.6" - "@rollup/rollup-android-arm64" "4.9.6" - "@rollup/rollup-darwin-arm64" "4.9.6" - "@rollup/rollup-darwin-x64" "4.9.6" - "@rollup/rollup-linux-arm-gnueabihf" "4.9.6" - "@rollup/rollup-linux-arm64-gnu" "4.9.6" - "@rollup/rollup-linux-arm64-musl" "4.9.6" - "@rollup/rollup-linux-riscv64-gnu" "4.9.6" - "@rollup/rollup-linux-x64-gnu" "4.9.6" - "@rollup/rollup-linux-x64-musl" "4.9.6" - "@rollup/rollup-win32-arm64-msvc" "4.9.6" - "@rollup/rollup-win32-ia32-msvc" "4.9.6" - "@rollup/rollup-win32-x64-msvc" "4.9.6" + "@rollup/rollup-android-arm-eabi" "4.18.0" + "@rollup/rollup-android-arm64" "4.18.0" + "@rollup/rollup-darwin-arm64" "4.18.0" + "@rollup/rollup-darwin-x64" "4.18.0" + "@rollup/rollup-linux-arm-gnueabihf" "4.18.0" + "@rollup/rollup-linux-arm-musleabihf" "4.18.0" + "@rollup/rollup-linux-arm64-gnu" "4.18.0" + "@rollup/rollup-linux-arm64-musl" "4.18.0" + "@rollup/rollup-linux-powerpc64le-gnu" "4.18.0" + "@rollup/rollup-linux-riscv64-gnu" "4.18.0" + "@rollup/rollup-linux-s390x-gnu" "4.18.0" + "@rollup/rollup-linux-x64-gnu" "4.18.0" + "@rollup/rollup-linux-x64-musl" "4.18.0" + "@rollup/rollup-win32-arm64-msvc" "4.18.0" + "@rollup/rollup-win32-ia32-msvc" "4.18.0" + "@rollup/rollup-win32-x64-msvc" "4.18.0" fsevents "~2.3.2" run-parallel@^1.1.9: @@ -5956,12 +5159,12 @@ run-parallel@^1.1.9: dependencies: queue-microtask "^1.2.2" -rxjs@^6.6.7: - version "6.6.7" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9" - integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== +rxjs@^7.5.1: + version "7.8.1" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.1.tgz#6f6f3d99ea8044291efd92e7c7fcf562c4057543" + integrity sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg== dependencies: - tslib "^1.9.0" + tslib "^2.1.0" safe-array-concat@^1.1.2: version "1.1.2" @@ -5999,58 +5202,35 @@ saxes@^6.0.0: dependencies: xmlchars "^2.2.0" -scheduler@^0.23.0: - version "0.23.0" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.0.tgz#ba8041afc3d30eb206a487b6b384002e4e61fdfe" - integrity sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw== +scheduler@^0.23.2: + version "0.23.2" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.2.tgz#414ba64a3b282892e944cf2108ecc078d115cdc3" + integrity sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ== dependencies: loose-envify "^1.1.0" semver-compare@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc" - integrity sha1-De4hahyUGrN+nvsXiPavxf9VN/w= - -semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" - integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + integrity sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow== -semver@^6.3.1: +semver@^6.3.0, semver@^6.3.1: version "6.3.1" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^7.5.3, semver@^7.5.4: - version "7.5.4" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" - integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== - dependencies: - lru-cache "^6.0.0" - -semver@^7.6.0: +semver@^7.5.3, semver@^7.5.4, semver@^7.6.0: version "7.6.2" resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.2.tgz#1e3b34759f896e8f14d6134732ce798aeb0c6e13" integrity sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w== -serialize-javascript@^6.0.0: - version "6.0.1" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.1.tgz#b206efb27c3da0b0ab6b52f48d170b7996458e5c" - integrity sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w== +serialize-javascript@^6.0.1: + version "6.0.2" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.2.tgz#defa1e055c83bf6d59ea805d8da862254eb6a6c2" + integrity sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g== dependencies: randombytes "^2.1.0" -set-function-length@^1.1.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.0.tgz#2f81dc6c16c7059bda5ab7c82c11f03a515ed8e1" - integrity sha512-4DBHDoyHlM1IRPGYcoxexgh67y4ueR53FKV1yyxwFMY7aCqcN/38M1+SwZ/qJQ8iLv7+ck385ot4CcisOAPT9w== - dependencies: - define-data-property "^1.1.1" - function-bind "^1.1.2" - get-intrinsic "^1.2.2" - gopd "^1.0.1" - has-property-descriptors "^1.0.1" - set-function-length@^1.2.1: version "1.2.2" resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" @@ -6063,15 +5243,6 @@ set-function-length@^1.2.1: gopd "^1.0.1" has-property-descriptors "^1.0.2" -set-function-name@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.1.tgz#12ce38b7954310b9f61faa12701620a0c882793a" - integrity sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA== - dependencies: - define-data-property "^1.0.1" - functions-have-names "^1.2.3" - has-property-descriptors "^1.0.0" - set-function-name@^2.0.1, set-function-name@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.2.tgz#16a705c5a0dc2f5e638ca96d8a8cd4e1c2b90985" @@ -6094,16 +5265,7 @@ shebang-regex@^3.0.0: resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== -side-channel@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" - integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== - dependencies: - call-bind "^1.0.0" - get-intrinsic "^1.0.2" - object-inspect "^1.9.0" - -side-channel@^1.0.6: +side-channel@^1.0.4, side-channel@^1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.6.tgz#abd25fb7cd24baf45466406b1096b7831c9215f2" integrity sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA== @@ -6113,12 +5275,7 @@ side-channel@^1.0.6: get-intrinsic "^1.2.4" object-inspect "^1.13.1" -signal-exit@^3.0.2, signal-exit@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" - integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== - -signal-exit@^3.0.7: +signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: version "3.0.7" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== @@ -6151,10 +5308,10 @@ slice-ansi@^4.0.0: astral-regex "^2.0.0" is-fullwidth-code-point "^3.0.0" -smob@^0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/smob/-/smob-0.0.6.tgz#09b268fea916158a2781c152044c6155adbb8aa1" - integrity sha512-V21+XeNni+tTyiST1MHsa84AQhT1aFZipzPpOFAVB8DkHzwJyjjAmt9bgwnuZiZWnIbMo2duE29wybxv/7HWUw== +smob@^1.0.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/smob/-/smob-1.5.0.tgz#85d79a1403abf128d24d3ebc1cdc5e1a9548d3ab" + integrity sha512-g6T+p7QO8npa+/hNx9ohv1E5pVCmWrVCUzUXJyLdMmftX6ER0oiWY/w9knEonLpnOp6b6FenKnMfR8gqwWdwig== source-map-support@0.5.13: version "0.5.13" @@ -6180,7 +5337,7 @@ source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= + integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== stack-utils@^2.0.3: version "2.0.6" @@ -6209,16 +5366,7 @@ string-length@^4.0.1: char-regex "^1.0.2" strip-ansi "^6.0.0" -string-width@^4.1.0, string-width@^4.2.0: - version "4.2.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.2.tgz#dafd4f9559a7585cfba529c6a0a4f73488ebd4c5" - integrity sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.0" - -string-width@^4.2.3: +string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -6255,14 +5403,6 @@ string.prototype.trim@^1.2.9: es-abstract "^1.23.0" es-object-atoms "^1.0.0" -string.prototype.trimend@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz#e75ae90c2942c63504686c18b287b4a0b1a45f80" - integrity sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - string.prototype.trimend@^1.0.8: version "1.0.8" resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz#3651b8513719e8a9f48de7f2f77640b26652b229" @@ -6272,14 +5412,6 @@ string.prototype.trimend@^1.0.8: define-properties "^1.2.1" es-object-atoms "^1.0.0" -string.prototype.trimstart@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz#b36399af4ab2999b4c9c648bd7a3fb2bb26feeed" - integrity sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - string.prototype.trimstart@^1.0.8: version "1.0.8" resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz#7ee834dda8c7c17eff3118472bb35bfedaa34dde" @@ -6289,7 +5421,7 @@ string.prototype.trimstart@^1.0.8: define-properties "^1.2.1" es-object-atoms "^1.0.0" -stringify-object@^3.3.0: +stringify-object@3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/stringify-object/-/stringify-object-3.3.0.tgz#703065aefca19300d3ce88af4f5b3956d7556629" integrity sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw== @@ -6298,25 +5430,13 @@ stringify-object@^3.3.0: is-obj "^1.0.1" is-regexp "^1.0.0" -strip-ansi@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" - integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== - dependencies: - ansi-regex "^5.0.0" - -strip-ansi@^6.0.1: +strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== dependencies: ansi-regex "^5.0.1" -strip-bom@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" - integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= - strip-bom@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" @@ -6339,6 +5459,13 @@ strip-json-comments@^3.1.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== +supports-color@8.1.1, supports-color@^8.0.0: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + supports-color@^5.3.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" @@ -6353,13 +5480,6 @@ supports-color@^7.1.0: dependencies: has-flag "^4.0.0" -supports-color@^8.0.0: - version "8.1.1" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" - integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== - dependencies: - has-flag "^4.0.0" - supports-preserve-symlinks-flag@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" @@ -6383,13 +5503,13 @@ tapable@^2.2.0: resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== -terser@^5.15.1: - version "5.16.1" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.16.1.tgz#5af3bc3d0f24241c7fb2024199d5c461a1075880" - integrity sha512-xvQfyfA1ayT0qdK47zskQgRZeWLoOQ8JQ6mIgRGVNwZKdQMU+5FkCBjmv4QjcrTzyZquRw2FVtlJSRUmMKQslw== +terser@^5.17.4: + version "5.31.1" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.31.1.tgz#735de3c987dd671e95190e6b98cfe2f07f3cf0d4" + integrity sha512-37upzU1+viGvuFtBo9NPufCb9dwM0+l9hMxYyWfBA+fbwrPqNJAhbZ6W47bBFnZHKHTUBnMvi87434qq+qnxOg== dependencies: - "@jridgewell/source-map" "^0.3.2" - acorn "^8.5.0" + "@jridgewell/source-map" "^0.3.3" + acorn "^8.8.2" commander "^2.20.0" source-map-support "~0.5.20" @@ -6405,12 +5525,12 @@ test-exclude@^6.0.0: text-table@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" - integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= + integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== through@^2.3.8: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" - integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= + integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== tmpl@1.0.5: version "1.0.5" @@ -6430,9 +5550,9 @@ to-regex-range@^5.0.1: is-number "^7.0.0" tough-cookie@^4.1.2: - version "4.1.3" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.3.tgz#97b9adb0728b42280aa3d814b6b999b2ff0318bf" - integrity sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw== + version "4.1.4" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.4.tgz#945f1461b45b5a8c76821c33ea49c3ac192c1b36" + integrity sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag== dependencies: psl "^1.1.33" punycode "^2.1.1" @@ -6470,22 +5590,7 @@ ts-node@^10.9.1, ts-node@^10.9.2: v8-compile-cache-lib "^3.0.1" yn "3.1.1" -tsconfig-paths@^3.15.0: - version "3.15.0" - resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz#5299ec605e55b1abb23ec939ef15edaf483070d4" - integrity sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg== - dependencies: - "@types/json5" "^0.0.29" - json5 "^1.0.2" - minimist "^1.2.6" - strip-bom "^3.0.0" - -tslib@^1.9.0: - version "1.14.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" - integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== - -tslib@^2.6.2: +tslib@^2.1.0, tslib@^2.6.2: version "2.6.3" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.3.tgz#0438f810ad7a9edcde7a241c3d80db693c8cbfe0" integrity sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ== @@ -6561,25 +5666,15 @@ typescript-eslint@^7.13.0: "@typescript-eslint/utils" "7.13.0" typescript@^4.1.3: - version "4.3.5" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.3.5.tgz#4d1c37cc16e893973c45a06886b7113234f119f4" - integrity sha512-DqQgihaQ9cUrskJo9kIyW/+g0Vxsk8cDtZ52a3NGh0YNTfpUSArXSohyUGnvbPazEPLu398C0UxmKSOrPumUzA== + version "4.9.5" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" + integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== typescript@^5.4.5: version "5.4.5" resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.4.5.tgz#42ccef2c571fdbd0f6718b1d1f5e6e5ef006f611" integrity sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ== -unbox-primitive@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.1.tgz#085e215625ec3162574dc8859abee78a59b14471" - integrity sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw== - dependencies: - function-bind "^1.1.1" - has-bigints "^1.0.1" - has-symbols "^1.0.2" - which-boxed-primitive "^1.0.2" - unbox-primitive@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" @@ -6623,21 +5718,13 @@ universalify@^0.2.0: resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.2.0.tgz#6451760566fa857534745ab1dde952d1b1761be0" integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg== -update-browserslist-db@^1.0.13: - version "1.0.13" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz#3c5e4f5c083661bd38ef64b6328c26ed6c8248c4" - integrity sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg== - dependencies: - escalade "^3.1.1" - picocolors "^1.0.0" - -update-browserslist-db@^1.0.9: - version "1.0.10" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz#0f54b876545726f17d00cd9a2561e6dade943ff3" - integrity sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ== +update-browserslist-db@^1.0.16: + version "1.0.16" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.16.tgz#f6d489ed90fb2f07d67784eb3f53d7891f736356" + integrity sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ== dependencies: - escalade "^3.1.1" - picocolors "^1.0.0" + escalade "^3.1.2" + picocolors "^1.0.1" uri-js@^4.2.2: version "4.4.1" @@ -6737,27 +5824,16 @@ which-builtin-type@^1.1.3: which-typed-array "^1.1.9" which-collection@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.1.tgz#70eab71ebbbd2aefaf32f917082fc62cdcb70906" - integrity sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A== - dependencies: - is-map "^2.0.1" - is-set "^2.0.1" - is-weakmap "^2.0.1" - is-weakset "^2.0.1" - -which-typed-array@^1.1.11, which-typed-array@^1.1.13: - version "1.1.13" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.13.tgz#870cd5be06ddb616f504e7b039c4c24898184d36" - integrity sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow== + version "1.0.2" + resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.2.tgz#627ef76243920a107e7ce8e96191debe4b16c2a0" + integrity sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw== dependencies: - available-typed-arrays "^1.0.5" - call-bind "^1.0.4" - for-each "^0.3.3" - gopd "^1.0.1" - has-tostringtag "^1.0.0" + is-map "^2.0.3" + is-set "^2.0.3" + is-weakmap "^2.0.2" + is-weakset "^2.0.3" -which-typed-array@^1.1.14, which-typed-array@^1.1.15, which-typed-array@^1.1.9: +which-typed-array@^1.1.13, which-typed-array@^1.1.14, which-typed-array@^1.1.15, which-typed-array@^1.1.9: version "1.1.15" resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.15.tgz#264859e9b11a649b388bfaaf4f767df1f779b38d" integrity sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA== @@ -6801,7 +5877,7 @@ wrap-ansi@^7.0.0: wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== write-file-atomic@^4.0.2: version "4.0.2" @@ -6812,9 +5888,9 @@ write-file-atomic@^4.0.2: signal-exit "^3.0.7" ws@^8.11.0: - version "8.16.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.16.0.tgz#d1cd774f36fbc07165066a60e40323eab6446fd4" - integrity sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ== + version "8.17.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.17.0.tgz#d145d18eca2ed25aaf791a183903f7be5e295fea" + integrity sha512-uJq6108EgZMAl20KagGkzCKfMEjxmKvZHG7Tlq0Z6nOky7YF7aq4mOx6xK8TJ/i1LeK4Qus7INktacctDgY8Ow== xml-name-validator@^4.0.0: version "4.0.0" @@ -6836,11 +5912,6 @@ yallist@^3.0.2: resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== -yallist@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" - integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== - yaml@^1.10.0: version "1.10.2" resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" From 0c4d8500338c2c1198109e9faa76e4538139e056 Mon Sep 17 00:00:00 2001 From: qpounodb Date: Fri, 14 Jun 2024 21:50:53 +0300 Subject: [PATCH 44/46] refactor: add utils for handling vk errors --- eslint.config.mjs | 3 +- src/callVkApi.ts | 38 +++----------------- src/getVkAccessToken.ts | 3 +- src/setVkViewSettings.ts | 5 +-- src/shareVkPost.ts | 27 +++++++++----- src/shareVkStory.ts | 9 ++--- src/types/callVkApi.ts | 2 +- src/vkErrorUtils.ts | 78 ++++++++++++++++++++++++++++++++++++++++ 8 files changed, 112 insertions(+), 53 deletions(-) create mode 100644 src/vkErrorUtils.ts diff --git a/eslint.config.mjs b/eslint.config.mjs index 9edee07..a1e5b2e 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -3,7 +3,6 @@ import eslint from '@eslint/js'; import importPluginX from 'eslint-plugin-import-x'; import eslintPluginPrettierRecommended from 'eslint-plugin-prettier/recommended'; import reactPlugin from 'eslint-plugin-react'; -import globals from 'globals'; import tsEslint from 'typescript-eslint'; export default tsEslint.config( @@ -45,7 +44,7 @@ export default tsEslint.config( 'prefer-arrow-callback': 'error', '@typescript-eslint/consistent-type-definitions': 'off', // отключает принудительное использование только `type` или `interface` '@typescript-eslint/no-invalid-void-type': 'off', // отключает использование `void` только в сигнатуре возврата функции - '@typescript-eslint/no-explicit-any': 'warn', + '@typescript-eslint/no-explicit-any': ['warn', { ignoreRestArgs: true }], '@typescript-eslint/interface-name-prefix': 'off', '@typescript-eslint/no-unused-vars': 'error', '@typescript-eslint/camelcase': 'off', diff --git a/src/callVkApi.ts b/src/callVkApi.ts index 458d23a..bded257 100644 --- a/src/callVkApi.ts +++ b/src/callVkApi.ts @@ -1,8 +1,9 @@ -import bridge, { ErrorData } from '@vkontakte/vk-bridge'; +import bridge from '@vkontakte/vk-bridge'; import { getVkAccessToken } from './getVkAccessToken'; import { isVkError } from './isVkError'; import { CallVkApiPropsType, CallVkApiResponseType } from './types'; +import { makeUnknownVkError, parseVkErrorMessage } from './vkErrorUtils'; /** * Ошибки от API ВКонтакте, в случае возникновения которых нужно обновить токен доступа. @@ -28,8 +29,7 @@ const VK_TOKEN_ERRORS = new Set([ * * @see {@link https://dev.vk.com/bridge/VKWebAppCallAPIMethod|VKWebAppCallAPIMethod} */ -// eslint-disable-next-line -const callVkApi = async ({ +const callVkApi = async ({ method, params = {}, version = '5.199', @@ -66,7 +66,7 @@ const callVkApi = async ({ return makeUnknownVkError(error); } - const errorMessage = getVkErrorMessage(error); + const errorMessage = parseVkErrorMessage(error); /** * Если срок действия токена доступа истек, @@ -94,34 +94,4 @@ const callVkApi = async ({ } }; -const getVkErrorMessage = (error: ErrorData) => { - if (error.error_type === 'api_error') { - return error.error_data.error_msg; - } - - return error.error_data.error_reason; -}; - -const makeUnknownVkError = (error: unknown): ErrorData => { - return { - error_type: 'client_error', - error_data: { - error_code: -111_000_111, - error_reason: 'unknown', - error_description: toStringInfo(error), - }, - }; -}; - -const toStringInfo = (value: unknown): string => { - if (value instanceof Error) { - return value.message; - } - try { - return JSON.stringify(value); - } catch (error) { - return String(value); - } -}; - export { VK_TOKEN_ERRORS, callVkApi }; diff --git a/src/getVkAccessToken.ts b/src/getVkAccessToken.ts index ecb54a8..ec6365d 100644 --- a/src/getVkAccessToken.ts +++ b/src/getVkAccessToken.ts @@ -9,6 +9,7 @@ import type { GetNewVkAccessTokenParamsType, GetNewVkAccessTokenResponseType, } from './types'; +import { toVkError } from './vkErrorUtils'; /** * Массив всех возможных scopes для доступа к данным пользователя. @@ -97,7 +98,7 @@ const getNewVkAccessToken = async ({ app_id: appId, }); } catch (error) { - return error as ErrorData; + return toVkError(error); } }; diff --git a/src/setVkViewSettings.ts b/src/setVkViewSettings.ts index a821752..d957837 100644 --- a/src/setVkViewSettings.ts +++ b/src/setVkViewSettings.ts @@ -1,10 +1,11 @@ -import bridge, { ErrorData } from '@vkontakte/vk-bridge'; +import bridge from '@vkontakte/vk-bridge'; import { VkPlatformType, SetViewSettingsPropsType, SetViewSettingsResponseType, } from './types'; +import { toVkError } from './vkErrorUtils'; /** * Массив платформ, которые поддерживают view settings @@ -69,7 +70,7 @@ const setVkViewSettings = async ( ); } } catch (error) { - return error as ErrorData; + return toVkError(error); } }; diff --git a/src/shareVkPost.ts b/src/shareVkPost.ts index 9ae2751..893ac52 100644 --- a/src/shareVkPost.ts +++ b/src/shareVkPost.ts @@ -1,5 +1,5 @@ import { api } from '@ktsstudio/mediaproject-utils'; -import bridge, { ErrorData } from '@vkontakte/vk-bridge'; +import bridge from '@vkontakte/vk-bridge'; import { callVkApi } from './callVkApi'; import { checkVkUserDenied } from './checkVkUserDenied'; @@ -11,6 +11,7 @@ import { ShareVkPostPropsType, SaveVkWallPhotoResponseType, } from './types'; +import { toVkError } from './vkErrorUtils'; /** * Утилита для шеринга поста на стену. @@ -26,13 +27,13 @@ const shareVkPost = async ( try { return await bridge.send('VKWebAppShowWallPostBox', props); } catch (error) { - const errorData = error as ErrorData; + const vkError = toVkError(error); - if (checkVkUserDenied(errorData)) { + if (checkVkUserDenied(vkError)) { return undefined; } - return errorData; + return vkError; } }; @@ -75,7 +76,9 @@ const shareVkPostWithUpload = async ({ /** * Получаем URL сервера для загрузки фото */ - const getWallUploadServerData = await callVkApi({ + const getWallUploadServerData = await callVkApi<{ + upload_url: string; + }>({ method: 'photos.getWallUploadServer', accessToken, getAccessTokenParams: { @@ -93,6 +96,12 @@ const shareVkPostWithUpload = async ({ return getWallUploadServerData; } + if (!getWallUploadServerData.response) { + onErrorOccurred?.(new Error('getWallUploadServerData response is empty')); + + return; + } + /** * Получили ссылку на сервер загрузки, * теперь отправляем картинку на бэк для загрузки @@ -167,13 +176,13 @@ const shareVkPostWithUpload = async ({ : uploadedPhotoAttachment, }); } catch (error) { - const errorData = error as ErrorData; + const vkError = toVkError(error); - if (!checkVkUserDenied(errorData)) { - onErrorOccurred?.(errorData); + if (!checkVkUserDenied(vkError)) { + onErrorOccurred?.(vkError); } - return errorData; + return vkError; } }; diff --git a/src/shareVkStory.ts b/src/shareVkStory.ts index 1ded755..b3b76d8 100644 --- a/src/shareVkStory.ts +++ b/src/shareVkStory.ts @@ -1,7 +1,8 @@ -import bridge, { ErrorData, RequestProps } from '@vkontakte/vk-bridge'; +import bridge, { RequestProps } from '@vkontakte/vk-bridge'; import { checkVkUserDenied } from './checkVkUserDenied'; import { ShareVkStoryPropsType, ShareVkStoryResponseType } from './types'; +import { toVkError } from './vkErrorUtils'; /** * Утилита для шеринга истории. @@ -36,13 +37,13 @@ const shareVkStory = async ({ return await bridge.send('VKWebAppShowStoryBox', props); } catch (error) { - const errorData = error as ErrorData; + const vkError = toVkError(error); - if (checkVkUserDenied(errorData)) { + if (checkVkUserDenied(vkError)) { return; } - return errorData; + return vkError; } }; diff --git a/src/types/callVkApi.ts b/src/types/callVkApi.ts index 9d8aa1e..b8a9b92 100644 --- a/src/types/callVkApi.ts +++ b/src/types/callVkApi.ts @@ -13,7 +13,7 @@ type CallVkApiPropsType = { getAccessTokenParams: GetVkAccessTokenParamsType; }; -type CallVkApiResponseType = Partial< +type CallVkApiResponseType = Partial< { response: D; } & ErrorData diff --git a/src/vkErrorUtils.ts b/src/vkErrorUtils.ts new file mode 100644 index 0000000..5fba574 --- /dev/null +++ b/src/vkErrorUtils.ts @@ -0,0 +1,78 @@ +import { ErrorData } from '@vkontakte/vk-bridge'; + +import { isVkError } from './isVkError'; + +/** + * Утилита парсинг сообщения из различных типов VK API ошибок {@link ErrorData} + * + * @param {ErrorData} error Ошибка, полученная от VK API. + * @returns {string} Сообщение об ошибке, полученное от VK API. + * + * Подробнее виды ошибок VK API можно посмотреть в: + * @see https://dev.vk.com/ru/bridge/getting-started#Обработка%20ошибок%20VK%20Bridge + * @see https://github.com/VKCOM/vk-bridge/blob/master/packages/core/src/types/bridge.ts#L86 + */ +export const parseVkErrorMessage = (error: ErrorData): string => { + if (error.error_type === 'api_error') { + return error.error_data.error_msg; + } + + const { error_reason } = error.error_data; + + // LEGACY: парсинг возможного нестандартного формата ошибки + // NOTE: в задокументированных форматах ошибок поле error_reason имеет тип string + // TODO: удалить если нестандартные ошибки больше не встречается + if ( + typeof error_reason === 'object' && + error_reason !== null && + 'error_msg' in error_reason && + typeof error_reason['error_msg'] === 'string' + ) { + return error_reason['error_msg']; + } + + return error_reason; +}; + +/** + * Утилита для случая когда нужно вернуть стандартный формат ошибки VK API, + * получив ошибку или данные неизвестного типа + * + * @param {unknown} error Ошибка неизвестного типа + * @returns {ErrorData} Ошибка VK API + */ +export const toVkError = (error: unknown): ErrorData => { + if (isVkError(error)) { + return error; + } + + return makeUnknownVkError(error); +}; + +/** + * Утилита обертки неопределенных данных в имитацию ошибки VK API + * + * @param {unknown} data Данные неизвестного типа + * @returns {ErrorData} Имитация ошибки VK API + */ +export const makeUnknownVkError = (data: unknown): ErrorData => { + return { + error_type: 'client_error', + error_data: { + error_code: -111_000_111, + error_reason: 'unknown', + error_description: toStringInfo(data), + }, + }; +}; + +const toStringInfo = (value: unknown): string => { + if (value instanceof Error) { + return value.message; + } + try { + return JSON.stringify(value); + } catch (error) { + return String(value); + } +}; From ade9861f0dd1d9c50350a738404e084c3bb84fad Mon Sep 17 00:00:00 2001 From: qpounodb Date: Mon, 17 Jun 2024 18:59:42 +0300 Subject: [PATCH 45/46] fix: vk statuses utils exports --- eslint.config.mjs | 35 +++++++++++++++++++++++++++++++++++ src/callVkApi.ts | 1 + src/getVkStatus.ts | 4 +++- src/getVkStatuses.ts | 4 +++- src/index.ts | 6 ++++++ src/setVkStatus.ts | 4 +++- src/vkErrorUtils.ts | 1 + 7 files changed, 52 insertions(+), 3 deletions(-) diff --git a/eslint.config.mjs b/eslint.config.mjs index a1e5b2e..a713868 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -71,6 +71,41 @@ export default tsEslint.config( }, }, ], + 'padding-line-between-statements': [ + 'error', + + // After directives (like 'use-strict'), except between directives + { blankLine: 'always', prev: 'directive', next: '*' }, + { blankLine: 'any', prev: 'directive', next: 'directive' }, + + // Before and after export + { blankLine: 'always', prev: '*', next: 'export' }, + { blankLine: 'always', prev: 'export', next: '*' }, + + // Before and after every sequence of variable declarations + { blankLine: 'always', prev: '*', next: ['const', 'let', 'var'] }, + { blankLine: 'always', prev: ['const', 'let', 'var'], next: '*' }, + { + blankLine: 'any', + prev: ['const', 'let', 'var'], + next: ['const', 'let', 'var'], + }, + + // Before and after class declaration, if, while, switch, try + { + blankLine: 'always', + prev: '*', + next: ['class', 'if', 'while', 'switch', 'try'], + }, + { + blankLine: 'always', + prev: ['class', 'if', 'while', 'switch', 'try'], + next: '*', + }, + + // Before return statements + { blankLine: 'always', prev: '*', next: 'return' }, + ], 'react/jsx-uses-react': 'error', 'react/jsx-uses-vars': 'error', 'react/jsx-no-target-blank': 'off', diff --git a/src/callVkApi.ts b/src/callVkApi.ts index bded257..62524be 100644 --- a/src/callVkApi.ts +++ b/src/callVkApi.ts @@ -78,6 +78,7 @@ const callVkApi = async ({ VK_TOKEN_ERRORS.has(errorMessage) ) { window.access_token = undefined; + const newAccessToken = await getVkAccessToken(getAccessTokenParams); return await callVkApi({ diff --git a/src/getVkStatus.ts b/src/getVkStatus.ts index 6d2ba86..9ef7dcd 100644 --- a/src/getVkStatus.ts +++ b/src/getVkStatus.ts @@ -16,7 +16,7 @@ import { VkStatusesParamsType } from './types'; * @return {Promise} Возвращает ID текущего статуса пользователя или null. * */ -export default async ({ +const getVkStatus = async ({ appId, accessToken = window.access_token, renewTokenIfExpired = true, @@ -44,3 +44,5 @@ export default async ({ return null; }; + +export { getVkStatus }; diff --git a/src/getVkStatuses.ts b/src/getVkStatuses.ts index 7643c01..79a6bdf 100644 --- a/src/getVkStatuses.ts +++ b/src/getVkStatuses.ts @@ -16,7 +16,7 @@ import { VkStatusesParamsType, VkApiStatusType } from './types'; * @return {Promise} Возвращает список доступных статусов. * */ -export default async ({ +const getVkStatuses = async ({ appId, accessToken = window.access_token, renewTokenIfExpired = true, @@ -44,3 +44,5 @@ export default async ({ return []; }; + +export { getVkStatuses }; diff --git a/src/index.ts b/src/index.ts index 92f858b..eabea98 100644 --- a/src/index.ts +++ b/src/index.ts @@ -19,3 +19,9 @@ export * from './shareVkPost'; export * from './shareVkStory'; export * from './isVkError'; + +export * from './getVkStatus'; + +export * from './getVkStatuses'; + +export * from './setVkStatus'; diff --git a/src/setVkStatus.ts b/src/setVkStatus.ts index 86f9bf4..91c2edc 100644 --- a/src/setVkStatus.ts +++ b/src/setVkStatus.ts @@ -17,7 +17,7 @@ import { SetVkStatusParamsType } from './types'; * @return {Promise} Возвращает, успешно ли выполнился запрос. * */ -export default async ({ +const setVkStatus = async ({ appId, statusId, accessToken = window.access_token, @@ -49,3 +49,5 @@ export default async ({ return false; }; + +export { setVkStatus }; diff --git a/src/vkErrorUtils.ts b/src/vkErrorUtils.ts index 5fba574..3e914df 100644 --- a/src/vkErrorUtils.ts +++ b/src/vkErrorUtils.ts @@ -70,6 +70,7 @@ const toStringInfo = (value: unknown): string => { if (value instanceof Error) { return value.message; } + try { return JSON.stringify(value); } catch (error) { From 8110f686b1483c5d090c9709f67d9598df7c027a Mon Sep 17 00:00:00 2001 From: qpounodb Date: Fri, 21 Jun 2024 13:28:06 +0300 Subject: [PATCH 46/46] doc: review updates --- CHANGELOG.md | 7 ++++++- src/checkVkPlatform.ts | 4 ++-- src/index.ts | 2 ++ src/vkErrorUtils.ts | 21 ++++++++++++++++++++- 4 files changed, 30 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a61f1a8..aeefd56 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,9 +4,14 @@ [*] в перечни ВК-платформ добавлены платформы ВК Мессенджера [*] исправлена проверка на пустую строку в функции `checkVkAvatarIsDefault` [*] в десктоп-платформы добавлены платформы десктопного ВК Мессенджера в функции `checkVkPlatform` -[+] добавлены автотесты на функции `callVkApi`, `parseVkScopes`, `checkOneScopesSetIncludesAnother`, `getNewVkAccessToken`, `getVkAccessToken`, `checkVkPlatform`, `callVkApi`, `checkVkAvatarIsDefault`, `setVkViewSettings`, `shareVkStory`, `isVkError`, `checkVkUserDenied`, `shareVkPost`, `shareVkPostWithUpload`, хуки `usePolling`, `useEventSubscribe` +[+] добавлены автотесты на функции `callVkApi`, `parseVkScopes`, `checkOneScopesSetIncludesAnother`, `getNewVkAccessToken`, `getVkAccessToken`, `checkVkPlatform`, `callVkApi`, `checkVkAvatarIsDefault`, `setVkViewSettings`, `shareVkStory`, `isVkError`, `checkVkUserDenied`, `shareVkPost`, `shareVkPostWithUpload`, и на хуки `usePolling`, `useEventSubscribe` +[*] в утилите `callVkApi` актуализировано значение по умолчанию параметра версии VK API: `5.131` -> `5.199` +[*] обновлены средства разработки и их конфиги: typescript, eslint, prettier +[*] логика по обработке ошибок ВК АПИ вынесена в файл `vkErrorUtils` с выделением обработки ошибок нестандартного формата в отдельный блок +[*] изменен формат экспорта для новых утилит `getVkStatus`, `getVkStatuses` и `setVkStatus` c `default` на такой же как у остальных утилит, для консистентности при сборке библиотеки ## v3.1.0 + - [+] добавлена утилита `getVkStatuses` для получения получение списка статусов, доступных приложению - [+] добавлена утилита `getVkStatus` для получения текущего ID статуса пользователя - [+] добавлена утилита `setVkStatus` для установки/снятия ID статуса пользователю diff --git a/src/checkVkPlatform.ts b/src/checkVkPlatform.ts index 60d85cb..6dbffa7 100644 --- a/src/checkVkPlatform.ts +++ b/src/checkVkPlatform.ts @@ -124,8 +124,8 @@ const isMobileUserAgent = () => * или на IOS устанавливает в true isIos и добавляет класснейм 'ios'). * * Возможные варианты сочетаний: - * - desktop - браузер или нативный мессенджер на компьютере - * - desktop web - веб-мессенджер на компьютере + * - desktop - десктопное нативное приложение VK Мессенджер (можно скачать на @see https://vk.me/app для платформ Windows, MacOS или Linux). + * - desktop web - открытый в десктопном браузере сайт ВКонтакте (vk.com) или VK Мессенджера (web.vk.me) * - mobile ios - нативное мобильное приложение ВКонтакте или Мессенджер на платформе IOS * - mobile android - нативное мобильное приложение ВКонтакте или Мессенджер на платформе Android * - mobile web - мобильный браузер на неизвестной платформе (например, m.vk.com открыт с браузера компьютера) diff --git a/src/index.ts b/src/index.ts index eabea98..6b3f075 100644 --- a/src/index.ts +++ b/src/index.ts @@ -25,3 +25,5 @@ export * from './getVkStatus'; export * from './getVkStatuses'; export * from './setVkStatus'; + +export * from './vkErrorUtils'; diff --git a/src/vkErrorUtils.ts b/src/vkErrorUtils.ts index 3e914df..905c26a 100644 --- a/src/vkErrorUtils.ts +++ b/src/vkErrorUtils.ts @@ -49,6 +49,12 @@ export const toVkError = (error: unknown): ErrorData => { return makeUnknownVkError(error); }; +/** + * Код для имитации ошибки VK API, несуществующий в документации + * @see https://dev.vk.com/ru/bridge/getting-started#Обработка%20ошибок%20VK%20Bridge + */ +export const UNKNOWN_VK_ERROR_CODE = -111_000_111; + /** * Утилита обертки неопределенных данных в имитацию ошибки VK API * @@ -59,7 +65,7 @@ export const makeUnknownVkError = (data: unknown): ErrorData => { return { error_type: 'client_error', error_data: { - error_code: -111_000_111, + error_code: UNKNOWN_VK_ERROR_CODE, error_reason: 'unknown', error_description: toStringInfo(data), }, @@ -77,3 +83,16 @@ const toStringInfo = (value: unknown): string => { return String(value); } }; + +/** + * Утилита для проверки что данная VK API ошибка является имитацией ошибки VK API + * + * @param {ErrorData} error VK API ошибка + * @returns {boolean} true если это имитация ошибки VK API + */ +export const isUnknownVkError = (error: ErrorData): boolean => { + return ( + error.error_type === 'client_error' && + error.error_data.error_code === UNKNOWN_VK_ERROR_CODE + ); +};