From b7497ab647685ee133dcab83fa3840993dcf9339 Mon Sep 17 00:00:00 2001 From: abhinav-grd Date: Tue, 28 Sep 2021 12:55:04 +0530 Subject: [PATCH 001/147] adds remove from collection option on the selection bar --- src/components/icons/RemoveIcon.tsx | 20 ++++++++++++++++++ .../pages/gallery/SelectedFileOptions.tsx | 21 +++++++++++++++++++ src/utils/strings/englishConstants.tsx | 4 ++++ 3 files changed, 45 insertions(+) create mode 100644 src/components/icons/RemoveIcon.tsx diff --git a/src/components/icons/RemoveIcon.tsx b/src/components/icons/RemoveIcon.tsx new file mode 100644 index 000000000..1890aa08b --- /dev/null +++ b/src/components/icons/RemoveIcon.tsx @@ -0,0 +1,20 @@ +import React from 'react'; + +export default function RemoveIcon(props) { + return ( + + + + ); +} + +RemoveIcon.defaultProps = { + height: 24, + width: 24, + viewBox: '0 0 24 24', +}; diff --git a/src/components/pages/gallery/SelectedFileOptions.tsx b/src/components/pages/gallery/SelectedFileOptions.tsx index 7fa000092..7b6295b69 100644 --- a/src/components/pages/gallery/SelectedFileOptions.tsx +++ b/src/components/pages/gallery/SelectedFileOptions.tsx @@ -15,6 +15,7 @@ import { ALL_SECTION, ARCHIVE_SECTION } from './Collections'; import UnArchive from 'components/icons/UnArchive'; import { OverlayTrigger } from 'react-bootstrap'; import { Collection } from 'services/collectionService'; +import RemoveIcon from 'components/icons/RemoveIcon'; interface Props { addToCollectionHelper: ( @@ -93,6 +94,19 @@ const SelectedFileOptions = ({ close: { text: constants.CANCEL }, }); + const removeFromCollectionHandler = () => + setDialogMessage({ + title: constants.CONFIRM_REMOVE, + content: constants.CONFIRM_REMOVE_MESSAGE, + staticBackdrop: true, + proceed: { + action: deleteFileHelper, + text: constants.REMOVE, + variant: 'danger', + }, + close: { text: constants.CANCEL }, + }); + const moveToCollection = () => { setCollectionSelectorAttributes({ callback: (collection) => moveToCollectionHelper(null, collection), @@ -139,6 +153,13 @@ const SelectedFileOptions = ({ + {activeCollection !== ALL_SECTION && ( + + + + + + )} diff --git a/src/utils/strings/englishConstants.tsx b/src/utils/strings/englishConstants.tsx index 29aeda2e8..cfe5454f6 100644 --- a/src/utils/strings/englishConstants.tsx +++ b/src/utils/strings/englishConstants.tsx @@ -552,6 +552,10 @@ const englishConstants = { SORT_BY_LATEST_PHOTO: 'most recent photo', SORT_BY_MODIFICATION_TIME: 'last modified', SORT_BY_COLLECTION_NAME: 'album title', + REMOVE: 'remove', + CONFIRM_REMOVE: 'confirm removal', + CONFIRM_REMOVE_MESSAGE: + 'are you sure you want to remove these files from the collection', }; export default englishConstants; From 29d02afba848cd65c4d2b6d4e94a8fc8357c18ad Mon Sep 17 00:00:00 2001 From: abhinav-grd Date: Tue, 28 Sep 2021 13:33:32 +0530 Subject: [PATCH 002/147] refactors collection ops code --- .../pages/gallery/SelectedFileOptions.tsx | 14 +- src/pages/gallery/index.tsx | 144 +++++++----------- src/utils/collection/index.ts | 19 +-- src/utils/common/errorUtil.ts | 1 + 4 files changed, 67 insertions(+), 111 deletions(-) diff --git a/src/components/pages/gallery/SelectedFileOptions.tsx b/src/components/pages/gallery/SelectedFileOptions.tsx index 7b6295b69..5cbe34a8b 100644 --- a/src/components/pages/gallery/SelectedFileOptions.tsx +++ b/src/components/pages/gallery/SelectedFileOptions.tsx @@ -18,14 +18,8 @@ import { Collection } from 'services/collectionService'; import RemoveIcon from 'components/icons/RemoveIcon'; interface Props { - addToCollectionHelper: ( - collectionName: string, - collection: Collection - ) => void; - moveToCollectionHelper: ( - collectionName: string, - collection: Collection - ) => void; + addToCollectionHelper: (collection: Collection) => void; + moveToCollectionHelper: (collection: Collection) => void; showCreateCollectionModal: (opsType: COLLECTION_OPS_TYPE) => () => void; setDialogMessage: SetDialogMessage; setCollectionSelectorAttributes: SetCollectionSelectorAttributes; @@ -75,7 +69,7 @@ const SelectedFileOptions = ({ }: Props) => { const addToCollection = () => setCollectionSelectorAttributes({ - callback: (collection) => addToCollectionHelper(null, collection), + callback: addToCollectionHelper, showNextModal: showCreateCollectionModal(COLLECTION_OPS_TYPE.ADD), title: constants.ADD_TO_COLLECTION, fromCollection: activeCollection, @@ -109,7 +103,7 @@ const SelectedFileOptions = ({ const moveToCollection = () => { setCollectionSelectorAttributes({ - callback: (collection) => moveToCollectionHelper(null, collection), + callback: moveToCollectionHelper, showNextModal: showCreateCollectionModal(COLLECTION_OPS_TYPE.MOVE), title: constants.MOVE_TO_COLLECTION, fromCollection: activeCollection, diff --git a/src/pages/gallery/index.tsx b/src/pages/gallery/index.tsx index b4cc05874..f75b87fef 100644 --- a/src/pages/gallery/index.tsx +++ b/src/pages/gallery/index.tsx @@ -25,6 +25,8 @@ import { getFavItemIds, getLocalCollections, getNonEmptyCollections, + createCollection, + CollectionType, } from 'services/collectionService'; import constants from 'utils/strings/constants'; import billingService from 'services/billingService'; @@ -68,9 +70,9 @@ import { AppContext } from 'pages/_app'; import { CustomError, ServerErrorCodes } from 'utils/common/errorUtil'; import { PAGES } from 'types'; import { - copyOrMoveFromCollection, COLLECTION_OPS_TYPE, isSharedCollection, + handleCollectionOps, } from 'utils/collection'; import { logError } from 'utils/sentry'; @@ -315,59 +317,30 @@ export default function Gallery() { if (!files) { return
; } - const addToCollectionHelper = async ( - collectionName: string, - collection: Collection - ) => { - loadingBar.current?.continuousStart(); - try { - await copyOrMoveFromCollection( - COLLECTION_OPS_TYPE.ADD, - setCollectionSelectorView, - selected, - files, - clearSelection, - syncWithRemote, - setActiveCollection, - collectionName, - collection - ); - } catch (e) { - setDialogMessage({ - title: constants.ERROR, - staticBackdrop: true, - close: { variant: 'danger' }, - content: constants.UNKNOWN_ERROR, - }); - } - }; + const collectionOpsHelper = + (ops: COLLECTION_OPS_TYPE) => async (collection: Collection) => { + loadingBar.current?.continuousStart(); + try { + await handleCollectionOps( + ops, + setCollectionSelectorView, + selected, + files, + clearSelection, + syncWithRemote, + setActiveCollection, + collection + ); + } catch (e) { + setDialogMessage({ + title: constants.ERROR, + staticBackdrop: true, + close: { variant: 'danger' }, + content: constants.UNKNOWN_ERROR, + }); + } + }; - const moveToCollectionHelper = async ( - collectionName: string, - collection: Collection - ) => { - loadingBar.current?.continuousStart(); - try { - await copyOrMoveFromCollection( - COLLECTION_OPS_TYPE.MOVE, - setCollectionSelectorView, - selected, - files, - clearSelection, - syncWithRemote, - setActiveCollection, - collectionName, - collection - ); - } catch (e) { - setDialogMessage({ - title: constants.ERROR, - staticBackdrop: true, - close: { variant: 'danger' }, - content: constants.UNKNOWN_ERROR, - }); - } - }; const changeFilesVisibilityHelper = async ( visibility: VISIBILITY_STATE ) => { @@ -403,40 +376,33 @@ export default function Gallery() { } }; - const showCreateCollectionModal = (opsType: COLLECTION_OPS_TYPE) => { - try { - let callback = null; - switch (opsType) { - case COLLECTION_OPS_TYPE.ADD: - callback = (collectionName: string) => - addToCollectionHelper(collectionName, null); - break; - case COLLECTION_OPS_TYPE.MOVE: - callback = (collectionName: string) => - moveToCollectionHelper(collectionName, null); - break; - default: - throw Error(CustomError.INVALID_COLLECTION_OPERATION); - } - return () => - setCollectionNamerAttributes({ - title: constants.CREATE_COLLECTION, - buttonText: constants.CREATE, - autoFilledName: '', - callback, + const showCreateCollectionModal = (ops: COLLECTION_OPS_TYPE) => { + const callback = async (collectionName: string) => { + try { + const collection = await createCollection( + collectionName, + CollectionType.album, + collections + ); + + await collectionOpsHelper(ops)(collection); + } catch (e) { + logError(e, 'create and collection ops failed'); + setDialogMessage({ + title: constants.ERROR, + staticBackdrop: true, + close: { variant: 'danger' }, + content: constants.UNKNOWN_ERROR, }); - } catch (e) { - logError( - e, - 'showCreateCollectionModal called with incorrect attributes' - ); - setDialogMessage({ - title: constants.ERROR, - staticBackdrop: true, - close: { variant: 'danger' }, - content: constants.UNKNOWN_ERROR, + } + }; + return () => + setCollectionNamerAttributes({ + title: constants.CREATE_COLLECTION, + buttonText: constants.CREATE, + autoFilledName: '', + callback, }); - } }; const deleteFileHelper = async () => { @@ -605,7 +571,9 @@ export default function Gallery() { {selected.count > 0 && selected.collectionID === activeCollection && ( changeFilesVisibilityHelper( VISIBILITY_STATE.ARCHIVED @@ -616,7 +584,9 @@ export default function Gallery() { VISIBILITY_STATE.VISIBLE ) } - moveToCollectionHelper={moveToCollectionHelper} + moveToCollectionHelper={collectionOpsHelper( + COLLECTION_OPS_TYPE.ADD + )} showCreateCollectionModal={ showCreateCollectionModal } diff --git a/src/utils/collection/index.ts b/src/utils/collection/index.ts index 1c13c40c1..a06f47614 100644 --- a/src/utils/collection/index.ts +++ b/src/utils/collection/index.ts @@ -1,8 +1,6 @@ import { addToCollection, Collection, - CollectionType, - createCollection, moveToCollection, } from 'services/collectionService'; import { getSelectedFiles } from 'utils/file'; @@ -15,8 +13,9 @@ import { getData, LS_KEYS } from 'utils/storage/localStorage'; export enum COLLECTION_OPS_TYPE { ADD, MOVE, + REMOVE, } -export async function copyOrMoveFromCollection( +export async function handleCollectionOps( type: COLLECTION_OPS_TYPE, setCollectionSelectorView: (value: boolean) => void, selected: SelectedState, @@ -24,19 +23,9 @@ export async function copyOrMoveFromCollection( clearSelection: () => void, syncWithRemote: () => Promise, setActiveCollection: (id: number) => void, - collectionName: string, - existingCollection: Collection + collection: Collection ) { setCollectionSelectorView(false); - let collection: Collection; - if (!existingCollection) { - collection = await createCollection( - collectionName, - CollectionType.album - ); - } else { - collection = existingCollection; - } const selectedFiles = getSelectedFiles(selected, files); switch (type) { case COLLECTION_OPS_TYPE.ADD: @@ -49,6 +38,8 @@ export async function copyOrMoveFromCollection( selectedFiles ); break; + case COLLECTION_OPS_TYPE.REMOVE: + break; default: throw Error(CustomError.INVALID_COLLECTION_OPERATION); } diff --git a/src/utils/common/errorUtil.ts b/src/utils/common/errorUtil.ts index 9bca94c37..65964cefe 100644 --- a/src/utils/common/errorUtil.ts +++ b/src/utils/common/errorUtil.ts @@ -27,6 +27,7 @@ export enum CustomError { SIGNUP_FAILED = 'signup failed', FAV_COLLECTION_MISSING = 'favorite collection missing', INVALID_COLLECTION_OPERATION = 'invalid collection operation', + INVALID_COLLECTION = 'invalid collection attribute', } function parseUploadError(error: AxiosResponse) { From 5796a2a7465c34522e0e7c42baa8463392f1f758 Mon Sep 17 00:00:00 2001 From: abhinav-grd Date: Tue, 28 Sep 2021 13:44:45 +0530 Subject: [PATCH 003/147] adds removeFromCollectionHelper --- src/components/pages/gallery/SelectedFileOptions.tsx | 4 +++- src/pages/gallery/index.tsx | 9 +++++++++ src/utils/collection/index.ts | 1 + 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/components/pages/gallery/SelectedFileOptions.tsx b/src/components/pages/gallery/SelectedFileOptions.tsx index 5cbe34a8b..c8a0b9810 100644 --- a/src/components/pages/gallery/SelectedFileOptions.tsx +++ b/src/components/pages/gallery/SelectedFileOptions.tsx @@ -24,6 +24,7 @@ interface Props { setDialogMessage: SetDialogMessage; setCollectionSelectorAttributes: SetCollectionSelectorAttributes; deleteFileHelper: () => void; + removeFromCollectionHelper: () => void; count: number; clearSelection: () => void; archiveFilesHelper: () => void; @@ -58,6 +59,7 @@ const SelectedFileOptions = ({ addToCollectionHelper, moveToCollectionHelper, showCreateCollectionModal, + removeFromCollectionHelper, setDialogMessage, setCollectionSelectorAttributes, deleteFileHelper, @@ -94,7 +96,7 @@ const SelectedFileOptions = ({ content: constants.CONFIRM_REMOVE_MESSAGE, staticBackdrop: true, proceed: { - action: deleteFileHelper, + action: removeFromCollectionHelper, text: constants.REMOVE, variant: 'danger', }, diff --git a/src/pages/gallery/index.tsx b/src/pages/gallery/index.tsx index f75b87fef..d74e7c42d 100644 --- a/src/pages/gallery/index.tsx +++ b/src/pages/gallery/index.tsx @@ -73,6 +73,7 @@ import { COLLECTION_OPS_TYPE, isSharedCollection, handleCollectionOps, + getSelectedCollection, } from 'utils/collection'; import { logError } from 'utils/sentry'; @@ -595,6 +596,14 @@ export default function Gallery() { setCollectionSelectorAttributes } deleteFileHelper={deleteFileHelper} + removeFromCollectionHelper={() => + collectionOpsHelper(COLLECTION_OPS_TYPE.REMOVE)( + getSelectedCollection( + activeCollection, + collections + ) + ) + } count={selected.count} clearSelection={clearSelection} activeCollection={activeCollection} diff --git a/src/utils/collection/index.ts b/src/utils/collection/index.ts index a06f47614..5b303d643 100644 --- a/src/utils/collection/index.ts +++ b/src/utils/collection/index.ts @@ -39,6 +39,7 @@ export async function handleCollectionOps( ); break; case COLLECTION_OPS_TYPE.REMOVE: + // todo add remove logic break; default: throw Error(CustomError.INVALID_COLLECTION_OPERATION); From 497b97c26d9b30f8a69e0a7a1e9c293959ed8d55 Mon Sep 17 00:00:00 2001 From: abhinav-grd Date: Tue, 28 Sep 2021 13:55:15 +0530 Subject: [PATCH 004/147] adds collection ops remove logic --- src/services/collectionService.ts | 29 ++++++++++++++++------------- src/utils/collection/index.ts | 3 ++- 2 files changed, 18 insertions(+), 14 deletions(-) diff --git a/src/services/collectionService.ts b/src/services/collectionService.ts index 4364db20a..276ad5153 100644 --- a/src/services/collectionService.ts +++ b/src/services/collectionService.ts @@ -75,6 +75,11 @@ export enum COLLECTION_SORT_BY { NAME, } +interface RemoveFromCollectionRequest { + collectionID: number; + fileIDs: number[]; +} + const getCollectionWithSecrets = async ( collection: Collection, masterKey: string @@ -436,22 +441,20 @@ const encryptWithNewCollectionKey = async ( } return fileKeysEncryptedWithNewCollection; }; -const removeFromCollection = async (collection: Collection, files: File[]) => { +export const removeFromCollection = async ( + collection: Collection, + files: File[] +) => { try { - const params = {}; const token = getToken(); - params['collectionID'] = collection.id; - await Promise.all( - files.map(async (file) => { - if (params['fileIDs'] === undefined) { - params['fileIDs'] = []; - } - params['fileIDs'].push(file.id); - }) - ); + const request: RemoveFromCollectionRequest = { + collectionID: collection.id, + fileIDs: files.map((file) => file.id), + }; + await HTTPService.post( - `${ENDPOINT}/collections/remove-files`, - params, + `${ENDPOINT}/collections/v2/remove-files`, + request, null, { 'X-Auth-Token': token } ); diff --git a/src/utils/collection/index.ts b/src/utils/collection/index.ts index 5b303d643..4a1497b06 100644 --- a/src/utils/collection/index.ts +++ b/src/utils/collection/index.ts @@ -2,6 +2,7 @@ import { addToCollection, Collection, moveToCollection, + removeFromCollection, } from 'services/collectionService'; import { getSelectedFiles } from 'utils/file'; import { File } from 'services/fileService'; @@ -39,7 +40,7 @@ export async function handleCollectionOps( ); break; case COLLECTION_OPS_TYPE.REMOVE: - // todo add remove logic + await removeFromCollection(collection, selectedFiles); break; default: throw Error(CustomError.INVALID_COLLECTION_OPERATION); From 376865f6d15888ddf0fc9643f29867cacd89cc0a Mon Sep 17 00:00:00 2001 From: abhinav-grd Date: Tue, 28 Sep 2021 14:10:14 +0530 Subject: [PATCH 005/147] fix move operation --- src/pages/gallery/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/gallery/index.tsx b/src/pages/gallery/index.tsx index fee09340c..e1121a10e 100644 --- a/src/pages/gallery/index.tsx +++ b/src/pages/gallery/index.tsx @@ -588,7 +588,7 @@ export default function Gallery() { ) } moveToCollectionHelper={collectionOpsHelper( - COLLECTION_OPS_TYPE.ADD + COLLECTION_OPS_TYPE.MOVE )} showCreateCollectionModal={ showCreateCollectionModal From 18d757525c3dd1396d3325e96c079c1daa845be0 Mon Sep 17 00:00:00 2001 From: abhinav-grd Date: Tue, 28 Sep 2021 14:13:19 +0530 Subject: [PATCH 006/147] unneeded CustomError --- src/utils/common/errorUtil.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/utils/common/errorUtil.ts b/src/utils/common/errorUtil.ts index 65964cefe..9bca94c37 100644 --- a/src/utils/common/errorUtil.ts +++ b/src/utils/common/errorUtil.ts @@ -27,7 +27,6 @@ export enum CustomError { SIGNUP_FAILED = 'signup failed', FAV_COLLECTION_MISSING = 'favorite collection missing', INVALID_COLLECTION_OPERATION = 'invalid collection operation', - INVALID_COLLECTION = 'invalid collection attribute', } function parseUploadError(error: AxiosResponse) { From 8ae89c5be1a4c7419f12a197b21b047200df579f Mon Sep 17 00:00:00 2001 From: abhinav-grd Date: Tue, 28 Sep 2021 14:20:05 +0530 Subject: [PATCH 007/147] adds error logging for failed collection ops and file archiving --- src/pages/gallery/index.tsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/pages/gallery/index.tsx b/src/pages/gallery/index.tsx index e1121a10e..0ad5c58cf 100644 --- a/src/pages/gallery/index.tsx +++ b/src/pages/gallery/index.tsx @@ -332,6 +332,7 @@ export default function Gallery() { ); clearSelection(); } catch (e) { + logError(e, 'collection ops failed', { ops }); setDialogMessage({ title: constants.ERROR, staticBackdrop: true, @@ -357,6 +358,7 @@ export default function Gallery() { await updateMagicMetadata(updatedFiles); clearSelection(); } catch (e) { + logError(e, 'change file visibility failed'); switch (e.status?.toString()) { case ServerErrorCodes.FORBIDDEN: setDialogMessage({ From f3b27eacdf697143cb7a243c9b583caf32dbaca2 Mon Sep 17 00:00:00 2001 From: abhinav-grd Date: Tue, 28 Sep 2021 11:27:45 +0530 Subject: [PATCH 008/147] added trash button on the sidebar --- src/components/Sidebar.tsx | 13 ++++++++++++- src/components/pages/gallery/Collections.tsx | 1 + src/utils/strings/englishConstants.tsx | 1 + 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/src/components/Sidebar.tsx b/src/components/Sidebar.tsx index 8e1ac23e3..1c23fa097 100644 --- a/src/components/Sidebar.tsx +++ b/src/components/Sidebar.tsx @@ -32,7 +32,10 @@ import InProgressIcon from './icons/InProgressIcon'; import exportService from 'services/exportService'; import { Subscription } from 'services/billingService'; import { PAGES } from 'types'; -import { ARCHIVE_SECTION } from 'components/pages/gallery/Collections'; +import { + ARCHIVE_SECTION, + TRASH_SECTION, +} from 'components/pages/gallery/Collections'; interface Props { collections: Collection[]; setDialogMessage: SetDialogMessage; @@ -221,6 +224,14 @@ export default function Sidebar(props: Props) { }}> {constants.ARCHIVE} + { + galleryContext.setActiveCollection(TRASH_SECTION); + setIsOpen(false); + }}> + {constants.TRASH} + <> Date: Tue, 28 Sep 2021 12:09:15 +0530 Subject: [PATCH 009/147] added trash chip when trash opened --- src/components/pages/gallery/Collections.tsx | 54 ++++++++++++-------- 1 file changed, 33 insertions(+), 21 deletions(-) diff --git a/src/components/pages/gallery/Collections.tsx b/src/components/pages/gallery/Collections.tsx index 51670692d..42c7c8793 100644 --- a/src/components/pages/gallery/Collections.tsx +++ b/src/components/pages/gallery/Collections.tsx @@ -88,6 +88,22 @@ const Chip = styled.button<{ active: boolean }>` } `; +const SectionChipCreater = + ({ activeCollection, clickHandler }) => + ({ section, label }) => + ( + + {label} +
+ + ); export default function Collections(props: CollectionProps) { const { activeCollection, collections, setActiveCollection } = props; const [selectedCollectionID, setSelectedCollectionID] = @@ -171,6 +187,8 @@ export default function Collections(props: CollectionProps) { ); }; + const SectionChip = SectionChipCreater({ activeCollection, clickHandler }); + return ( !props.searchMode && ( <> @@ -194,17 +212,10 @@ export default function Collections(props: CollectionProps) { /> )} - - {constants.ALL} -
- + {sortCollections( collections, props.collectionAndTheirLatestFile, @@ -246,17 +257,18 @@ export default function Collections(props: CollectionProps) { ))} - - {constants.ARCHIVE} -
- + )} + {activeCollection === TRASH_SECTION && ( + + )} {scrollObj.scrollLeft < scrollObj.scrollWidth - scrollObj.clientWidth && ( From 5ae24449f5285d6085f7fe200c83c29c1acca787 Mon Sep 17 00:00:00 2001 From: abhinav-grd Date: Tue, 28 Sep 2021 12:39:20 +0530 Subject: [PATCH 010/147] updates confirmation messge --- src/components/Sidebar.tsx | 2 +- src/components/pages/gallery/SelectedFileOptions.tsx | 6 +++--- src/utils/strings/englishConstants.tsx | 8 +++++--- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/src/components/Sidebar.tsx b/src/components/Sidebar.tsx index 1c23fa097..fb38ba5e0 100644 --- a/src/components/Sidebar.tsx +++ b/src/components/Sidebar.tsx @@ -331,7 +331,7 @@ export default function Sidebar(props: Props) { onClick={() => props.setDialogMessage({ title: `${constants.DELETE_ACCOUNT}`, - content: constants.DELETE_MESSAGE(), + content: constants.DELETE_ACCOUNT_MESSAGE(), staticBackdrop: true, proceed: { text: constants.DELETE_ACCOUNT, diff --git a/src/components/pages/gallery/SelectedFileOptions.tsx b/src/components/pages/gallery/SelectedFileOptions.tsx index c8a0b9810..aff4319ec 100644 --- a/src/components/pages/gallery/SelectedFileOptions.tsx +++ b/src/components/pages/gallery/SelectedFileOptions.tsx @@ -79,12 +79,12 @@ const SelectedFileOptions = ({ const deleteHandler = () => setDialogMessage({ - title: constants.CONFIRM_DELETE_FILE, - content: constants.DELETE_FILE_MESSAGE, + title: constants.CONFIRM_DELETE, + content: constants.DELETE_MESSAGE, staticBackdrop: true, proceed: { action: deleteFileHelper, - text: constants.DELETE, + text: constants.MOVE_TO_TRASH, variant: 'danger', }, close: { text: constants.CANCEL }, diff --git a/src/utils/strings/englishConstants.tsx b/src/utils/strings/englishConstants.tsx index 65b24d6ae..56fe9c851 100644 --- a/src/utils/strings/englishConstants.tsx +++ b/src/utils/strings/englishConstants.tsx @@ -159,8 +159,9 @@ const englishConstants = { UPLOAD_FIRST_PHOTO_DESCRIPTION: 'preserve your first memory with ente', UPLOAD_FIRST_PHOTO: 'preserve', UPLOAD_DROPZONE_MESSAGE: 'drop to backup your files', - CONFIRM_DELETE_FILE: 'confirm file deletion', - DELETE_FILE_MESSAGE: 'sure you want to delete selected files?', + CONFIRM_DELETE: 'confirm deletion', + DELETE_MESSAGE: + 'the selected files will be removed from all collection and moved to trash ', DELETE_FILE: 'delete files', DELETE: 'delete', MULTI_FOLDER_UPLOAD: 'multiple folders detected', @@ -210,7 +211,7 @@ const englishConstants = { CANCEL: 'cancel', LOGOUT: 'logout', DELETE_ACCOUNT: 'delete account', - DELETE_MESSAGE: () => ( + DELETE_ACCOUNT_MESSAGE: () => ( <>

please send an email to{' '} @@ -557,6 +558,7 @@ const englishConstants = { CONFIRM_REMOVE_MESSAGE: 'are you sure you want to remove these files from the collection', TRASH: 'trash', + MOVE_TO_TRASH: 'move to trash', }; export default englishConstants; From 44f01d128c66c5c630f8a5f05cfd9f14502e8150 Mon Sep 17 00:00:00 2001 From: abhinav-grd Date: Tue, 28 Sep 2021 12:39:59 +0530 Subject: [PATCH 011/147] upates delete file to trash file --- src/pages/gallery/index.tsx | 11 +++++------ src/services/fileService.ts | 29 +++++++++++++++++++---------- src/utils/file/index.ts | 2 +- 3 files changed, 25 insertions(+), 17 deletions(-) diff --git a/src/pages/gallery/index.tsx b/src/pages/gallery/index.tsx index 0ad5c58cf..094c1ad63 100644 --- a/src/pages/gallery/index.tsx +++ b/src/pages/gallery/index.tsx @@ -10,10 +10,10 @@ import { clearKeys, getKey, SESSION_KEYS } from 'utils/storage/sessionStorage'; import { File, getLocalFiles, - deleteFiles, syncFiles, updateMagicMetadata, VISIBILITY_STATE, + trashFiles, } from 'services/fileService'; import styled from 'styled-components'; import LoadingBar from 'react-top-loading-bar'; @@ -49,7 +49,7 @@ import { LoadingOverlay } from 'components/LoadingOverlay'; import PhotoFrame from 'components/PhotoFrame'; import { changeFilesVisibility, - getSelectedFileIds, + getSelectedFiles, sortFilesIntoCollections, } from 'utils/file'; import SearchBar, { DateValue } from 'components/SearchBar'; @@ -413,10 +413,9 @@ export default function Gallery() { const deleteFileHelper = async () => { loadingBar.current?.continuousStart(); try { - const fileIds = getSelectedFileIds(selected); - await deleteFiles(fileIds); - setDeleted([...deleted, ...fileIds]); - clearSelection(); + const selectedFiles = getSelectedFiles(selected, files); + await trashFiles(selectedFiles); + setDeleted([...deleted, ...selectedFiles.map((file) => file.id)]); } catch (e) { switch (e.status?.toString()) { case ServerErrorCodes.FORBIDDEN: diff --git a/src/services/fileService.ts b/src/services/fileService.ts index f3fc24ddf..b6df38815 100644 --- a/src/services/fileService.ts +++ b/src/services/fileService.ts @@ -86,6 +86,14 @@ export const NEW_MAGIC_METADATA: MagicMetadata = { count: 0, }; +interface TrashRequest { + items: TrashRequestItems[]; +} + +interface TrashRequestItems { + fileID: number; + collectionID: number; +} export const getLocalFiles = async () => { const files: Array = (await localForage.getItem(FILES)) || []; return files; @@ -232,22 +240,23 @@ const removeDeletedCollectionFiles = async ( return files; }; -export const deleteFiles = async (filesToDelete: number[]) => { +export const trashFiles = async (filesToTrash: File[]) => { try { const token = getToken(); if (!token) { return; } - await HTTPService.post( - `${ENDPOINT}/files/delete`, - { fileIDs: filesToDelete }, - null, - { - 'X-Auth-Token': token, - } - ); + const trashRequest: TrashRequest = { + items: filesToTrash.map((file) => ({ + fileID: file.id, + collectionID: file.collectionID, + })), + }; + await HTTPService.post(`${ENDPOINT}/files/trash`, trashRequest, null, { + 'X-Auth-Token': token, + }); } catch (e) { - logError(e, 'delete failed'); + logError(e, 'trash file failed'); throw e; } }; diff --git a/src/utils/file/index.ts b/src/utils/file/index.ts index a9186ac1f..8c53c18f8 100644 --- a/src/utils/file/index.ts +++ b/src/utils/file/index.ts @@ -54,7 +54,7 @@ export function sortFilesIntoCollections(files: File[]) { return collectionWiseFiles; } -export function getSelectedFileIds(selectedFiles: SelectedState) { +function getSelectedFileIds(selectedFiles: SelectedState) { const filesIDs: number[] = []; for (const [key, val] of Object.entries(selectedFiles)) { if (typeof val === 'boolean' && val) { From 8deb45a358fc698248ca7ec3f686064aef3577e4 Mon Sep 17 00:00:00 2001 From: abhinav-grd Date: Tue, 28 Sep 2021 12:47:16 +0530 Subject: [PATCH 012/147] updates collection delete to use the new API --- src/services/collectionService.ts | 2 +- src/utils/strings/englishConstants.tsx | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/services/collectionService.ts b/src/services/collectionService.ts index 276ad5153..5375defd0 100644 --- a/src/services/collectionService.ts +++ b/src/services/collectionService.ts @@ -474,7 +474,7 @@ export const deleteCollection = async ( const token = getToken(); await HTTPService.delete( - `${ENDPOINT}/collections/${collectionID}`, + `${ENDPOINT}/collections/v2/${collectionID}`, null, null, { 'X-Auth-Token': token } diff --git a/src/utils/strings/englishConstants.tsx b/src/utils/strings/englishConstants.tsx index 56fe9c851..51a7e088a 100644 --- a/src/utils/strings/englishConstants.tsx +++ b/src/utils/strings/englishConstants.tsx @@ -360,8 +360,7 @@ const englishConstants = { <>

are you sure you want to delete this album?

- all files that are unique to this album will be permanently - deleted + all files that are unique to this album will be moved to trash

), From e28154e5b143780030c230b6bc5c3767f782a266 Mon Sep 17 00:00:00 2001 From: abhinav-grd Date: Fri, 1 Oct 2021 12:11:48 +0530 Subject: [PATCH 013/147] added trash service --- src/services/trashService.ts | 165 +++++++++++++++++++++++++++++++++++ 1 file changed, 165 insertions(+) create mode 100644 src/services/trashService.ts diff --git a/src/services/trashService.ts b/src/services/trashService.ts new file mode 100644 index 000000000..e41f422e6 --- /dev/null +++ b/src/services/trashService.ts @@ -0,0 +1,165 @@ +import { SetFiles } from 'pages/gallery'; +import { getEndpoint } from 'utils/common/apiUtil'; +import { getToken } from 'utils/common/key'; +import { appendPhotoSwipeProps, decryptFile, sortFiles } from 'utils/file'; +import { logError } from 'utils/sentry'; +import localForage from 'utils/storage/localForage'; +import { Collection, getCollection } from './collectionService'; +import { File } from './fileService'; +import HTTPService from './HTTPService'; + +const TRASH = 'file-trash'; +const TRASH_TIME = 'trash-time'; +const DELETED_COLLECTION = 'deleted-collection'; +const SYNC_LIMIT = 1000; + +const ENDPOINT = getEndpoint(); + +export interface TrashItem { + file: File; + isDeleted: boolean; + isRestored: boolean; + deletedBy: boolean; + createdAt: number; + updatedAt: number; +} +export type Trash = TrashItem[]; + +export async function getLocalTrash() { + const trash = (await localForage.getItem(TRASH)) || []; + return trash; +} + +export async function getLocalDeletedCollections() { + const trashedCollections: Array = + (await localForage.getItem(DELETED_COLLECTION)) || []; + return trashedCollections; +} + +export async function cleanTrashCollections(fileTrash: Trash) { + const trashedCollections = await getLocalDeletedCollections(); + const neededTrashCollections = new Set( + fileTrash.map((item) => item.file.collectionID) + ); + const filterCollections = trashedCollections.filter((item) => + neededTrashCollections.has(item.id) + ); + await localForage.setItem(DELETED_COLLECTION, filterCollections); +} + +export async function syncTrash( + collections: Collection[], + setFiles: SetFiles +): Promise { + const trash = await getLocalTrash(); + collections = [...collections, ...(await getLocalDeletedCollections())]; + const collectionMap = new Map( + collections.map((collection) => [collection.id, collection]) + ); + if (!getToken()) { + return trash; + } + const lastSyncTime = (await localForage.getItem(TRASH_TIME)) ?? 0; + + const updatedTrash = await updateTrash( + collectionMap, + lastSyncTime, + setFiles, + trash + ); + cleanTrashCollections(updatedTrash); +} + +export const updateTrash = async ( + collections: Map, + sinceTime: number, + setFiles: SetFiles, + currentTrash: Trash +): Promise => { + try { + let updatedTrash: Trash = currentTrash; + let time = sinceTime; + + let resp; + do { + const token = getToken(); + if (!token) { + break; + } + resp = await HTTPService.get( + `${ENDPOINT}/trash/diff`, + { + sinceTime: time, + limit: SYNC_LIMIT, + }, + { + 'X-Auth-Token': token, + } + ); + for (const trashItem of resp.data.diff as TrashItem[]) { + const collectionID = trashItem.file.collectionID; + let collection = collections.get(collectionID); + if (!collection) { + collection = await getCollection(collectionID); + collections.set(collectionID, collection); + localForage.setItem(DELETED_COLLECTION, [ + ...collections.values(), + ]); + } + if (!trashItem.isDeleted && !trashItem.isRestored) { + trashItem.file = await decryptFile( + trashItem.file, + collections.get(trashItem.file.collectionID) + ); + } + updatedTrash.push(trashItem); + } + + if (resp.data.diff.length) { + time = resp.data.diff.slice(-1)[0].updatedAt; + } + updatedTrash = removeDuplicates(updatedTrash); + + setFiles((files) => [ + ...files, + ...appendPhotoSwipeProps( + sortFiles(getTrashedFiles(updatedTrash)) + ), + ]); + localForage.setItem(TRASH, updatedTrash); + localForage.setItem(TRASH_TIME, time); + } while (resp.data.diff.length === SYNC_LIMIT); + return updatedTrash; + } catch (e) { + logError(e, 'Get trash files failed'); + } +}; + +function removeDuplicates(trash: Trash) { + const latestVersionTrashItems = new Map(); + trash.forEach(({ file, updatedAt, ...rest }) => { + if ( + !latestVersionTrashItems.has(file.id) || + latestVersionTrashItems.get(file.id).updatedAt < updatedAt + ) { + latestVersionTrashItems.set(file.id, { file, updatedAt, ...rest }); + } + }); + trash = []; + // eslint-disable-next-line @typescript-eslint/no-unused-vars + for (const [_, trashedFile] of latestVersionTrashItems) { + if (trashedFile.isDeleted || trashedFile.isRestored) { + continue; + } + trash.push(trashedFile); + } + return trash; +} + +export function getTrashedFiles(trash: Trash) { + return trash.map((trashedFile) => ({ + ...trashedFile.file, + updationTime: trashedFile.updatedAt, + isTrashed: true, + })) as File[]; +} From ad173f7481872a4814e187d5511599560b389184 Mon Sep 17 00:00:00 2001 From: abhinav-grd Date: Fri, 1 Oct 2021 12:15:14 +0530 Subject: [PATCH 014/147] updated files state to include trash files --- src/pages/gallery/index.tsx | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/pages/gallery/index.tsx b/src/pages/gallery/index.tsx index 094c1ad63..9265bb6cb 100644 --- a/src/pages/gallery/index.tsx +++ b/src/pages/gallery/index.tsx @@ -76,6 +76,11 @@ import { getSelectedCollection, } from 'utils/collection'; import { logError } from 'utils/sentry'; +import { + getLocalTrash, + getTrashedFiles, + syncTrash, +} from 'services/trashService'; export const DeadCenter = styled.div` flex: 1; @@ -201,7 +206,9 @@ export default function Gallery() { setIsFirstLogin(false); const files = await getLocalFiles(); const collections = await getLocalCollections(); - setFiles(files); + const trash = await getLocalTrash(); + const trashedFile = getTrashedFiles(trash); + setFiles([...files, ...trashedFile]); setCollections(collections); await setDerivativeState(collections, files); await checkSubscriptionPurchase( @@ -257,8 +264,9 @@ export default function Gallery() { await billingService.syncSubscription(); const collections = await syncCollections(); setCollections(collections); - const { files } = await syncFiles(collections, setFiles); + const files = await syncFiles(collections, setFiles); await setDerivativeState(collections, files); + await syncTrash(collections, setFiles); } catch (e) { switch (e.message) { case ServerErrorCodes.SESSION_EXPIRED: @@ -416,6 +424,7 @@ export default function Gallery() { const selectedFiles = getSelectedFiles(selected, files); await trashFiles(selectedFiles); setDeleted([...deleted, ...selectedFiles.map((file) => file.id)]); + clearSelection(); } catch (e) { switch (e.status?.toString()) { case ServerErrorCodes.FORBIDDEN: From a034504679c8afa4d7cc8d5451e5b5bb5472a637 Mon Sep 17 00:00:00 2001 From: abhinav-grd Date: Fri, 1 Oct 2021 12:15:44 +0530 Subject: [PATCH 015/147] added getCollection API --- src/services/collectionService.ts | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/src/services/collectionService.ts b/src/services/collectionService.ts index 5375defd0..732484894 100644 --- a/src/services/collectionService.ts +++ b/src/services/collectionService.ts @@ -214,8 +214,23 @@ export const syncCollections = async () => { return collections; }; -export const setLocalCollection = async (collections: Collection[]) => { - await localForage.setItem(COLLECTIONS, collections); +export const getCollection = async ( + collectionID: number +): Promise => { + try { + const token = getToken(); + if (!token) { + return; + } + const resp = await HTTPService.get( + `${ENDPOINT}/collections/${collectionID}`, + null, + { 'X-Auth-Token': token } + ); + return resp.data; + } catch (e) { + logError(e, 'failed to get collection', { collectionID }); + } }; export const getCollectionsAndTheirLatestFile = ( From d8801bf8bc973c34a0caaaace2837f4e03bc38a8 Mon Sep 17 00:00:00 2001 From: abhinav-grd Date: Fri, 1 Oct 2021 12:16:07 +0530 Subject: [PATCH 016/147] added isTrashed Property to file interface --- src/services/fileService.ts | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/src/services/fileService.ts b/src/services/fileService.ts index b6df38815..03103a93e 100644 --- a/src/services/fileService.ts +++ b/src/services/fileService.ts @@ -67,6 +67,7 @@ export interface File { w: number; h: number; isDeleted: boolean; + isTrashed?: boolean; dataIndex: number; updationTime: number; } @@ -159,13 +160,11 @@ export const syncFiles = async ( })) ); } - return { - files: files.map((item) => ({ - ...item, - w: window.innerWidth, - h: window.innerHeight, - })), - }; + return files.map((item) => ({ + ...item, + w: window.innerWidth, + h: window.innerHeight, + })); }; export const getFiles = async ( From 90f6b0e1859c13acfdf9964b2d85d82bfd1e4166 Mon Sep 17 00:00:00 2001 From: abhinav-grd Date: Fri, 1 Oct 2021 12:16:33 +0530 Subject: [PATCH 017/147] added appendPhotoSwipeProps util --- src/utils/file/index.ts | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/utils/file/index.ts b/src/utils/file/index.ts index 8c53c18f8..49a0b082e 100644 --- a/src/utils/file/index.ts +++ b/src/utils/file/index.ts @@ -275,3 +275,11 @@ export function isSharedFile(file: File) { } return file.ownerID !== user.id; } + +export function appendPhotoSwipeProps(files: File[]) { + return files.map((file) => ({ + ...file, + w: window.innerWidth, + h: window.innerHeight, + })) as File[]; +} From b456147311dce9b3a347cc96571fb6b15ee209ba Mon Sep 17 00:00:00 2001 From: abhinav-grd Date: Fri, 1 Oct 2021 12:17:02 +0530 Subject: [PATCH 018/147] display trash --- src/components/PhotoFrame.tsx | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/components/PhotoFrame.tsx b/src/components/PhotoFrame.tsx index faeae4cff..a63e4eef7 100644 --- a/src/components/PhotoFrame.tsx +++ b/src/components/PhotoFrame.tsx @@ -28,7 +28,11 @@ import { SPACE_BTW_DATES, } from 'types'; import { fileIsArchived } from 'utils/file'; -import { ALL_SECTION, ARCHIVE_SECTION } from './pages/gallery/Collections'; +import { + ALL_SECTION, + ARCHIVE_SECTION, + TRASH_SECTION, +} from './pages/gallery/Collections'; import { isSharedFile } from 'utils/file'; const NO_OF_PAGES = 2; @@ -416,10 +420,17 @@ const PhotoFrame = ({ if (isSharedFile(item) && !isSharedCollection) { return false; } + if (activeCollection === TRASH_SECTION && !item.isTrashed) { + return false; + } + if (activeCollection !== TRASH_SECTION && item.isTrashed) { + return false; + } if (!idSet.has(item.id)) { if ( activeCollection === ALL_SECTION || activeCollection === ARCHIVE_SECTION || + activeCollection === TRASH_SECTION || activeCollection === item.collectionID ) { idSet.add(item.id); From 749786517234195b029716b82aeab17ccaff8b06 Mon Sep 17 00:00:00 2001 From: abhinav-grd Date: Mon, 4 Oct 2021 10:52:12 +0530 Subject: [PATCH 019/147] added trash and delete from trash options --- .../pages/gallery/SelectedFileOptions.tsx | 31 +++++++++++++++---- src/pages/gallery/index.tsx | 9 ++++-- src/services/fileService.ts | 20 ++++++++++++ src/utils/strings/englishConstants.tsx | 9 ++++-- 4 files changed, 59 insertions(+), 10 deletions(-) diff --git a/src/components/pages/gallery/SelectedFileOptions.tsx b/src/components/pages/gallery/SelectedFileOptions.tsx index aff4319ec..647f74023 100644 --- a/src/components/pages/gallery/SelectedFileOptions.tsx +++ b/src/components/pages/gallery/SelectedFileOptions.tsx @@ -11,7 +11,7 @@ import constants from 'utils/strings/constants'; import Archive from 'components/icons/Archive'; import MoveIcon from 'components/icons/MoveIcon'; import { COLLECTION_OPS_TYPE } from 'utils/collection'; -import { ALL_SECTION, ARCHIVE_SECTION } from './Collections'; +import { ALL_SECTION, ARCHIVE_SECTION, TRASH_SECTION } from './Collections'; import UnArchive from 'components/icons/UnArchive'; import { OverlayTrigger } from 'react-bootstrap'; import { Collection } from 'services/collectionService'; @@ -23,7 +23,7 @@ interface Props { showCreateCollectionModal: (opsType: COLLECTION_OPS_TYPE) => () => void; setDialogMessage: SetDialogMessage; setCollectionSelectorAttributes: SetCollectionSelectorAttributes; - deleteFileHelper: () => void; + deleteFileHelper: (permanent?: boolean) => void; removeFromCollectionHelper: () => void; count: number; clearSelection: () => void; @@ -77,14 +77,27 @@ const SelectedFileOptions = ({ fromCollection: activeCollection, }); - const deleteHandler = () => + const trashHandler = () => + setDialogMessage({ + title: constants.CONFIRM_DELETE, + content: constants.TRASH_MESSAGE, + staticBackdrop: true, + proceed: { + action: deleteFileHelper, + text: constants.MOVE_TO_TRASH, + variant: 'danger', + }, + close: { text: constants.CANCEL }, + }); + + const permanentlyDeleteHandler = () => setDialogMessage({ title: constants.CONFIRM_DELETE, content: constants.DELETE_MESSAGE, staticBackdrop: true, proceed: { - action: deleteFileHelper, - text: constants.MOVE_TO_TRASH, + action: () => deleteFileHelper(true), + text: constants.DELETE, variant: 'danger', }, close: { text: constants.CANCEL }, @@ -128,6 +141,12 @@ const SelectedFileOptions = ({ + ) : activeCollection === TRASH_SECTION ? ( + + + + + ) : ( <> {activeCollection === ALL_SECTION && ( @@ -157,7 +176,7 @@ const SelectedFileOptions = ({ )} - + diff --git a/src/pages/gallery/index.tsx b/src/pages/gallery/index.tsx index 9265bb6cb..e6c02f715 100644 --- a/src/pages/gallery/index.tsx +++ b/src/pages/gallery/index.tsx @@ -14,6 +14,7 @@ import { updateMagicMetadata, VISIBILITY_STATE, trashFiles, + deleteFromTrash, } from 'services/fileService'; import styled from 'styled-components'; import LoadingBar from 'react-top-loading-bar'; @@ -418,11 +419,15 @@ export default function Gallery() { }); }; - const deleteFileHelper = async () => { + const deleteFileHelper = async (permanent?: boolean) => { loadingBar.current?.continuousStart(); try { const selectedFiles = getSelectedFiles(selected, files); - await trashFiles(selectedFiles); + if (permanent) { + await deleteFromTrash(selectedFiles.map((file) => file.id)); + } else { + await trashFiles(selectedFiles); + } setDeleted([...deleted, ...selectedFiles.map((file) => file.id)]); clearSelection(); } catch (e) { diff --git a/src/services/fileService.ts b/src/services/fileService.ts index 03103a93e..e3fd2de8f 100644 --- a/src/services/fileService.ts +++ b/src/services/fileService.ts @@ -260,6 +260,26 @@ export const trashFiles = async (filesToTrash: File[]) => { } }; +export const deleteFromTrash = async (filesToDelete: number[]) => { + try { + const token = getToken(); + if (!token) { + return; + } + await HTTPService.post( + `${ENDPOINT}/trash/delete`, + { fileIDs: filesToDelete }, + null, + { + 'X-Auth-Token': token, + } + ); + } catch (e) { + logError(e, 'delete from trash failed'); + throw e; + } +}; + export const updateMagicMetadata = async (files: File[]) => { const token = getToken(); if (!token) { diff --git a/src/utils/strings/englishConstants.tsx b/src/utils/strings/englishConstants.tsx index 51a7e088a..0be7faee5 100644 --- a/src/utils/strings/englishConstants.tsx +++ b/src/utils/strings/englishConstants.tsx @@ -160,8 +160,7 @@ const englishConstants = { UPLOAD_FIRST_PHOTO: 'preserve', UPLOAD_DROPZONE_MESSAGE: 'drop to backup your files', CONFIRM_DELETE: 'confirm deletion', - DELETE_MESSAGE: - 'the selected files will be removed from all collection and moved to trash ', + DELETE_MESSAGE: `the selected files will be permanently deleted and can't be restored `, DELETE_FILE: 'delete files', DELETE: 'delete', MULTI_FOLDER_UPLOAD: 'multiple folders detected', @@ -558,6 +557,12 @@ const englishConstants = { 'are you sure you want to remove these files from the collection', TRASH: 'trash', MOVE_TO_TRASH: 'move to trash', + TRASH_MESSAGE: + 'the selected files will be removed from all collection and moved to trash ', + DELETE_PERMANENTLY: 'delete permanently', + RESTORE: 'restore', + CONFIRM_RESTORE: 'confirm restoration', + RESTORE_MESSAGE: 'restore selected files ?', }; export default englishConstants; From db066090f0ea4452a2f09747b368674eabb73d30 Mon Sep 17 00:00:00 2001 From: abhinav-grd Date: Mon, 4 Oct 2021 11:39:23 +0530 Subject: [PATCH 020/147] moved appendPhotoSwipeProps to getTrashedFiles --- src/services/trashService.ts | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/src/services/trashService.ts b/src/services/trashService.ts index e41f422e6..e59594c89 100644 --- a/src/services/trashService.ts +++ b/src/services/trashService.ts @@ -120,12 +120,9 @@ export const updateTrash = async ( } updatedTrash = removeDuplicates(updatedTrash); - setFiles((files) => [ - ...files, - ...appendPhotoSwipeProps( - sortFiles(getTrashedFiles(updatedTrash)) - ), - ]); + setFiles((files) => + sortFiles([...files, ...getTrashedFiles(updatedTrash)]) + ); localForage.setItem(TRASH, updatedTrash); localForage.setItem(TRASH_TIME, time); } while (resp.data.diff.length === SYNC_LIMIT); @@ -157,9 +154,11 @@ function removeDuplicates(trash: Trash) { } export function getTrashedFiles(trash: Trash) { - return trash.map((trashedFile) => ({ - ...trashedFile.file, - updationTime: trashedFile.updatedAt, - isTrashed: true, - })) as File[]; + return appendPhotoSwipeProps( + trash.map((trashedFile) => ({ + ...trashedFile.file, + updationTime: trashedFile.updatedAt, + isTrashed: true, + })) + ); } From bfa24ce19a95edd9ae728effe3f82e5b24788d31 Mon Sep 17 00:00:00 2001 From: abhinav-grd Date: Mon, 4 Oct 2021 11:39:47 +0530 Subject: [PATCH 021/147] dont set deleted state for trashed files --- src/pages/gallery/index.tsx | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/pages/gallery/index.tsx b/src/pages/gallery/index.tsx index e6c02f715..11b7bee71 100644 --- a/src/pages/gallery/index.tsx +++ b/src/pages/gallery/index.tsx @@ -425,10 +425,13 @@ export default function Gallery() { const selectedFiles = getSelectedFiles(selected, files); if (permanent) { await deleteFromTrash(selectedFiles.map((file) => file.id)); + setDeleted([ + ...deleted, + ...selectedFiles.map((file) => file.id), + ]); } else { await trashFiles(selectedFiles); } - setDeleted([...deleted, ...selectedFiles.map((file) => file.id)]); clearSelection(); } catch (e) { switch (e.status?.toString()) { From 652487d2625b8e3bcef3c390b751abf9ba38df37 Mon Sep 17 00:00:00 2001 From: abhinav-grd Date: Mon, 4 Oct 2021 12:15:18 +0530 Subject: [PATCH 022/147] make sections always visible --- src/components/pages/gallery/Collections.tsx | 24 +++++++------------- 1 file changed, 8 insertions(+), 16 deletions(-) diff --git a/src/components/pages/gallery/Collections.tsx b/src/components/pages/gallery/Collections.tsx index 42c7c8793..f64d26be2 100644 --- a/src/components/pages/gallery/Collections.tsx +++ b/src/components/pages/gallery/Collections.tsx @@ -145,10 +145,6 @@ export default function Collections(props: CollectionProps) { const user: User = getData(LS_KEYS.USER); - if (!collections || collections.length === 0) { - return null; - } - const collectionOptions = CollectionOptions({ syncWithRemote: props.syncWithRemote, setCollectionNamerAttributes: props.setCollectionNamerAttributes, @@ -257,18 +253,14 @@ export default function Collections(props: CollectionProps) { ))} - {activeCollection === ARCHIVE_SECTION && ( - - )} - {activeCollection === TRASH_SECTION && ( - - )} + + {scrollObj.scrollLeft < scrollObj.scrollWidth - scrollObj.clientWidth && ( From 94edb58804b2f951e5392e0e3325abdc8ef49ae2 Mon Sep 17 00:00:00 2001 From: abhinav-grd Date: Mon, 4 Oct 2021 12:30:14 +0530 Subject: [PATCH 023/147] show colletionSelector even if collectionsAndTheirLatestFile is zero --- src/pages/gallery/index.tsx | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/pages/gallery/index.tsx b/src/pages/gallery/index.tsx index 11b7bee71..e780d71a1 100644 --- a/src/pages/gallery/index.tsx +++ b/src/pages/gallery/index.tsx @@ -529,10 +529,7 @@ export default function Gallery() { attributes={collectionNamerAttributes} /> Date: Mon, 4 Oct 2021 12:31:05 +0530 Subject: [PATCH 024/147] added restore files UI --- src/components/icons/RestoreIcon.tsx | 21 +++++++++++++ .../pages/gallery/SelectedFileOptions.tsx | 30 +++++++++++++++---- src/pages/gallery/index.tsx | 3 ++ src/utils/collection/index.ts | 1 + src/utils/strings/englishConstants.tsx | 1 + 5 files changed, 51 insertions(+), 5 deletions(-) create mode 100644 src/components/icons/RestoreIcon.tsx diff --git a/src/components/icons/RestoreIcon.tsx b/src/components/icons/RestoreIcon.tsx new file mode 100644 index 000000000..333d26d3e --- /dev/null +++ b/src/components/icons/RestoreIcon.tsx @@ -0,0 +1,21 @@ +import React from 'react'; + +export default function RestoreIcon(props) { + return ( + + + + + ); +} + +RestoreIcon.defaultProps = { + height: 24, + width: 24, + viewBox: '0 0 24 24', +}; diff --git a/src/components/pages/gallery/SelectedFileOptions.tsx b/src/components/pages/gallery/SelectedFileOptions.tsx index 647f74023..ef074bf78 100644 --- a/src/components/pages/gallery/SelectedFileOptions.tsx +++ b/src/components/pages/gallery/SelectedFileOptions.tsx @@ -16,10 +16,12 @@ import UnArchive from 'components/icons/UnArchive'; import { OverlayTrigger } from 'react-bootstrap'; import { Collection } from 'services/collectionService'; import RemoveIcon from 'components/icons/RemoveIcon'; +import RestoreIcon from 'components/icons/RestoreIcon'; interface Props { addToCollectionHelper: (collection: Collection) => void; moveToCollectionHelper: (collection: Collection) => void; + restoreToCollectionHelper: (collection: Collection) => void; showCreateCollectionModal: (opsType: COLLECTION_OPS_TYPE) => () => void; setDialogMessage: SetDialogMessage; setCollectionSelectorAttributes: SetCollectionSelectorAttributes; @@ -58,6 +60,7 @@ export const IconWithMessage = (props) => ( const SelectedFileOptions = ({ addToCollectionHelper, moveToCollectionHelper, + restoreToCollectionHelper, showCreateCollectionModal, removeFromCollectionHelper, setDialogMessage, @@ -103,6 +106,15 @@ const SelectedFileOptions = ({ close: { text: constants.CANCEL }, }); + const restoreHandler = () => + setCollectionSelectorAttributes({ + callback: restoreToCollectionHelper, + showNextModal: showCreateCollectionModal( + COLLECTION_OPS_TYPE.RESTORE + ), + title: constants.RESTORE_TO_COLLECTION, + }); + const removeFromCollectionHandler = () => setDialogMessage({ title: constants.CONFIRM_REMOVE, @@ -142,11 +154,19 @@ const SelectedFileOptions = ({ ) : activeCollection === TRASH_SECTION ? ( - - - - - + <> + + + + + + + + + + + + ) : ( <> {activeCollection === ALL_SECTION && ( diff --git a/src/pages/gallery/index.tsx b/src/pages/gallery/index.tsx index e780d71a1..adf0b31f4 100644 --- a/src/pages/gallery/index.tsx +++ b/src/pages/gallery/index.tsx @@ -605,6 +605,9 @@ export default function Gallery() { moveToCollectionHelper={collectionOpsHelper( COLLECTION_OPS_TYPE.MOVE )} + restoreToCollectionHelper={collectionOpsHelper( + COLLECTION_OPS_TYPE.RESTORE + )} showCreateCollectionModal={ showCreateCollectionModal } diff --git a/src/utils/collection/index.ts b/src/utils/collection/index.ts index 8701632d9..487106abd 100644 --- a/src/utils/collection/index.ts +++ b/src/utils/collection/index.ts @@ -15,6 +15,7 @@ export enum COLLECTION_OPS_TYPE { ADD, MOVE, REMOVE, + RESTORE, } export async function handleCollectionOps( type: COLLECTION_OPS_TYPE, diff --git a/src/utils/strings/englishConstants.tsx b/src/utils/strings/englishConstants.tsx index 0be7faee5..f074071b3 100644 --- a/src/utils/strings/englishConstants.tsx +++ b/src/utils/strings/englishConstants.tsx @@ -563,6 +563,7 @@ const englishConstants = { RESTORE: 'restore', CONFIRM_RESTORE: 'confirm restoration', RESTORE_MESSAGE: 'restore selected files ?', + RESTORE_TO_COLLECTION: 'restore to album', }; export default englishConstants; From d8d86eb9676a91e59cbf355ba2ad0719ffc9a62a Mon Sep 17 00:00:00 2001 From: abhinav-grd Date: Mon, 4 Oct 2021 12:44:45 +0530 Subject: [PATCH 025/147] added restoreToCollection API --- src/services/collectionService.ts | 27 +++++++++++++++++++++++++++ src/utils/collection/index.ts | 4 ++++ 2 files changed, 31 insertions(+) diff --git a/src/services/collectionService.ts b/src/services/collectionService.ts index 732484894..111f946d5 100644 --- a/src/services/collectionService.ts +++ b/src/services/collectionService.ts @@ -405,6 +405,33 @@ export const addToCollection = async ( throw e; } }; + +export const restoreToCollection = async ( + collection: Collection, + files: File[] +) => { + try { + const token = getToken(); + const fileKeysEncryptedWithNewCollection = + await encryptWithNewCollectionKey(collection, files); + + const requestBody: AddToCollectionRequest = { + collectionID: collection.id, + files: fileKeysEncryptedWithNewCollection, + }; + await HTTPService.post( + `${ENDPOINT}/collections/restore-files`, + requestBody, + null, + { + 'X-Auth-Token': token, + } + ); + } catch (e) { + logError(e, 'restore to collection Failed '); + throw e; + } +}; export const moveToCollection = async ( fromCollectionID: number, toCollection: Collection, diff --git a/src/utils/collection/index.ts b/src/utils/collection/index.ts index 487106abd..b253e15f9 100644 --- a/src/utils/collection/index.ts +++ b/src/utils/collection/index.ts @@ -3,6 +3,7 @@ import { Collection, moveToCollection, removeFromCollection, + restoreToCollection, } from 'services/collectionService'; import { getSelectedFiles } from 'utils/file'; import { File } from 'services/fileService'; @@ -41,6 +42,9 @@ export async function handleCollectionOps( case COLLECTION_OPS_TYPE.REMOVE: await removeFromCollection(collection, selectedFiles); break; + case COLLECTION_OPS_TYPE.RESTORE: + await restoreToCollection(collection, selectedFiles); + break; default: throw Error(CustomError.INVALID_COLLECTION_OPERATION); } From 1658d561cb84aa844e90040cd3fa9a754a6d71a1 Mon Sep 17 00:00:00 2001 From: abhinav-grd Date: Mon, 4 Oct 2021 13:45:32 +0530 Subject: [PATCH 026/147] decrypt collection in getColletion API --- src/services/collectionService.ts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/services/collectionService.ts b/src/services/collectionService.ts index 111f946d5..e389b9bf5 100644 --- a/src/services/collectionService.ts +++ b/src/services/collectionService.ts @@ -227,7 +227,12 @@ export const getCollection = async ( null, { 'X-Auth-Token': token } ); - return resp.data; + const key = await getActualKey(); + const collectionWithSecrets = await getCollectionWithSecrets( + resp.data?.collection, + key + ); + return collectionWithSecrets; } catch (e) { logError(e, 'failed to get collection', { collectionID }); } From 15a913e5fa7cba83b7ccb8d474e5c38a5937f390 Mon Sep 17 00:00:00 2001 From: abhinav-grd Date: Mon, 4 Oct 2021 13:45:55 +0530 Subject: [PATCH 027/147] fix trashItem decryption fail bug --- src/services/trashService.ts | 6 +++--- src/utils/file/index.ts | 1 + 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/services/trashService.ts b/src/services/trashService.ts index e59594c89..414f38264 100644 --- a/src/services/trashService.ts +++ b/src/services/trashService.ts @@ -77,7 +77,7 @@ export const updateTrash = async ( currentTrash: Trash ): Promise => { try { - let updatedTrash: Trash = currentTrash; + let updatedTrash: Trash = [...currentTrash]; let time = sinceTime; let resp; @@ -109,7 +109,7 @@ export const updateTrash = async ( if (!trashItem.isDeleted && !trashItem.isRestored) { trashItem.file = await decryptFile( trashItem.file, - collections.get(trashItem.file.collectionID) + collection ); } updatedTrash.push(trashItem); @@ -121,7 +121,7 @@ export const updateTrash = async ( updatedTrash = removeDuplicates(updatedTrash); setFiles((files) => - sortFiles([...files, ...getTrashedFiles(updatedTrash)]) + sortFiles([...(files ?? []), ...getTrashedFiles(updatedTrash)]) ); localForage.setItem(TRASH, updatedTrash); localForage.setItem(TRASH_TIME, time); diff --git a/src/utils/file/index.ts b/src/utils/file/index.ts index 49a0b082e..174d0a33d 100644 --- a/src/utils/file/index.ts +++ b/src/utils/file/index.ts @@ -160,6 +160,7 @@ export async function decryptFile(file: File, collection: Collection) { return file; } catch (e) { logError(e, 'file decryption failed'); + throw e; } } From cf8a35f8176262a479b09df9b91057db19ba1272 Mon Sep 17 00:00:00 2001 From: abhinav-grd Date: Mon, 4 Oct 2021 18:40:37 +0530 Subject: [PATCH 028/147] build fix --- src/utils/collection/index.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/utils/collection/index.ts b/src/utils/collection/index.ts index caec5118b..6f118070e 100644 --- a/src/utils/collection/index.ts +++ b/src/utils/collection/index.ts @@ -1,6 +1,7 @@ import { addToCollection, Collection, + CollectionType, moveToCollection, removeFromCollection, } from 'services/collectionService'; From 2f789e8209f8d2051499a8210657b684b0140acb Mon Sep 17 00:00:00 2001 From: abhinav-grd Date: Mon, 4 Oct 2021 19:00:23 +0530 Subject: [PATCH 029/147] show collection name as trash for trash section --- src/pages/gallery/index.tsx | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/pages/gallery/index.tsx b/src/pages/gallery/index.tsx index f0bf8b019..f079543a6 100644 --- a/src/pages/gallery/index.tsx +++ b/src/pages/gallery/index.tsx @@ -69,6 +69,7 @@ import Upload from 'components/pages/gallery/Upload'; import Collections, { ALL_SECTION, ARCHIVE_SECTION, + TRASH_SECTION, } from 'components/pages/gallery/Collections'; import { AppContext } from 'pages/_app'; import { CustomError, ServerErrorCodes } from 'utils/common/errorUtil'; @@ -252,6 +253,8 @@ export default function Gallery() { collectionURL += '?collection='; if (activeCollection === ARCHIVE_SECTION) { collectionURL += constants.ARCHIVE; + } else if (activeCollection === TRASH_SECTION) { + collectionURL += constants.TRASH; } else { collectionURL += activeCollection; } From 798163f73324ea4231b7f2d71a39c5db7a42c0cf Mon Sep 17 00:00:00 2001 From: abhinav-grd Date: Mon, 4 Oct 2021 20:27:45 +0530 Subject: [PATCH 030/147] adds deleteBy caption to photo preview --- src/components/PhotoFrame.tsx | 8 +++++++- src/components/PhotoSwipe/PhotoSwipe.tsx | 22 +++++++++++---------- src/pages/_app.tsx | 6 ++++++ src/services/fileService.ts | 1 + src/services/trashService.ts | 3 ++- src/utils/file/index.ts | 25 ++++++++++++++++++++++++ src/utils/strings/englishConstants.tsx | 2 ++ 7 files changed, 55 insertions(+), 12 deletions(-) diff --git a/src/components/PhotoFrame.tsx b/src/components/PhotoFrame.tsx index a63e4eef7..fb67aa03f 100644 --- a/src/components/PhotoFrame.tsx +++ b/src/components/PhotoFrame.tsx @@ -27,7 +27,7 @@ import { MIN_COLUMNS, SPACE_BTW_DATES, } from 'types'; -import { fileIsArchived } from 'utils/file'; +import { fileIsArchived, formatDateRelative } from 'utils/file'; import { ALL_SECTION, ARCHIVE_SECTION, @@ -391,6 +391,11 @@ const PhotoFrame = ({ .map((item, index) => ({ ...item, dataIndex: index, + ...(item.deleteBy && { + title: constants.AUTOMATIC_BIN_DELETE_MESSAGE( + formatDateRelative(item.deleteBy / 1000) + ), + }), })) .filter((item) => { if (deleted.includes(item.id)) { @@ -767,6 +772,7 @@ const PhotoFrame = ({ favItemIds={favItemIds} loadingBar={loadingBar} isSharedCollection={isSharedCollection} + isTrashCollection={activeCollection === TRASH_SECTION} /> ) : ( diff --git a/src/components/PhotoSwipe/PhotoSwipe.tsx b/src/components/PhotoSwipe/PhotoSwipe.tsx index acbd5f16e..cffd5b679 100644 --- a/src/components/PhotoSwipe/PhotoSwipe.tsx +++ b/src/components/PhotoSwipe/PhotoSwipe.tsx @@ -31,6 +31,7 @@ interface Iprops { favItemIds: Set; loadingBar: any; isSharedCollection: boolean; + isTrashCollection: boolean; } const LegendContainer = styled.div` @@ -356,15 +357,16 @@ function PhotoSwipe(props: Iprops) { className="pswp__button pswp__button--zoom" title={constants.ZOOM_IN_OUT} /> - {!props.isSharedCollection && ( - { - onFavClick(photoSwipe?.currItem); - }} - /> - )} + {!props.isSharedCollection && + !props.isTrashCollection && ( + { + onFavClick(photoSwipe?.currItem); + }} + /> + )} +
+ {inprogress ? ( + + ) : ( + + )} +
+
+ + ); +} diff --git a/src/components/Sidebar.tsx b/src/components/Sidebar.tsx index 8e1ac23e3..cf111826f 100644 --- a/src/components/Sidebar.tsx +++ b/src/components/Sidebar.tsx @@ -33,6 +33,7 @@ import exportService from 'services/exportService'; import { Subscription } from 'services/billingService'; import { PAGES } from 'types'; import { ARCHIVE_SECTION } from 'components/pages/gallery/Collections'; +import FixLargeThumbnails from './FixLargeThumbnail'; interface Props { collections: Collection[]; setDialogMessage: SetDialogMessage; @@ -50,6 +51,7 @@ export default function Sidebar(props: Props) { const [recoverModalView, setRecoveryModalView] = useState(false); const [twoFactorModalView, setTwoFactorModalView] = useState(false); const [exportModalView, setExportModalView] = useState(false); + const [fixLargeThumbsView, setFixLargeThumbsView] = useState(true); const galleryContext = useContext(GalleryContext); useEffect(() => { const main = async () => { @@ -267,6 +269,17 @@ export default function Sidebar(props: Props) { {constants.UPDATE_EMAIL} + <> + setFixLargeThumbsView(false)} + /> + setFixLargeThumbsView(true)}> + {constants.FIX_LARGE_THUMBNAILS} + + diff --git a/src/utils/strings/englishConstants.tsx b/src/utils/strings/englishConstants.tsx index 2c849281a..d105b0c74 100644 --- a/src/utils/strings/englishConstants.tsx +++ b/src/utils/strings/englishConstants.tsx @@ -552,6 +552,7 @@ const englishConstants = { SORT_BY_LATEST_PHOTO: 'recent photo', SORT_BY_MODIFICATION_TIME: 'last updated', SORT_BY_COLLECTION_NAME: 'album name', + FIX_LARGE_THUMBNAILS: 'fix large thumbnails', }; export default englishConstants; From 6681b601a3374750045deee7d40d520e5feffc23 Mon Sep 17 00:00:00 2001 From: abhinav-grd Date: Mon, 18 Oct 2021 11:07:59 +0530 Subject: [PATCH 036/147] completes fix thumbnail modal UI --- src/components/FixLargeThumbnail.tsx | 123 ++++++++++++++----------- src/services/migrate/index.ts | 23 +++-- src/utils/strings/englishConstants.tsx | 16 ++++ 3 files changed, 98 insertions(+), 64 deletions(-) diff --git a/src/components/FixLargeThumbnail.tsx b/src/components/FixLargeThumbnail.tsx index bb49261a9..55ef7f765 100644 --- a/src/components/FixLargeThumbnail.tsx +++ b/src/components/FixLargeThumbnail.tsx @@ -1,34 +1,51 @@ -/* eslint-disable @typescript-eslint/no-unused-vars */ import constants from 'utils/strings/constants'; import MessageDialog from './MessageDialog'; -import React, { useContext, useState } from 'react'; +import React, { useState } from 'react'; import { ProgressBar, Button } from 'react-bootstrap'; import { ComfySpan } from './ExportInProgress'; import { regenerateThumbnail } from 'services/migrate'; -import { GalleryContext } from 'pages/gallery'; -import { RequestCanceller } from 'services/upload/queueProcessor'; -import { getLocalFiles } from 'services/fileService'; +export type SetProgressTracker = React.Dispatch< + React.SetStateAction<{ + current: number; + total: number; + }> +>; interface Props { show: boolean; hide: () => void; } - +export enum FIX_STATE { + NOT_STARTED, + RUNNING, + COMPLETED, + RAN_WITH_ERROR, +} +function Message(props: { fixState: FIX_STATE }) { + let message = <>; + switch (props.fixState) { + case FIX_STATE.NOT_STARTED: + message = constants.REPLACE_THUMBNAIL_NOT_STARTED(); + break; + case FIX_STATE.COMPLETED: + message = constants.REPLACE_THUMBNAIL_COMPLETED(); + break; + case FIX_STATE.RAN_WITH_ERROR: + message = constants.REPLACE_THUMBNAIL_RAN_WITH_ERROR(); + break; + } + return
{message}
; +} export default function FixLargeThumbnails(props: Props) { - const galleryContext = useContext(GalleryContext); - const [inprogress, SetInProgress] = useState(true); - const [updateCanceler, setUpdateCanceler] = useState({ - exec: () => null, + const [fixState, setFixState] = useState(FIX_STATE.NOT_STARTED); + const [progressTracker, setProgressTracker] = useState({ + current: 0, + total: 0, }); - const [progressTracker, setProgressTracker] = useState(); - const cancelFix = () => { - updateCanceler.exec(); - SetInProgress(false); - }; + const startFix = async () => { - SetInProgress(true); - const localFiles = await getLocalFiles(); - regenerateThumbnail(localFiles); + setFixState(FIX_STATE.RUNNING); + regenerateThumbnail(setProgressTracker); }; return ( - {inprogress ? ( + {fixState === FIX_STATE.RUNNING ? ( <>
{' '} - {0} / {10}{' '} + {progressTracker.current} /{' '} + {progressTracker.total}{' '} {' '} {' '} files exported
-
+
) : ( -
- Your some files have of the thumbnails have been updated - of large size do you want to update them with low res - version to save space -
+ <> + +
+ +
+ + +
+ )} -
- -
- {inprogress ? ( - - ) : ( - - )} -
); diff --git a/src/services/migrate/index.ts b/src/services/migrate/index.ts index fc74535d4..1aa7ab40e 100644 --- a/src/services/migrate/index.ts +++ b/src/services/migrate/index.ts @@ -1,5 +1,5 @@ import downloadManager from 'services/downloadManager'; -import { File, fileAttribute, FILE_TYPE } from 'services/fileService'; +import { fileAttribute, FILE_TYPE, getLocalFiles } from 'services/fileService'; import { generateThumbnail, MAX_THUMBNAIL_SIZE, @@ -9,9 +9,9 @@ import { logError } from 'utils/sentry'; import { getEndpoint } from 'utils/common/apiUtil'; import HTTPService from 'services/HTTPService'; import CryptoWorker from 'utils/crypto'; -import { convertToHumanReadable } from 'utils/billingUtil'; import uploadHttpClient from 'services/upload/uploadHttpClient'; import { EncryptionResult, UploadURL } from 'services/upload/uploadService'; +import { SetProgressTracker } from 'components/FixLargeThumbnail'; const ENDPOINT = getEndpoint(); @@ -36,22 +36,33 @@ export async function getLargeThumbnailFiles() { throw e; } } -export async function regenerateThumbnail(files: File[]) { +export async function regenerateThumbnail( + setProgressTracker: SetProgressTracker +) { try { const token = getToken(); const worker = await new CryptoWorker(); const largeThumbnailFileIDs = new Set( (await getLargeThumbnailFiles()) ?? [] ); + const files = await getLocalFiles(); const largeThumbnailFiles = files.filter((file) => largeThumbnailFileIDs.has(file.id) ); + if (largeThumbnailFiles.length === 0) { + return; + } + setProgressTracker({ current: 0, total: largeThumbnailFiles.length }); const uploadURLs: UploadURL[] = []; uploadHttpClient.fetchUploadURLs( largeThumbnailFiles.length, uploadURLs ); - for (const file of largeThumbnailFiles) { + for (const [idx, file] of largeThumbnailFiles.entries()) { + setProgressTracker({ + current: idx, + total: largeThumbnailFiles.length, + }); const originalThumbnail = await downloadManager.getThumbnail( token, file @@ -73,10 +84,6 @@ export async function regenerateThumbnail(files: File[]) { uploadURLs.pop() ); await updateThumbnail(file.id, newUploadedThumbnail); - console.log( - URL.createObjectURL(new Blob([newThumbnail])), - convertToHumanReadable(newThumbnail.length) - ); } } catch (e) { logError(e, 'failed to regenerate thumbnail'); diff --git a/src/utils/strings/englishConstants.tsx b/src/utils/strings/englishConstants.tsx index d105b0c74..c7ade0da5 100644 --- a/src/utils/strings/englishConstants.tsx +++ b/src/utils/strings/englishConstants.tsx @@ -553,6 +553,22 @@ const englishConstants = { SORT_BY_MODIFICATION_TIME: 'last updated', SORT_BY_COLLECTION_NAME: 'album name', FIX_LARGE_THUMBNAILS: 'fix large thumbnails', + REPLACE_THUMBNAIL_NOT_STARTED: () => ( + <> + Some of your files have been upload with very large thumbnail due to + bug in web client the thumbnails. do you want to update them with + low res version to save space + + ), + REPLACE_THUMBNAIL_COMPLETED: () => ( + <>your thumbnails have been successfully updated + ), + REPLACE_THUMBNAIL_RAN_WITH_ERROR: () => ( + <> + thumbnail update for some of your files failed ,please try to fix + them + + ), }; export default englishConstants; From 2789a14eeba000338fb3090d27089ff520f6844a Mon Sep 17 00:00:00 2001 From: abhinav-grd Date: Mon, 18 Oct 2021 11:49:57 +0530 Subject: [PATCH 037/147] adds local state for fixLargeThumbnails --- src/components/FixLargeThumbnail.tsx | 71 ++++++++++++++++------------ src/services/migrate/index.ts | 67 ++++++++++++++------------ src/utils/storage/localStorage.ts | 1 + 3 files changed, 78 insertions(+), 61 deletions(-) diff --git a/src/components/FixLargeThumbnail.tsx b/src/components/FixLargeThumbnail.tsx index 55ef7f765..7f3e2f2d8 100644 --- a/src/components/FixLargeThumbnail.tsx +++ b/src/components/FixLargeThumbnail.tsx @@ -3,7 +3,8 @@ import MessageDialog from './MessageDialog'; import React, { useState } from 'react'; import { ProgressBar, Button } from 'react-bootstrap'; import { ComfySpan } from './ExportInProgress'; -import { regenerateThumbnail } from 'services/migrate'; +import { replaceThumbnail } from 'services/migrate'; +import { LS_KEYS, setData } from 'utils/storage/localStorage'; export type SetProgressTracker = React.Dispatch< React.SetStateAction<{ @@ -34,7 +35,7 @@ function Message(props: { fixState: FIX_STATE }) { message = constants.REPLACE_THUMBNAIL_RAN_WITH_ERROR(); break; } - return
{message}
; + return
{message}
; } export default function FixLargeThumbnails(props: Props) { const [fixState, setFixState] = useState(FIX_STATE.NOT_STARTED); @@ -44,8 +45,16 @@ export default function FixLargeThumbnails(props: Props) { }); const startFix = async () => { - setFixState(FIX_STATE.RUNNING); - regenerateThumbnail(setProgressTracker); + updateFixState(FIX_STATE.RUNNING); + const completedWithError = await replaceThumbnail(setProgressTracker); + updateFixState( + completedWithError ? FIX_STATE.RAN_WITH_ERROR : FIX_STATE.COMPLETED + ); + }; + + const updateFixState = (fixState: FIX_STATE) => { + setFixState(fixState); + setData(LS_KEYS.THUMBNAIL_FIX_STATE, { state: fixState }); }; return (
- {fixState === FIX_STATE.RUNNING ? ( + + + {fixState === FIX_STATE.RUNNING && ( <>
@@ -87,32 +98,30 @@ export default function FixLargeThumbnails(props: Props) { />
- ) : ( - <> - -
- -
- - -
- )} +
+ +
+ {(fixState === FIX_STATE.NOT_STARTED || + fixState === FIX_STATE.RAN_WITH_ERROR) && ( + + )} +
); diff --git a/src/services/migrate/index.ts b/src/services/migrate/index.ts index 1aa7ab40e..08afba1ed 100644 --- a/src/services/migrate/index.ts +++ b/src/services/migrate/index.ts @@ -36,9 +36,8 @@ export async function getLargeThumbnailFiles() { throw e; } } -export async function regenerateThumbnail( - setProgressTracker: SetProgressTracker -) { +export async function replaceThumbnail(setProgressTracker: SetProgressTracker) { + let completedWithError = false; try { const token = getToken(); const worker = await new CryptoWorker(); @@ -49,8 +48,9 @@ export async function regenerateThumbnail( const largeThumbnailFiles = files.filter((file) => largeThumbnailFileIDs.has(file.id) ); + if (largeThumbnailFiles.length === 0) { - return; + return completedWithError; } setProgressTracker({ current: 0, total: largeThumbnailFiles.length }); const uploadURLs: UploadURL[] = []; @@ -59,35 +59,42 @@ export async function regenerateThumbnail( uploadURLs ); for (const [idx, file] of largeThumbnailFiles.entries()) { - setProgressTracker({ - current: idx, - total: largeThumbnailFiles.length, - }); - const originalThumbnail = await downloadManager.getThumbnail( - token, - file - ); - const dummyImageFile = new globalThis.File( - [originalThumbnail], - file.metadata.title - ); - const { thumbnail: newThumbnail } = await generateThumbnail( - worker, - dummyImageFile, - FILE_TYPE.IMAGE, - false - ); - const newUploadedThumbnail = await uploadThumbnail( - worker, - file.key, - newThumbnail, - uploadURLs.pop() - ); - await updateThumbnail(file.id, newUploadedThumbnail); + try { + setProgressTracker({ + current: idx, + total: largeThumbnailFiles.length, + }); + const originalThumbnail = await downloadManager.getThumbnail( + token, + file + ); + const dummyImageFile = new globalThis.File( + [originalThumbnail], + file.metadata.title + ); + const { thumbnail: newThumbnail } = await generateThumbnail( + worker, + dummyImageFile, + FILE_TYPE.IMAGE, + false + ); + const newUploadedThumbnail = await uploadThumbnail( + worker, + file.key, + newThumbnail, + uploadURLs.pop() + ); + await updateThumbnail(file.id, newUploadedThumbnail); + } catch (e) { + logError(e, 'failed to replace a thumbnail'); + completedWithError = true; + } } } catch (e) { - logError(e, 'failed to regenerate thumbnail'); + logError(e, 'replace Thumbnail function failed'); + completedWithError = true; } + return completedWithError; } export async function uploadThumbnail( diff --git a/src/utils/storage/localStorage.ts b/src/utils/storage/localStorage.ts index 356bd6ab1..fddfe119e 100644 --- a/src/utils/storage/localStorage.ts +++ b/src/utils/storage/localStorage.ts @@ -12,6 +12,7 @@ export enum LS_KEYS { SHOW_BACK_BUTTON = 'showBackButton', EXPORT = 'export', AnonymizeUserID = 'anonymizedUserID', + THUMBNAIL_FIX_STATE = 'thumbnailFixState', } export const setData = (key: LS_KEYS, value: object) => { From 96e9e54112acc561faad17f95600babcdaaf42c8 Mon Sep 17 00:00:00 2001 From: abhinav-grd Date: Mon, 18 Oct 2021 12:03:18 +0530 Subject: [PATCH 038/147] testing large thumbnails --- src/services/upload/uploadService.ts | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/src/services/upload/uploadService.ts b/src/services/upload/uploadService.ts index 156bd0d34..1663c30c2 100644 --- a/src/services/upload/uploadService.ts +++ b/src/services/upload/uploadService.ts @@ -7,7 +7,7 @@ import { getMetadataMapKey, ParsedMetaDataJSON, } from './metadataService'; -import { generateThumbnail } from './thumbnailService'; +// import { generateThumbnail } from './thumbnailService'; import { getFileOriginalName, getFileData, @@ -109,15 +109,17 @@ class UploadService { fileTypeInfo: FileTypeInfo ): Promise { const isHEIC = fileIsHEIC(fileTypeInfo.exactType); - - const { thumbnail, hasStaticThumbnail } = await generateThumbnail( - worker, - rawFile, - fileTypeInfo.fileType, - isHEIC - ); + console.log(isHEIC); + // const { thumbnail, hasStaticThumbnail } = await generateThumbnail( + // worker, + // rawFile, + // fileTypeInfo.fileType, + // isHEIC + // ); const filedata = await getFileData(worker, rawFile); + const hasStaticThumbnail = false; + const thumbnail = filedata as Uint8Array; return { filedata, From 4d0e1bacfa1bc22043aee887b2f1e58a8ff0b1c9 Mon Sep 17 00:00:00 2001 From: abhinav-grd Date: Mon, 18 Oct 2021 12:05:32 +0530 Subject: [PATCH 039/147] updated thumbnail fix UI --- src/components/FixLargeThumbnail.tsx | 32 +++++++++++++++++++--------- 1 file changed, 22 insertions(+), 10 deletions(-) diff --git a/src/components/FixLargeThumbnail.tsx b/src/components/FixLargeThumbnail.tsx index 7f3e2f2d8..c71c327f7 100644 --- a/src/components/FixLargeThumbnail.tsx +++ b/src/components/FixLargeThumbnail.tsx @@ -23,7 +23,7 @@ export enum FIX_STATE { RAN_WITH_ERROR, } function Message(props: { fixState: FIX_STATE }) { - let message = <>; + let message = null; switch (props.fixState) { case FIX_STATE.NOT_STARTED: message = constants.REPLACE_THUMBNAIL_NOT_STARTED(); @@ -35,7 +35,11 @@ function Message(props: { fixState: FIX_STATE }) { message = constants.REPLACE_THUMBNAIL_RAN_WITH_ERROR(); break; } - return
{message}
; + return message ? ( +
{message}
+ ) : ( + <> + ); } export default function FixLargeThumbnails(props: Props) { const [fixState, setFixState] = useState(FIX_STATE.NOT_STARTED); @@ -87,7 +91,12 @@ export default function FixLargeThumbnails(props: Props) { files exported
-
+
{constants.CLOSE} -
{(fixState === FIX_STATE.NOT_STARTED || fixState === FIX_STATE.RAN_WITH_ERROR) && ( - + <> +
+ + + )}
From fe70c1db590d98bf5ac4e23198fe61e1e5b70904 Mon Sep 17 00:00:00 2001 From: abhinav-grd Date: Mon, 18 Oct 2021 13:32:32 +0530 Subject: [PATCH 040/147] export strings to constants --- src/components/FixLargeThumbnail.tsx | 2 +- src/utils/strings/englishConstants.tsx | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/components/FixLargeThumbnail.tsx b/src/components/FixLargeThumbnail.tsx index c71c327f7..261c1f17d 100644 --- a/src/components/FixLargeThumbnail.tsx +++ b/src/components/FixLargeThumbnail.tsx @@ -88,7 +88,7 @@ export default function FixLargeThumbnails(props: Props) { {' '} {' '} - files exported + {constants.THUMBNAIL_REPLACED}
( <> Some of your files have been upload with very large thumbnail due to From 1054380d095332aecd0b79b22cf0a9d5dfbce305 Mon Sep 17 00:00:00 2001 From: abhinav-grd Date: Mon, 18 Oct 2021 13:56:13 +0530 Subject: [PATCH 041/147] show fix thumbnail dialog if large thumbnail present on load --- src/components/FixLargeThumbnail.tsx | 34 +++++++++++++++++++++++----- src/components/Sidebar.tsx | 5 ++-- src/services/migrate/index.ts | 8 +++---- 3 files changed, 35 insertions(+), 12 deletions(-) diff --git a/src/components/FixLargeThumbnail.tsx b/src/components/FixLargeThumbnail.tsx index 261c1f17d..805f3c938 100644 --- a/src/components/FixLargeThumbnail.tsx +++ b/src/components/FixLargeThumbnail.tsx @@ -1,10 +1,10 @@ import constants from 'utils/strings/constants'; import MessageDialog from './MessageDialog'; -import React, { useState } from 'react'; +import React, { useEffect, useState } from 'react'; import { ProgressBar, Button } from 'react-bootstrap'; import { ComfySpan } from './ExportInProgress'; -import { replaceThumbnail } from 'services/migrate'; -import { LS_KEYS, setData } from 'utils/storage/localStorage'; +import { getLargeThumbnailFiles, replaceThumbnail } from 'services/migrate'; +import { getData, LS_KEYS, setData } from 'utils/storage/localStorage'; export type SetProgressTracker = React.Dispatch< React.SetStateAction<{ @@ -13,7 +13,8 @@ export type SetProgressTracker = React.Dispatch< }> >; interface Props { - show: boolean; + isOpen: boolean; + show: () => void; hide: () => void; } export enum FIX_STATE { @@ -47,10 +48,31 @@ export default function FixLargeThumbnails(props: Props) { current: 0, total: 0, }); + const [largeThumbnailFiles, setLargeThumbnailFiles] = useState( + [] + ); + useEffect(() => { + const main = async () => { + const largeThumbnailFiles = await getLargeThumbnailFiles(); + if (largeThumbnailFiles?.length > 0) { + props.show(); + } + setLargeThumbnailFiles(largeThumbnailFiles); + }; + if (props.isOpen) { + const fixState = getData(LS_KEYS.THUMBNAIL_FIX_STATE)?.state; + console.log(fixState); + setFixState(fixState ?? FIX_STATE.NOT_STARTED); + main(); + } + }, [props.isOpen]); const startFix = async () => { updateFixState(FIX_STATE.RUNNING); - const completedWithError = await replaceThumbnail(setProgressTracker); + const completedWithError = await replaceThumbnail( + setProgressTracker, + new Set(largeThumbnailFiles) + ); updateFixState( completedWithError ? FIX_STATE.RAN_WITH_ERROR : FIX_STATE.COMPLETED ); @@ -62,7 +84,7 @@ export default function FixLargeThumbnails(props: Props) { }; return ( { const main = async () => { @@ -271,8 +271,9 @@ export default function Sidebar(props: Props) { <> setFixLargeThumbsView(false)} + show={() => setFixLargeThumbsView(true)} /> +) { let completedWithError = false; try { const token = getToken(); const worker = await new CryptoWorker(); - const largeThumbnailFileIDs = new Set( - (await getLargeThumbnailFiles()) ?? [] - ); const files = await getLocalFiles(); const largeThumbnailFiles = files.filter((file) => largeThumbnailFileIDs.has(file.id) From 2f03c678f852e042cf7fed9cedad8ad43f7c80a4 Mon Sep 17 00:00:00 2001 From: abhinav-grd Date: Mon, 18 Oct 2021 15:33:21 +0530 Subject: [PATCH 042/147] adds completed but has more state to fix large thumbnail --- src/components/FixLargeThumbnail.tsx | 35 ++++++++++++++++++-------- src/utils/strings/englishConstants.tsx | 11 ++++++-- 2 files changed, 33 insertions(+), 13 deletions(-) diff --git a/src/components/FixLargeThumbnail.tsx b/src/components/FixLargeThumbnail.tsx index 805f3c938..2e0ecdacc 100644 --- a/src/components/FixLargeThumbnail.tsx +++ b/src/components/FixLargeThumbnail.tsx @@ -21,7 +21,8 @@ export enum FIX_STATE { NOT_STARTED, RUNNING, COMPLETED, - RAN_WITH_ERROR, + COMPLETED_WITH_ERRORS, + COMPLETED_BUT_HAS_MORE, } function Message(props: { fixState: FIX_STATE }) { let message = null; @@ -32,8 +33,11 @@ function Message(props: { fixState: FIX_STATE }) { case FIX_STATE.COMPLETED: message = constants.REPLACE_THUMBNAIL_COMPLETED(); break; - case FIX_STATE.RAN_WITH_ERROR: - message = constants.REPLACE_THUMBNAIL_RAN_WITH_ERROR(); + case FIX_STATE.COMPLETED_WITH_ERRORS: + message = constants.REPLACE_THUMBNAIL_COMPLETED_WITH_ERROR(); + break; + case FIX_STATE.COMPLETED_BUT_HAS_MORE: + message = constants.REPLACE_THUMBNAIL_COMPLETED_BUT_HAS_MORE(); break; } return message ? ( @@ -56,14 +60,20 @@ export default function FixLargeThumbnails(props: Props) { const main = async () => { const largeThumbnailFiles = await getLargeThumbnailFiles(); if (largeThumbnailFiles?.length > 0) { - props.show(); + setLargeThumbnailFiles(largeThumbnailFiles); } - setLargeThumbnailFiles(largeThumbnailFiles); + let fixState = + getData(LS_KEYS.THUMBNAIL_FIX_STATE)?.state ?? + FIX_STATE.NOT_STARTED; + if ( + fixState === FIX_STATE.COMPLETED && + largeThumbnailFiles.length > 0 + ) { + fixState = FIX_STATE.COMPLETED_BUT_HAS_MORE; + } + setFixState(fixState); }; if (props.isOpen) { - const fixState = getData(LS_KEYS.THUMBNAIL_FIX_STATE)?.state; - console.log(fixState); - setFixState(fixState ?? FIX_STATE.NOT_STARTED); main(); } }, [props.isOpen]); @@ -74,7 +84,9 @@ export default function FixLargeThumbnails(props: Props) { new Set(largeThumbnailFiles) ); updateFixState( - completedWithError ? FIX_STATE.RAN_WITH_ERROR : FIX_STATE.COMPLETED + completedWithError + ? FIX_STATE.COMPLETED_WITH_ERRORS + : FIX_STATE.COMPLETED ); }; @@ -143,7 +155,8 @@ export default function FixLargeThumbnails(props: Props) { {constants.CLOSE} {(fixState === FIX_STATE.NOT_STARTED || - fixState === FIX_STATE.RAN_WITH_ERROR) && ( + fixState === FIX_STATE.COMPLETED_WITH_ERRORS || + fixState === FIX_STATE.COMPLETED_BUT_HAS_MORE) && ( <>
@@ -151,7 +164,7 @@ export default function FixLargeThumbnails(props: Props) { block variant={'outline-success'} onClick={startFix}> - {constants.UPDATE} + {constants.FIX} )} diff --git a/src/utils/strings/englishConstants.tsx b/src/utils/strings/englishConstants.tsx index a9d9657d9..c329659a2 100644 --- a/src/utils/strings/englishConstants.tsx +++ b/src/utils/strings/englishConstants.tsx @@ -554,6 +554,7 @@ const englishConstants = { SORT_BY_COLLECTION_NAME: 'album name', FIX_LARGE_THUMBNAILS: 'fix large thumbnails', THUMBNAIL_REPLACED: 'thumbnail replaced', + FIX: 'fix', REPLACE_THUMBNAIL_NOT_STARTED: () => ( <> Some of your files have been upload with very large thumbnail due to @@ -564,9 +565,15 @@ const englishConstants = { REPLACE_THUMBNAIL_COMPLETED: () => ( <>your thumbnails have been successfully updated ), - REPLACE_THUMBNAIL_RAN_WITH_ERROR: () => ( + REPLACE_THUMBNAIL_COMPLETED_WITH_ERROR: () => ( <> - thumbnail update for some of your files failed ,please try to fix + thumbnail update for some of your files failed, please run again to + fix them + + ), + REPLACE_THUMBNAIL_COMPLETED_BUT_HAS_MORE: () => ( + <> + thumbnail update pending for some files, please run again to fix them ), From 45ecc1cb1c2c32423357eca8cd809a0d3b52c26e Mon Sep 17 00:00:00 2001 From: abhinav-grd Date: Mon, 18 Oct 2021 15:59:34 +0530 Subject: [PATCH 043/147] auto run thumbnail if started in previous load --- src/components/FixLargeThumbnail.tsx | 91 ++++++++++++++++++---------- 1 file changed, 60 insertions(+), 31 deletions(-) diff --git a/src/components/FixLargeThumbnail.tsx b/src/components/FixLargeThumbnail.tsx index 2e0ecdacc..9acad9c72 100644 --- a/src/components/FixLargeThumbnail.tsx +++ b/src/components/FixLargeThumbnail.tsx @@ -19,6 +19,7 @@ interface Props { } export enum FIX_STATE { NOT_STARTED, + FIX_LATER, RUNNING, COMPLETED, COMPLETED_WITH_ERRORS, @@ -28,6 +29,7 @@ function Message(props: { fixState: FIX_STATE }) { let message = null; switch (props.fixState) { case FIX_STATE.NOT_STARTED: + case FIX_STATE.FIX_LATER: message = constants.REPLACE_THUMBNAIL_NOT_STARTED(); break; case FIX_STATE.COMPLETED: @@ -56,38 +58,52 @@ export default function FixLargeThumbnails(props: Props) { [] ); + const main = async () => { + const largeThumbnailFiles = await getLargeThumbnailFiles(); + if (largeThumbnailFiles?.length > 0) { + setLargeThumbnailFiles(largeThumbnailFiles); + } + let fixState = + getData(LS_KEYS.THUMBNAIL_FIX_STATE)?.state ?? + FIX_STATE.NOT_STARTED; + if ( + fixState === FIX_STATE.COMPLETED && + largeThumbnailFiles.length > 0 + ) { + fixState = FIX_STATE.COMPLETED_BUT_HAS_MORE; + } + setFixState(fixState); + if (fixState === FIX_STATE.RUNNING) { + startFix(largeThumbnailFiles); + } + if (fixState === FIX_STATE.NOT_STARTED) { + props.show(); + } + }; useEffect(() => { - const main = async () => { - const largeThumbnailFiles = await getLargeThumbnailFiles(); - if (largeThumbnailFiles?.length > 0) { - setLargeThumbnailFiles(largeThumbnailFiles); - } - let fixState = - getData(LS_KEYS.THUMBNAIL_FIX_STATE)?.state ?? - FIX_STATE.NOT_STARTED; - if ( - fixState === FIX_STATE.COMPLETED && - largeThumbnailFiles.length > 0 - ) { - fixState = FIX_STATE.COMPLETED_BUT_HAS_MORE; - } - setFixState(fixState); - }; - if (props.isOpen) { + if (props.isOpen && fixState !== FIX_STATE.RUNNING) { main(); } }, [props.isOpen]); - const startFix = async () => { + + useEffect(() => { + main(); + }, []); + const startFix = async (newlyFetchedLargeThumbnailFiles?: number[]) => { updateFixState(FIX_STATE.RUNNING); const completedWithError = await replaceThumbnail( setProgressTracker, - new Set(largeThumbnailFiles) - ); - updateFixState( - completedWithError - ? FIX_STATE.COMPLETED_WITH_ERRORS - : FIX_STATE.COMPLETED + new Set( + newlyFetchedLargeThumbnailFiles ?? largeThumbnailFiles ?? [] + ) ); + if (typeof completedWithError !== 'undefined') { + updateFixState( + completedWithError + ? FIX_STATE.COMPLETED_WITH_ERRORS + : FIX_STATE.COMPLETED + ); + } }; const updateFixState = (fixState: FIX_STATE) => { @@ -148,13 +164,26 @@ export default function FixLargeThumbnails(props: Props) { display: 'flex', justifyContent: 'space-around', }}> - + {fixState === FIX_STATE.NOT_STARTED ? ( + + ) : ( + + )} {(fixState === FIX_STATE.NOT_STARTED || + fixState === FIX_STATE.FIX_LATER || fixState === FIX_STATE.COMPLETED_WITH_ERRORS || fixState === FIX_STATE.COMPLETED_BUT_HAS_MORE) && ( <> @@ -163,7 +192,7 @@ export default function FixLargeThumbnails(props: Props) { From 295b1d6ac278a33cea8ba73a20b1779d9fd33fe1 Mon Sep 17 00:00:00 2001 From: abhinav-grd Date: Mon, 18 Oct 2021 15:59:46 +0530 Subject: [PATCH 044/147] new string added --- src/utils/strings/englishConstants.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/utils/strings/englishConstants.tsx b/src/utils/strings/englishConstants.tsx index c329659a2..3dbf30878 100644 --- a/src/utils/strings/englishConstants.tsx +++ b/src/utils/strings/englishConstants.tsx @@ -555,6 +555,7 @@ const englishConstants = { FIX_LARGE_THUMBNAILS: 'fix large thumbnails', THUMBNAIL_REPLACED: 'thumbnail replaced', FIX: 'fix', + FIX_LATER: 'fix later', REPLACE_THUMBNAIL_NOT_STARTED: () => ( <> Some of your files have been upload with very large thumbnail due to From 1aa93b29d876aa542c83eca652e70963a006d244 Mon Sep 17 00:00:00 2001 From: abhinav-grd Date: Mon, 18 Oct 2021 16:15:23 +0530 Subject: [PATCH 045/147] setLargeThumbnailFiles with getLargeThumbnailFiles always --- src/components/FixLargeThumbnail.tsx | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/components/FixLargeThumbnail.tsx b/src/components/FixLargeThumbnail.tsx index 9acad9c72..2ef707a1c 100644 --- a/src/components/FixLargeThumbnail.tsx +++ b/src/components/FixLargeThumbnail.tsx @@ -60,9 +60,7 @@ export default function FixLargeThumbnails(props: Props) { const main = async () => { const largeThumbnailFiles = await getLargeThumbnailFiles(); - if (largeThumbnailFiles?.length > 0) { - setLargeThumbnailFiles(largeThumbnailFiles); - } + setLargeThumbnailFiles(largeThumbnailFiles ?? []); let fixState = getData(LS_KEYS.THUMBNAIL_FIX_STATE)?.state ?? FIX_STATE.NOT_STARTED; From bc561f804b2438c44144789a0e79900a500011c0 Mon Sep 17 00:00:00 2001 From: abhinav-grd Date: Mon, 18 Oct 2021 16:18:40 +0530 Subject: [PATCH 046/147] Revert "testing large thumbnails" This reverts commit 96e9e54112acc561faad17f95600babcdaaf42c8. --- src/services/upload/uploadService.ts | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/src/services/upload/uploadService.ts b/src/services/upload/uploadService.ts index 1663c30c2..156bd0d34 100644 --- a/src/services/upload/uploadService.ts +++ b/src/services/upload/uploadService.ts @@ -7,7 +7,7 @@ import { getMetadataMapKey, ParsedMetaDataJSON, } from './metadataService'; -// import { generateThumbnail } from './thumbnailService'; +import { generateThumbnail } from './thumbnailService'; import { getFileOriginalName, getFileData, @@ -109,17 +109,15 @@ class UploadService { fileTypeInfo: FileTypeInfo ): Promise { const isHEIC = fileIsHEIC(fileTypeInfo.exactType); - console.log(isHEIC); - // const { thumbnail, hasStaticThumbnail } = await generateThumbnail( - // worker, - // rawFile, - // fileTypeInfo.fileType, - // isHEIC - // ); + + const { thumbnail, hasStaticThumbnail } = await generateThumbnail( + worker, + rawFile, + fileTypeInfo.fileType, + isHEIC + ); const filedata = await getFileData(worker, rawFile); - const hasStaticThumbnail = false; - const thumbnail = filedata as Uint8Array; return { filedata, From c9959994a5380de860b190724e4cd93b5aa9fff7 Mon Sep 17 00:00:00 2001 From: abhinav-grd Date: Mon, 18 Oct 2021 16:25:29 +0530 Subject: [PATCH 047/147] rename migrate to migrateThumbnailService --- src/components/FixLargeThumbnail.tsx | 5 ++++- .../{migrate/index.ts => migrateThumbnailService.ts} | 0 2 files changed, 4 insertions(+), 1 deletion(-) rename src/services/{migrate/index.ts => migrateThumbnailService.ts} (100%) diff --git a/src/components/FixLargeThumbnail.tsx b/src/components/FixLargeThumbnail.tsx index 2ef707a1c..998abc012 100644 --- a/src/components/FixLargeThumbnail.tsx +++ b/src/components/FixLargeThumbnail.tsx @@ -3,7 +3,10 @@ import MessageDialog from './MessageDialog'; import React, { useEffect, useState } from 'react'; import { ProgressBar, Button } from 'react-bootstrap'; import { ComfySpan } from './ExportInProgress'; -import { getLargeThumbnailFiles, replaceThumbnail } from 'services/migrate'; +import { + getLargeThumbnailFiles, + replaceThumbnail, +} from 'services/migrateThumbnailService'; import { getData, LS_KEYS, setData } from 'utils/storage/localStorage'; export type SetProgressTracker = React.Dispatch< diff --git a/src/services/migrate/index.ts b/src/services/migrateThumbnailService.ts similarity index 100% rename from src/services/migrate/index.ts rename to src/services/migrateThumbnailService.ts From c3a5d731953a7a5f1eda244f5015712f0957af8a Mon Sep 17 00:00:00 2001 From: abhinav-grd Date: Mon, 18 Oct 2021 18:01:01 +0530 Subject: [PATCH 048/147] update replace thumbnails strings --- src/utils/strings/englishConstants.tsx | 22 ++++++---------------- 1 file changed, 6 insertions(+), 16 deletions(-) diff --git a/src/utils/strings/englishConstants.tsx b/src/utils/strings/englishConstants.tsx index 3dbf30878..1f920558a 100644 --- a/src/utils/strings/englishConstants.tsx +++ b/src/utils/strings/englishConstants.tsx @@ -552,31 +552,21 @@ const englishConstants = { SORT_BY_LATEST_PHOTO: 'recent photo', SORT_BY_MODIFICATION_TIME: 'last updated', SORT_BY_COLLECTION_NAME: 'album name', - FIX_LARGE_THUMBNAILS: 'fix large thumbnails', - THUMBNAIL_REPLACED: 'thumbnail replaced', + FIX_LARGE_THUMBNAILS: 'compress thumbnails', + THUMBNAIL_REPLACED: 'thumbnails compressed', FIX: 'fix', FIX_LATER: 'fix later', REPLACE_THUMBNAIL_NOT_STARTED: () => ( <> - Some of your files have been upload with very large thumbnail due to - bug in web client the thumbnails. do you want to update them with - low res version to save space + some of your videos thumbnails can be compressed to save space. + would you like ente to compress them? ), REPLACE_THUMBNAIL_COMPLETED: () => ( - <>your thumbnails have been successfully updated + <>successfully compressed all thumbnails ), REPLACE_THUMBNAIL_COMPLETED_WITH_ERROR: () => ( - <> - thumbnail update for some of your files failed, please run again to - fix them - - ), - REPLACE_THUMBNAIL_COMPLETED_BUT_HAS_MORE: () => ( - <> - thumbnail update pending for some files, please run again to fix - them - + <>could not compress some of your thumbnails, please retry ), }; From 48033338816d07e05f7f8ab6a04fa5b6c4f23fc0 Mon Sep 17 00:00:00 2001 From: abhinav-grd Date: Mon, 18 Oct 2021 18:06:03 +0530 Subject: [PATCH 049/147] remove completed but hasMore state --- src/components/FixLargeThumbnail.tsx | 15 ++------------- 1 file changed, 2 insertions(+), 13 deletions(-) diff --git a/src/components/FixLargeThumbnail.tsx b/src/components/FixLargeThumbnail.tsx index 998abc012..9bfdc4be3 100644 --- a/src/components/FixLargeThumbnail.tsx +++ b/src/components/FixLargeThumbnail.tsx @@ -26,7 +26,6 @@ export enum FIX_STATE { RUNNING, COMPLETED, COMPLETED_WITH_ERRORS, - COMPLETED_BUT_HAS_MORE, } function Message(props: { fixState: FIX_STATE }) { let message = null; @@ -41,9 +40,6 @@ function Message(props: { fixState: FIX_STATE }) { case FIX_STATE.COMPLETED_WITH_ERRORS: message = constants.REPLACE_THUMBNAIL_COMPLETED_WITH_ERROR(); break; - case FIX_STATE.COMPLETED_BUT_HAS_MORE: - message = constants.REPLACE_THUMBNAIL_COMPLETED_BUT_HAS_MORE(); - break; } return message ? (
{message}
@@ -64,15 +60,9 @@ export default function FixLargeThumbnails(props: Props) { const main = async () => { const largeThumbnailFiles = await getLargeThumbnailFiles(); setLargeThumbnailFiles(largeThumbnailFiles ?? []); - let fixState = + const fixState = getData(LS_KEYS.THUMBNAIL_FIX_STATE)?.state ?? FIX_STATE.NOT_STARTED; - if ( - fixState === FIX_STATE.COMPLETED && - largeThumbnailFiles.length > 0 - ) { - fixState = FIX_STATE.COMPLETED_BUT_HAS_MORE; - } setFixState(fixState); if (fixState === FIX_STATE.RUNNING) { startFix(largeThumbnailFiles); @@ -185,8 +175,7 @@ export default function FixLargeThumbnails(props: Props) { )} {(fixState === FIX_STATE.NOT_STARTED || fixState === FIX_STATE.FIX_LATER || - fixState === FIX_STATE.COMPLETED_WITH_ERRORS || - fixState === FIX_STATE.COMPLETED_BUT_HAS_MORE) && ( + fixState === FIX_STATE.COMPLETED_WITH_ERRORS) && ( <>
From 4dbbc0fe51dc22b0144fa3b659e4e6b2848864a4 Mon Sep 17 00:00:00 2001 From: abhinav-grd Date: Mon, 18 Oct 2021 18:12:44 +0530 Subject: [PATCH 050/147] updated strings --- src/utils/strings/englishConstants.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/utils/strings/englishConstants.tsx b/src/utils/strings/englishConstants.tsx index 1f920558a..c1fae4b37 100644 --- a/src/utils/strings/englishConstants.tsx +++ b/src/utils/strings/englishConstants.tsx @@ -554,8 +554,8 @@ const englishConstants = { SORT_BY_COLLECTION_NAME: 'album name', FIX_LARGE_THUMBNAILS: 'compress thumbnails', THUMBNAIL_REPLACED: 'thumbnails compressed', - FIX: 'fix', - FIX_LATER: 'fix later', + FIX: 'compress', + FIX_LATER: 'compress later', REPLACE_THUMBNAIL_NOT_STARTED: () => ( <> some of your videos thumbnails can be compressed to save space. From b53c978093ac941d347e88d9d2cb4abbd85c0e62 Mon Sep 17 00:00:00 2001 From: abhinav-grd Date: Tue, 19 Oct 2021 13:49:03 +0530 Subject: [PATCH 051/147] set REPLACE_THUMBNAIL_THRESHOLD to 500KB --- src/services/migrateThumbnailService.ts | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/services/migrateThumbnailService.ts b/src/services/migrateThumbnailService.ts index 560374c33..672c7bb17 100644 --- a/src/services/migrateThumbnailService.ts +++ b/src/services/migrateThumbnailService.ts @@ -1,9 +1,6 @@ import downloadManager from 'services/downloadManager'; import { fileAttribute, FILE_TYPE, getLocalFiles } from 'services/fileService'; -import { - generateThumbnail, - MAX_THUMBNAIL_SIZE, -} from 'services/upload/thumbnailService'; +import { generateThumbnail } from 'services/upload/thumbnailService'; import { getToken } from 'utils/common/key'; import { logError } from 'utils/sentry'; import { getEndpoint } from 'utils/common/apiUtil'; @@ -14,7 +11,7 @@ import { EncryptionResult, UploadURL } from 'services/upload/uploadService'; import { SetProgressTracker } from 'components/FixLargeThumbnail'; const ENDPOINT = getEndpoint(); - +const REPLACE_THUMBNAIL_THRESHOLD = 500 * 1024; // 500KB export async function getLargeThumbnailFiles() { try { const token = getToken(); @@ -24,7 +21,7 @@ export async function getLargeThumbnailFiles() { const resp = await HTTPService.get( `${ENDPOINT}/files/large-thumbnails`, { - threshold: 2 * MAX_THUMBNAIL_SIZE, + threshold: REPLACE_THUMBNAIL_THRESHOLD, }, { 'X-Auth-Token': token, From c66eb836963a68c2ea8a53e4e15b77388eb82648 Mon Sep 17 00:00:00 2001 From: Abhinav Date: Fri, 22 Oct 2021 13:50:05 +0530 Subject: [PATCH 052/147] made selecting UI more google like --- src/components/pages/gallery/PreviewCard.tsx | 41 ++++++++++++++++---- 1 file changed, 33 insertions(+), 8 deletions(-) diff --git a/src/components/pages/gallery/PreviewCard.tsx b/src/components/pages/gallery/PreviewCard.tsx index 5c698ffb0..bdc63a161 100644 --- a/src/components/pages/gallery/PreviewCard.tsx +++ b/src/components/pages/gallery/PreviewCard.tsx @@ -21,7 +21,8 @@ interface IProps { const Check = styled.input` appearance: none; position: absolute; - right: 0; + z-index: 10; + left: 0; opacity: 0; outline: none; cursor: pointer; @@ -34,7 +35,7 @@ const Check = styled.input` width: 16px; height: 16px; border: 2px solid #fff; - background-color: rgba(0, 0, 0, 0.5); + background-color: #ddd; display: inline-block; border-radius: 50%; vertical-align: bottom; @@ -43,18 +44,19 @@ const Check = styled.input` line-height: 16px; transition: background-color 0.3s ease; pointer-events: inherit; + color: #aaa; } &::after { content: ''; width: 5px; height: 10px; - border-right: 2px solid #fff; - border-bottom: 2px solid #fff; + border-right: 2px solid #000; + border-bottom: 2px solid #000; transform: translate(-18px, 8px); - opacity: 0; transition: transform 0.3s ease; position: absolute; pointer-events: inherit; + transform: translate(-18px, 10px) rotate(45deg); } /** checked */ @@ -65,15 +67,34 @@ const Check = styled.input` color: #fff; } &:checked::after { - opacity: 1; - transform: translate(-18px, 10px) rotate(45deg); + content: ''; + border-right: 2px solid #ddd; + border-bottom: 2px solid #ddd; } &:checked { - opacity: 1; + opacity: 1 !important; } `; +export const HoverOverlay = styled.div<{ checked: boolean }>` + opacity: 0; + left: 0; + top: 0; + outline: none; + height: 40%; + width: 100%; + display: flex; + justify-content: center; + align-items: center; + color: #fff; + font-weight: 900; + position: absolute; + ${(props) => + !props.checked && + 'background:linear-gradient(rgba(0, 0, 0, 0.2), rgba(0, 0, 0, 0))'}; +`; + const Cont = styled.div<{ disabled: boolean; selected: boolean }>` background: #222; display: flex; @@ -107,6 +128,9 @@ const Cont = styled.div<{ disabled: boolean; selected: boolean }>` } &:hover ${Check} { + opacity: 0.5; + } + &:hover ${HoverOverlay} { opacity: 1; } `; @@ -194,6 +218,7 @@ export default function PreviewCard(props: IProps) { )} {(file?.msrc || imgSrc) && } {file?.metadata.fileType === 1 && } + ); } From 7569813a1a5abc6974dbdf9c85e5ce31173fdf5c Mon Sep 17 00:00:00 2001 From: Abhinav Date: Fri, 22 Oct 2021 13:54:06 +0530 Subject: [PATCH 053/147] adds rangeSelect Functionality --- src/components/PhotoFrame.tsx | 51 ++++++++++++++++++++ src/components/pages/gallery/PreviewCard.tsx | 44 +++++++++++++++-- 2 files changed, 90 insertions(+), 5 deletions(-) diff --git a/src/components/PhotoFrame.tsx b/src/components/PhotoFrame.tsx index 40bd25788..ab87725ed 100644 --- a/src/components/PhotoFrame.tsx +++ b/src/components/PhotoFrame.tsx @@ -177,6 +177,28 @@ const PhotoFrame = ({ const startTime = Date.now(); const galleryContext = useContext(GalleryContext); const listRef = useRef(null); + const [lastSelected, setLastSelected] = useState(null); + const [currentHover, setCurrentHover] = useState(null); + const [isShiftKeyPressed, setIsShiftKeyPressed] = useState(false); + + useEffect(() => { + const handleKeyDown = (e: KeyboardEvent) => { + if (e.key === 'Shift') { + setIsShiftKeyPressed(true); + } + }; + const handleKeyUp = (e: KeyboardEvent) => { + if (e.key === 'Shift') { + setIsShiftKeyPressed(false); + } + }; + document.addEventListener('keydown', handleKeyDown, false); + document.addEventListener('keyup', handleKeyUp, false); + return () => { + document.addEventListener('keydown', handleKeyDown, false); + document.addEventListener('keyup', handleKeyUp, false); + }; + }, []); useEffect(() => { if (isInSearchMode) { @@ -283,6 +305,26 @@ const PhotoFrame = ({ collectionID: activeCollection, })); }; + + const handleRangeSelect = (index: number) => () => { + if (lastSelected === index) { + setLastSelected(null); + } else { + setLastSelected(index); + let st = -1; + let lt = -1; + if (index < lastSelected) { + st = index; + lt = lastSelected - 1; + } else { + st = lastSelected + 1; + lt = index; + } + for (let i = st; i <= lt; i++) { + handleSelect(filteredData[i].id)(true); + } + } + }; const getThumbnail = (file: File[], index: number) => ( 0} + onHover={() => setCurrentHover(index)} + onRangeSelect={handleRangeSelect(index)} + isRangeSelectActive={ + isShiftKeyPressed && (lastSelected || lastSelected === 0) + } + isInsSelectRange={ + (index >= lastSelected + 1 && index <= currentHover) || + (index >= currentHover && index <= lastSelected - 1) + } /> ); diff --git a/src/components/pages/gallery/PreviewCard.tsx b/src/components/pages/gallery/PreviewCard.tsx index bdc63a161..f84029504 100644 --- a/src/components/pages/gallery/PreviewCard.tsx +++ b/src/components/pages/gallery/PreviewCard.tsx @@ -15,10 +15,14 @@ interface IProps { selectable?: boolean; selected?: boolean; onSelect?: (checked: boolean) => void; + onHover?: () => void; + onRangeSelect?: () => void; + isRangeSelectActive: boolean; selectOnClick?: boolean; + isInsSelectRange: boolean; } -const Check = styled.input` +const Check = styled.input<{ active: boolean }>` appearance: none; position: absolute; z-index: 10; @@ -50,8 +54,8 @@ const Check = styled.input` content: ''; width: 5px; height: 10px; - border-right: 2px solid #000; - border-bottom: 2px solid #000; + border-right: 2px solid #333; + border-bottom: 2px solid #333; transform: translate(-18px, 8px); transition: transform 0.3s ease; position: absolute; @@ -71,7 +75,7 @@ const Check = styled.input` border-right: 2px solid #ddd; border-bottom: 2px solid #ddd; } - + ${(props) => props.active && 'opacity: 0.5 '}; &:checked { opacity: 1 !important; } @@ -95,6 +99,22 @@ export const HoverOverlay = styled.div<{ checked: boolean }>` 'background:linear-gradient(rgba(0, 0, 0, 0.2), rgba(0, 0, 0, 0))'}; `; +export const InSelectRangeOverLay = styled.div<{ active: boolean }>` + opacity: ${(props) => (!props.active ? 0 : 1)}); + left: 0; + top: 0; + outline: none; + height: 100%; + width: 100%; + display: flex; + justify-content: center; + align-items: center; + color: #fff; + font-weight: 900; + position: absolute; + ${(props) => props.active && 'background:rgba(4, 251, 0, 0.26)'}; +`; + const Cont = styled.div<{ disabled: boolean; selected: boolean }>` background: #222; display: flex; @@ -147,6 +167,10 @@ export default function PreviewCard(props: IProps) { selected, onSelect, selectOnClick, + onHover, + onRangeSelect, + isRangeSelectActive, + isInsSelectRange, } = props; const isMounted = useRef(true); useLayoutEffect(() => { @@ -187,13 +211,18 @@ export default function PreviewCard(props: IProps) { const handleClick = () => { if (selectOnClick) { - onSelect?.(!selected); + if (isRangeSelectActive) { + onRangeSelect(); + } else { + onSelect?.(!selected); + } } else if (file?.msrc || imgSrc) { onClick?.(); } }; const handleSelect: React.ChangeEventHandler = (e) => { + onRangeSelect?.(); onSelect?.(e.target.checked); }; @@ -205,6 +234,7 @@ export default function PreviewCard(props: IProps) { isRangeSelectActive && onHover()} disabled={!forcedEnable && !file?.msrc && !imgSrc} selected={selected} {...(selectable ? useLongPress(longPressCallback, 500) : {})}> @@ -213,12 +243,16 @@ export default function PreviewCard(props: IProps) { type="checkbox" checked={selected} onChange={handleSelect} + active={isRangeSelectActive && isInsSelectRange} onClick={(e) => e.stopPropagation()} /> )} {(file?.msrc || imgSrc) && } {file?.metadata.fileType === 1 && } + ); } From 500c91d431d416f34c8998e04e22b35c55ebd7d3 Mon Sep 17 00:00:00 2001 From: Abhinav Date: Fri, 22 Oct 2021 13:56:33 +0530 Subject: [PATCH 054/147] clear last selected on selection clear --- src/components/PhotoFrame.tsx | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/components/PhotoFrame.tsx b/src/components/PhotoFrame.tsx index ab87725ed..84de28f0f 100644 --- a/src/components/PhotoFrame.tsx +++ b/src/components/PhotoFrame.tsx @@ -222,6 +222,12 @@ const PhotoFrame = ({ setFetching({}); }, [files, search, deleted]); + useEffect(() => { + if (selected.count === 0) { + setLastSelected(null); + } + }, [selected]); + const updateUrl = (index: number) => (url: string) => { files[index] = { ...files[index], From 296ada94afe53e180a65b9c779fe1fd0919e6093 Mon Sep 17 00:00:00 2001 From: Abhinav Date: Fri, 22 Oct 2021 14:30:59 +0530 Subject: [PATCH 055/147] complete rangeSelect operation after rangeEnd selected --- src/components/PhotoFrame.tsx | 42 ++++++++++---------- src/components/pages/gallery/PreviewCard.tsx | 4 +- 2 files changed, 25 insertions(+), 21 deletions(-) diff --git a/src/components/PhotoFrame.tsx b/src/components/PhotoFrame.tsx index 84de28f0f..4b0af594e 100644 --- a/src/components/PhotoFrame.tsx +++ b/src/components/PhotoFrame.tsx @@ -177,7 +177,7 @@ const PhotoFrame = ({ const startTime = Date.now(); const galleryContext = useContext(GalleryContext); const listRef = useRef(null); - const [lastSelected, setLastSelected] = useState(null); + const [rangeStart, setRangeStart] = useState(null); const [currentHover, setCurrentHover] = useState(null); const [isShiftKeyPressed, setIsShiftKeyPressed] = useState(false); @@ -224,7 +224,7 @@ const PhotoFrame = ({ useEffect(() => { if (selected.count === 0) { - setLastSelected(null); + setRangeStart(null); } }, [selected]); @@ -300,10 +300,16 @@ const PhotoFrame = ({ setOpen(true); }; - const handleSelect = (id: number) => (checked: boolean) => { + const handleSelect = (id: number, index?: number) => (checked: boolean) => { if (selected.collectionID !== activeCollection) { setSelected({ count: 0, collectionID: 0 }); } + if (rangeStart || rangeStart === 0) { + setRangeStart(null); + } else { + setRangeStart(index); + } + setSelected((selected) => ({ ...selected, [id]: checked, @@ -311,22 +317,18 @@ const PhotoFrame = ({ collectionID: activeCollection, })); }; - const handleRangeSelect = (index: number) => () => { - if (lastSelected === index) { - setLastSelected(null); - } else { - setLastSelected(index); - let st = -1; - let lt = -1; - if (index < lastSelected) { - st = index; - lt = lastSelected - 1; + if (rangeStart !== index) { + let leftEnd = -1; + let rightEnd = -1; + if (index < rangeStart) { + leftEnd = index; + rightEnd = rangeStart; } else { - st = lastSelected + 1; - lt = index; + leftEnd = rangeStart; + rightEnd = index; } - for (let i = st; i <= lt; i++) { + for (let i = leftEnd; i <= rightEnd; i++) { handleSelect(filteredData[i].id)(true); } } @@ -338,7 +340,7 @@ const PhotoFrame = ({ updateUrl={updateUrl(file[index].dataIndex)} onClick={onThumbnailClick(index)} selectable={!isSharedCollection} - onSelect={handleSelect(file[index].id)} + onSelect={handleSelect(file[index].id, index)} selected={ selected.collectionID === activeCollection && selected[file[index].id] @@ -347,11 +349,11 @@ const PhotoFrame = ({ onHover={() => setCurrentHover(index)} onRangeSelect={handleRangeSelect(index)} isRangeSelectActive={ - isShiftKeyPressed && (lastSelected || lastSelected === 0) + isShiftKeyPressed && (rangeStart || rangeStart === 0) } isInsSelectRange={ - (index >= lastSelected + 1 && index <= currentHover) || - (index >= currentHover && index <= lastSelected - 1) + (index >= rangeStart + 1 && index <= currentHover) || + (index >= currentHover && index <= rangeStart - 1) } /> ); diff --git a/src/components/pages/gallery/PreviewCard.tsx b/src/components/pages/gallery/PreviewCard.tsx index f84029504..8b0ee846f 100644 --- a/src/components/pages/gallery/PreviewCard.tsx +++ b/src/components/pages/gallery/PreviewCard.tsx @@ -222,7 +222,9 @@ export default function PreviewCard(props: IProps) { }; const handleSelect: React.ChangeEventHandler = (e) => { - onRangeSelect?.(); + if (isRangeSelectActive) { + onRangeSelect?.(); + } onSelect?.(e.target.checked); }; From 193d3de04457a1df13125eb30b2079290ed329d2 Mon Sep 17 00:00:00 2001 From: Abhinav Date: Fri, 22 Oct 2021 14:34:57 +0530 Subject: [PATCH 056/147] disable text select with shift for gallery list and date container --- src/components/PhotoFrame.tsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/components/PhotoFrame.tsx b/src/components/PhotoFrame.tsx index 4b0af594e..236067b67 100644 --- a/src/components/PhotoFrame.tsx +++ b/src/components/PhotoFrame.tsx @@ -82,6 +82,7 @@ const getTemplateColumns = (columns: number, groups?: number[]): string => { }; const ListContainer = styled.div<{ columns: number; groups?: number[] }>` + user-select: none; display: grid; grid-template-columns: ${({ columns, groups }) => getTemplateColumns(columns, groups)}; @@ -96,6 +97,7 @@ const ListContainer = styled.div<{ columns: number; groups?: number[] }>` `; const DateContainer = styled.div<{ span: number }>` + user-select: none; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; From cde5df055a6d6f0200a79c751c260998997c09fe Mon Sep 17 00:00:00 2001 From: Abhinav Date: Fri, 22 Oct 2021 14:38:10 +0530 Subject: [PATCH 057/147] start rangeSelect only on checked select event --- src/components/PhotoFrame.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/PhotoFrame.tsx b/src/components/PhotoFrame.tsx index 236067b67..673c33316 100644 --- a/src/components/PhotoFrame.tsx +++ b/src/components/PhotoFrame.tsx @@ -308,7 +308,7 @@ const PhotoFrame = ({ } if (rangeStart || rangeStart === 0) { setRangeStart(null); - } else { + } else if (checked) { setRangeStart(index); } From 9a9671c0ee995275ffb0f968213bfe5bdb098089 Mon Sep 17 00:00:00 2001 From: Abhinav Date: Fri, 22 Oct 2021 14:40:09 +0530 Subject: [PATCH 058/147] make rangeSelect props optional for preview card --- src/components/pages/gallery/PreviewCard.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/pages/gallery/PreviewCard.tsx b/src/components/pages/gallery/PreviewCard.tsx index 8b0ee846f..3220065c7 100644 --- a/src/components/pages/gallery/PreviewCard.tsx +++ b/src/components/pages/gallery/PreviewCard.tsx @@ -17,9 +17,9 @@ interface IProps { onSelect?: (checked: boolean) => void; onHover?: () => void; onRangeSelect?: () => void; - isRangeSelectActive: boolean; + isRangeSelectActive?: boolean; selectOnClick?: boolean; - isInsSelectRange: boolean; + isInsSelectRange?: boolean; } const Check = styled.input<{ active: boolean }>` From d07c6807486e55516c2a070dc795970c92caaa0a Mon Sep 17 00:00:00 2001 From: Abhinav Date: Mon, 25 Oct 2021 13:25:53 +0530 Subject: [PATCH 059/147] perf improvement --- src/components/pages/gallery/PreviewCard.tsx | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/components/pages/gallery/PreviewCard.tsx b/src/components/pages/gallery/PreviewCard.tsx index 3220065c7..f940f654d 100644 --- a/src/components/pages/gallery/PreviewCard.tsx +++ b/src/components/pages/gallery/PreviewCard.tsx @@ -231,12 +231,16 @@ export default function PreviewCard(props: IProps) { const longPressCallback = () => { onSelect(!selected); }; - + const handleHover = () => { + if (isRangeSelectActive) { + onHover(); + } + }; return ( isRangeSelectActive && onHover()} + onMouseEnter={handleHover} disabled={!forcedEnable && !file?.msrc && !imgSrc} selected={selected} {...(selectable ? useLongPress(longPressCallback, 500) : {})}> From 601c6770c297aa3a5caab94e3c8f746980395199 Mon Sep 17 00:00:00 2001 From: Abhinav Date: Mon, 25 Oct 2021 13:49:50 +0530 Subject: [PATCH 060/147] added selected parameter to key prop --- src/components/PhotoFrame.tsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/components/PhotoFrame.tsx b/src/components/PhotoFrame.tsx index 673c33316..cb11c1fbb 100644 --- a/src/components/PhotoFrame.tsx +++ b/src/components/PhotoFrame.tsx @@ -337,7 +337,9 @@ const PhotoFrame = ({ }; const getThumbnail = (file: File[], index: number) => ( Date: Mon, 25 Oct 2021 13:50:32 +0530 Subject: [PATCH 061/147] added test console logs --- src/components/PhotoFrame.tsx | 1 + src/components/pages/gallery/PreviewCard.tsx | 1 + 2 files changed, 2 insertions(+) diff --git a/src/components/PhotoFrame.tsx b/src/components/PhotoFrame.tsx index cb11c1fbb..c71c2bc54 100644 --- a/src/components/PhotoFrame.tsx +++ b/src/components/PhotoFrame.tsx @@ -335,6 +335,7 @@ const PhotoFrame = ({ } } }; + console.log('re-render gallery'); const getThumbnail = (file: File[], index: number) => ( Date: Tue, 26 Oct 2021 10:43:14 +0530 Subject: [PATCH 062/147] only getThumbnail at start if migration not started --- src/components/FixLargeThumbnail.tsx | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/src/components/FixLargeThumbnail.tsx b/src/components/FixLargeThumbnail.tsx index 9bfdc4be3..3c342856e 100644 --- a/src/components/FixLargeThumbnail.tsx +++ b/src/components/FixLargeThumbnail.tsx @@ -57,13 +57,19 @@ export default function FixLargeThumbnails(props: Props) { [] ); + const init = (): FIX_STATE => { + let fixState = getData(LS_KEYS.THUMBNAIL_FIX_STATE)?.state; + if (!fixState) { + fixState = FIX_STATE.NOT_STARTED; + updateFixState(fixState); + } + setFixState(fixState); + return fixState; + }; + const main = async () => { const largeThumbnailFiles = await getLargeThumbnailFiles(); setLargeThumbnailFiles(largeThumbnailFiles ?? []); - const fixState = - getData(LS_KEYS.THUMBNAIL_FIX_STATE)?.state ?? - FIX_STATE.NOT_STARTED; - setFixState(fixState); if (fixState === FIX_STATE.RUNNING) { startFix(largeThumbnailFiles); } @@ -78,7 +84,10 @@ export default function FixLargeThumbnails(props: Props) { }, [props.isOpen]); useEffect(() => { - main(); + const fixState = init(); + if (fixState === FIX_STATE.NOT_STARTED) { + main(); + } }, []); const startFix = async (newlyFetchedLargeThumbnailFiles?: number[]) => { updateFixState(FIX_STATE.RUNNING); From 69067d89da420d79a26cf70500ecfacef9092679 Mon Sep 17 00:00:00 2001 From: Abhinav Date: Tue, 26 Oct 2021 10:44:26 +0530 Subject: [PATCH 063/147] dont autoStart thumbnail fix --- src/components/FixLargeThumbnail.tsx | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/components/FixLargeThumbnail.tsx b/src/components/FixLargeThumbnail.tsx index 3c342856e..06a74e19c 100644 --- a/src/components/FixLargeThumbnail.tsx +++ b/src/components/FixLargeThumbnail.tsx @@ -59,7 +59,7 @@ export default function FixLargeThumbnails(props: Props) { const init = (): FIX_STATE => { let fixState = getData(LS_KEYS.THUMBNAIL_FIX_STATE)?.state; - if (!fixState) { + if (!fixState || fixState === FIX_STATE.RUNNING) { fixState = FIX_STATE.NOT_STARTED; updateFixState(fixState); } @@ -70,9 +70,6 @@ export default function FixLargeThumbnails(props: Props) { const main = async () => { const largeThumbnailFiles = await getLargeThumbnailFiles(); setLargeThumbnailFiles(largeThumbnailFiles ?? []); - if (fixState === FIX_STATE.RUNNING) { - startFix(largeThumbnailFiles); - } if (fixState === FIX_STATE.NOT_STARTED) { props.show(); } From 565f871a3d40a53e689010d604545a9b5f57f6b9 Mon Sep 17 00:00:00 2001 From: Abhinav Date: Tue, 26 Oct 2021 10:45:19 +0530 Subject: [PATCH 064/147] logError if largeThumbnail left after migration complete --- src/components/FixLargeThumbnail.tsx | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/components/FixLargeThumbnail.tsx b/src/components/FixLargeThumbnail.tsx index 06a74e19c..3db85a03a 100644 --- a/src/components/FixLargeThumbnail.tsx +++ b/src/components/FixLargeThumbnail.tsx @@ -8,6 +8,7 @@ import { replaceThumbnail, } from 'services/migrateThumbnailService'; import { getData, LS_KEYS, setData } from 'utils/storage/localStorage'; +import { logError } from 'utils/sentry'; export type SetProgressTracker = React.Dispatch< React.SetStateAction<{ @@ -73,6 +74,13 @@ export default function FixLargeThumbnails(props: Props) { if (fixState === FIX_STATE.NOT_STARTED) { props.show(); } + if ( + fixState === FIX_STATE.COMPLETED && + largeThumbnailFiles.length > 0 + ) { + updateFixState(FIX_STATE.NOT_STARTED); + logError(Error(), 'large thumbnail files left after migration'); + } }; useEffect(() => { if (props.isOpen && fixState !== FIX_STATE.RUNNING) { From 2f52bc2aed118cb86aa7d0c8d9004ac8464072b7 Mon Sep 17 00:00:00 2001 From: Abhinav Date: Tue, 26 Oct 2021 10:50:00 +0530 Subject: [PATCH 065/147] show compress thumbnail only if has large thumbnails and if no large thumbnail set state as completed --- src/components/FixLargeThumbnail.tsx | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/components/FixLargeThumbnail.tsx b/src/components/FixLargeThumbnail.tsx index 3db85a03a..08238182c 100644 --- a/src/components/FixLargeThumbnail.tsx +++ b/src/components/FixLargeThumbnail.tsx @@ -71,7 +71,10 @@ export default function FixLargeThumbnails(props: Props) { const main = async () => { const largeThumbnailFiles = await getLargeThumbnailFiles(); setLargeThumbnailFiles(largeThumbnailFiles ?? []); - if (fixState === FIX_STATE.NOT_STARTED) { + if ( + fixState === FIX_STATE.NOT_STARTED && + largeThumbnailFiles.length > 0 + ) { props.show(); } if ( @@ -81,6 +84,9 @@ export default function FixLargeThumbnails(props: Props) { updateFixState(FIX_STATE.NOT_STARTED); logError(Error(), 'large thumbnail files left after migration'); } + if (largeThumbnailFiles.length === 0) { + updateFixState(FIX_STATE.COMPLETED); + } }; useEffect(() => { if (props.isOpen && fixState !== FIX_STATE.RUNNING) { From aaf74290c35d137ac0b3d27c9842ddc7602f9de6 Mon Sep 17 00:00:00 2001 From: Abhinav Date: Tue, 26 Oct 2021 11:19:44 +0530 Subject: [PATCH 066/147] updated trash diff fetch --- src/services/trashService.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/services/trashService.ts b/src/services/trashService.ts index 964b071e7..44c75ee3b 100644 --- a/src/services/trashService.ts +++ b/src/services/trashService.ts @@ -11,7 +11,6 @@ import HTTPService from './HTTPService'; const TRASH = 'file-trash'; const TRASH_TIME = 'trash-time'; const DELETED_COLLECTION = 'deleted-collection'; -const SYNC_LIMIT = 1000; const ENDPOINT = getEndpoint(); @@ -90,7 +89,6 @@ export const updateTrash = async ( `${ENDPOINT}/trash/diff`, { sinceTime: time, - limit: SYNC_LIMIT, }, { 'X-Auth-Token': token, @@ -125,7 +123,7 @@ export const updateTrash = async ( ); localForage.setItem(TRASH, updatedTrash); localForage.setItem(TRASH_TIME, time); - } while (resp.data.diff.length === SYNC_LIMIT); + } while (resp.data.hasMore); return updatedTrash; } catch (e) { logError(e, 'Get trash files failed'); From 2e5425a8e6152bd51ecaf1fa218bfa5ec2a15f9a Mon Sep 17 00:00:00 2001 From: Abhinav Date: Tue, 26 Oct 2021 11:35:26 +0530 Subject: [PATCH 067/147] upadtes remove from collection messgae --- .../pages/gallery/SelectedFileOptions.tsx | 2 +- src/utils/strings/englishConstants.tsx | 13 +++++++++++-- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/src/components/pages/gallery/SelectedFileOptions.tsx b/src/components/pages/gallery/SelectedFileOptions.tsx index 610a1c5f6..c895cd3e0 100644 --- a/src/components/pages/gallery/SelectedFileOptions.tsx +++ b/src/components/pages/gallery/SelectedFileOptions.tsx @@ -95,7 +95,7 @@ const SelectedFileOptions = ({ const removeFromCollectionHandler = () => setDialogMessage({ title: constants.CONFIRM_REMOVE, - content: constants.CONFIRM_REMOVE_MESSAGE, + content: constants.CONFIRM_REMOVE_MESSAGE(), staticBackdrop: true, proceed: { action: removeFromCollectionHelper, diff --git a/src/utils/strings/englishConstants.tsx b/src/utils/strings/englishConstants.tsx index cfe5454f6..43104ba93 100644 --- a/src/utils/strings/englishConstants.tsx +++ b/src/utils/strings/englishConstants.tsx @@ -554,8 +554,17 @@ const englishConstants = { SORT_BY_COLLECTION_NAME: 'album title', REMOVE: 'remove', CONFIRM_REMOVE: 'confirm removal', - CONFIRM_REMOVE_MESSAGE: - 'are you sure you want to remove these files from the collection', + + CONFIRM_REMOVE_MESSAGE: () => ( + <> +

+ are you sure you want to remove these files from the collection? +

+

+ all files that are unique to this album will be moved to trash +

+ + ), }; export default englishConstants; From 475ae0535248341fb22b935a64239a8775215356 Mon Sep 17 00:00:00 2001 From: Abhinav Date: Tue, 26 Oct 2021 12:02:31 +0530 Subject: [PATCH 068/147] fixed duplicate file entries in selectedFiles --- src/utils/file/index.ts | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/utils/file/index.ts b/src/utils/file/index.ts index e0c389482..1d83d9ce6 100644 --- a/src/utils/file/index.ts +++ b/src/utils/file/index.ts @@ -64,17 +64,19 @@ function getSelectedFileIds(selectedFiles: SelectedState) { return filesIDs; } export function getSelectedFiles( - selectedFiles: SelectedState, + selected: SelectedState, files: File[] ): File[] { - const filesIDs = new Set(getSelectedFileIds(selectedFiles)); - const filesToDelete: File[] = []; + const filesIDs = new Set(getSelectedFileIds(selected)); + const selectedFiles: File[] = []; + const foundFiles = new Set(); for (const file of files) { - if (filesIDs.has(file.id)) { - filesToDelete.push(file); + if (filesIDs.has(file.id) && !foundFiles.has(file.id)) { + selectedFiles.push(file); + foundFiles.add(file.id); } } - return filesToDelete; + return selectedFiles; } export function checkFileFormatSupport(name: string) { From 0b5af9a3c7ee00325e174580b783afec9248b660 Mon Sep 17 00:00:00 2001 From: Abhinav Date: Tue, 26 Oct 2021 12:40:41 +0530 Subject: [PATCH 069/147] update delete btn with info message --- src/components/DeleteBtn.tsx | 28 +++++++++++-------- .../pages/gallery/SelectedFileOptions.tsx | 6 +++- 2 files changed, 21 insertions(+), 13 deletions(-) diff --git a/src/components/DeleteBtn.tsx b/src/components/DeleteBtn.tsx index 6bf7bbae6..a7d2cd6cb 100644 --- a/src/components/DeleteBtn.tsx +++ b/src/components/DeleteBtn.tsx @@ -1,13 +1,15 @@ import React from 'react'; import styled from 'styled-components'; +import constants from 'utils/strings/constants'; +import { IconWithMessage } from './pages/gallery/SelectedFileOptions'; const Wrapper = styled.button` border: none; background-color: #ff6666; position: fixed; z-index: 1; - bottom: 20px; - right: 20px; + bottom: 30px; + right: 30px; width: 60px; height: 60px; border-radius: 50%; @@ -15,16 +17,18 @@ const Wrapper = styled.button` `; export default function DeleteBtn(props) { return ( - - - - - - + + + + + + + + ); } diff --git a/src/components/pages/gallery/SelectedFileOptions.tsx b/src/components/pages/gallery/SelectedFileOptions.tsx index cd3ad9b22..e8d0aa5ea 100644 --- a/src/components/pages/gallery/SelectedFileOptions.tsx +++ b/src/components/pages/gallery/SelectedFileOptions.tsx @@ -50,7 +50,11 @@ const SelectionContainer = styled.div` display: flex; `; -export const IconWithMessage = (props) => ( +interface IconWithMessageProps { + children?: any; + message: string; +} +export const IconWithMessage = (props: IconWithMessageProps) => ( {props.message}

}> From 9aaac2b2327a7d843a42202012617e1b1f65421b Mon Sep 17 00:00:00 2001 From: Abhinav Date: Tue, 26 Oct 2021 13:04:29 +0530 Subject: [PATCH 070/147] adds new empty trash api --- src/services/trashService.ts | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/src/services/trashService.ts b/src/services/trashService.ts index 44c75ee3b..ec0005a21 100644 --- a/src/services/trashService.ts +++ b/src/services/trashService.ts @@ -46,6 +46,9 @@ export async function cleanTrashCollections(fileTrash: Trash) { await localForage.setItem(DELETED_COLLECTION, filterCollections); } +async function getLastSyncTime() { + return (await localForage.getItem(TRASH_TIME)) ?? 0; +} export async function syncTrash( collections: Collection[], setFiles: SetFiles @@ -58,7 +61,7 @@ export async function syncTrash( if (!getToken()) { return trash; } - const lastSyncTime = (await localForage.getItem(TRASH_TIME)) ?? 0; + const lastSyncTime = await getLastSyncTime(); const updatedTrash = await updateTrash( collectionMap, @@ -161,3 +164,25 @@ export function getTrashedFiles(trash: Trash) { })) ); } + +export const emptyTrash = async () => { + try { + const token = getToken(); + if (!token) { + return; + } + const lastUpdatedAt = await getLastSyncTime(); + + await HTTPService.post( + `${ENDPOINT}/trash/empty`, + { lastUpdatedAt }, + null, + { + 'X-Auth-Token': token, + } + ); + } catch (e) { + logError(e, 'empty trash failed'); + throw e; + } +}; From 9b1188804017fd1e941e2182cfbbc7a3bdece157 Mon Sep 17 00:00:00 2001 From: Abhinav Date: Tue, 26 Oct 2021 13:05:12 +0530 Subject: [PATCH 071/147] adds empty trash button --- src/pages/gallery/index.tsx | 34 ++++++++++++++++++++++++++ src/utils/strings/englishConstants.tsx | 4 +++ 2 files changed, 38 insertions(+) diff --git a/src/pages/gallery/index.tsx b/src/pages/gallery/index.tsx index f079543a6..720c68997 100644 --- a/src/pages/gallery/index.tsx +++ b/src/pages/gallery/index.tsx @@ -83,10 +83,12 @@ import { } from 'utils/collection'; import { logError } from 'utils/sentry'; import { + emptyTrash, getLocalTrash, getTrashedFiles, syncTrash, } from 'services/trashService'; +import DeleteBtn from 'components/DeleteBtn'; export const DeadCenter = styled.div` flex: 1; @@ -488,6 +490,35 @@ export default function Gallery() { setCollectionSelectorView(false); }; + const emptyTrashHandler = () => + setDialogMessage({ + title: constants.CONFIRM_EMPTY_TRASH, + content: constants.EMPTY_TRASH_MESSAGE, + staticBackdrop: true, + proceed: { + action: emptyTrashHelper, + text: constants.EMPTY_TRASH, + variant: 'danger', + }, + close: { text: constants.CANCEL }, + }); + const emptyTrashHelper = async () => { + loadingBar.current?.continuousStart(); + try { + await emptyTrash(); + } catch (e) { + setDialogMessage({ + title: constants.ERROR, + staticBackdrop: true, + close: { variant: 'danger' }, + content: constants.UNKNOWN_ERROR, + }); + } finally { + await syncWithRemote(false, true); + loadingBar.current.complete(); + } + }; + return ( )} + {activeCollection === TRASH_SECTION && ( + + )} ); diff --git a/src/utils/strings/englishConstants.tsx b/src/utils/strings/englishConstants.tsx index 1e0b8104c..4232bee36 100644 --- a/src/utils/strings/englishConstants.tsx +++ b/src/utils/strings/englishConstants.tsx @@ -566,6 +566,10 @@ const englishConstants = { RESTORE_TO_COLLECTION: 'restore to album', AUTOMATIC_BIN_DELETE_MESSAGE: (relativeTime: string) => `permanently deleted ${relativeTime}`, + EMPTY_TRASH: 'empty trash', + CONFIRM_EMPTY_TRASH: 'confirm empty trash', + EMPTY_TRASH_MESSAGE: + "all trash files will be permanently deleted and can't be restored", }; export default englishConstants; From f3fc1955f2767ab96741f215e2054100983cd281 Mon Sep 17 00:00:00 2001 From: Abhinav Date: Tue, 26 Oct 2021 13:53:32 +0530 Subject: [PATCH 072/147] remove inline function --- src/components/PhotoFrame.tsx | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/components/PhotoFrame.tsx b/src/components/PhotoFrame.tsx index c71c2bc54..9aba1ec90 100644 --- a/src/components/PhotoFrame.tsx +++ b/src/components/PhotoFrame.tsx @@ -319,6 +319,10 @@ const PhotoFrame = ({ collectionID: activeCollection, })); }; + const onHoverOver = (index: number) => () => { + setCurrentHover(index); + }; + const handleRangeSelect = (index: number) => () => { if (rangeStart !== index) { let leftEnd = -1; @@ -351,7 +355,7 @@ const PhotoFrame = ({ selected[file[index].id] } selectOnClick={selected.count > 0} - onHover={() => setCurrentHover(index)} + onHover={onHoverOver(index)} onRangeSelect={handleRangeSelect(index)} isRangeSelectActive={ isShiftKeyPressed && (rangeStart || rangeStart === 0) From d57f829adca011457273f4a237f4ab2907a75e12 Mon Sep 17 00:00:00 2001 From: Abhinav Date: Tue, 26 Oct 2021 16:33:06 +0530 Subject: [PATCH 073/147] pass files to trashService to get latest files --- src/pages/gallery/index.tsx | 2 +- src/services/trashService.ts | 15 ++++++++++----- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/src/pages/gallery/index.tsx b/src/pages/gallery/index.tsx index 720c68997..f70582e1d 100644 --- a/src/pages/gallery/index.tsx +++ b/src/pages/gallery/index.tsx @@ -290,7 +290,7 @@ export default function Gallery() { setCollections(collections); const files = await syncFiles(collections, setFiles); await setDerivativeState(collections, files); - await syncTrash(collections, setFiles); + await syncTrash(collections, setFiles, files); } catch (e) { switch (e.message) { case ServerErrorCodes.SESSION_EXPIRED: diff --git a/src/services/trashService.ts b/src/services/trashService.ts index ec0005a21..9cbd4aceb 100644 --- a/src/services/trashService.ts +++ b/src/services/trashService.ts @@ -51,7 +51,8 @@ async function getLastSyncTime() { } export async function syncTrash( collections: Collection[], - setFiles: SetFiles + setFiles: SetFiles, + files: File[] ): Promise { const trash = await getLocalTrash(); collections = [...collections, ...(await getLocalDeletedCollections())]; @@ -67,6 +68,7 @@ export async function syncTrash( collectionMap, lastSyncTime, setFiles, + files, trash ); cleanTrashCollections(updatedTrash); @@ -76,6 +78,7 @@ export const updateTrash = async ( collections: Map, sinceTime: number, setFiles: SetFiles, + files: File[], currentTrash: Trash ): Promise => { try { @@ -120,8 +123,9 @@ export const updateTrash = async ( time = resp.data.diff.slice(-1)[0].updatedAt; } updatedTrash = removeDuplicates(updatedTrash); + updatedTrash = removeRestoredOrDeletedTrashItems(updatedTrash); - setFiles((files) => + setFiles( sortFiles([...(files ?? []), ...getTrashedFiles(updatedTrash)]) ); localForage.setItem(TRASH, updatedTrash); @@ -146,14 +150,15 @@ function removeDuplicates(trash: Trash) { trash = []; // eslint-disable-next-line @typescript-eslint/no-unused-vars for (const [_, trashedFile] of latestVersionTrashItems) { - if (trashedFile.isDeleted || trashedFile.isRestored) { - continue; - } trash.push(trashedFile); } return trash; } +function removeRestoredOrDeletedTrashItems(trash: Trash) { + return trash.filter((item) => !item.isDeleted && !item.isRestored); +} + export function getTrashedFiles(trash: Trash) { return appendPhotoSwipeProps( trash.map((trashedFile) => ({ From 9d6ae6afea4abe38b3ddff56882d073de9417dd0 Mon Sep 17 00:00:00 2001 From: Abhinav Date: Tue, 26 Oct 2021 16:42:32 +0530 Subject: [PATCH 074/147] show empty trash button only when trash has files --- src/pages/gallery/index.tsx | 11 +++++++++-- src/services/trashService.ts | 1 + 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/pages/gallery/index.tsx b/src/pages/gallery/index.tsx index f70582e1d..3f63ae794 100644 --- a/src/pages/gallery/index.tsx +++ b/src/pages/gallery/index.tsx @@ -87,6 +87,7 @@ import { getLocalTrash, getTrashedFiles, syncTrash, + Trash, } from 'services/trashService'; import DeleteBtn from 'components/DeleteBtn'; @@ -200,6 +201,7 @@ export default function Gallery() { useState(false); const [isFavCollectionActive, setIsFavCollectionActive] = useState(false); + const [trash, setTrash] = useState([]); useEffect(() => { const key = getKey(SESSION_KEYS.ENCRYPTION_KEY); @@ -221,6 +223,7 @@ export default function Gallery() { const trashedFile = getTrashedFiles(trash); setFiles([...files, ...trashedFile]); setCollections(collections); + setTrash(trash); await setDerivativeState(collections, files); await checkSubscriptionPurchase( setDialogMessage, @@ -290,7 +293,8 @@ export default function Gallery() { setCollections(collections); const files = await syncFiles(collections, setFiles); await setDerivativeState(collections, files); - await syncTrash(collections, setFiles, files); + const trash = await syncTrash(collections, setFiles, files); + setTrash(trash); } catch (e) { switch (e.message) { case ServerErrorCodes.SESSION_EXPIRED: @@ -506,6 +510,9 @@ export default function Gallery() { loadingBar.current?.continuousStart(); try { await emptyTrash(); + if (selected.collectionID === TRASH_SECTION) { + clearSelection(); + } } catch (e) { setDialogMessage({ title: constants.ERROR, @@ -682,7 +689,7 @@ export default function Gallery() { isFavoriteCollection={isFavCollectionActive} /> )} - {activeCollection === TRASH_SECTION && ( + {activeCollection === TRASH_SECTION && trash?.length > 0 && ( )} diff --git a/src/services/trashService.ts b/src/services/trashService.ts index 9cbd4aceb..ca2b551f8 100644 --- a/src/services/trashService.ts +++ b/src/services/trashService.ts @@ -72,6 +72,7 @@ export async function syncTrash( trash ); cleanTrashCollections(updatedTrash); + return updatedTrash; } export const updateTrash = async ( From 6111ac87e2344515cca67342501f0bb3ab309c37 Mon Sep 17 00:00:00 2001 From: Abhinav Date: Tue, 26 Oct 2021 16:49:46 +0530 Subject: [PATCH 075/147] clearLocalTrash after empty trash api call --- src/pages/gallery/index.tsx | 2 ++ src/services/trashService.ts | 8 ++++++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/pages/gallery/index.tsx b/src/pages/gallery/index.tsx index 3f63ae794..2d0ddac7c 100644 --- a/src/pages/gallery/index.tsx +++ b/src/pages/gallery/index.tsx @@ -83,6 +83,7 @@ import { } from 'utils/collection'; import { logError } from 'utils/sentry'; import { + clearLocalTrash, emptyTrash, getLocalTrash, getTrashedFiles, @@ -513,6 +514,7 @@ export default function Gallery() { if (selected.collectionID === TRASH_SECTION) { clearSelection(); } + await clearLocalTrash(); } catch (e) { setDialogMessage({ title: constants.ERROR, diff --git a/src/services/trashService.ts b/src/services/trashService.ts index ca2b551f8..5fcdd0e6d 100644 --- a/src/services/trashService.ts +++ b/src/services/trashService.ts @@ -129,8 +129,8 @@ export const updateTrash = async ( setFiles( sortFiles([...(files ?? []), ...getTrashedFiles(updatedTrash)]) ); - localForage.setItem(TRASH, updatedTrash); - localForage.setItem(TRASH_TIME, time); + await localForage.setItem(TRASH, updatedTrash); + await localForage.setItem(TRASH_TIME, time); } while (resp.data.hasMore); return updatedTrash; } catch (e) { @@ -192,3 +192,7 @@ export const emptyTrash = async () => { throw e; } }; + +export const clearLocalTrash = async () => { + await localForage.setItem(TRASH, []); +}; From 01e92a35e960c7c33f109512d808c501021b498b Mon Sep 17 00:00:00 2001 From: Abhinav Date: Tue, 26 Oct 2021 18:25:39 +0530 Subject: [PATCH 076/147] fetch large thumbnail after fix for confirmation --- src/components/FixLargeThumbnail.tsx | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/components/FixLargeThumbnail.tsx b/src/components/FixLargeThumbnail.tsx index 08238182c..12de7731b 100644 --- a/src/components/FixLargeThumbnail.tsx +++ b/src/components/FixLargeThumbnail.tsx @@ -68,9 +68,14 @@ export default function FixLargeThumbnails(props: Props) { return fixState; }; + const fetchLargeThumbnail = async () => { + const largeThumbnailFiles = (await getLargeThumbnailFiles()) ?? []; + setLargeThumbnailFiles(largeThumbnailFiles); + return largeThumbnailFiles; + }; + const main = async () => { - const largeThumbnailFiles = await getLargeThumbnailFiles(); - setLargeThumbnailFiles(largeThumbnailFiles ?? []); + const largeThumbnailFiles = await fetchLargeThumbnail(); if ( fixState === FIX_STATE.NOT_STARTED && largeThumbnailFiles.length > 0 @@ -115,6 +120,7 @@ export default function FixLargeThumbnails(props: Props) { : FIX_STATE.COMPLETED ); } + await fetchLargeThumbnail(); }; const updateFixState = (fixState: FIX_STATE) => { From bc0be40a92707fdddbf4975d90c0016ee6d5e489 Mon Sep 17 00:00:00 2001 From: Abhinav Date: Tue, 26 Oct 2021 18:28:51 +0530 Subject: [PATCH 077/147] update copies --- src/utils/strings/englishConstants.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/utils/strings/englishConstants.tsx b/src/utils/strings/englishConstants.tsx index 83de0fa2a..b1bec342d 100644 --- a/src/utils/strings/englishConstants.tsx +++ b/src/utils/strings/englishConstants.tsx @@ -556,7 +556,7 @@ const englishConstants = { TRASH: 'trash', MOVE_TO_TRASH: 'move to trash', TRASH_MESSAGE: - 'the selected files will be removed from all collection and moved to trash ', + 'the selected files will be removed from all albums and moved to trash ', DELETE_PERMANENTLY: 'delete permanently', RESTORE: 'restore', CONFIRM_RESTORE: 'confirm restoration', @@ -564,10 +564,10 @@ const englishConstants = { RESTORE_TO_COLLECTION: 'restore to album', AUTOMATIC_BIN_DELETE_MESSAGE: (relativeTime: string) => `permanently deleted ${relativeTime}`, - EMPTY_TRASH: 'empty trash', + EMPTY_TRASH: 'empty trash?', CONFIRM_EMPTY_TRASH: 'confirm empty trash', EMPTY_TRASH_MESSAGE: - "all trash files will be permanently deleted and can't be restored", + 'all files will be permanently removed from your ente account', CONFIRM_REMOVE_MESSAGE: () => ( <> From 29279771928a407134880d3e0359e554443a6f70 Mon Sep 17 00:00:00 2001 From: Abhinav Date: Tue, 26 Oct 2021 18:30:59 +0530 Subject: [PATCH 078/147] update copy --- src/utils/strings/englishConstants.tsx | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/utils/strings/englishConstants.tsx b/src/utils/strings/englishConstants.tsx index 43104ba93..4cc26498b 100644 --- a/src/utils/strings/englishConstants.tsx +++ b/src/utils/strings/englishConstants.tsx @@ -557,9 +557,7 @@ const englishConstants = { CONFIRM_REMOVE_MESSAGE: () => ( <> -

- are you sure you want to remove these files from the collection? -

+

are you sure you want to remove these files from the album?

all files that are unique to this album will be moved to trash

From 384fd9799a07f86c7723c6636902c42aacb56cff Mon Sep 17 00:00:00 2001 From: Abhinav Date: Wed, 27 Oct 2021 11:27:43 +0530 Subject: [PATCH 079/147] improved error logs for failure during thumbnail generation --- src/services/upload/thumbnailService.ts | 35 ++++++++++--------------- src/services/upload/uploadService.ts | 6 +---- src/utils/common/errorUtil.ts | 1 + 3 files changed, 16 insertions(+), 26 deletions(-) diff --git a/src/services/upload/thumbnailService.ts b/src/services/upload/thumbnailService.ts index 586a396af..f73d177d1 100644 --- a/src/services/upload/thumbnailService.ts +++ b/src/services/upload/thumbnailService.ts @@ -4,6 +4,8 @@ import { logError } from 'utils/sentry'; import { BLACK_THUMBNAIL_BASE64 } from '../../../public/images/black-thumbnail-b64'; import FFmpegService from 'services/ffmpegService'; import { convertToHumanReadable } from 'utils/billingUtil'; +import { fileIsHEIC } from 'utils/file'; +import { FileTypeInfo } from './readFileService'; const MAX_THUMBNAIL_DIMENSION = 720; const MIN_COMPRESSION_PERCENTAGE_SIZE_DIFF = 10; @@ -21,15 +23,15 @@ interface Dimension { export async function generateThumbnail( worker, file: globalThis.File, - fileType: FILE_TYPE, - isHEIC: boolean + fileTypeInfo: FileTypeInfo ): Promise<{ thumbnail: Uint8Array; hasStaticThumbnail: boolean }> { try { let hasStaticThumbnail = false; let canvas = document.createElement('canvas'); let thumbnail: Uint8Array; try { - if (fileType === FILE_TYPE.IMAGE) { + if (fileTypeInfo.fileType === FILE_TYPE.IMAGE) { + const isHEIC = fileIsHEIC(fileTypeInfo.exactType); canvas = await generateImageThumbnail(worker, file, isHEIC); } else { try { @@ -38,9 +40,12 @@ export async function generateThumbnail( canvas = await generateImageThumbnail( worker, dummyImageFile, - isHEIC + false ); } catch (e) { + logError(e, 'failed to generate thumbnail using ffmpeg', { + type: fileTypeInfo.exactType, + }); canvas = await generateVideoThumbnail(file); } } @@ -50,7 +55,9 @@ export async function generateThumbnail( throw Error('EMPTY THUMBNAIL'); } } catch (e) { - logError(e, 'uploading static thumbnail'); + logError(e, 'uploading static thumbnail', { + type: fileTypeInfo.exactType, + }); thumbnail = Uint8Array.from(atob(BLACK_THUMBNAIL_BASE64), (c) => c.charCodeAt(0) ); @@ -116,14 +123,7 @@ export async function generateImageThumbnail( } }; timeout = setTimeout( - () => - reject( - Error( - `wait time exceeded for format ${ - file.name.split('.').slice(-1)[0] - }` - ) - ), + () => reject(Error(CustomError.WAIT_TIME_EXCEEDED)), WAIT_TIME_THUMBNAIL_GENERATION ); }); @@ -176,14 +176,7 @@ export async function generateVideoThumbnail(file: globalThis.File) { video.preload = 'metadata'; video.src = videoURL; timeout = setTimeout( - () => - reject( - Error( - `wait time exceeded for format ${ - file.name.split('.').slice(-1)[0] - }` - ) - ), + () => reject(Error(CustomError.WAIT_TIME_EXCEEDED)), WAIT_TIME_THUMBNAIL_GENERATION ); }); diff --git a/src/services/upload/uploadService.ts b/src/services/upload/uploadService.ts index 156bd0d34..a14682772 100644 --- a/src/services/upload/uploadService.ts +++ b/src/services/upload/uploadService.ts @@ -19,7 +19,6 @@ import { uploadStreamUsingMultipart } from './multiPartUploadService'; import UIService from './uiService'; import { handleUploadError } from 'utils/common/errorUtil'; import { MetadataMap } from './uploadManager'; -import { fileIsHEIC } from 'utils/file'; // this is the chunk size of the un-encrypted file which is read and encrypted before uploading it as a single part. export const MULTIPART_PART_SIZE = 20 * 1024 * 1024; @@ -108,13 +107,10 @@ class UploadService { rawFile: globalThis.File, fileTypeInfo: FileTypeInfo ): Promise { - const isHEIC = fileIsHEIC(fileTypeInfo.exactType); - const { thumbnail, hasStaticThumbnail } = await generateThumbnail( worker, rawFile, - fileTypeInfo.fileType, - isHEIC + fileTypeInfo ); const filedata = await getFileData(worker, rawFile); diff --git a/src/utils/common/errorUtil.ts b/src/utils/common/errorUtil.ts index 9bca94c37..664388966 100644 --- a/src/utils/common/errorUtil.ts +++ b/src/utils/common/errorUtil.ts @@ -27,6 +27,7 @@ export enum CustomError { SIGNUP_FAILED = 'signup failed', FAV_COLLECTION_MISSING = 'favorite collection missing', INVALID_COLLECTION_OPERATION = 'invalid collection operation', + WAIT_TIME_EXCEEDED = 'thumbnail generation wait time exceeded', } function parseUploadError(error: AxiosResponse) { From c4dc9926e08e6691df6708fa799d461756f6402c Mon Sep 17 00:00:00 2001 From: Abhinav Date: Wed, 27 Oct 2021 11:43:13 +0530 Subject: [PATCH 080/147] return file extension asexactType if file type detection fails --- src/services/upload/readFileService.ts | 2 +- src/services/upload/uploader.ts | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/services/upload/readFileService.ts b/src/services/upload/readFileService.ts index 5ced23843..3342fd572 100644 --- a/src/services/upload/readFileService.ts +++ b/src/services/upload/readFileService.ts @@ -58,7 +58,7 @@ export async function getFileType( logError(e, CustomError.TYPE_DETECTION_FAILED, { fileFormat, }); - return { fileType: FILE_TYPE.OTHERS, exactType: null }; + return { fileType: FILE_TYPE.OTHERS, exactType: fileFormat }; } } diff --git a/src/services/upload/uploader.ts b/src/services/upload/uploader.ts index 8259e2117..aef8bd962 100644 --- a/src/services/upload/uploader.ts +++ b/src/services/upload/uploader.ts @@ -102,9 +102,9 @@ export default async function uploader( file: decryptedFile, }; } catch (e) { - const fileFormat = - fileTypeInfo.exactType ?? rawFile.name.split('.').pop(); - logError(e, 'file upload failed', { fileFormat }); + logError(e, 'file upload failed', { + fileFormat: fileTypeInfo.exactType, + }); const error = handleUploadError(e); switch (error.message) { case CustomError.ETAG_MISSING: From 58b45715b1f49441638f0306630819f6702c90f6 Mon Sep 17 00:00:00 2001 From: Abhinav Date: Wed, 27 Oct 2021 11:43:59 +0530 Subject: [PATCH 081/147] improve sentry local error logging for development --- src/utils/sentry/index.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/utils/sentry/index.ts b/src/utils/sentry/index.ts index aef44d4e5..dae3f9996 100644 --- a/src/utils/sentry/index.ts +++ b/src/utils/sentry/index.ts @@ -3,13 +3,13 @@ import { errorWithContext } from 'utils/common/errorUtil'; import { getUserAnonymizedID } from 'utils/user'; export const logError = ( - e: any, + error: any, msg: string, info?: Record ) => { - const err = errorWithContext(e, msg); + const err = errorWithContext(error, msg); if (!process.env.NEXT_PUBLIC_SENTRY_ENV) { - console.log(e); + console.log({ error, msg, info }); } Sentry.captureException(err, { level: Sentry.Severity.Info, @@ -18,7 +18,7 @@ export const logError = ( ...(info && { info: info, }), - rootCause: { message: e?.message }, + rootCause: { message: error?.message }, }, }); }; From a980fbd8e1336c4fcf127f45617b6b0725c6bc64 Mon Sep 17 00:00:00 2001 From: Abhinav Date: Wed, 27 Oct 2021 14:05:08 +0530 Subject: [PATCH 082/147] added date time picker --- package.json | 1 + yarn.lock | 123 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 124 insertions(+) diff --git a/package.json b/package.json index 131caabb6..3293e1a3f 100644 --- a/package.json +++ b/package.json @@ -44,6 +44,7 @@ "react-bootstrap": "^1.3.0", "react-burger-menu": "^3.0.4", "react-collapse": "^5.1.0", + "react-datetime-picker": "^3.4.2", "react-dom": "^17.0.2", "react-dropzone": "^11.2.4", "react-otp-input": "^2.3.1", diff --git a/yarn.lock b/yarn.lock index e8ecfc433..496381313 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1468,6 +1468,13 @@ resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.4.tgz#fcf7205c25dff795ee79af1e30da2c9790808f11" integrity sha512-rZ5drC/jWjrArrS8BR6SIr4cWpW09RNTYt9AMZo3Jwwif+iacXAqgVjm0B0Bv/S1jhDXKHqRVNCbACkJ89RAnQ== +"@types/react-calendar@^3.0.0": + version "3.4.3" + resolved "https://registry.yarnpkg.com/@types/react-calendar/-/react-calendar-3.4.3.tgz#f2475519b44a1495562c526556074df947ce5bc6" + integrity sha512-k56OS9d62/g3OCTepULEpNoClVUKuWxHBBuKS4hX8/qNiNup+Gf1Qn0SXHakbqBGWEfdLK93RlIRy5XOA4+Iaw== + dependencies: + "@types/react" "*" + "@types/react-collapse@^5.0.1": version "5.0.1" resolved "https://registry.yarnpkg.com/@types/react-collapse/-/react-collapse-5.0.1.tgz#078ea1ad15e00ba2063f2e4d8d6760c9375a2023" @@ -1675,6 +1682,11 @@ "@typescript-eslint/types" "4.31.0" eslint-visitor-keys "^2.0.0" +"@wojtekmaj/date-utils@^1.0.0", "@wojtekmaj/date-utils@^1.0.2", "@wojtekmaj/date-utils@^1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@wojtekmaj/date-utils/-/date-utils-1.0.3.tgz#2dcfd92881425c5923e429c2aec86fb3609032a1" + integrity sha512-1VPkkTBk07gMR1fjpBtse4G+oJqpmE+0gUFB0dg3VIL7qJmUVaBoD/vlzMm/jNeOPfvlmerl1lpnsZyBUFIRuw== + accepts@~1.3.7: version "1.3.7" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" @@ -2746,6 +2758,11 @@ destroy@~1.0.4: resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= +detect-element-overflow@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/detect-element-overflow/-/detect-element-overflow-1.2.0.tgz#86e504292ffedc3aef813395fbdf0261aaf6afa9" + integrity sha512-Jtr9ivYPhpd9OJux+hjL0QjUKiS1Ghgy8tvIufUjFslQgIWvgGr4mn57H190APbKkiOmXnmtMI6ytaKzMusecg== + diffie-hellman@^5.0.0: version "5.0.3" resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" @@ -3511,6 +3528,13 @@ get-symbol-description@^1.0.0: call-bind "^1.0.2" get-intrinsic "^1.1.1" +get-user-locale@^1.2.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/get-user-locale/-/get-user-locale-1.4.0.tgz#a2c4b5da46feec9f03c9b07d197b1620490a5370" + integrity sha512-gQo03lP1OArHLKlnoglqrGGl7b04u2EP9Xutmp72cMdtrrSD7ZgIsCsUKZynYWLDkVJW33Cj3pliP7uP0UonHQ== + dependencies: + lodash.once "^4.1.1" + glob-parent@^5.1.2, glob-parent@~5.1.0: version "5.1.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" @@ -4340,6 +4364,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.once@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac" + integrity sha1-DdOXEhPHxW34gJd9UEyI+0cal6w= + lodash.sortby@^4.7.0: version "4.7.0" resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" @@ -4421,6 +4450,11 @@ make-dir@^3.0.2: dependencies: semver "^6.0.0" +make-event-props@^1.1.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/make-event-props/-/make-event-props-1.3.0.tgz#2434cb390d58bcf40898d009ef5b1f936de9671b" + integrity sha512-oWiDZMcVB1/A487251hEWza1xzgCzl6MXxe9aF24l5Bt9N9UEbqTqKumEfuuLhmlhRZYnc+suVvW4vUs8bwO7Q== + md5.js@^1.3.4: version "1.3.5" resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" @@ -4440,11 +4474,21 @@ media-typer@0.3.0: resolved "https://registry.yarnpkg.com/memoize-one/-/memoize-one-5.2.1.tgz#8337aa3c4335581839ec01c3d594090cebe8f00e" integrity sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q== +merge-class-names@^1.1.1: + version "1.4.2" + resolved "https://registry.yarnpkg.com/merge-class-names/-/merge-class-names-1.4.2.tgz#78d6d95ab259e7e647252a7988fd25a27d5a8835" + integrity sha512-bOl98VzwCGi25Gcn3xKxnR5p/WrhWFQB59MS/aGENcmUc6iSm96yrFDF0XSNurX9qN4LbJm0R9kfvsQ17i8zCw== + merge-descriptors@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= +merge-refs@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/merge-refs/-/merge-refs-1.0.0.tgz#388348bce22e623782c6df9d3c4fc55888276120" + integrity sha512-WZ4S5wqD9FCR9hxkLgvcHJCBxzXzy3VVE6p8W2OzxRzB+hLRlcadGE2bW9xp2KSzk10rvp4y+pwwKO6JQVguMg== + merge-stream@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" @@ -5295,11 +5339,62 @@ react-burger-menu@^3.0.4: prop-types "^15.7.2" snapsvg-cjs "0.0.6" +react-calendar@^3.3.1: + version "3.4.0" + resolved "https://registry.yarnpkg.com/react-calendar/-/react-calendar-3.4.0.tgz#25396ca0992b3b2042abca334515f6ff4d9878bc" + integrity sha512-ykbvXASArQQ8KZlCEXEdE+w+KFGSj7kDpdTRzbLVJeN26oUIu+EFavFDAqg4G//zTO0tSq5SMfqAa6fjrdGQjQ== + dependencies: + "@wojtekmaj/date-utils" "^1.0.2" + get-user-locale "^1.2.0" + merge-class-names "^1.1.1" + prop-types "^15.6.0" + +react-clock@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/react-clock/-/react-clock-3.0.0.tgz#0d29f8e682ef516574061d1d24b1a286cb2da89b" + integrity sha512-D3K82D3YGcDtzxZCfiACLcDTL8cJXSgpdrzTY9ff3H5vflxlLzTSLF8apZRo6JZzOFrZQvw5mrS7TkQzj9nG0A== + dependencies: + "@wojtekmaj/date-utils" "^1.0.0" + merge-class-names "^1.1.1" + prop-types "^15.6.0" + react-collapse@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/react-collapse/-/react-collapse-5.1.0.tgz#36f69ecb0fe797f976aaf5e4f2b2c248d2760140" integrity sha512-5v0ywsn9HjiR/odNzbRDs0RZfrnbdSippJebWOBCFFDA12Vx8DddrbI4qWVf1P2wTiVagrpcSy07AU0b6+gM9Q== +react-date-picker@^8.3.3: + version "8.3.4" + resolved "https://registry.yarnpkg.com/react-date-picker/-/react-date-picker-8.3.4.tgz#6445d4c2c3cddc0f073928851f598abe3a9fd76a" + integrity sha512-6DdeMjg5ji1W2ZBMADhDhOipZndAey24yQyUIIfMXKOOuehcnmb5MuGuGmdqd4zzMmktyGTIzf51c2E3u2P+7Q== + dependencies: + "@types/react-calendar" "^3.0.0" + "@wojtekmaj/date-utils" "^1.0.3" + get-user-locale "^1.2.0" + make-event-props "^1.1.0" + merge-class-names "^1.1.1" + merge-refs "^1.0.0" + prop-types "^15.6.0" + react-calendar "^3.3.1" + react-fit "^1.0.3" + update-input-width "^1.2.2" + +react-datetime-picker@^3.4.2: + version "3.4.2" + resolved "https://registry.yarnpkg.com/react-datetime-picker/-/react-datetime-picker-3.4.2.tgz#0a6620b82354a9096766394f0411d76655fb26b4" + integrity sha512-i/Iw7Qbz8Zl0Bo3rMbHQ1+dnWtImNexF8Nh+bsKxaK6wFTmpE1l8ugTGHDKT8gbZ2DRtzscjSMC/LVz/gIE8DA== + dependencies: + "@wojtekmaj/date-utils" "^1.0.3" + get-user-locale "^1.2.0" + make-event-props "^1.1.0" + merge-class-names "^1.1.1" + prop-types "^15.6.0" + react-calendar "^3.3.1" + react-clock "^3.0.0" + react-date-picker "^8.3.3" + react-fit "^1.0.3" + react-time-picker "^4.4.2" + react-dom@^17.0.2: version "17.0.2" resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-17.0.2.tgz#ecffb6845e3ad8dbfcdc498f0d0a939736502c23" @@ -5323,6 +5418,14 @@ react-fast-compare@^2.0.1: resolved "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-2.0.4.tgz#e84b4d455b0fec113e0402c329352715196f81f9" integrity sha512-suNP+J1VU1MWFKcyt7RtjiSWUjvidmQSlqu+eHslq+342xCbGTYmC0mEhPCOHxlW0CywylOC1u2DFAT+bv4dBw== +react-fit@^1.0.3: + version "1.3.2" + resolved "https://registry.yarnpkg.com/react-fit/-/react-fit-1.3.2.tgz#dea734d1dbe4d540037a766c316ae7a4141cf421" + integrity sha512-Ih/ee8/I/N6EcGZjOqfo/yFq6Q/xuZ62uai21rMyud208ixx8V5xJxuRLIxedLcwNAEtyyEPEJ2Y47qeKljQHA== + dependencies: + detect-element-overflow "^1.2.0" + prop-types "^15.6.0" + react-input-autosize@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/react-input-autosize/-/react-input-autosize-3.0.0.tgz#6b5898c790d4478d69420b55441fcc31d5c50a85" @@ -5382,6 +5485,21 @@ react-select@^4.3.1: react-input-autosize "^3.0.0" react-transition-group "^4.3.0" +react-time-picker@^4.4.2: + version "4.4.3" + resolved "https://registry.yarnpkg.com/react-time-picker/-/react-time-picker-4.4.3.tgz#1b27a3288b8f290ae2aa08a5232a6b92968137f1" + integrity sha512-YnEC9Qpbgy1fWBbjzM89LJ8O81G33MXSM8dUsEpSJXQSSHnEQ/kYEytWCnmi7joXGzBUOzHLRK6mxkgJnoL4zQ== + dependencies: + "@wojtekmaj/date-utils" "^1.0.0" + get-user-locale "^1.2.0" + make-event-props "^1.1.0" + merge-class-names "^1.1.1" + merge-refs "^1.0.0" + prop-types "^15.6.0" + react-clock "^3.0.0" + react-fit "^1.0.3" + update-input-width "^1.2.2" + react-top-loading-bar@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/react-top-loading-bar/-/react-top-loading-bar-2.0.1.tgz#c8805ad9c1068766fdd3cadd414e67cfdf1878e9" @@ -6473,6 +6591,11 @@ upath@^1.1.2, upath@^1.2.0: resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== +update-input-width@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/update-input-width/-/update-input-width-1.2.2.tgz#9a6a35858ae8e66fbfe0304437b23a4934fc7d37" + integrity sha512-6QwD9ZVSXb96PxOZ01DU0DJTPwQGY7qBYgdniZKJN02Xzom2m+9J6EPxMbefskqtj4x78qbe5psDSALq9iNEYg== + uri-js@^4.2.2: version "4.4.1" resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" From 6d5ae6010f421f4261b165cd756b18c1b06f186a Mon Sep 17 00:00:00 2001 From: Abhinav Date: Wed, 27 Oct 2021 14:05:17 +0530 Subject: [PATCH 083/147] added edit icon --- src/components/icons/EditIcon.tsx | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 src/components/icons/EditIcon.tsx diff --git a/src/components/icons/EditIcon.tsx b/src/components/icons/EditIcon.tsx new file mode 100644 index 000000000..ea96a862e --- /dev/null +++ b/src/components/icons/EditIcon.tsx @@ -0,0 +1,20 @@ +import React from 'react'; + +export default function AddIcon(props) { + return ( + + + + ); +} + +AddIcon.defaultProps = { + height: 24, + width: 24, + viewBox: '0 0 24 24', +}; From a9d88c9b8f2c0846e43848c1b2438ceef606fad3 Mon Sep 17 00:00:00 2001 From: Abhinav Date: Thu, 28 Oct 2021 12:12:13 +0530 Subject: [PATCH 084/147] remove console logs --- src/components/PhotoFrame.tsx | 1 - src/components/pages/gallery/PreviewCard.tsx | 1 - 2 files changed, 2 deletions(-) diff --git a/src/components/PhotoFrame.tsx b/src/components/PhotoFrame.tsx index 9aba1ec90..adc6abfe4 100644 --- a/src/components/PhotoFrame.tsx +++ b/src/components/PhotoFrame.tsx @@ -339,7 +339,6 @@ const PhotoFrame = ({ } } }; - console.log('re-render gallery'); const getThumbnail = (file: File[], index: number) => ( Date: Thu, 28 Oct 2021 12:12:49 +0530 Subject: [PATCH 085/147] put filteredData inside useEffect --- src/components/PhotoFrame.tsx | 104 ++++++++++++++++++---------------- 1 file changed, 55 insertions(+), 49 deletions(-) diff --git a/src/components/PhotoFrame.tsx b/src/components/PhotoFrame.tsx index adc6abfe4..8fdec7037 100644 --- a/src/components/PhotoFrame.tsx +++ b/src/components/PhotoFrame.tsx @@ -182,7 +182,8 @@ const PhotoFrame = ({ const [rangeStart, setRangeStart] = useState(null); const [currentHover, setCurrentHover] = useState(null); const [isShiftKeyPressed, setIsShiftKeyPressed] = useState(false); - + const filteredDataRef = useRef([]); + const filteredData = filteredDataRef?.current ?? []; useEffect(() => { const handleKeyDown = (e: KeyboardEvent) => { if (e.key === 'Shift') { @@ -230,6 +231,59 @@ const PhotoFrame = ({ } }, [selected]); + useEffect(() => { + const idSet = new Set(); + filteredDataRef.current = files + .map((item, index) => ({ + ...item, + dataIndex: index, + })) + .filter((item) => { + if (deleted.includes(item.id)) { + return false; + } + if ( + search.date && + !isSameDayAnyYear(search.date)( + new Date(item.metadata.creationTime / 1000) + ) + ) { + return false; + } + if ( + search.location && + !isInsideBox(item.metadata, search.location) + ) { + return false; + } + if (activeCollection === ALL_SECTION && fileIsArchived(item)) { + return false; + } + if ( + activeCollection === ARCHIVE_SECTION && + !fileIsArchived(item) + ) { + return false; + } + + if (isSharedFile(item) && !isSharedCollection) { + return false; + } + if (!idSet.has(item.id)) { + if ( + activeCollection === ALL_SECTION || + activeCollection === ARCHIVE_SECTION || + activeCollection === item.collectionID + ) { + idSet.add(item.id); + return true; + } + return false; + } + return false; + }); + }, [files, deleted, search, activeCollection]); + const updateUrl = (index: number) => (url: string) => { files[index] = { ...files[index], @@ -412,54 +466,6 @@ const PhotoFrame = ({ } }; - const idSet = new Set(); - const filteredData = files - .map((item, index) => ({ - ...item, - dataIndex: index, - })) - .filter((item) => { - if (deleted.includes(item.id)) { - return false; - } - if ( - search.date && - !isSameDayAnyYear(search.date)( - new Date(item.metadata.creationTime / 1000) - ) - ) { - return false; - } - if ( - search.location && - !isInsideBox(item.metadata, search.location) - ) { - return false; - } - if (activeCollection === ALL_SECTION && fileIsArchived(item)) { - return false; - } - if (activeCollection === ARCHIVE_SECTION && !fileIsArchived(item)) { - return false; - } - - if (isSharedFile(item) && !isSharedCollection) { - return false; - } - if (!idSet.has(item.id)) { - if ( - activeCollection === ALL_SECTION || - activeCollection === ARCHIVE_SECTION || - activeCollection === item.collectionID - ) { - idSet.add(item.id); - return true; - } - return false; - } - return false; - }); - const isSameDay = (first, second) => first.getFullYear() === second.getFullYear() && first.getMonth() === second.getMonth() && From 98f1f9c388cb189be6f36403a7ec38513dcb14b3 Mon Sep 17 00:00:00 2001 From: Abhinav Date: Thu, 28 Oct 2021 13:33:01 +0530 Subject: [PATCH 086/147] refactor PhotoFrame to PhotoWall and PhotoList --- src/components/PhotoFrame.tsx | 806 ---------------------------------- src/components/PhotoList.tsx | 356 +++++++++++++++ src/components/PhotoWall.tsx | 441 +++++++++++++++++++ src/pages/gallery/index.tsx | 2 +- 4 files changed, 798 insertions(+), 807 deletions(-) delete mode 100644 src/components/PhotoFrame.tsx create mode 100644 src/components/PhotoList.tsx create mode 100644 src/components/PhotoWall.tsx diff --git a/src/components/PhotoFrame.tsx b/src/components/PhotoFrame.tsx deleted file mode 100644 index 8fdec7037..000000000 --- a/src/components/PhotoFrame.tsx +++ /dev/null @@ -1,806 +0,0 @@ -import { - DeadCenter, - GalleryContext, - Search, - SelectedState, - SetFiles, - setSearchStats, -} from 'pages/gallery'; -import PreviewCard from './pages/gallery/PreviewCard'; -import React, { useContext, useEffect, useRef, useState } from 'react'; -import { Button } from 'react-bootstrap'; -import { File, FILE_TYPE } from 'services/fileService'; -import styled from 'styled-components'; -import DownloadManager from 'services/downloadManager'; -import constants from 'utils/strings/constants'; -import AutoSizer from 'react-virtualized-auto-sizer'; -import { VariableSizeList as List } from 'react-window'; -import PhotoSwipe from 'components/PhotoSwipe/PhotoSwipe'; -import { isInsideBox, isSameDay as isSameDayAnyYear } from 'utils/search'; -import { SetDialogMessage } from './MessageDialog'; -import { - GAP_BTW_TILES, - DATE_CONTAINER_HEIGHT, - IMAGE_CONTAINER_MAX_HEIGHT, - IMAGE_CONTAINER_MAX_WIDTH, - MIN_COLUMNS, - SPACE_BTW_DATES, -} from 'types'; -import { fileIsArchived } from 'utils/file'; -import { ALL_SECTION, ARCHIVE_SECTION } from './pages/gallery/Collections'; -import { isSharedFile } from 'utils/file'; -import { isPlaybackPossible } from 'utils/photoFrame'; - -const NO_OF_PAGES = 2; -const A_DAY = 24 * 60 * 60 * 1000; - -interface TimeStampListItem { - itemType: ITEM_TYPE; - items?: File[]; - itemStartIndex?: number; - date?: string; - dates?: { - date: string; - span: number; - }[]; - groups?: number[]; - banner?: any; - id?: string; - height?: number; -} - -const Container = styled.div` - display: block; - flex: 1; - width: 100%; - flex-wrap: wrap; - margin: 0 auto; - overflow-x: hidden; - .pswp-thumbnail { - display: inline-block; - cursor: pointer; - } -`; - -const ListItem = styled.div` - display: flex; - justify-content: center; -`; - -const getTemplateColumns = (columns: number, groups?: number[]): string => { - if (groups) { - const sum = groups.reduce((acc, item) => acc + item, 0); - if (sum < columns) { - groups[groups.length - 1] += columns - sum; - } - return groups - .map((x) => `repeat(${x}, 1fr)`) - .join(` ${SPACE_BTW_DATES}px `); - } else { - return `repeat(${columns}, 1fr)`; - } -}; - -const ListContainer = styled.div<{ columns: number; groups?: number[] }>` - user-select: none; - display: grid; - grid-template-columns: ${({ columns, groups }) => - getTemplateColumns(columns, groups)}; - grid-column-gap: ${GAP_BTW_TILES}px; - padding: 0 24px; - width: 100%; - color: #fff; - - @media (max-width: ${IMAGE_CONTAINER_MAX_WIDTH * 4}px) { - padding: 0 4px; - } -`; - -const DateContainer = styled.div<{ span: number }>` - user-select: none; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - grid-column: span ${(props) => props.span}; - display: flex; - align-items: center; - height: ${DATE_CONTAINER_HEIGHT}px; -`; - -const BannerContainer = styled.div<{ span: number }>` - color: #979797; - text-align: center; - grid-column: span ${(props) => props.span}; - display: flex; - justify-content: center; - align-items: flex-end; -`; - -const EmptyScreen = styled.div` - display: flex; - justify-content: center; - align-items: center; - flex-direction: column; - flex: 1; - color: #51cd7c; - - & > svg { - filter: drop-shadow(3px 3px 5px rgba(45, 194, 98, 0.5)); - } -`; - -enum ITEM_TYPE { - TIME = 'TIME', - TILE = 'TILE', - BANNER = 'BANNER', -} - -interface Props { - files: File[]; - setFiles: SetFiles; - syncWithRemote: () => Promise; - favItemIds: Set; - setSelected: ( - selected: SelectedState | ((selected: SelectedState) => SelectedState) - ) => void; - selected: SelectedState; - isFirstLoad; - openFileUploader; - loadingBar; - isInSearchMode: boolean; - search: Search; - setSearchStats: setSearchStats; - deleted?: number[]; - setDialogMessage: SetDialogMessage; - activeCollection: number; - isSharedCollection: boolean; -} - -const PhotoFrame = ({ - files, - setFiles, - syncWithRemote, - favItemIds, - setSelected, - selected, - isFirstLoad, - openFileUploader, - loadingBar, - isInSearchMode, - search, - setSearchStats, - deleted, - activeCollection, - isSharedCollection, -}: Props) => { - const [open, setOpen] = useState(false); - const [currentIndex, setCurrentIndex] = useState(0); - const [fetching, setFetching] = useState<{ [k: number]: boolean }>({}); - const startTime = Date.now(); - const galleryContext = useContext(GalleryContext); - const listRef = useRef(null); - const [rangeStart, setRangeStart] = useState(null); - const [currentHover, setCurrentHover] = useState(null); - const [isShiftKeyPressed, setIsShiftKeyPressed] = useState(false); - const filteredDataRef = useRef([]); - const filteredData = filteredDataRef?.current ?? []; - useEffect(() => { - const handleKeyDown = (e: KeyboardEvent) => { - if (e.key === 'Shift') { - setIsShiftKeyPressed(true); - } - }; - const handleKeyUp = (e: KeyboardEvent) => { - if (e.key === 'Shift') { - setIsShiftKeyPressed(false); - } - }; - document.addEventListener('keydown', handleKeyDown, false); - document.addEventListener('keyup', handleKeyUp, false); - return () => { - document.addEventListener('keydown', handleKeyDown, false); - document.addEventListener('keyup', handleKeyUp, false); - }; - }, []); - - useEffect(() => { - if (isInSearchMode) { - setSearchStats({ - resultCount: filteredData.length, - timeTaken: (Date.now() - startTime) / 1000, - }); - } - if (search.fileIndex || search.fileIndex === 0) { - const filteredDataIdx = filteredData.findIndex( - (data) => data.dataIndex === search.fileIndex - ); - if (filteredDataIdx || filteredDataIdx === 0) { - onThumbnailClick(filteredDataIdx)(); - } - } - }, [search]); - - useEffect(() => { - listRef.current?.resetAfterIndex(0); - setFetching({}); - }, [files, search, deleted]); - - useEffect(() => { - if (selected.count === 0) { - setRangeStart(null); - } - }, [selected]); - - useEffect(() => { - const idSet = new Set(); - filteredDataRef.current = files - .map((item, index) => ({ - ...item, - dataIndex: index, - })) - .filter((item) => { - if (deleted.includes(item.id)) { - return false; - } - if ( - search.date && - !isSameDayAnyYear(search.date)( - new Date(item.metadata.creationTime / 1000) - ) - ) { - return false; - } - if ( - search.location && - !isInsideBox(item.metadata, search.location) - ) { - return false; - } - if (activeCollection === ALL_SECTION && fileIsArchived(item)) { - return false; - } - if ( - activeCollection === ARCHIVE_SECTION && - !fileIsArchived(item) - ) { - return false; - } - - if (isSharedFile(item) && !isSharedCollection) { - return false; - } - if (!idSet.has(item.id)) { - if ( - activeCollection === ALL_SECTION || - activeCollection === ARCHIVE_SECTION || - activeCollection === item.collectionID - ) { - idSet.add(item.id); - return true; - } - return false; - } - return false; - }); - }, [files, deleted, search, activeCollection]); - - const updateUrl = (index: number) => (url: string) => { - files[index] = { - ...files[index], - msrc: url, - src: files[index].src ? files[index].src : url, - w: window.innerWidth, - h: window.innerHeight, - }; - if ( - files[index].metadata.fileType === FILE_TYPE.VIDEO && - !files[index].html - ) { - files[index].html = ` -
- -
- Loading... -
-
- `; - delete files[index].src; - } - if ( - files[index].metadata.fileType === FILE_TYPE.IMAGE && - !files[index].src - ) { - files[index].src = url; - } - setFiles(files); - }; - - const updateSrcUrl = async (index: number, url: string) => { - files[index] = { - ...files[index], - w: window.innerWidth, - h: window.innerHeight, - }; - if (files[index].metadata.fileType === FILE_TYPE.VIDEO) { - if (await isPlaybackPossible(url)) { - files[index].html = ` - - `; - } else { - files[index].html = ` -
- -
- ${constants.VIDEO_PLAYBACK_FAILED_DOWNLOAD_INSTEAD} - Download -
-
- `; - } - } else { - files[index].src = url; - } - setFiles(files); - }; - - const handleClose = (needUpdate) => { - setOpen(false); - needUpdate && syncWithRemote(); - }; - - const onThumbnailClick = (index: number) => () => { - setCurrentIndex(index); - setOpen(true); - }; - - const handleSelect = (id: number, index?: number) => (checked: boolean) => { - if (selected.collectionID !== activeCollection) { - setSelected({ count: 0, collectionID: 0 }); - } - if (rangeStart || rangeStart === 0) { - setRangeStart(null); - } else if (checked) { - setRangeStart(index); - } - - setSelected((selected) => ({ - ...selected, - [id]: checked, - count: checked ? selected.count + 1 : selected.count - 1, - collectionID: activeCollection, - })); - }; - const onHoverOver = (index: number) => () => { - setCurrentHover(index); - }; - - const handleRangeSelect = (index: number) => () => { - if (rangeStart !== index) { - let leftEnd = -1; - let rightEnd = -1; - if (index < rangeStart) { - leftEnd = index; - rightEnd = rangeStart; - } else { - leftEnd = rangeStart; - rightEnd = index; - } - for (let i = leftEnd; i <= rightEnd; i++) { - handleSelect(filteredData[i].id)(true); - } - } - }; - const getThumbnail = (file: File[], index: number) => ( - 0} - onHover={onHoverOver(index)} - onRangeSelect={handleRangeSelect(index)} - isRangeSelectActive={ - isShiftKeyPressed && (rangeStart || rangeStart === 0) - } - isInsSelectRange={ - (index >= rangeStart + 1 && index <= currentHover) || - (index >= currentHover && index <= rangeStart - 1) - } - /> - ); - - const getSlideData = async (instance: any, index: number, item: File) => { - if (!item.msrc) { - let url: string; - if (galleryContext.thumbs.has(item.id)) { - url = galleryContext.thumbs.get(item.id); - } else { - url = await DownloadManager.getPreview(item); - galleryContext.thumbs.set(item.id, url); - } - updateUrl(item.dataIndex)(url); - item.msrc = url; - if (!item.src) { - item.src = url; - } - item.w = window.innerWidth; - item.h = window.innerHeight; - try { - instance.invalidateCurrItems(); - instance.updateSize(true); - } catch (e) { - // ignore - } - } - if (!fetching[item.dataIndex]) { - fetching[item.dataIndex] = true; - let url: string; - if (galleryContext.files.has(item.id)) { - url = galleryContext.files.get(item.id); - } else { - url = await DownloadManager.getFile(item, true); - galleryContext.files.set(item.id, url); - } - await updateSrcUrl(item.dataIndex, url); - item.html = files[item.dataIndex].html; - item.src = files[item.dataIndex].src; - item.w = files[item.dataIndex].w; - item.h = files[item.dataIndex].h; - try { - instance.invalidateCurrItems(); - instance.updateSize(true); - } catch (e) { - // ignore - } - } - }; - - const isSameDay = (first, second) => - first.getFullYear() === second.getFullYear() && - first.getMonth() === second.getMonth() && - first.getDate() === second.getDate(); - - /** - * Checks and merge multiple dates into a single row. - * - * @param items - * @param columns - * @returns - */ - const mergeTimeStampList = ( - items: TimeStampListItem[], - columns: number - ): TimeStampListItem[] => { - const newList: TimeStampListItem[] = []; - let index = 0; - let newIndex = 0; - while (index < items.length) { - const currItem = items[index]; - // If the current item is of type time, then it is not part of an ongoing date. - // So, there is a possibility of merge. - if (currItem.itemType === ITEM_TYPE.TIME) { - // If new list pointer is not at the end of list then - // we can add more items to the same list. - if (newList[newIndex]) { - // Check if items can be added to same list - if ( - newList[newIndex + 1].items.length + - items[index + 1].items.length <= - columns - ) { - newList[newIndex].dates.push({ - date: currItem.date, - span: items[index + 1].items.length, - }); - newList[newIndex + 1].items = newList[ - newIndex + 1 - ].items.concat(items[index + 1].items); - index += 2; - } else { - // Adding items would exceed the number of columns. - // So, move new list pointer to the end. Hence, in next iteration, - // items will be added to a new list. - newIndex += 2; - } - } else { - // New list pointer was at the end of list so simply add new items to the list. - newList.push({ - ...currItem, - date: null, - dates: [ - { - date: currItem.date, - span: items[index + 1].items.length, - }, - ], - }); - newList.push(items[index + 1]); - index += 2; - } - } else { - // Merge cannot happen. Simply add all items to new list - // and set new list point to the end of list. - newList.push(currItem); - index++; - newIndex = newList.length; - } - } - for (let i = 0; i < newList.length; i++) { - const currItem = newList[i]; - const nextItem = newList[i + 1]; - if (currItem.itemType === ITEM_TYPE.TIME) { - if (currItem.dates.length > 1) { - currItem.groups = currItem.dates.map((item) => item.span); - nextItem.groups = currItem.groups; - } - } - } - return newList; - }; - - return ( - <> - {!isFirstLoad && files.length === 0 && !isInSearchMode ? ( - - -
- {constants.UPLOAD_FIRST_PHOTO_DESCRIPTION} -
- -
- ) : filteredData.length ? ( - - - {({ height, width }) => { - let columns = Math.floor( - width / IMAGE_CONTAINER_MAX_WIDTH - ); - let listItemHeight = IMAGE_CONTAINER_MAX_HEIGHT; - let skipMerge = false; - if (columns < MIN_COLUMNS) { - columns = MIN_COLUMNS; - listItemHeight = width / MIN_COLUMNS; - skipMerge = true; - } - - let timeStampList: TimeStampListItem[] = []; - let listItemIndex = 0; - let currentDate = -1; - filteredData.forEach((item, index) => { - if ( - !isSameDay( - new Date( - item.metadata.creationTime / 1000 - ), - new Date(currentDate) - ) - ) { - currentDate = - item.metadata.creationTime / 1000; - const dateTimeFormat = - new Intl.DateTimeFormat('en-IN', { - weekday: 'short', - year: 'numeric', - month: 'short', - day: 'numeric', - }); - timeStampList.push({ - itemType: ITEM_TYPE.TIME, - date: isSameDay( - new Date(currentDate), - new Date() - ) - ? 'Today' - : isSameDay( - new Date(currentDate), - new Date(Date.now() - A_DAY) - ) - ? 'Yesterday' - : dateTimeFormat.format( - currentDate - ), - id: currentDate.toString(), - }); - timeStampList.push({ - itemType: ITEM_TYPE.TILE, - items: [item], - itemStartIndex: index, - }); - listItemIndex = 1; - } else if (listItemIndex < columns) { - timeStampList[ - timeStampList.length - 1 - ].items.push(item); - listItemIndex++; - } else { - listItemIndex = 1; - timeStampList.push({ - itemType: ITEM_TYPE.TILE, - items: [item], - itemStartIndex: index, - }); - } - }); - - if (!skipMerge) { - timeStampList = mergeTimeStampList( - timeStampList, - columns - ); - } - - const getItemSize = (index) => { - switch (timeStampList[index].itemType) { - case ITEM_TYPE.TIME: - return DATE_CONTAINER_HEIGHT; - case ITEM_TYPE.TILE: - return listItemHeight; - default: - return timeStampList[index].height; - } - }; - - const photoFrameHeight = (() => { - let sum = 0; - for (let i = 0; i < timeStampList.length; i++) { - sum += getItemSize(i); - } - return sum; - })(); - files.length < 30 && - !isInSearchMode && - timeStampList.push({ - itemType: ITEM_TYPE.BANNER, - banner: ( - -

- {constants.INSTALL_MOBILE_APP()} -

-
- ), - id: 'install-banner', - height: Math.max( - 48, - height - photoFrameHeight - ), - }); - const extraRowsToRender = Math.ceil( - (NO_OF_PAGES * height) / - IMAGE_CONTAINER_MAX_HEIGHT - ); - - const generateKey = (index) => { - switch (timeStampList[index].itemType) { - case ITEM_TYPE.TILE: - return `${ - timeStampList[index].items[0].id - }-${ - timeStampList[index].items.slice( - -1 - )[0].id - }`; - default: - return `${timeStampList[index].id}-${index}`; - } - }; - - const renderListItem = ( - listItem: TimeStampListItem - ) => { - switch (listItem.itemType) { - case ITEM_TYPE.TIME: - return listItem.dates ? ( - listItem.dates.map((item) => ( - <> - - {item.date} - -
- - )) - ) : ( - - {listItem.date} - - ); - case ITEM_TYPE.BANNER: - return listItem.banner; - default: { - const ret = listItem.items.map( - (item, idx) => - getThumbnail( - filteredData, - listItem.itemStartIndex + - idx - ) - ); - if (listItem.groups) { - let sum = 0; - for ( - let i = 0; - i < listItem.groups.length - 1; - i++ - ) { - sum = sum + listItem.groups[i]; - ret.splice(sum, 0,
); - sum += 1; - } - } - return ret; - } - } - }; - - return ( - - {({ index, style }) => ( - - - {renderListItem( - timeStampList[index] - )} - - - )} - - ); - }} - - - - ) : ( - -
{constants.NOTHING_HERE}
-
- )} - - ); -}; - -export default PhotoFrame; diff --git a/src/components/PhotoList.tsx b/src/components/PhotoList.tsx new file mode 100644 index 000000000..477e7634b --- /dev/null +++ b/src/components/PhotoList.tsx @@ -0,0 +1,356 @@ +import React, { useRef, useEffect } from 'react'; +import { VariableSizeList as List } from 'react-window'; +import styled from 'styled-components'; + +import { + IMAGE_CONTAINER_MAX_WIDTH, + IMAGE_CONTAINER_MAX_HEIGHT, + MIN_COLUMNS, + DATE_CONTAINER_HEIGHT, + GAP_BTW_TILES, + SPACE_BTW_DATES, +} from 'types'; +import constants from 'utils/strings/constants'; + +const A_DAY = 24 * 60 * 60 * 1000; +const NO_OF_PAGES = 2; + +enum ITEM_TYPE { + TIME = 'TIME', + TILE = 'TILE', + BANNER = 'BANNER', +} + +interface TimeStampListItem { + itemType: ITEM_TYPE; + items?: File[]; + itemStartIndex?: number; + date?: string; + dates?: { + date: string; + span: number; + }[]; + groups?: number[]; + banner?: any; + id?: string; + height?: number; +} + +const ListItem = styled.div` + display: flex; + justify-content: center; +`; + +const getTemplateColumns = (columns: number, groups?: number[]): string => { + if (groups) { + const sum = groups.reduce((acc, item) => acc + item, 0); + if (sum < columns) { + groups[groups.length - 1] += columns - sum; + } + return groups + .map((x) => `repeat(${x}, 1fr)`) + .join(` ${SPACE_BTW_DATES}px `); + } else { + return `repeat(${columns}, 1fr)`; + } +}; + +const ListContainer = styled.div<{ columns: number; groups?: number[] }>` + user-select: none; + display: grid; + grid-template-columns: ${({ columns, groups }) => + getTemplateColumns(columns, groups)}; + grid-column-gap: ${GAP_BTW_TILES}px; + padding: 0 24px; + width: 100%; + color: #fff; + + @media (max-width: ${IMAGE_CONTAINER_MAX_WIDTH * 4}px) { + padding: 0 4px; + } +`; + +const DateContainer = styled.div<{ span: number }>` + user-select: none; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + grid-column: span ${(props) => props.span}; + display: flex; + align-items: center; + height: ${DATE_CONTAINER_HEIGHT}px; +`; + +const BannerContainer = styled.div<{ span: number }>` + color: #979797; + text-align: center; + grid-column: span ${(props) => props.span}; + display: flex; + justify-content: center; + align-items: flex-end; +`; + +export function PhotoList({ + height, + width, + filteredData, + showBanner, + getThumbnail, + activeCollection, +}) { + let columns = Math.floor(width / IMAGE_CONTAINER_MAX_WIDTH); + let listItemHeight = IMAGE_CONTAINER_MAX_HEIGHT; + const timeStampListRef = useRef([]); + const timeStampList = timeStampListRef?.current ?? []; + useEffect(() => { + let skipMerge = false; + if (columns < MIN_COLUMNS) { + columns = MIN_COLUMNS; + listItemHeight = width / MIN_COLUMNS; + skipMerge = true; + } + + let timeStampList: TimeStampListItem[] = []; + let listItemIndex = 0; + let currentDate = -1; + + filteredData.forEach((item, index) => { + if ( + !isSameDay( + new Date(item.metadata.creationTime / 1000), + new Date(currentDate) + ) + ) { + currentDate = item.metadata.creationTime / 1000; + const dateTimeFormat = new Intl.DateTimeFormat('en-IN', { + weekday: 'short', + year: 'numeric', + month: 'short', + day: 'numeric', + }); + timeStampList.push({ + itemType: ITEM_TYPE.TIME, + date: isSameDay(new Date(currentDate), new Date()) + ? 'Today' + : isSameDay( + new Date(currentDate), + new Date(Date.now() - A_DAY) + ) + ? 'Yesterday' + : dateTimeFormat.format(currentDate), + id: currentDate.toString(), + }); + timeStampList.push({ + itemType: ITEM_TYPE.TILE, + items: [item], + itemStartIndex: index, + }); + listItemIndex = 1; + } else if (listItemIndex < columns) { + timeStampList[timeStampList.length - 1].items.push(item); + listItemIndex++; + } else { + listItemIndex = 1; + timeStampList.push({ + itemType: ITEM_TYPE.TILE, + items: [item], + itemStartIndex: index, + }); + } + }); + + if (!skipMerge) { + timeStampList = mergeTimeStampList(timeStampList, columns); + } + + showBanner && appendBanner(); + + timeStampListRef.current = timeStampList; + }, [width, height, filteredData, showBanner]); + + const isSameDay = (first, second) => + first.getFullYear() === second.getFullYear() && + first.getMonth() === second.getMonth() && + first.getDate() === second.getDate(); + + const appendBanner = () => { + const photoFrameHeight = (() => { + let sum = 0; + for (let i = 0; i < timeStampList.length; i++) { + sum += getItemSize(i); + } + return sum; + })(); + timeStampList.push({ + itemType: ITEM_TYPE.BANNER, + banner: ( + +

{constants.INSTALL_MOBILE_APP()}

+
+ ), + id: 'install-banner', + height: Math.max(48, height - photoFrameHeight), + }); + }; + /** + * Checks and merge multiple dates into a single row. + * + * @param items + * @param columns + * @returns + */ + const mergeTimeStampList = ( + items: TimeStampListItem[], + columns: number + ): TimeStampListItem[] => { + const newList: TimeStampListItem[] = []; + let index = 0; + let newIndex = 0; + while (index < items.length) { + const currItem = items[index]; + // If the current item is of type time, then it is not part of an ongoing date. + // So, there is a possibility of merge. + if (currItem.itemType === ITEM_TYPE.TIME) { + // If new list pointer is not at the end of list then + // we can add more items to the same list. + if (newList[newIndex]) { + // Check if items can be added to same list + if ( + newList[newIndex + 1].items.length + + items[index + 1].items.length <= + columns + ) { + newList[newIndex].dates.push({ + date: currItem.date, + span: items[index + 1].items.length, + }); + newList[newIndex + 1].items = newList[ + newIndex + 1 + ].items.concat(items[index + 1].items); + index += 2; + } else { + // Adding items would exceed the number of columns. + // So, move new list pointer to the end. Hence, in next iteration, + // items will be added to a new list. + newIndex += 2; + } + } else { + // New list pointer was at the end of list so simply add new items to the list. + newList.push({ + ...currItem, + date: null, + dates: [ + { + date: currItem.date, + span: items[index + 1].items.length, + }, + ], + }); + newList.push(items[index + 1]); + index += 2; + } + } else { + // Merge cannot happen. Simply add all items to new list + // and set new list point to the end of list. + newList.push(currItem); + index++; + newIndex = newList.length; + } + } + for (let i = 0; i < newList.length; i++) { + const currItem = newList[i]; + const nextItem = newList[i + 1]; + if (currItem.itemType === ITEM_TYPE.TIME) { + if (currItem.dates.length > 1) { + currItem.groups = currItem.dates.map((item) => item.span); + nextItem.groups = currItem.groups; + } + } + } + return newList; + }; + + const getItemSize = (index) => { + switch (timeStampList[index].itemType) { + case ITEM_TYPE.TIME: + return DATE_CONTAINER_HEIGHT; + case ITEM_TYPE.TILE: + return listItemHeight; + default: + return timeStampList[index].height; + } + }; + + const extraRowsToRender = Math.ceil( + (NO_OF_PAGES * height) / IMAGE_CONTAINER_MAX_HEIGHT + ); + + const generateKey = (index) => { + switch (timeStampList[index].itemType) { + case ITEM_TYPE.TILE: + return `${timeStampList[index].items[0].id}-${ + timeStampList[index].items.slice(-1)[0].id + }`; + default: + return `${timeStampList[index].id}-${index}`; + } + }; + + const renderListItem = (listItem: TimeStampListItem) => { + switch (listItem.itemType) { + case ITEM_TYPE.TIME: + return listItem.dates ? ( + listItem.dates.map((item) => ( + <> + + {item.date} + +
+ + )) + ) : ( + + {listItem.date} + + ); + case ITEM_TYPE.BANNER: + return listItem.banner; + default: { + const ret = listItem.items.map((item, idx) => + getThumbnail(filteredData, listItem.itemStartIndex + idx) + ); + if (listItem.groups) { + let sum = 0; + for (let i = 0; i < listItem.groups.length - 1; i++) { + sum = sum + listItem.groups[i]; + ret.splice(sum, 0,
); + sum += 1; + } + } + return ret; + } + } + }; + + return ( + + {({ index, style }) => ( + + + {renderListItem(timeStampList[index])} + + + )} + + ); +} diff --git a/src/components/PhotoWall.tsx b/src/components/PhotoWall.tsx new file mode 100644 index 000000000..1f9d0c960 --- /dev/null +++ b/src/components/PhotoWall.tsx @@ -0,0 +1,441 @@ +import { + DeadCenter, + GalleryContext, + Search, + SelectedState, + SetFiles, + setSearchStats, +} from 'pages/gallery'; +import PreviewCard from './pages/gallery/PreviewCard'; +import React, { useContext, useEffect, useRef, useState } from 'react'; +import { Button } from 'react-bootstrap'; +import { File, FILE_TYPE } from 'services/fileService'; +import styled from 'styled-components'; +import DownloadManager from 'services/downloadManager'; +import constants from 'utils/strings/constants'; +import AutoSizer from 'react-virtualized-auto-sizer'; +import PhotoSwipe from 'components/PhotoSwipe/PhotoSwipe'; +import { isInsideBox, isSameDay as isSameDayAnyYear } from 'utils/search'; +import { SetDialogMessage } from './MessageDialog'; +import { fileIsArchived } from 'utils/file'; +import { ALL_SECTION, ARCHIVE_SECTION } from './pages/gallery/Collections'; +import { isSharedFile } from 'utils/file'; +import { isPlaybackPossible } from 'utils/photoFrame'; +import { PhotoList } from './PhotoList'; + +const Container = styled.div` + display: block; + flex: 1; + width: 100%; + flex-wrap: wrap; + margin: 0 auto; + overflow-x: hidden; + .pswp-thumbnail { + display: inline-block; + cursor: pointer; + } +`; + +const EmptyScreen = styled.div` + display: flex; + justify-content: center; + align-items: center; + flex-direction: column; + flex: 1; + color: #51cd7c; + + & > svg { + filter: drop-shadow(3px 3px 5px rgba(45, 194, 98, 0.5)); + } +`; + +interface Props { + files: File[]; + setFiles: SetFiles; + syncWithRemote: () => Promise; + favItemIds: Set; + setSelected: ( + selected: SelectedState | ((selected: SelectedState) => SelectedState) + ) => void; + selected: SelectedState; + isFirstLoad; + openFileUploader; + loadingBar; + isInSearchMode: boolean; + search: Search; + setSearchStats: setSearchStats; + deleted?: number[]; + setDialogMessage: SetDialogMessage; + activeCollection: number; + isSharedCollection: boolean; +} + +const PhotoWall = ({ + files, + setFiles, + syncWithRemote, + favItemIds, + setSelected, + selected, + isFirstLoad, + openFileUploader, + loadingBar, + isInSearchMode, + search, + setSearchStats, + deleted, + activeCollection, + isSharedCollection, +}: Props) => { + const [open, setOpen] = useState(false); + const [currentIndex, setCurrentIndex] = useState(0); + const [fetching, setFetching] = useState<{ [k: number]: boolean }>({}); + const startTime = Date.now(); + const galleryContext = useContext(GalleryContext); + const listRef = useRef(null); + const [rangeStart, setRangeStart] = useState(null); + const [currentHover, setCurrentHover] = useState(null); + const [isShiftKeyPressed, setIsShiftKeyPressed] = useState(false); + const filteredDataRef = useRef([]); + const filteredData = filteredDataRef?.current ?? []; + useEffect(() => { + const handleKeyDown = (e: KeyboardEvent) => { + if (e.key === 'Shift') { + setIsShiftKeyPressed(true); + } + }; + const handleKeyUp = (e: KeyboardEvent) => { + if (e.key === 'Shift') { + setIsShiftKeyPressed(false); + } + }; + document.addEventListener('keydown', handleKeyDown, false); + document.addEventListener('keyup', handleKeyUp, false); + return () => { + document.addEventListener('keydown', handleKeyDown, false); + document.addEventListener('keyup', handleKeyUp, false); + }; + }, []); + + useEffect(() => { + if (isInSearchMode) { + setSearchStats({ + resultCount: filteredData.length, + timeTaken: (Date.now() - startTime) / 1000, + }); + } + if (search.fileIndex || search.fileIndex === 0) { + const filteredDataIdx = filteredData.findIndex( + (data) => data.dataIndex === search.fileIndex + ); + if (filteredDataIdx || filteredDataIdx === 0) { + onThumbnailClick(filteredDataIdx)(); + } + } + }, [search]); + + useEffect(() => { + listRef.current?.resetAfterIndex(0); + setFetching({}); + }, [files, search, deleted]); + + useEffect(() => { + if (selected.count === 0) { + setRangeStart(null); + } + }, [selected]); + + useEffect(() => { + const idSet = new Set(); + filteredDataRef.current = files + .map((item, index) => ({ + ...item, + dataIndex: index, + })) + .filter((item) => { + if (deleted.includes(item.id)) { + return false; + } + if ( + search.date && + !isSameDayAnyYear(search.date)( + new Date(item.metadata.creationTime / 1000) + ) + ) { + return false; + } + if ( + search.location && + !isInsideBox(item.metadata, search.location) + ) { + return false; + } + if (activeCollection === ALL_SECTION && fileIsArchived(item)) { + return false; + } + if ( + activeCollection === ARCHIVE_SECTION && + !fileIsArchived(item) + ) { + return false; + } + + if (isSharedFile(item) && !isSharedCollection) { + return false; + } + if (!idSet.has(item.id)) { + if ( + activeCollection === ALL_SECTION || + activeCollection === ARCHIVE_SECTION || + activeCollection === item.collectionID + ) { + idSet.add(item.id); + return true; + } + return false; + } + return false; + }); + }, [files, deleted, search, activeCollection]); + + const updateUrl = (index: number) => (url: string) => { + files[index] = { + ...files[index], + msrc: url, + src: files[index].src ? files[index].src : url, + w: window.innerWidth, + h: window.innerHeight, + }; + if ( + files[index].metadata.fileType === FILE_TYPE.VIDEO && + !files[index].html + ) { + files[index].html = ` +
+ +
+ Loading... +
+
+ `; + delete files[index].src; + } + if ( + files[index].metadata.fileType === FILE_TYPE.IMAGE && + !files[index].src + ) { + files[index].src = url; + } + setFiles(files); + }; + + const updateSrcUrl = async (index: number, url: string) => { + files[index] = { + ...files[index], + w: window.innerWidth, + h: window.innerHeight, + }; + if (files[index].metadata.fileType === FILE_TYPE.VIDEO) { + if (await isPlaybackPossible(url)) { + files[index].html = ` + + `; + } else { + files[index].html = ` +
+ `; + } + } else { + files[index].src = url; + } + setFiles(files); + }; + + const handleClose = (needUpdate) => { + setOpen(false); + needUpdate && syncWithRemote(); + }; + + const onThumbnailClick = (index: number) => () => { + setCurrentIndex(index); + setOpen(true); + }; + + const handleSelect = (id: number, index?: number) => (checked: boolean) => { + if (selected.collectionID !== activeCollection) { + setSelected({ count: 0, collectionID: 0 }); + } + if (rangeStart || rangeStart === 0) { + setRangeStart(null); + } else if (checked) { + setRangeStart(index); + } + + setSelected((selected) => ({ + ...selected, + [id]: checked, + count: checked ? selected.count + 1 : selected.count - 1, + collectionID: activeCollection, + })); + }; + const onHoverOver = (index: number) => () => { + setCurrentHover(index); + }; + + const handleRangeSelect = (index: number) => () => { + if (rangeStart !== index) { + let leftEnd = -1; + let rightEnd = -1; + if (index < rangeStart) { + leftEnd = index; + rightEnd = rangeStart; + } else { + leftEnd = rangeStart; + rightEnd = index; + } + for (let i = leftEnd; i <= rightEnd; i++) { + handleSelect(filteredData[i].id)(true); + } + } + }; + const getThumbnail = (file: File[], index: number) => ( + 0} + onHover={onHoverOver(index)} + onRangeSelect={handleRangeSelect(index)} + isRangeSelectActive={ + isShiftKeyPressed && (rangeStart || rangeStart === 0) + } + isInsSelectRange={ + (index >= rangeStart + 1 && index <= currentHover) || + (index >= currentHover && index <= rangeStart - 1) + } + /> + ); + + const getSlideData = async (instance: any, index: number, item: File) => { + if (!item.msrc) { + let url: string; + if (galleryContext.thumbs.has(item.id)) { + url = galleryContext.thumbs.get(item.id); + } else { + url = await DownloadManager.getPreview(item); + galleryContext.thumbs.set(item.id, url); + } + updateUrl(item.dataIndex)(url); + item.msrc = url; + if (!item.src) { + item.src = url; + } + item.w = window.innerWidth; + item.h = window.innerHeight; + try { + instance.invalidateCurrItems(); + instance.updateSize(true); + } catch (e) { + // ignore + } + } + if (!fetching[item.dataIndex]) { + fetching[item.dataIndex] = true; + let url: string; + if (galleryContext.files.has(item.id)) { + url = galleryContext.files.get(item.id); + } else { + url = await DownloadManager.getFile(item, true); + galleryContext.files.set(item.id, url); + } + await updateSrcUrl(item.dataIndex, url); + item.html = files[item.dataIndex].html; + item.src = files[item.dataIndex].src; + item.w = files[item.dataIndex].w; + item.h = files[item.dataIndex].h; + try { + instance.invalidateCurrItems(); + instance.updateSize(true); + } catch (e) { + // ignore + } + } + }; + + return ( + <> + {!isFirstLoad && files.length === 0 && !isInSearchMode ? ( + + +
+ {constants.UPLOAD_FIRST_PHOTO_DESCRIPTION} +
+ +
+ ) : filteredData.length ? ( + + + {({ height, width }) => ( + + )} + + + + ) : ( + +
{constants.NOTHING_HERE}
+
+ )} + + ); +}; + +export default PhotoWall; diff --git a/src/pages/gallery/index.tsx b/src/pages/gallery/index.tsx index 22307c862..8132415b0 100644 --- a/src/pages/gallery/index.tsx +++ b/src/pages/gallery/index.tsx @@ -44,7 +44,7 @@ import MessageDialog, { MessageAttributes } from 'components/MessageDialog'; import { useDropzone } from 'react-dropzone'; import EnteSpinner from 'components/EnteSpinner'; import { LoadingOverlay } from 'components/LoadingOverlay'; -import PhotoFrame from 'components/PhotoFrame'; +import PhotoFrame from 'components/PhotoWall'; import { changeFilesVisibility, getSelectedFileIds, From 2bafe4d7e3e8d61c345daaaeb10a2212d2e307a2 Mon Sep 17 00:00:00 2001 From: Abhinav Date: Thu, 28 Oct 2021 16:49:25 +0530 Subject: [PATCH 087/147] moved list Ref and added type definations --- src/components/PhotoList.tsx | 29 ++++++++++++++++++++++++----- src/components/PhotoWall.tsx | 7 +++---- 2 files changed, 27 insertions(+), 9 deletions(-) diff --git a/src/components/PhotoList.tsx b/src/components/PhotoList.tsx index 477e7634b..901d85f9b 100644 --- a/src/components/PhotoList.tsx +++ b/src/components/PhotoList.tsx @@ -1,7 +1,7 @@ import React, { useRef, useEffect } from 'react'; import { VariableSizeList as List } from 'react-window'; import styled from 'styled-components'; - +import { File } from 'services/fileService'; import { IMAGE_CONTAINER_MAX_WIDTH, IMAGE_CONTAINER_MAX_HEIGHT, @@ -90,6 +90,16 @@ const BannerContainer = styled.div<{ span: number }>` align-items: flex-end; `; +interface Props { + height: number; + width: number; + filteredData: File[]; + showBanner: boolean; + getThumbnail: (file: File[], index: number) => JSX.Element; + activeCollection: number; + resetFetching: () => void; +} + export function PhotoList({ height, width, @@ -97,11 +107,20 @@ export function PhotoList({ showBanner, getThumbnail, activeCollection, -}) { - let columns = Math.floor(width / IMAGE_CONTAINER_MAX_WIDTH); - let listItemHeight = IMAGE_CONTAINER_MAX_HEIGHT; + resetFetching, +}: Props) { const timeStampListRef = useRef([]); const timeStampList = timeStampListRef?.current ?? []; + const listRef = useRef(null); + + let columns = Math.floor(width / IMAGE_CONTAINER_MAX_WIDTH); + let listItemHeight = IMAGE_CONTAINER_MAX_HEIGHT; + + useEffect(() => { + listRef.current?.resetAfterIndex(0); + resetFetching(); + }, [filteredData]); + useEffect(() => { let skipMerge = false; if (columns < MIN_COLUMNS) { @@ -335,7 +354,7 @@ export function PhotoList({ return ( ({}); const startTime = Date.now(); const galleryContext = useContext(GalleryContext); - const listRef = useRef(null); const [rangeStart, setRangeStart] = useState(null); const [currentHover, setCurrentHover] = useState(null); const [isShiftKeyPressed, setIsShiftKeyPressed] = useState(false); @@ -134,10 +133,9 @@ const PhotoWall = ({ } }, [search]); - useEffect(() => { - listRef.current?.resetAfterIndex(0); + const resetFetching = () => { setFetching({}); - }, [files, search, deleted]); + }; useEffect(() => { if (selected.count === 0) { @@ -415,6 +413,7 @@ const PhotoWall = ({ showBanner={ files.length < 30 && !isInSearchMode } + resetFetching={resetFetching} /> )} From 4dc50a75e8e937116071e89ebe4d2d21f1ee48a9 Mon Sep 17 00:00:00 2001 From: Abhinav Date: Thu, 28 Oct 2021 17:29:37 +0530 Subject: [PATCH 088/147] use filterdataCopy until filterdata is updated --- src/components/PhotoList.tsx | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/components/PhotoList.tsx b/src/components/PhotoList.tsx index 901d85f9b..bf54be873 100644 --- a/src/components/PhotoList.tsx +++ b/src/components/PhotoList.tsx @@ -111,6 +111,8 @@ export function PhotoList({ }: Props) { const timeStampListRef = useRef([]); const timeStampList = timeStampListRef?.current ?? []; + const filteredDataCopyRef = useRef([]); + const filteredDataCopy = filteredDataCopyRef.current ?? []; const listRef = useRef(null); let columns = Math.floor(width / IMAGE_CONTAINER_MAX_WIDTH); @@ -185,6 +187,7 @@ export function PhotoList({ showBanner && appendBanner(); timeStampListRef.current = timeStampList; + filteredDataCopyRef.current = filteredData; }, [width, height, filteredData, showBanner]); const isSameDay = (first, second) => @@ -336,7 +339,10 @@ export function PhotoList({ return listItem.banner; default: { const ret = listItem.items.map((item, idx) => - getThumbnail(filteredData, listItem.itemStartIndex + idx) + getThumbnail( + filteredDataCopy, + listItem.itemStartIndex + idx + ) ); if (listItem.groups) { let sum = 0; From 99c4223e7507587c9041d5e5613561036796d4f6 Mon Sep 17 00:00:00 2001 From: Abhinav Date: Thu, 28 Oct 2021 19:31:38 +0530 Subject: [PATCH 089/147] rename PhotoWall back to PhotoFrame --- src/components/{PhotoWall.tsx => PhotoFrame.tsx} | 4 ++-- src/pages/gallery/index.tsx | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) rename src/components/{PhotoWall.tsx => PhotoFrame.tsx} (99%) diff --git a/src/components/PhotoWall.tsx b/src/components/PhotoFrame.tsx similarity index 99% rename from src/components/PhotoWall.tsx rename to src/components/PhotoFrame.tsx index 9082a63a5..23c50edc0 100644 --- a/src/components/PhotoWall.tsx +++ b/src/components/PhotoFrame.tsx @@ -70,7 +70,7 @@ interface Props { isSharedCollection: boolean; } -const PhotoWall = ({ +const PhotoFrame = ({ files, setFiles, syncWithRemote, @@ -437,4 +437,4 @@ const PhotoWall = ({ ); }; -export default PhotoWall; +export default PhotoFrame; diff --git a/src/pages/gallery/index.tsx b/src/pages/gallery/index.tsx index 8132415b0..22307c862 100644 --- a/src/pages/gallery/index.tsx +++ b/src/pages/gallery/index.tsx @@ -44,7 +44,7 @@ import MessageDialog, { MessageAttributes } from 'components/MessageDialog'; import { useDropzone } from 'react-dropzone'; import EnteSpinner from 'components/EnteSpinner'; import { LoadingOverlay } from 'components/LoadingOverlay'; -import PhotoFrame from 'components/PhotoWall'; +import PhotoFrame from 'components/PhotoFrame'; import { changeFilesVisibility, getSelectedFileIds, From ed6be1cde128db2d1e8c3dc20618c254780dc34e Mon Sep 17 00:00:00 2001 From: Abhinav Date: Fri, 29 Oct 2021 14:20:45 +0530 Subject: [PATCH 090/147] fix generateThumbnail call during replaceThumbnail --- src/services/migrateThumbnailService.ts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/services/migrateThumbnailService.ts b/src/services/migrateThumbnailService.ts index 672c7bb17..a6a16e349 100644 --- a/src/services/migrateThumbnailService.ts +++ b/src/services/migrateThumbnailService.ts @@ -1,5 +1,5 @@ import downloadManager from 'services/downloadManager'; -import { fileAttribute, FILE_TYPE, getLocalFiles } from 'services/fileService'; +import { fileAttribute, getLocalFiles } from 'services/fileService'; import { generateThumbnail } from 'services/upload/thumbnailService'; import { getToken } from 'utils/common/key'; import { logError } from 'utils/sentry'; @@ -9,6 +9,7 @@ import CryptoWorker from 'utils/crypto'; import uploadHttpClient from 'services/upload/uploadHttpClient'; import { EncryptionResult, UploadURL } from 'services/upload/uploadService'; import { SetProgressTracker } from 'components/FixLargeThumbnail'; +import { getFileType } from './upload/readFileService'; const ENDPOINT = getEndpoint(); const REPLACE_THUMBNAIL_THRESHOLD = 500 * 1024; // 500KB @@ -69,11 +70,11 @@ export async function replaceThumbnail( [originalThumbnail], file.metadata.title ); + const fileTypeInfo = await getFileType(worker, dummyImageFile); const { thumbnail: newThumbnail } = await generateThumbnail( worker, dummyImageFile, - FILE_TYPE.IMAGE, - false + fileTypeInfo ); const newUploadedThumbnail = await uploadThumbnail( worker, From 3cd2789dc983d2791059b68b5ddde8139d2d6b51 Mon Sep 17 00:00:00 2001 From: Abhinav Date: Fri, 29 Oct 2021 16:53:10 +0530 Subject: [PATCH 091/147] updates Icon with HighlightWrapper --- src/components/Container.ts | 8 ++++++++ src/components/icons/CrossIcon.tsx | 21 ++++++++++++--------- src/components/icons/EditIcon.tsx | 19 +++++++++++-------- src/components/icons/TickIcon.tsx | 19 +++++++++++-------- 4 files changed, 42 insertions(+), 25 deletions(-) diff --git a/src/components/Container.ts b/src/components/Container.ts index 88e183559..ba7c35257 100644 --- a/src/components/Container.ts +++ b/src/components/Container.ts @@ -62,3 +62,11 @@ export const FlexWrapper = styled.div` text-align: center; justify-content: center; `; + +export const HighLightWrapper = styled.div` + &:hover { + background-color: #555; + } + border-radius: 50%; + padding: 5px; +`; diff --git a/src/components/icons/CrossIcon.tsx b/src/components/icons/CrossIcon.tsx index bee5baeb2..18eb9c333 100644 --- a/src/components/icons/CrossIcon.tsx +++ b/src/components/icons/CrossIcon.tsx @@ -1,18 +1,21 @@ +import { HighLightWrapper } from 'components/Container'; import React from 'react'; -export default function DateIcon(props) { +export default function CrossIcon(props) { return ( - - - + + + + + ); } -DateIcon.defaultProps = { +CrossIcon.defaultProps = { height: 24, width: 24, viewBox: '0 0 24 24', diff --git a/src/components/icons/EditIcon.tsx b/src/components/icons/EditIcon.tsx index ea96a862e..19a719e14 100644 --- a/src/components/icons/EditIcon.tsx +++ b/src/components/icons/EditIcon.tsx @@ -1,15 +1,18 @@ +import { HighLightWrapper } from 'components/Container'; import React from 'react'; export default function AddIcon(props) { return ( - - - + + + + + ); } diff --git a/src/components/icons/TickIcon.tsx b/src/components/icons/TickIcon.tsx index 8bd76968f..8d230b961 100644 --- a/src/components/icons/TickIcon.tsx +++ b/src/components/icons/TickIcon.tsx @@ -1,15 +1,18 @@ +import { HighLightWrapper } from 'components/Container'; import React from 'react'; export default function TickIcon(props) { return ( - - - + + + + + ); } From c918225f4ae5f09a7bfb364e96a5c88d2400920f Mon Sep 17 00:00:00 2001 From: Abhinav Date: Fri, 29 Oct 2021 17:02:28 +0530 Subject: [PATCH 092/147] updates MagicMetadata related type definations --- src/services/fileService.ts | 38 +++++++++++++++++++++++++++++-------- 1 file changed, 30 insertions(+), 8 deletions(-) diff --git a/src/services/fileService.ts b/src/services/fileService.ts index f3fc24ddf..02144c5da 100644 --- a/src/services/fileService.ts +++ b/src/services/fileService.ts @@ -41,15 +41,35 @@ export enum VISIBILITY_STATE { VISIBLE, ARCHIVED, } + +export interface MagicMetadataCore { + version: number; + count: number; + header: string; + data: Record; +} + +export interface EncryptedMagicMetadataCore + extends Omit { + data: string; +} + export interface MagicMetadataProps { visibility?: VISIBILITY_STATE; } -export interface MagicMetadata { - version: number; - count: number; - data: string | MagicMetadataProps; - header: string; + +export interface MagicMetadata extends Omit { + data: MagicMetadataProps; } + +export interface PublicMagicMetadataProps { + creationTime?: number; +} + +export interface PublicMagicMetadata extends Omit { + data: PublicMagicMetadataProps; +} + export interface File { id: number; collectionID: number; @@ -58,6 +78,7 @@ export interface File { thumbnail: fileAttribute; metadata: MetadataObject; magicMetadata: MagicMetadata; + pubMagicMetadata: PublicMagicMetadata; encryptedKey: string; keyDecryptionNonce: string; key: string; @@ -74,12 +95,13 @@ export interface File { interface UpdateMagicMetadataRequest { metadataList: UpdateMagicMetadata[]; } + interface UpdateMagicMetadata { id: number; - magicMetadata: MagicMetadata; + magicMetadata: EncryptedMagicMetadataCore; } -export const NEW_MAGIC_METADATA: MagicMetadata = { +export const NEW_MAGIC_METADATA: MagicMetadataCore = { version: 0, data: {}, header: null, @@ -261,7 +283,7 @@ export const updateMagicMetadata = async (files: File[]) => { for (const file of files) { reqBody.metadataList.push({ id: file.id, - magicMetadata: file.magicMetadata, + magicMetadata: file.magicMetadata as EncryptedMagicMetadataCore, }); } await HTTPService.put(`${ENDPOINT}/files/magic-metadata`, reqBody, null, { From 8afcd3a766893c6cfd67cae7ad3ad9cf6bd782a4 Mon Sep 17 00:00:00 2001 From: Abhinav Date: Fri, 29 Oct 2021 17:15:06 +0530 Subject: [PATCH 093/147] refactor changeFilesVisibility to have a seperate updateMagicMetadata function and move encryption logic to upateMagicMetadata API --- src/services/fileService.ts | 17 ++++++++-- src/utils/file/index.ts | 68 ++++++++++++++++++++++--------------- 2 files changed, 56 insertions(+), 29 deletions(-) diff --git a/src/services/fileService.ts b/src/services/fileService.ts index 02144c5da..a93092dc9 100644 --- a/src/services/fileService.ts +++ b/src/services/fileService.ts @@ -2,11 +2,16 @@ import { getEndpoint } from 'utils/common/apiUtil'; import localForage from 'utils/storage/localForage'; import { getToken } from 'utils/common/key'; -import { DataStream, MetadataObject } from './upload/uploadService'; +import { + DataStream, + EncryptionResult, + MetadataObject, +} from './upload/uploadService'; import { Collection } from './collectionService'; import HTTPService from './HTTPService'; import { logError } from 'utils/sentry'; import { decryptFile, sortFiles } from 'utils/file'; +import CryptoWorker from 'utils/crypto'; const ENDPOINT = getEndpoint(); const DIFF_LIMIT: number = 1000; @@ -280,10 +285,18 @@ export const updateMagicMetadata = async (files: File[]) => { return; } const reqBody: UpdateMagicMetadataRequest = { metadataList: [] }; + const worker = await new CryptoWorker(); for (const file of files) { + const { file: encryptedMagicMetadata }: EncryptionResult = + await worker.encryptMetadata(file.magicMetadata.data, file.key); reqBody.metadataList.push({ id: file.id, - magicMetadata: file.magicMetadata as EncryptedMagicMetadataCore, + magicMetadata: { + version: file.pubMagicMetadata.version, + count: file.pubMagicMetadata.count, + data: encryptedMagicMetadata.encryptedData as unknown as string, + header: encryptedMagicMetadata.decryptionHeader, + }, }); } await HTTPService.put(`${ENDPOINT}/files/magic-metadata`, reqBody, null, { diff --git a/src/utils/file/index.ts b/src/utils/file/index.ts index 154639c32..bb00afaba 100644 --- a/src/utils/file/index.ts +++ b/src/utils/file/index.ts @@ -10,7 +10,6 @@ import { } from 'services/fileService'; import { decodeMotionPhoto } from 'services/motionPhotoService'; import { getMimeTypeFromBlob } from 'services/upload/readFileService'; -import { EncryptionResult } from 'services/upload/uploadService'; import DownloadManger from 'services/downloadManager'; import { logError } from 'utils/sentry'; import { User } from 'services/userService'; @@ -245,46 +244,61 @@ export function fileIsArchived(file: File) { return file.magicMetadata.data.visibility === VISIBILITY_STATE.ARCHIVED; } +export async function updateMagicMetadata( + file: File, + magicMetadataUpdates: MagicMetadataProps +) { + const worker = await new CryptoWorker(); + + if (!file.magicMetadata) { + file.magicMetadata = NEW_MAGIC_METADATA; + } + if (typeof file.magicMetadata.data === 'string') { + file.magicMetadata.data = (await worker.decryptMetadata( + file.magicMetadata.data, + file.magicMetadata.header, + file.key + )) as MagicMetadataProps; + } + if (magicMetadataUpdates) { + // copies the existing magic metadata properties of the files and updates the visibility value + // The expected behaviour while updating magic metadata is to let the existing property as it is and update/add the property you want + const magicMetadataProps: MagicMetadataProps = { + ...file.magicMetadata.data, + ...magicMetadataUpdates, + }; + + return { + ...file, + magicMetadata: { + ...file.pubMagicMetadata, + data: magicMetadataProps, + }, + }; + } else { + return file; + } +} + export async function changeFilesVisibility( files: File[], selected: SelectedState, visibility: VISIBILITY_STATE ) { - const worker = await new CryptoWorker(); const selectedFiles = getSelectedFiles(selected, files); const updatedFiles: File[] = []; for (const file of selectedFiles) { - if (!file.magicMetadata) { - file.magicMetadata = NEW_MAGIC_METADATA; - } - if (typeof file.magicMetadata.data === 'string') { - file.magicMetadata.data = (await worker.decryptMetadata( - file.magicMetadata.data, - file.magicMetadata.header, - file.key - )) as MagicMetadataProps; - } - // copies the existing magic metadata properties of the files and updates the visibility value - // The expected behaviour while updating magic metadata is to let the existing property as it is and update/add the property you want const updatedMagicMetadataProps: MagicMetadataProps = { - ...file.magicMetadata.data, visibility, }; - const encryptedMagicMetadata: EncryptionResult = - await worker.encryptMetadata(updatedMagicMetadataProps, file.key); - updatedFiles.push({ - ...file, - magicMetadata: { - version: file.magicMetadata.version, - count: Object.keys(updatedMagicMetadataProps).length, - data: encryptedMagicMetadata.file - .encryptedData as unknown as string, - header: encryptedMagicMetadata.file.decryptionHeader, - }, - }); + + updatedFiles.push( + await updateMagicMetadata(file, updatedMagicMetadataProps) + ); } return updatedFiles; } + export function isSharedFile(file: File) { const user: User = getData(LS_KEYS.USER); From 69c9f423fedeffb89ebb1d66adc2be125c425168 Mon Sep 17 00:00:00 2001 From: Abhinav Date: Fri, 29 Oct 2021 17:22:08 +0530 Subject: [PATCH 094/147] adds publicMetadata data update and parsing logic --- src/services/fileService.ts | 30 +++++++++++++++++++++ src/utils/file/index.ts | 52 +++++++++++++++++++++++++++++++++++++ 2 files changed, 82 insertions(+) diff --git a/src/services/fileService.ts b/src/services/fileService.ts index a93092dc9..aff0bf5c3 100644 --- a/src/services/fileService.ts +++ b/src/services/fileService.ts @@ -303,3 +303,33 @@ export const updateMagicMetadata = async (files: File[]) => { 'X-Auth-Token': token, }); }; + +export const updatePublicMagicMetadata = async (files: File[]) => { + const token = getToken(); + if (!token) { + return; + } + const reqBody: UpdateMagicMetadataRequest = { metadataList: [] }; + const worker = await new CryptoWorker(); + for (const file of files) { + const { file: encryptedPubMagicMetadata }: EncryptionResult = + await worker.encryptMetadata(file.pubMagicMetadata.data, file.key); + reqBody.metadataList.push({ + id: file.id, + magicMetadata: { + version: file.pubMagicMetadata.version, + count: file.pubMagicMetadata.count, + data: encryptedPubMagicMetadata.encryptedData as unknown as string, + header: encryptedPubMagicMetadata.decryptionHeader, + }, + }); + } + await HTTPService.put( + `${ENDPOINT}/files/public-magic-metadata`, + reqBody, + null, + { + 'X-Auth-Token': token, + } + ); +}; diff --git a/src/utils/file/index.ts b/src/utils/file/index.ts index bb00afaba..70bf2373a 100644 --- a/src/utils/file/index.ts +++ b/src/utils/file/index.ts @@ -6,6 +6,7 @@ import { FILE_TYPE, MagicMetadataProps, NEW_MAGIC_METADATA, + PublicMagicMetadataProps, VISIBILITY_STATE, } from 'services/fileService'; import { decodeMotionPhoto } from 'services/motionPhotoService'; @@ -171,6 +172,13 @@ export async function decryptFile(file: File, collection: Collection) { file.key ); } + if (file.pubMagicMetadata?.data) { + file.pubMagicMetadata.data = await worker.decryptMetadata( + file.pubMagicMetadata.data, + file.pubMagicMetadata.header, + file.key + ); + } return file; } catch (e) { logError(e, 'file decryption failed'); @@ -279,6 +287,39 @@ export async function updateMagicMetadata( return file; } } +export async function updatePublicMagicMetadata( + file: File, + publicMetadataUpdates: PublicMagicMetadataProps +) { + const worker = await new CryptoWorker(); + + if (!file.pubMagicMetadata) { + file.pubMagicMetadata = NEW_MAGIC_METADATA; + } + if (typeof file.pubMagicMetadata.data === 'string') { + file.pubMagicMetadata.data = (await worker.decryptMetadata( + file.pubMagicMetadata.data, + file.pubMagicMetadata.header, + file.key + )) as PublicMagicMetadataProps; + } + + if (publicMetadataUpdates) { + const publicMetadataProps = { + ...file.pubMagicMetadata.data, + ...publicMetadataUpdates, + }; + return { + ...file, + pubMagicMetadata: { + ...file.pubMagicMetadata, + data: publicMetadataProps, + }, + }; + } else { + return file; + } +} export async function changeFilesVisibility( files: File[], @@ -299,6 +340,17 @@ export async function changeFilesVisibility( return updatedFiles; } +export async function changeFileCreationTime(file: File, creationTime: number) { + const updatedPublicMagicMetadataProps: PublicMagicMetadataProps = { + creationTime, + }; + + return await updatePublicMagicMetadata( + file, + updatedPublicMagicMetadataProps + ); +} + export function isSharedFile(file: File) { const user: User = getData(LS_KEYS.USER); From 8fb7146236e0dcbf4a4664fa1436bef91317bfa7 Mon Sep 17 00:00:00 2001 From: Abhinav Date: Fri, 29 Oct 2021 17:39:57 +0530 Subject: [PATCH 095/147] use public metadata creation time for sorting --- src/services/fileService.ts | 9 ++++----- src/utils/file/index.ts | 9 +++++++-- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/src/services/fileService.ts b/src/services/fileService.ts index aff0bf5c3..14381b57a 100644 --- a/src/services/fileService.ts +++ b/src/services/fileService.ts @@ -233,12 +233,11 @@ export const getFiles = async ( time = resp.data.diff.slice(-1)[0].updationTime; } setFiles( - [...(files || []), ...decryptedFiles] - .filter((item) => !item.isDeleted) - .sort( - (a, b) => - b.metadata.creationTime - a.metadata.creationTime + sortFiles( + [...(files || []), ...decryptedFiles].filter( + (item) => !item.isDeleted ) + ) ); } while (resp.data.diff.length === limit); return decryptedFiles; diff --git a/src/utils/file/index.ts b/src/utils/file/index.ts index 70bf2373a..71482bdd3 100644 --- a/src/utils/file/index.ts +++ b/src/utils/file/index.ts @@ -140,8 +140,13 @@ export function sortFiles(files: File[]) { files = files .map((file, index) => ({ index, file })) .sort((a, b) => { - let diff = - b.file.metadata.creationTime - a.file.metadata.creationTime; + const fileACreationTime = + a.file.pubMagicMetadata?.data.creationTime ?? + a.file.metadata.creationTime; + const fileBCreationTime = + b.file.pubMagicMetadata?.data.creationTime ?? + a.file.metadata.creationTime; + let diff = fileBCreationTime - fileACreationTime; if (diff === 0) { diff = a.index - b.index; } From 125cb79ecc7f8fd142dad491ecbae59dfbc6cec7 Mon Sep 17 00:00:00 2001 From: Abhinav Date: Fri, 29 Oct 2021 17:41:59 +0530 Subject: [PATCH 096/147] adds syncWithRemote to gallery context --- src/pages/gallery/index.tsx | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/pages/gallery/index.tsx b/src/pages/gallery/index.tsx index 22307c862..8046936b4 100644 --- a/src/pages/gallery/index.tsx +++ b/src/pages/gallery/index.tsx @@ -118,6 +118,7 @@ type GalleryContextType = { files: Map; showPlanSelectorModal: () => void; setActiveCollection: (collection: number) => void; + syncWithRemote: (force?: boolean, silent?: boolean) => Promise; }; const defaultGalleryContext: GalleryContextType = { @@ -125,6 +126,7 @@ const defaultGalleryContext: GalleryContextType = { files: new Map(), showPlanSelectorModal: () => null, setActiveCollection: () => null, + syncWithRemote: () => null, }; export const GalleryContext = createContext( @@ -499,6 +501,7 @@ export default function Gallery() { ...defaultGalleryContext, showPlanSelectorModal: () => setPlanModalView(true), setActiveCollection, + syncWithRemote, }}> Date: Fri, 29 Oct 2021 17:43:16 +0530 Subject: [PATCH 097/147] refactores info modal and adds renderCreationTime with edit button --- src/components/PhotoSwipe/PhotoSwipe.tsx | 233 ++++++++++++++++------- src/pages/_app.tsx | 2 + 2 files changed, 169 insertions(+), 66 deletions(-) diff --git a/src/components/PhotoSwipe/PhotoSwipe.tsx b/src/components/PhotoSwipe/PhotoSwipe.tsx index 845d3cc08..b39c45735 100644 --- a/src/components/PhotoSwipe/PhotoSwipe.tsx +++ b/src/components/PhotoSwipe/PhotoSwipe.tsx @@ -1,4 +1,4 @@ -import React, { useEffect, useRef, useState } from 'react'; +import React, { useContext, useEffect, useRef, useState } from 'react'; import Photoswipe from 'photoswipe'; import PhotoswipeUIDefault from 'photoswipe/dist/photoswipe-ui-default'; import classnames from 'classnames'; @@ -7,18 +7,29 @@ import { addToFavorites, removeFromFavorites, } from 'services/collectionService'; -import { File } from 'services/fileService'; +import { File, updatePublicMagicMetadata } from 'services/fileService'; import constants from 'utils/strings/constants'; import exifr from 'exifr'; import Modal from 'react-bootstrap/Modal'; import Button from 'react-bootstrap/Button'; -import Form from 'react-bootstrap/Form'; import styled from 'styled-components'; import events from './events'; -import { downloadFile, formatDateTime } from 'utils/file'; +import { + changeFileCreationTime, + downloadFile, + formatDateTime, +} from 'utils/file'; import { FormCheck } from 'react-bootstrap'; import { prettyPrintExif } from 'utils/exif'; - +import EditIcon from 'components/icons/EditIcon'; +import { FlexWrapper, Label, Row, Value } from 'components/Container'; +import TickIcon from 'components/icons/TickIcon'; +import DateTimePicker from 'react-datetime-picker/dist/entry.nostyle'; +import 'react-calendar/dist/Calendar.css'; +import 'react-clock/dist/Clock.css'; +import 'react-datetime-picker/dist/DateTimePicker.css'; +import { GalleryContext } from 'pages/gallery'; +import CrossIcon from 'components/icons/CrossIcon'; interface Iprops { isOpen: boolean; items: any[]; @@ -48,17 +59,89 @@ const Pre = styled.pre` padding: 7px 15px; `; +const ClickWrapper = (props) =>
; + const renderInfoItem = (label: string, value: string | JSX.Element) => ( - <> - - {label} - - - {value} - - + + + {value} + ); +function RenderCreationTime({ + file, + syncWithRemote, +}: { + file: File; + syncWithRemote: (force?: boolean, silent?: boolean) => void; +}) { + const originalCreationTime = new Date(file.metadata.creationTime / 1000); + const [isInEditMode, setIsInEditMode] = useState(false); + + const [pickedTime, setPickedTime] = useState(originalCreationTime); + + const openEditMode = () => setIsInEditMode(true); + + const saveEdits = async () => { + if (isInEditMode && file) { + const unixTimeInMicroSec = pickedTime.getTime() * 1000; + const updatedFile = await changeFileCreationTime( + file, + unixTimeInMicroSec + ); + await updatePublicMagicMetadata([updatedFile]); + file.pubMagicMetadata = updatedFile.pubMagicMetadata; + syncWithRemote(false, true); + } + setIsInEditMode(false); + }; + const discardEdits = () => { + setPickedTime(originalCreationTime); + setIsInEditMode(false); + }; + return ( + <> + + + + {isInEditMode ? ( + <> + + + ) : ( + formatDateTime(pickedTime) + )} + + + {isInEditMode ? ( + + + + + + + + + ) : ( + + + + )} + + + + ); +} function ExifData(props: { exif: any }) { const { exif } = props; const [showAll, setShowAll] = useState(false); @@ -112,6 +195,67 @@ function ExifData(props: { exif: any }) { ); } +function InfoModal({ + showInfo, + handleCloseInfo, + items, + photoSwipe, + metadata, + exif, + syncWithRemote, +}) { + return ( + + + {constants.INFO} + + +
+ {constants.METADATA} +
+ {renderInfoItem( + constants.FILE_ID, + items[photoSwipe?.getCurrentIndex()]?.id + )} + {metadata?.title && + renderInfoItem(constants.FILE_NAME, metadata.title)} + {metadata?.creationTime && ( + + )} + {metadata?.modificationTime && + renderInfoItem( + constants.UPDATED_ON, + formatDateTime(metadata.modificationTime / 1000) + )} + {metadata?.longitude > 0 && + metadata?.longitude > 0 && + renderInfoItem( + constants.LOCATION, +
+ {constants.SHOW_MAP} + + )} + {exif && ( + <> + + + )} + + + + + + ); +} + function PhotoSwipe(props: Iprops) { const pswpElement = useRef(); const [photoSwipe, setPhotoSwipe] = useState>(); @@ -122,6 +266,7 @@ function PhotoSwipe(props: Iprops) { const [metadata, setMetaData] = useState(null); const [exif, setExif] = useState(null); const needUpdate = useRef(false); + const galleryContext = useContext(GalleryContext); useEffect(() => { if (!pswpElement) return; @@ -384,59 +529,15 @@ function PhotoSwipe(props: Iprops) {
- - - {constants.INFO} - - - -
- {constants.METADATA} -
- {renderInfoItem( - constants.FILE_ID, - items[photoSwipe?.getCurrentIndex()]?.id - )} - {metadata?.title && - renderInfoItem(constants.FILE_NAME, metadata.title)} - {metadata?.creationTime && - renderInfoItem( - constants.CREATION_TIME, - formatDateTime(metadata.creationTime / 1000) - )} - {metadata?.modificationTime && - renderInfoItem( - constants.UPDATED_ON, - formatDateTime(metadata.modificationTime / 1000) - )} - {metadata?.longitude > 0 && - metadata?.longitude > 0 && - renderInfoItem( - constants.LOCATION, - - {constants.SHOW_MAP} - - )} - {exif && ( - <> -
-
- - - )} -
-
- - - -
+ ); } diff --git a/src/pages/_app.tsx b/src/pages/_app.tsx index eff5d1866..fa8abcfe0 100644 --- a/src/pages/_app.tsx +++ b/src/pages/_app.tsx @@ -404,6 +404,8 @@ const GlobalStyles = createGlobalStyle` .tooltip-inner{ padding:0px; } + .react-datetime-picker__inputGroup__input { + color:#ddd; `; export const LogoImage = styled.img` From 4f01979b1494df066eb0e5d9979b7ab283005887 Mon Sep 17 00:00:00 2001 From: Abhinav Date: Fri, 29 Oct 2021 18:10:02 +0530 Subject: [PATCH 098/147] merge metadata for easy use in UI --- src/pages/gallery/index.tsx | 11 +++++++---- src/utils/file/index.ts | 11 +++++++++++ 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/src/pages/gallery/index.tsx b/src/pages/gallery/index.tsx index 8046936b4..d6c5cee8c 100644 --- a/src/pages/gallery/index.tsx +++ b/src/pages/gallery/index.tsx @@ -48,6 +48,7 @@ import PhotoFrame from 'components/PhotoFrame'; import { changeFilesVisibility, getSelectedFileIds, + mergeMetadata, sortFilesIntoCollections, } from 'utils/file'; import SearchBar, { DateValue } from 'components/SearchBar'; @@ -299,21 +300,23 @@ export default function Gallery() { collections: Collection[], files: File[] ) => { + const filesWithMergedMetadata = mergeMetadata(files); + setFiles(filesWithMergedMetadata); + const favItemIds = await getFavItemIds(files); + setFavItemIds(favItemIds); const nonEmptyCollections = getNonEmptyCollections(collections, files); + setCollections(nonEmptyCollections); const collectionsAndTheirLatestFile = getCollectionsAndTheirLatestFile( nonEmptyCollections, files ); + setCollectionsAndTheirLatestFile(collectionsAndTheirLatestFile); const collectionWiseFiles = sortFilesIntoCollections(files); const collectionFilesCount = new Map(); for (const [id, files] of collectionWiseFiles) { collectionFilesCount.set(id, files.length); } - setCollections(nonEmptyCollections); - setCollectionsAndTheirLatestFile(collectionsAndTheirLatestFile); setCollectionFilesCount(collectionFilesCount); - const favItemIds = await getFavItemIds(files); - setFavItemIds(favItemIds); }; const clearSelection = function () { diff --git a/src/utils/file/index.ts b/src/utils/file/index.ts index 71482bdd3..58cdd4169 100644 --- a/src/utils/file/index.ts +++ b/src/utils/file/index.ts @@ -364,3 +364,14 @@ export function isSharedFile(file: File) { } return file.ownerID !== user.id; } + +export function mergeMetadata(files: File[]): File[] { + return files.map((file) => ({ + ...file, + metadata: { + ...file.metadata, + ...(file.pubMagicMetadata?.data ? file.pubMagicMetadata.data : {}), + ...(file.magicMetadata?.data ? file.magicMetadata.data : {}), + }, + })); +} From 243a39c904526cbc21ef75261cc64d3226ee8c29 Mon Sep 17 00:00:00 2001 From: Abhinav Date: Sat, 30 Oct 2021 08:26:30 +0530 Subject: [PATCH 099/147] update to collection diff v2 --- src/services/fileService.ts | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-) diff --git a/src/services/fileService.ts b/src/services/fileService.ts index 76f689ff1..77e5c6bfd 100644 --- a/src/services/fileService.ts +++ b/src/services/fileService.ts @@ -9,7 +9,6 @@ import { logError } from 'utils/sentry'; import { decryptFile, sortFiles } from 'utils/file'; const ENDPOINT = getEndpoint(); -const DIFF_LIMIT: number = 1000; const FILES = 'files'; @@ -121,13 +120,7 @@ export const syncFiles = async ( continue; } const fetchedFiles = - (await getFiles( - collection, - lastSyncTime, - DIFF_LIMIT, - files, - setFiles - )) ?? []; + (await getFiles(collection, lastSyncTime, files, setFiles)) ?? []; files.push(...fetchedFiles); const latestVersionFiles = new Map(); files.forEach((file) => { @@ -171,7 +164,6 @@ export const syncFiles = async ( export const getFiles = async ( collection: Collection, sinceTime: number, - limit: number, files: File[], setFiles: (files: File[]) => void ): Promise => { @@ -188,11 +180,10 @@ export const getFiles = async ( break; } resp = await HTTPService.get( - `${ENDPOINT}/collections/diff`, + `${ENDPOINT}/collections/v2/diff`, { collectionID: collection.id, sinceTime: time, - limit, }, { 'X-Auth-Token': token, @@ -221,7 +212,7 @@ export const getFiles = async ( b.metadata.creationTime - a.metadata.creationTime ) ); - } while (resp.data.diff.length === limit); + } while (resp.data.hasMore); return decryptedFiles; } catch (e) { logError(e, 'Get files failed'); From 1569e189ed84d9855ac1a9b4ee0e0eaae74f5890 Mon Sep 17 00:00:00 2001 From: Abhinav Date: Sat, 30 Oct 2021 09:15:39 +0530 Subject: [PATCH 100/147] update migrate thumbnail copies --- src/utils/strings/englishConstants.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils/strings/englishConstants.tsx b/src/utils/strings/englishConstants.tsx index fbf1bca96..2182765ca 100644 --- a/src/utils/strings/englishConstants.tsx +++ b/src/utils/strings/englishConstants.tsx @@ -588,7 +588,7 @@ const englishConstants = { ), REPLACE_THUMBNAIL_COMPLETED: () => ( - <>successfully compressed all thumbnails + <>you have no thumbnails that can be compressed further ), REPLACE_THUMBNAIL_COMPLETED_WITH_ERROR: () => ( <>could not compress some of your thumbnails, please retry From c46ba48980557988d4962fcb01c72534a27e1a22 Mon Sep 17 00:00:00 2001 From: Abhinav Date: Sat, 30 Oct 2021 16:04:22 +0530 Subject: [PATCH 101/147] disable photoswipe keyboard event when info modal is open --- src/components/PhotoSwipe/PhotoSwipe.tsx | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/components/PhotoSwipe/PhotoSwipe.tsx b/src/components/PhotoSwipe/PhotoSwipe.tsx index b39c45735..4ec75fdde 100644 --- a/src/components/PhotoSwipe/PhotoSwipe.tsx +++ b/src/components/PhotoSwipe/PhotoSwipe.tsx @@ -285,6 +285,12 @@ function PhotoSwipe(props: Iprops) { updateItems(items); }, [items]); + useEffect(() => { + if (photoSwipe) { + photoSwipe.options.arrowKeys = !showInfo; + } + }, [showInfo]); + function updateFavButton() { setIsFav(isInFav(this?.currItem)); } From 0c20f59cebadfbcae4cf8058720cba9885ddd5ab Mon Sep 17 00:00:00 2001 From: Abhinav Date: Sat, 30 Oct 2021 16:09:37 +0530 Subject: [PATCH 102/147] update files metadata with new update pubMagicMetaData --- src/components/PhotoSwipe/PhotoSwipe.tsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/components/PhotoSwipe/PhotoSwipe.tsx b/src/components/PhotoSwipe/PhotoSwipe.tsx index 4ec75fdde..4dedfa73f 100644 --- a/src/components/PhotoSwipe/PhotoSwipe.tsx +++ b/src/components/PhotoSwipe/PhotoSwipe.tsx @@ -18,6 +18,7 @@ import { changeFileCreationTime, downloadFile, formatDateTime, + mergeMetadata, } from 'utils/file'; import { FormCheck } from 'react-bootstrap'; import { prettyPrintExif } from 'utils/exif'; @@ -91,6 +92,7 @@ function RenderCreationTime({ ); await updatePublicMagicMetadata([updatedFile]); file.pubMagicMetadata = updatedFile.pubMagicMetadata; + file.metadata = mergeMetadata([file])[0].metadata; syncWithRemote(false, true); } setIsInEditMode(false); From 7f75cc532ae93f321a0449e5861d4404c8a6cfd4 Mon Sep 17 00:00:00 2001 From: Abhinav Date: Sat, 30 Oct 2021 17:04:52 +0530 Subject: [PATCH 103/147] Schedule update and update pubMagicMetadata locally --- src/components/PhotoSwipe/PhotoSwipe.tsx | 41 +++++++++++++----------- 1 file changed, 23 insertions(+), 18 deletions(-) diff --git a/src/components/PhotoSwipe/PhotoSwipe.tsx b/src/components/PhotoSwipe/PhotoSwipe.tsx index 4dedfa73f..9fc04f891 100644 --- a/src/components/PhotoSwipe/PhotoSwipe.tsx +++ b/src/components/PhotoSwipe/PhotoSwipe.tsx @@ -1,4 +1,4 @@ -import React, { useContext, useEffect, useRef, useState } from 'react'; +import React, { useEffect, useRef, useState } from 'react'; import Photoswipe from 'photoswipe'; import PhotoswipeUIDefault from 'photoswipe/dist/photoswipe-ui-default'; import classnames from 'classnames'; @@ -29,8 +29,8 @@ import DateTimePicker from 'react-datetime-picker/dist/entry.nostyle'; import 'react-calendar/dist/Calendar.css'; import 'react-clock/dist/Clock.css'; import 'react-datetime-picker/dist/DateTimePicker.css'; -import { GalleryContext } from 'pages/gallery'; import CrossIcon from 'components/icons/CrossIcon'; +import { logError } from 'utils/sentry'; interface Iprops { isOpen: boolean; items: any[]; @@ -71,10 +71,10 @@ const renderInfoItem = (label: string, value: string | JSX.Element) => ( function RenderCreationTime({ file, - syncWithRemote, + scheduleUpdate, }: { file: File; - syncWithRemote: (force?: boolean, silent?: boolean) => void; + scheduleUpdate: () => void; }) { const originalCreationTime = new Date(file.metadata.creationTime / 1000); const [isInEditMode, setIsInEditMode] = useState(false); @@ -84,16 +84,21 @@ function RenderCreationTime({ const openEditMode = () => setIsInEditMode(true); const saveEdits = async () => { - if (isInEditMode && file) { - const unixTimeInMicroSec = pickedTime.getTime() * 1000; - const updatedFile = await changeFileCreationTime( - file, - unixTimeInMicroSec - ); - await updatePublicMagicMetadata([updatedFile]); - file.pubMagicMetadata = updatedFile.pubMagicMetadata; - file.metadata = mergeMetadata([file])[0].metadata; - syncWithRemote(false, true); + try { + if (isInEditMode && file) { + const unixTimeInMicroSec = pickedTime.getTime() * 1000; + const updatedFile = await changeFileCreationTime( + file, + unixTimeInMicroSec + ); + await updatePublicMagicMetadata([updatedFile]); + updatedFile.pubMagicMetadata.version += 1; + file.pubMagicMetadata = updatedFile.pubMagicMetadata; + file.metadata = mergeMetadata([file])[0].metadata; + scheduleUpdate(); + } + } catch (e) { + logError(e, 'failed to update creationTime'); } setIsInEditMode(false); }; @@ -204,7 +209,7 @@ function InfoModal({ photoSwipe, metadata, exif, - syncWithRemote, + scheduleUpdate, }) { return ( @@ -224,7 +229,7 @@ function InfoModal({ {metadata?.creationTime && ( )} {metadata?.modificationTime && @@ -268,7 +273,6 @@ function PhotoSwipe(props: Iprops) { const [metadata, setMetaData] = useState(null); const [exif, setExif] = useState(null); const needUpdate = useRef(false); - const galleryContext = useContext(GalleryContext); useEffect(() => { if (!pswpElement) return; @@ -454,6 +458,7 @@ function PhotoSwipe(props: Iprops) { await downloadFile(file); loadingBar.current.complete(); }; + const scheduleUpdate = () => (needUpdate.current = true); const { id } = props; let { className } = props; className = classnames(['pswp', className]).trim(); @@ -544,7 +549,7 @@ function PhotoSwipe(props: Iprops) { photoSwipe={photoSwipe} metadata={metadata} exif={exif} - syncWithRemote={galleryContext.syncWithRemote} + scheduleUpdate={scheduleUpdate} /> ); From f4097effd22420fb03ff99ef03831784fed171ae Mon Sep 17 00:00:00 2001 From: Abhinav Date: Sat, 30 Oct 2021 18:02:13 +0530 Subject: [PATCH 104/147] adds new NOOP state for for when no files present to be compressed and use Completed when fix completes --- src/components/FixLargeThumbnail.tsx | 14 +++++++++++--- src/utils/strings/englishConstants.tsx | 3 +++ 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/src/components/FixLargeThumbnail.tsx b/src/components/FixLargeThumbnail.tsx index 12de7731b..bc9f6f2c2 100644 --- a/src/components/FixLargeThumbnail.tsx +++ b/src/components/FixLargeThumbnail.tsx @@ -24,6 +24,7 @@ interface Props { export enum FIX_STATE { NOT_STARTED, FIX_LATER, + NOOP, RUNNING, COMPLETED, COMPLETED_WITH_ERRORS, @@ -38,6 +39,9 @@ function Message(props: { fixState: FIX_STATE }) { case FIX_STATE.COMPLETED: message = constants.REPLACE_THUMBNAIL_COMPLETED(); break; + case FIX_STATE.NOOP: + message = constants.REPLACE_THUMBNAIL_NOOP(); + break; case FIX_STATE.COMPLETED_WITH_ERRORS: message = constants.REPLACE_THUMBNAIL_COMPLETED_WITH_ERROR(); break; @@ -64,6 +68,10 @@ export default function FixLargeThumbnails(props: Props) { fixState = FIX_STATE.NOT_STARTED; updateFixState(fixState); } + if (fixState === FIX_STATE.COMPLETED) { + fixState = FIX_STATE.NOOP; + updateFixState(fixState); + } setFixState(fixState); return fixState; }; @@ -83,14 +91,14 @@ export default function FixLargeThumbnails(props: Props) { props.show(); } if ( - fixState === FIX_STATE.COMPLETED && + (fixState === FIX_STATE.COMPLETED || fixState === FIX_STATE.NOOP) && largeThumbnailFiles.length > 0 ) { updateFixState(FIX_STATE.NOT_STARTED); logError(Error(), 'large thumbnail files left after migration'); } - if (largeThumbnailFiles.length === 0) { - updateFixState(FIX_STATE.COMPLETED); + if (largeThumbnailFiles.length === 0 && fixState !== FIX_STATE.NOOP) { + updateFixState(FIX_STATE.NOOP); } }; useEffect(() => { diff --git a/src/utils/strings/englishConstants.tsx b/src/utils/strings/englishConstants.tsx index 2182765ca..03a5b4544 100644 --- a/src/utils/strings/englishConstants.tsx +++ b/src/utils/strings/englishConstants.tsx @@ -588,6 +588,9 @@ const englishConstants = { ), REPLACE_THUMBNAIL_COMPLETED: () => ( + <>successfully compressed all thumbnails + ), + REPLACE_THUMBNAIL_NOOP: () => ( <>you have no thumbnails that can be compressed further ), REPLACE_THUMBNAIL_COMPLETED_WITH_ERROR: () => ( From dc794090a6f27523a5595c4374b2ebfa10da1686 Mon Sep 17 00:00:00 2001 From: Abhinav Date: Sat, 30 Oct 2021 18:46:40 +0530 Subject: [PATCH 105/147] update pubMagicMetadat prop name from creationTime to editedTime --- src/services/fileService.ts | 2 +- src/utils/file/index.ts | 16 +++++++++++----- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/src/services/fileService.ts b/src/services/fileService.ts index 14381b57a..03a5f5e08 100644 --- a/src/services/fileService.ts +++ b/src/services/fileService.ts @@ -68,7 +68,7 @@ export interface MagicMetadata extends Omit { } export interface PublicMagicMetadataProps { - creationTime?: number; + editedTime?: number; } export interface PublicMagicMetadata extends Omit { diff --git a/src/utils/file/index.ts b/src/utils/file/index.ts index 58cdd4169..d70b4a6c7 100644 --- a/src/utils/file/index.ts +++ b/src/utils/file/index.ts @@ -141,10 +141,10 @@ export function sortFiles(files: File[]) { .map((file, index) => ({ index, file })) .sort((a, b) => { const fileACreationTime = - a.file.pubMagicMetadata?.data.creationTime ?? + a.file.pubMagicMetadata?.data.editedTime ?? a.file.metadata.creationTime; const fileBCreationTime = - b.file.pubMagicMetadata?.data.creationTime ?? + b.file.pubMagicMetadata?.data.editedTime ?? a.file.metadata.creationTime; let diff = fileBCreationTime - fileACreationTime; if (diff === 0) { @@ -345,9 +345,9 @@ export async function changeFilesVisibility( return updatedFiles; } -export async function changeFileCreationTime(file: File, creationTime: number) { +export async function changeFileCreationTime(file: File, editedTime: number) { const updatedPublicMagicMetadataProps: PublicMagicMetadataProps = { - creationTime, + editedTime, }; return await updatePublicMagicMetadata( @@ -370,7 +370,13 @@ export function mergeMetadata(files: File[]): File[] { ...file, metadata: { ...file.metadata, - ...(file.pubMagicMetadata?.data ? file.pubMagicMetadata.data : {}), + ...(file.pubMagicMetadata?.data + ? { + ...(file.pubMagicMetadata?.data.editedTime && { + creationTime: file.pubMagicMetadata.data.editedTime, + }), + } + : {}), ...(file.magicMetadata?.data ? file.magicMetadata.data : {}), }, })); From ebccb6a981d67de655867cb8352e66df01cbfcba Mon Sep 17 00:00:00 2001 From: Abhinav Date: Sat, 30 Oct 2021 20:35:13 +0530 Subject: [PATCH 106/147] merge metadatas before sorting --- src/services/fileService.ts | 10 ++++++---- src/utils/file/index.ts | 9 ++------- 2 files changed, 8 insertions(+), 11 deletions(-) diff --git a/src/services/fileService.ts b/src/services/fileService.ts index 03a5f5e08..edf478ac5 100644 --- a/src/services/fileService.ts +++ b/src/services/fileService.ts @@ -10,7 +10,7 @@ import { import { Collection } from './collectionService'; import HTTPService from './HTTPService'; import { logError } from 'utils/sentry'; -import { decryptFile, sortFiles } from 'utils/file'; +import { decryptFile, mergeMetadata, sortFiles } from 'utils/file'; import CryptoWorker from 'utils/crypto'; const ENDPOINT = getEndpoint(); @@ -164,12 +164,12 @@ export const syncFiles = async ( } files.push(file); } - files = sortFiles(files); await localForage.setItem('files', files); await localForage.setItem( `${collection.id}-time`, collection.updationTime ); + files = sortFiles(mergeMetadata(files)); setFiles( files.map((item) => ({ ...item, @@ -234,8 +234,10 @@ export const getFiles = async ( } setFiles( sortFiles( - [...(files || []), ...decryptedFiles].filter( - (item) => !item.isDeleted + mergeMetadata( + [...(files || []), ...decryptedFiles].filter( + (item) => !item.isDeleted + ) ) ) ); diff --git a/src/utils/file/index.ts b/src/utils/file/index.ts index d70b4a6c7..eee6b7ac5 100644 --- a/src/utils/file/index.ts +++ b/src/utils/file/index.ts @@ -140,13 +140,8 @@ export function sortFiles(files: File[]) { files = files .map((file, index) => ({ index, file })) .sort((a, b) => { - const fileACreationTime = - a.file.pubMagicMetadata?.data.editedTime ?? - a.file.metadata.creationTime; - const fileBCreationTime = - b.file.pubMagicMetadata?.data.editedTime ?? - a.file.metadata.creationTime; - let diff = fileBCreationTime - fileACreationTime; + let diff = + b.file.metadata.creationTime - a.file.metadata.creationTime; if (diff === 0) { diff = a.index - b.index; } From df0bfd0c2babded4a5c74b22c8ad48d0bee66a5a Mon Sep 17 00:00:00 2001 From: Abhinav Date: Sat, 30 Oct 2021 20:39:52 +0530 Subject: [PATCH 107/147] fix update magic metadata --- src/services/fileService.ts | 4 ++-- src/utils/file/index.ts | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/services/fileService.ts b/src/services/fileService.ts index edf478ac5..7a470ad6e 100644 --- a/src/services/fileService.ts +++ b/src/services/fileService.ts @@ -293,8 +293,8 @@ export const updateMagicMetadata = async (files: File[]) => { reqBody.metadataList.push({ id: file.id, magicMetadata: { - version: file.pubMagicMetadata.version, - count: file.pubMagicMetadata.count, + version: file.magicMetadata.version, + count: file.magicMetadata.count, data: encryptedMagicMetadata.encryptedData as unknown as string, header: encryptedMagicMetadata.decryptionHeader, }, diff --git a/src/utils/file/index.ts b/src/utils/file/index.ts index eee6b7ac5..b69065a7a 100644 --- a/src/utils/file/index.ts +++ b/src/utils/file/index.ts @@ -279,7 +279,7 @@ export async function updateMagicMetadata( return { ...file, magicMetadata: { - ...file.pubMagicMetadata, + ...file.magicMetadata, data: magicMetadataProps, }, }; From 3f127b99273cde44804712ea9f6b1cba4c43bc72 Mon Sep 17 00:00:00 2001 From: Abhinav Date: Sun, 31 Oct 2021 11:12:53 +0530 Subject: [PATCH 108/147] fix banner appending --- src/components/PhotoList.tsx | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/src/components/PhotoList.tsx b/src/components/PhotoList.tsx index bf54be873..b678e971e 100644 --- a/src/components/PhotoList.tsx +++ b/src/components/PhotoList.tsx @@ -184,7 +184,9 @@ export function PhotoList({ timeStampList = mergeTimeStampList(timeStampList, columns); } - showBanner && appendBanner(); + if (showBanner) { + timeStampList.push(getBannerItem(timeStampList)); + } timeStampListRef.current = timeStampList; filteredDataCopyRef.current = filteredData; @@ -195,15 +197,16 @@ export function PhotoList({ first.getMonth() === second.getMonth() && first.getDate() === second.getDate(); - const appendBanner = () => { + const getBannerItem = (timeStampList) => { const photoFrameHeight = (() => { let sum = 0; + const getCurrentItemSize = getItemSize(timeStampList); for (let i = 0; i < timeStampList.length; i++) { - sum += getItemSize(i); + sum += getCurrentItemSize(i); } return sum; })(); - timeStampList.push({ + return { itemType: ITEM_TYPE.BANNER, banner: ( @@ -212,7 +215,7 @@ export function PhotoList({ ), id: 'install-banner', height: Math.max(48, height - photoFrameHeight), - }); + }; }; /** * Checks and merge multiple dates into a single row. @@ -292,7 +295,7 @@ export function PhotoList({ return newList; }; - const getItemSize = (index) => { + const getItemSize = (timeStampList) => (index) => { switch (timeStampList[index].itemType) { case ITEM_TYPE.TIME: return DATE_CONTAINER_HEIGHT; @@ -361,7 +364,7 @@ export function PhotoList({ Date: Sun, 31 Oct 2021 14:39:03 +0530 Subject: [PATCH 109/147] refresh list after timeStampList instead of filtered data update --- src/components/PhotoList.tsx | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/src/components/PhotoList.tsx b/src/components/PhotoList.tsx index b678e971e..fb64359a6 100644 --- a/src/components/PhotoList.tsx +++ b/src/components/PhotoList.tsx @@ -118,19 +118,19 @@ export function PhotoList({ let columns = Math.floor(width / IMAGE_CONTAINER_MAX_WIDTH); let listItemHeight = IMAGE_CONTAINER_MAX_HEIGHT; - useEffect(() => { + let skipMerge = false; + if (columns < MIN_COLUMNS) { + columns = MIN_COLUMNS; + listItemHeight = width / MIN_COLUMNS; + skipMerge = true; + } + + const refreshList = () => { listRef.current?.resetAfterIndex(0); resetFetching(); - }, [filteredData]); + }; useEffect(() => { - let skipMerge = false; - if (columns < MIN_COLUMNS) { - columns = MIN_COLUMNS; - listItemHeight = width / MIN_COLUMNS; - skipMerge = true; - } - let timeStampList: TimeStampListItem[] = []; let listItemIndex = 0; let currentDate = -1; @@ -190,6 +190,7 @@ export function PhotoList({ timeStampListRef.current = timeStampList; filteredDataCopyRef.current = filteredData; + refreshList(); }, [width, height, filteredData, showBanner]); const isSameDay = (first, second) => From 22e76c0c3e496a11e3e89e93003d3d7c7ba0522a Mon Sep 17 00:00:00 2001 From: Abhinav Date: Sun, 31 Oct 2021 19:18:15 +0530 Subject: [PATCH 110/147] start tracking hover if one item has been selected --- src/components/pages/gallery/PreviewCard.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/pages/gallery/PreviewCard.tsx b/src/components/pages/gallery/PreviewCard.tsx index f940f654d..8701bc19c 100644 --- a/src/components/pages/gallery/PreviewCard.tsx +++ b/src/components/pages/gallery/PreviewCard.tsx @@ -232,7 +232,7 @@ export default function PreviewCard(props: IProps) { onSelect(!selected); }; const handleHover = () => { - if (isRangeSelectActive) { + if (selectOnClick) { onHover(); } }; From 9d6a7218a300e13137ed100ed150af2bc2ba2a26 Mon Sep 17 00:00:00 2001 From: Abhinav Date: Sun, 31 Oct 2021 19:18:56 +0530 Subject: [PATCH 111/147] update highlight in range color --- src/components/pages/gallery/PreviewCard.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/pages/gallery/PreviewCard.tsx b/src/components/pages/gallery/PreviewCard.tsx index 8701bc19c..1adbdb97d 100644 --- a/src/components/pages/gallery/PreviewCard.tsx +++ b/src/components/pages/gallery/PreviewCard.tsx @@ -112,7 +112,7 @@ export const InSelectRangeOverLay = styled.div<{ active: boolean }>` color: #fff; font-weight: 900; position: absolute; - ${(props) => props.active && 'background:rgba(4, 251, 0, 0.26)'}; + ${(props) => props.active && 'background:rgba(81, 205, 124, 0.25)'}; `; const Cont = styled.div<{ disabled: boolean; selected: boolean }>` From b06dbc4f574dd64d19da5575cc5f9f58b75da36c Mon Sep 17 00:00:00 2001 From: Abhinav Date: Mon, 1 Nov 2021 18:02:50 +0530 Subject: [PATCH 112/147] update to new date picking lib --- package.json | 2 + src/components/PhotoSwipe/PhotoSwipe.tsx | 34 +- src/pages/_app.tsx | 5 +- yarn.lock | 2021 +++++++++++----------- 4 files changed, 1070 insertions(+), 992 deletions(-) diff --git a/package.json b/package.json index 3293e1a3f..9b5de3785 100644 --- a/package.json +++ b/package.json @@ -44,6 +44,7 @@ "react-bootstrap": "^1.3.0", "react-burger-menu": "^3.0.4", "react-collapse": "^5.1.0", + "react-datepicker": "^4.3.0", "react-datetime-picker": "^3.4.2", "react-dom": "^17.0.2", "react-dropzone": "^11.2.4", @@ -71,6 +72,7 @@ "@types/photoswipe": "^4.1.1", "@types/react": "^16.9.49", "@types/react-collapse": "^5.0.1", + "@types/react-datepicker": "^4.1.7", "@types/react-select": "^4.0.15", "@types/react-window": "^1.8.2", "@types/react-window-infinite-loader": "^1.0.3", diff --git a/src/components/PhotoSwipe/PhotoSwipe.tsx b/src/components/PhotoSwipe/PhotoSwipe.tsx index 2e085b344..faf319b32 100644 --- a/src/components/PhotoSwipe/PhotoSwipe.tsx +++ b/src/components/PhotoSwipe/PhotoSwipe.tsx @@ -25,12 +25,12 @@ import { prettyPrintExif } from 'utils/exif'; import EditIcon from 'components/icons/EditIcon'; import { FlexWrapper, Label, Row, Value } from 'components/Container'; import TickIcon from 'components/icons/TickIcon'; -import DateTimePicker from 'react-datetime-picker/dist/entry.nostyle'; -import 'react-calendar/dist/Calendar.css'; -import 'react-clock/dist/Clock.css'; -import 'react-datetime-picker/dist/DateTimePicker.css'; import CrossIcon from 'components/icons/CrossIcon'; import { logError } from 'utils/sentry'; + +import DatePicker from 'react-datepicker'; +import 'react-datepicker/dist/react-datepicker.css'; + interface Iprops { isOpen: boolean; items: any[]; @@ -107,23 +107,25 @@ function RenderCreationTime({ setPickedTime(originalCreationTime); setIsInEditMode(false); }; + const handleChange = (newDate) => { + if (newDate instanceof Date) { + setPickedTime(newDate); + } + }; return ( <> {isInEditMode ? ( - <> - - + ) : ( formatDateTime(pickedTime) )} @@ -147,6 +149,7 @@ function RenderCreationTime({ )} + {isInEditMode &&
} ); } @@ -295,6 +298,7 @@ function PhotoSwipe(props: Iprops) { useEffect(() => { if (photoSwipe) { photoSwipe.options.arrowKeys = !showInfo; + photoSwipe.options.escKey = !showInfo; } }, [showInfo]); diff --git a/src/pages/_app.tsx b/src/pages/_app.tsx index 395784609..332e30bac 100644 --- a/src/pages/_app.tsx +++ b/src/pages/_app.tsx @@ -410,8 +410,9 @@ const GlobalStyles = createGlobalStyle` .tooltip-inner{ padding:0px; } - .react-datetime-picker__inputGroup__input { - color:#ddd; + .react-datepicker__input-container > input { + width:100%; + } `; export const LogoImage = styled.img` diff --git a/yarn.lock b/yarn.lock index 496381313..9f0209c4b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4,26 +4,26 @@ "@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" + resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz" integrity sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw== dependencies: "@babel/highlight" "^7.10.4" "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.14.5", "@babel/code-frame@^7.5.5": version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.14.5.tgz#23b08d740e83f49c5e59945fbf1b43e80bbf4edb" + resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz" integrity sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw== dependencies: "@babel/highlight" "^7.14.5" "@babel/compat-data@^7.13.11", "@babel/compat-data@^7.15.0": version "7.15.0" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.15.0.tgz#2dbaf8b85334796cafbb0f5793a90a2fc010b176" + resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.15.0.tgz" integrity sha512-0NqAC1IJE0S0+lL1SWFMxMkz1pKCNCjI4tr2Zx4LJSXxCLAdr6KyArnY+sno5m3yH9g737ygOyPABDsnXkpxiA== "@babel/core@^7.8.4": version "7.15.5" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.15.5.tgz#f8ed9ace730722544609f90c9bb49162dc3bf5b9" + resolved "https://registry.npmjs.org/@babel/core/-/core-7.15.5.tgz" integrity sha512-pYgXxiwAgQpgM1bNkZsDEq85f0ggXMA5L7c+o3tskGMh2BunCI9QUwB9Z4jpvXUOuMdyGKiGKQiRe11VS6Jzvg== dependencies: "@babel/code-frame" "^7.14.5" @@ -44,7 +44,7 @@ "@babel/generator@^7.15.4": version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.15.4.tgz#85acb159a267ca6324f9793986991ee2022a05b0" + resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.15.4.tgz" integrity sha512-d3itta0tu+UayjEORPNz6e1T3FtvWlP5N4V5M+lhp/CxT4oAA7/NcScnpRyspUMLK6tu9MNHmQHxRykuN2R7hw== dependencies: "@babel/types" "^7.15.4" @@ -53,14 +53,14 @@ "@babel/helper-annotate-as-pure@^7.0.0", "@babel/helper-annotate-as-pure@^7.14.5", "@babel/helper-annotate-as-pure@^7.15.4": version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.15.4.tgz#3d0e43b00c5e49fdb6c57e421601a7a658d5f835" + resolved "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.15.4.tgz" integrity sha512-QwrtdNvUNsPCj2lfNQacsGSQvGX8ee1ttrBrcozUP2Sv/jylewBP/8QFe6ZkBsC8T/GYWonNAWJV4aRR9AL2DA== dependencies: "@babel/types" "^7.15.4" "@babel/helper-builder-binary-assignment-operator-visitor@^7.14.5": version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.15.4.tgz#21ad815f609b84ee0e3058676c33cf6d1670525f" + resolved "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.15.4.tgz" integrity sha512-P8o7JP2Mzi0SdC6eWr1zF+AEYvrsZa7GSY1lTayjF5XJhVH0kjLYUZPvTMflP7tBgZoe9gIhTa60QwFpqh/E0Q== dependencies: "@babel/helper-explode-assignable-expression" "^7.15.4" @@ -68,7 +68,7 @@ "@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.15.4": version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.15.4.tgz#cf6d94f30fbefc139123e27dd6b02f65aeedb7b9" + resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.15.4.tgz" integrity sha512-rMWPCirulnPSe4d+gwdWXLfAXTTBj8M3guAf5xFQJ0nvFY7tfNAFnWdqaHegHlgDZOCT4qvhF3BYlSJag8yhqQ== dependencies: "@babel/compat-data" "^7.15.0" @@ -78,7 +78,7 @@ "@babel/helper-create-class-features-plugin@^7.14.5", "@babel/helper-create-class-features-plugin@^7.15.4": version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.15.4.tgz#7f977c17bd12a5fba363cb19bea090394bf37d2e" + resolved "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.15.4.tgz" integrity sha512-7ZmzFi+DwJx6A7mHRwbuucEYpyBwmh2Ca0RvI6z2+WLZYCqV0JOaLb+u0zbtmDicebgKBZgqbYfLaKNqSgv5Pw== dependencies: "@babel/helper-annotate-as-pure" "^7.15.4" @@ -90,7 +90,7 @@ "@babel/helper-create-regexp-features-plugin@^7.14.5": version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.14.5.tgz#c7d5ac5e9cf621c26057722fb7a8a4c5889358c4" + resolved "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.14.5.tgz" integrity sha512-TLawwqpOErY2HhWbGJ2nZT5wSkR192QpN+nBg1THfBfftrlvOh+WbhrxXCH4q4xJ9Gl16BGPR/48JA+Ryiho/A== dependencies: "@babel/helper-annotate-as-pure" "^7.14.5" @@ -98,7 +98,7 @@ "@babel/helper-define-polyfill-provider@^0.2.2": version "0.2.3" - resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.2.3.tgz#0525edec5094653a282688d34d846e4c75e9c0b6" + resolved "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.2.3.tgz" integrity sha512-RH3QDAfRMzj7+0Nqu5oqgO5q9mFtQEVvCRsi8qCEfzLR9p2BHfn5FzhSB2oj1fF7I2+DcTORkYaQ6aTR9Cofew== dependencies: "@babel/helper-compilation-targets" "^7.13.0" @@ -112,14 +112,14 @@ "@babel/helper-explode-assignable-expression@^7.15.4": version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.15.4.tgz#f9aec9d219f271eaf92b9f561598ca6b2682600c" + resolved "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.15.4.tgz" integrity sha512-J14f/vq8+hdC2KoWLIQSsGrC9EFBKE4NFts8pfMpymfApds+fPqR30AOUWc4tyr56h9l/GA1Sxv2q3dLZWbQ/g== dependencies: "@babel/types" "^7.15.4" "@babel/helper-function-name@^7.14.5", "@babel/helper-function-name@^7.15.4": version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.15.4.tgz#845744dafc4381a4a5fb6afa6c3d36f98a787ebc" + resolved "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.15.4.tgz" integrity sha512-Z91cOMM4DseLIGOnog+Z8OI6YseR9bua+HpvLAQ2XayUGU+neTtX+97caALaLdyu53I/fjhbeCnWnRH1O3jFOw== dependencies: "@babel/helper-get-function-arity" "^7.15.4" @@ -128,35 +128,35 @@ "@babel/helper-get-function-arity@^7.15.4": version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.15.4.tgz#098818934a137fce78b536a3e015864be1e2879b" + resolved "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.15.4.tgz" integrity sha512-1/AlxSF92CmGZzHnC515hm4SirTxtpDnLEJ0UyEMgTMZN+6bxXKg04dKhiRx5Enel+SUA1G1t5Ed/yQia0efrA== dependencies: "@babel/types" "^7.15.4" "@babel/helper-hoist-variables@^7.15.4": version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.15.4.tgz#09993a3259c0e918f99d104261dfdfc033f178df" + resolved "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.15.4.tgz" integrity sha512-VTy085egb3jUGVK9ycIxQiPbquesq0HUQ+tPO0uv5mPEBZipk+5FkRKiWq5apuyTE9FUrjENB0rCf8y+n+UuhA== dependencies: "@babel/types" "^7.15.4" "@babel/helper-member-expression-to-functions@^7.15.4": version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.15.4.tgz#bfd34dc9bba9824a4658b0317ec2fd571a51e6ef" + resolved "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.15.4.tgz" integrity sha512-cokOMkxC/BTyNP1AlY25HuBWM32iCEsLPI4BHDpJCHHm1FU2E7dKWWIXJgQgSFiu4lp8q3bL1BIKwqkSUviqtA== dependencies: "@babel/types" "^7.15.4" "@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.14.5", "@babel/helper-module-imports@^7.15.4": version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.15.4.tgz#e18007d230632dea19b47853b984476e7b4e103f" + resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.15.4.tgz" integrity sha512-jeAHZbzUwdW/xHgHQ3QmWR4Jg6j15q4w/gCfwZvtqOxoo5DKtLHk8Bsf4c5RZRC7NmLEs+ohkdq8jFefuvIxAA== dependencies: "@babel/types" "^7.15.4" "@babel/helper-module-transforms@^7.14.5", "@babel/helper-module-transforms@^7.15.4": version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.15.4.tgz#962cc629a7f7f9a082dd62d0307fa75fe8788d7c" + resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.15.4.tgz" integrity sha512-9fHHSGE9zTC++KuXLZcB5FKgvlV83Ox+NLUmQTawovwlJ85+QMhk1CnVk406CQVj97LaWod6KVjl2Sfgw9Aktw== dependencies: "@babel/helper-module-imports" "^7.15.4" @@ -170,19 +170,19 @@ "@babel/helper-optimise-call-expression@^7.15.4": version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.15.4.tgz#f310a5121a3b9cc52d9ab19122bd729822dee171" + resolved "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.15.4.tgz" integrity sha512-E/z9rfbAOt1vDW1DR7k4SzhzotVV5+qMciWV6LaG1g4jeFrkDlJedjtV4h0i4Q/ITnUu+Pk08M7fczsB9GXBDw== dependencies: "@babel/types" "^7.15.4" "@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.13.0", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz#5ac822ce97eec46741ab70a517971e443a70c5a9" + resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz" integrity sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ== "@babel/helper-remap-async-to-generator@^7.14.5", "@babel/helper-remap-async-to-generator@^7.15.4": version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.15.4.tgz#2637c0731e4c90fbf58ac58b50b2b5a192fc970f" + resolved "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.15.4.tgz" integrity sha512-v53MxgvMK/HCwckJ1bZrq6dNKlmwlyRNYM6ypaRTdXWGOE2c1/SCa6dL/HimhPulGhZKw9W0QhREM583F/t0vQ== dependencies: "@babel/helper-annotate-as-pure" "^7.15.4" @@ -191,7 +191,7 @@ "@babel/helper-replace-supers@^7.14.5", "@babel/helper-replace-supers@^7.15.4": version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.15.4.tgz#52a8ab26ba918c7f6dee28628b07071ac7b7347a" + resolved "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.15.4.tgz" integrity sha512-/ztT6khaXF37MS47fufrKvIsiQkx1LBRvSJNzRqmbyeZnTwU9qBxXYLaaT/6KaxfKhjs2Wy8kG8ZdsFUuWBjzw== dependencies: "@babel/helper-member-expression-to-functions" "^7.15.4" @@ -201,38 +201,38 @@ "@babel/helper-simple-access@^7.15.4": version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.15.4.tgz#ac368905abf1de8e9781434b635d8f8674bcc13b" + resolved "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.15.4.tgz" integrity sha512-UzazrDoIVOZZcTeHHEPYrr1MvTR/K+wgLg6MY6e1CJyaRhbibftF6fR2KU2sFRtI/nERUZR9fBd6aKgBlIBaPg== dependencies: "@babel/types" "^7.15.4" "@babel/helper-skip-transparent-expression-wrappers@^7.14.5", "@babel/helper-skip-transparent-expression-wrappers@^7.15.4": version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.15.4.tgz#707dbdba1f4ad0fa34f9114fc8197aec7d5da2eb" + resolved "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.15.4.tgz" integrity sha512-BMRLsdh+D1/aap19TycS4eD1qELGrCBJwzaY9IE8LrpJtJb+H7rQkPIdsfgnMtLBA6DJls7X9z93Z4U8h7xw0A== dependencies: "@babel/types" "^7.15.4" "@babel/helper-split-export-declaration@^7.15.4": version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.15.4.tgz#aecab92dcdbef6a10aa3b62ab204b085f776e257" + resolved "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.15.4.tgz" integrity sha512-HsFqhLDZ08DxCpBdEVtKmywj6PQbwnF6HHybur0MAnkAKnlS6uHkwnmRIkElB2Owpfb4xL4NwDmDLFubueDXsw== dependencies: "@babel/types" "^7.15.4" "@babel/helper-validator-identifier@^7.14.5", "@babel/helper-validator-identifier@^7.14.9": version "7.14.9" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz#6654d171b2024f6d8ee151bf2509699919131d48" + resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz" integrity sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g== "@babel/helper-validator-option@^7.14.5": version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz#6e72a1fff18d5dfcb878e1e62f1a021c4b72d5a3" + resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz" integrity sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow== "@babel/helper-wrap-function@^7.15.4": version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.15.4.tgz#6f754b2446cfaf3d612523e6ab8d79c27c3a3de7" + resolved "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.15.4.tgz" integrity sha512-Y2o+H/hRV5W8QhIfTpRIBwl57y8PrZt6JM3V8FOo5qarjshHItyH5lXlpMfBfmBefOqSCpKZs/6Dxqp0E/U+uw== dependencies: "@babel/helper-function-name" "^7.15.4" @@ -242,7 +242,7 @@ "@babel/helpers@^7.15.4": version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.15.4.tgz#5f40f02050a3027121a3cf48d497c05c555eaf43" + resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.15.4.tgz" integrity sha512-V45u6dqEJ3w2rlryYYXf6i9rQ5YMNu4FLS6ngs8ikblhu2VdR1AqAd6aJjBzmf2Qzh6KOLqKHxEN9+TFbAkAVQ== dependencies: "@babel/template" "^7.15.4" @@ -251,7 +251,7 @@ "@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" + resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz" integrity sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg== dependencies: "@babel/helper-validator-identifier" "^7.14.5" @@ -260,12 +260,12 @@ "@babel/parser@^7.15.4", "@babel/parser@^7.15.5": version "7.15.6" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.15.6.tgz#043b9aa3c303c0722e5377fef9197f4cf1796549" + resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.15.6.tgz" integrity sha512-S/TSCcsRuCkmpUuoWijua0Snt+f3ewU/8spLo+4AXJCZfT0bVCzLD5MuOKdrx0mlAptbKzn5AdgEIIKXxXkz9Q== "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.15.4": version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.15.4.tgz#dbdeabb1e80f622d9f0b583efb2999605e0a567e" + resolved "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.15.4.tgz" integrity sha512-eBnpsl9tlhPhpI10kU06JHnrYXwg3+V6CaP2idsCXNef0aeslpqyITXQ74Vfk5uHgY7IG7XP0yIH8b42KSzHog== dependencies: "@babel/helper-plugin-utils" "^7.14.5" @@ -274,7 +274,7 @@ "@babel/plugin-proposal-async-generator-functions@^7.15.4": version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.15.4.tgz#f82aabe96c135d2ceaa917feb9f5fca31635277e" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.15.4.tgz" integrity sha512-2zt2g5vTXpMC3OmK6uyjvdXptbhBXfA77XGrd3gh93zwG8lZYBLOBImiGBEG0RANu3JqKEACCz5CGk73OJROBw== dependencies: "@babel/helper-plugin-utils" "^7.14.5" @@ -283,7 +283,7 @@ "@babel/plugin-proposal-class-properties@^7.14.5": version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.14.5.tgz#40d1ee140c5b1e31a350f4f5eed945096559b42e" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.14.5.tgz" integrity sha512-q/PLpv5Ko4dVc1LYMpCY7RVAAO4uk55qPwrIuJ5QJ8c6cVuAmhu7I/49JOppXL6gXf7ZHzpRVEUZdYoPLM04Gg== dependencies: "@babel/helper-create-class-features-plugin" "^7.14.5" @@ -291,7 +291,7 @@ "@babel/plugin-proposal-class-static-block@^7.15.4": version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.15.4.tgz#3e7ca6128453c089e8b477a99f970c63fc1cb8d7" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.15.4.tgz" integrity sha512-M682XWrrLNk3chXCjoPUQWOyYsB93B9z3mRyjtqqYJWDf2mfCdIYgDrA11cgNVhAQieaq6F2fn2f3wI0U4aTjA== dependencies: "@babel/helper-create-class-features-plugin" "^7.15.4" @@ -300,7 +300,7 @@ "@babel/plugin-proposal-dynamic-import@^7.14.5": version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.14.5.tgz#0c6617df461c0c1f8fff3b47cd59772360101d2c" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.14.5.tgz" integrity sha512-ExjiNYc3HDN5PXJx+bwC50GIx/KKanX2HiggnIUAYedbARdImiCU4RhhHfdf0Kd7JNXGpsBBBCOm+bBVy3Gb0g== dependencies: "@babel/helper-plugin-utils" "^7.14.5" @@ -308,7 +308,7 @@ "@babel/plugin-proposal-export-namespace-from@^7.14.5": version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.14.5.tgz#dbad244310ce6ccd083072167d8cea83a52faf76" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.14.5.tgz" integrity sha512-g5POA32bXPMmSBu5Dx/iZGLGnKmKPc5AiY7qfZgurzrCYgIztDlHFbznSNCoQuv57YQLnQfaDi7dxCtLDIdXdA== dependencies: "@babel/helper-plugin-utils" "^7.14.5" @@ -316,7 +316,7 @@ "@babel/plugin-proposal-json-strings@^7.14.5": version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.14.5.tgz#38de60db362e83a3d8c944ac858ddf9f0c2239eb" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.14.5.tgz" integrity sha512-NSq2fczJYKVRIsUJyNxrVUMhB27zb7N7pOFGQOhBKJrChbGcgEAqyZrmZswkPk18VMurEeJAaICbfm57vUeTbQ== dependencies: "@babel/helper-plugin-utils" "^7.14.5" @@ -324,7 +324,7 @@ "@babel/plugin-proposal-logical-assignment-operators@^7.14.5": version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.14.5.tgz#6e6229c2a99b02ab2915f82571e0cc646a40c738" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.14.5.tgz" integrity sha512-YGn2AvZAo9TwyhlLvCCWxD90Xq8xJ4aSgaX3G5D/8DW94L8aaT+dS5cSP+Z06+rCJERGSr9GxMBZ601xoc2taw== dependencies: "@babel/helper-plugin-utils" "^7.14.5" @@ -332,7 +332,7 @@ "@babel/plugin-proposal-nullish-coalescing-operator@^7.14.5": version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.14.5.tgz#ee38589ce00e2cc59b299ec3ea406fcd3a0fdaf6" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.14.5.tgz" integrity sha512-gun/SOnMqjSb98Nkaq2rTKMwervfdAoz6NphdY0vTfuzMfryj+tDGb2n6UkDKwez+Y8PZDhE3D143v6Gepp4Hg== dependencies: "@babel/helper-plugin-utils" "^7.14.5" @@ -340,7 +340,7 @@ "@babel/plugin-proposal-numeric-separator@^7.14.5": version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.14.5.tgz#83631bf33d9a51df184c2102a069ac0c58c05f18" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.14.5.tgz" integrity sha512-yiclALKe0vyZRZE0pS6RXgjUOt87GWv6FYa5zqj15PvhOGFO69R5DusPlgK/1K5dVnCtegTiWu9UaBSrLLJJBg== dependencies: "@babel/helper-plugin-utils" "^7.14.5" @@ -348,7 +348,7 @@ "@babel/plugin-proposal-object-rest-spread@^7.15.6": version "7.15.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.15.6.tgz#ef68050c8703d07b25af402cb96cf7f34a68ed11" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.15.6.tgz" integrity sha512-qtOHo7A1Vt+O23qEAX+GdBpqaIuD3i9VRrWgCJeq7WO6H2d14EK3q11urj5Te2MAeK97nMiIdRpwd/ST4JFbNg== dependencies: "@babel/compat-data" "^7.15.0" @@ -359,7 +359,7 @@ "@babel/plugin-proposal-optional-catch-binding@^7.14.5": version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.14.5.tgz#939dd6eddeff3a67fdf7b3f044b5347262598c3c" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.14.5.tgz" integrity sha512-3Oyiixm0ur7bzO5ybNcZFlmVsygSIQgdOa7cTfOYCMY+wEPAYhZAJxi3mixKFCTCKUhQXuCTtQ1MzrpL3WT8ZQ== dependencies: "@babel/helper-plugin-utils" "^7.14.5" @@ -367,7 +367,7 @@ "@babel/plugin-proposal-optional-chaining@^7.14.5": version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.14.5.tgz#fa83651e60a360e3f13797eef00b8d519695b603" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.14.5.tgz" integrity sha512-ycz+VOzo2UbWNI1rQXxIuMOzrDdHGrI23fRiz/Si2R4kv2XZQ1BK8ccdHwehMKBlcH/joGW/tzrUmo67gbJHlQ== dependencies: "@babel/helper-plugin-utils" "^7.14.5" @@ -376,7 +376,7 @@ "@babel/plugin-proposal-private-methods@^7.14.5": version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.14.5.tgz#37446495996b2945f30f5be5b60d5e2aa4f5792d" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.14.5.tgz" integrity sha512-838DkdUA1u+QTCplatfq4B7+1lnDa/+QMI89x5WZHBcnNv+47N8QEj2k9I2MUU9xIv8XJ4XvPCviM/Dj7Uwt9g== dependencies: "@babel/helper-create-class-features-plugin" "^7.14.5" @@ -384,7 +384,7 @@ "@babel/plugin-proposal-private-property-in-object@^7.15.4": version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.15.4.tgz#55c5e3b4d0261fd44fe637e3f624cfb0f484e3e5" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.15.4.tgz" integrity sha512-X0UTixkLf0PCCffxgu5/1RQyGGbgZuKoI+vXP4iSbJSYwPb7hu06omsFGBvQ9lJEvwgrxHdS8B5nbfcd8GyUNA== dependencies: "@babel/helper-annotate-as-pure" "^7.15.4" @@ -394,7 +394,7 @@ "@babel/plugin-proposal-unicode-property-regex@^7.14.5", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.14.5.tgz#0f95ee0e757a5d647f378daa0eca7e93faa8bbe8" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.14.5.tgz" integrity sha512-6axIeOU5LnY471KenAB9vI8I5j7NQ2d652hIYwVyRfgaZT5UpiqFKCuVXCDMSrU+3VFafnu2c5m3lrWIlr6A5Q== dependencies: "@babel/helper-create-regexp-features-plugin" "^7.14.5" @@ -402,119 +402,119 @@ "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz" integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-class-properties@^7.12.13": version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz" integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== dependencies: "@babel/helper-plugin-utils" "^7.12.13" "@babel/plugin-syntax-class-static-block@^7.14.5": version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz#195df89b146b4b78b3bf897fd7a257c84659d406" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz" integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== dependencies: "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-dynamic-import@^7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz" integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-export-namespace-from@^7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz#028964a9ba80dbc094c915c487ad7c4e7a66465a" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz" integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q== dependencies: "@babel/helper-plugin-utils" "^7.8.3" "@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" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz" integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-jsx@7.14.5": version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.14.5.tgz#000e2e25d8673cce49300517a3eda44c263e4201" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.14.5.tgz" integrity sha512-ohuFIsOMXJnbOMRfX7/w7LocdR6R7whhuRD4ax8IipLcLPlZGJKkBxgHp++U4N/vKyU16/YDQr2f5seajD3jIw== dependencies: "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-logical-assignment-operators@^7.10.4": 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" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz" integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== dependencies: "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz" integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-numeric-separator@^7.10.4": version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz" integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== dependencies: "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-object-rest-spread@^7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz" integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-optional-catch-binding@^7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz" integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-optional-chaining@^7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz" integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-private-property-in-object@^7.14.5": version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz#0dc6671ec0ea22b6e94a1114f857970cd39de1ad" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz" integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== dependencies: "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-top-level-await@^7.14.5": 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" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz" integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== dependencies: "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-transform-arrow-functions@^7.14.5": version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.14.5.tgz#f7187d9588a768dd080bf4c9ffe117ea62f7862a" + resolved "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.14.5.tgz" integrity sha512-KOnO0l4+tD5IfOdi4x8C1XmEIRWUjNRV8wc6K2vz/3e8yAOoZZvsRXRRIF/yo/MAOFb4QjtAw9xSxMXbSMRy8A== dependencies: "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-transform-async-to-generator@^7.14.5": version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.14.5.tgz#72c789084d8f2094acb945633943ef8443d39e67" + resolved "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.14.5.tgz" integrity sha512-szkbzQ0mNk0rpu76fzDdqSyPu0MuvpXgC+6rz5rpMb5OIRxdmHfQxrktL8CYolL2d8luMCZTR0DpIMIdL27IjA== dependencies: "@babel/helper-module-imports" "^7.14.5" @@ -523,21 +523,21 @@ "@babel/plugin-transform-block-scoped-functions@^7.14.5": version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.14.5.tgz#e48641d999d4bc157a67ef336aeb54bc44fd3ad4" + resolved "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.14.5.tgz" integrity sha512-dtqWqdWZ5NqBX3KzsVCWfQI3A53Ft5pWFCT2eCVUftWZgjc5DpDponbIF1+c+7cSGk2wN0YK7HGL/ezfRbpKBQ== dependencies: "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-transform-block-scoping@^7.15.3": version "7.15.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.15.3.tgz#94c81a6e2fc230bcce6ef537ac96a1e4d2b3afaf" + resolved "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.15.3.tgz" integrity sha512-nBAzfZwZb4DkaGtOes1Up1nOAp9TDRRFw4XBzBBSG9QK7KVFmYzgj9o9sbPv7TX5ofL4Auq4wZnxCoPnI/lz2Q== dependencies: "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-transform-classes@^7.15.4": version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.15.4.tgz#50aee17aaf7f332ae44e3bce4c2e10534d5d3bf1" + resolved "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.15.4.tgz" integrity sha512-Yjvhex8GzBmmPQUvpXRPWQ9WnxXgAFuZSrqOK/eJlOGIXwvv8H3UEdUigl1gb/bnjTrln+e8bkZUYCBt/xYlBg== dependencies: "@babel/helper-annotate-as-pure" "^7.15.4" @@ -550,21 +550,21 @@ "@babel/plugin-transform-computed-properties@^7.14.5": version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.14.5.tgz#1b9d78987420d11223d41195461cc43b974b204f" + resolved "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.14.5.tgz" integrity sha512-pWM+E4283UxaVzLb8UBXv4EIxMovU4zxT1OPnpHJcmnvyY9QbPPTKZfEj31EUvG3/EQRbYAGaYEUZ4yWOBC2xg== dependencies: "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-transform-destructuring@^7.14.7": version "7.14.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.14.7.tgz#0ad58ed37e23e22084d109f185260835e5557576" + resolved "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.14.7.tgz" integrity sha512-0mDE99nK+kVh3xlc5vKwB6wnP9ecuSj+zQCa/n0voENtP/zymdT4HH6QEb65wjjcbqr1Jb/7z9Qp7TF5FtwYGw== dependencies: "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-transform-dotall-regex@^7.14.5", "@babel/plugin-transform-dotall-regex@^7.4.4": version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.14.5.tgz#2f6bf76e46bdf8043b4e7e16cf24532629ba0c7a" + resolved "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.14.5.tgz" integrity sha512-loGlnBdj02MDsFaHhAIJzh7euK89lBrGIdM9EAtHFo6xKygCUGuuWe07o1oZVk287amtW1n0808sQM99aZt3gw== dependencies: "@babel/helper-create-regexp-features-plugin" "^7.14.5" @@ -572,14 +572,14 @@ "@babel/plugin-transform-duplicate-keys@^7.14.5": version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.14.5.tgz#365a4844881bdf1501e3a9f0270e7f0f91177954" + resolved "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.14.5.tgz" integrity sha512-iJjbI53huKbPDAsJ8EmVmvCKeeq21bAze4fu9GBQtSLqfvzj2oRuHVx4ZkDwEhg1htQ+5OBZh/Ab0XDf5iBZ7A== dependencies: "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-transform-exponentiation-operator@^7.14.5": version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.14.5.tgz#5154b8dd6a3dfe6d90923d61724bd3deeb90b493" + resolved "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.14.5.tgz" integrity sha512-jFazJhMBc9D27o9jDnIE5ZErI0R0m7PbKXVq77FFvqFbzvTMuv8jaAwLZ5PviOLSFttqKIW0/wxNSDbjLk0tYA== dependencies: "@babel/helper-builder-binary-assignment-operator-visitor" "^7.14.5" @@ -587,14 +587,14 @@ "@babel/plugin-transform-for-of@^7.15.4": version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.15.4.tgz#25c62cce2718cfb29715f416e75d5263fb36a8c2" + resolved "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.15.4.tgz" integrity sha512-DRTY9fA751AFBDh2oxydvVm4SYevs5ILTWLs6xKXps4Re/KG5nfUkr+TdHCrRWB8C69TlzVgA9b3RmGWmgN9LA== dependencies: "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-transform-function-name@^7.14.5": version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.14.5.tgz#e81c65ecb900746d7f31802f6bed1f52d915d6f2" + resolved "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.14.5.tgz" integrity sha512-vbO6kv0fIzZ1GpmGQuvbwwm+O4Cbm2NrPzwlup9+/3fdkuzo1YqOZcXw26+YUJB84Ja7j9yURWposEHLYwxUfQ== dependencies: "@babel/helper-function-name" "^7.14.5" @@ -602,21 +602,21 @@ "@babel/plugin-transform-literals@^7.14.5": version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.14.5.tgz#41d06c7ff5d4d09e3cf4587bd3ecf3930c730f78" + resolved "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.14.5.tgz" integrity sha512-ql33+epql2F49bi8aHXxvLURHkxJbSmMKl9J5yHqg4PLtdE6Uc48CH1GS6TQvZ86eoB/ApZXwm7jlA+B3kra7A== dependencies: "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-transform-member-expression-literals@^7.14.5": version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.14.5.tgz#b39cd5212a2bf235a617d320ec2b48bcc091b8a7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.14.5.tgz" integrity sha512-WkNXxH1VXVTKarWFqmso83xl+2V3Eo28YY5utIkbsmXoItO8Q3aZxN4BTS2k0hz9dGUloHK26mJMyQEYfkn/+Q== dependencies: "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-transform-modules-amd@^7.14.5": version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.14.5.tgz#4fd9ce7e3411cb8b83848480b7041d83004858f7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.14.5.tgz" integrity sha512-3lpOU8Vxmp3roC4vzFpSdEpGUWSMsHFreTWOMMLzel2gNGfHE5UWIh/LN6ghHs2xurUp4jRFYMUIZhuFbody1g== dependencies: "@babel/helper-module-transforms" "^7.14.5" @@ -625,7 +625,7 @@ "@babel/plugin-transform-modules-commonjs@^7.15.4": version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.15.4.tgz#8201101240eabb5a76c08ef61b2954f767b6b4c1" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.15.4.tgz" integrity sha512-qg4DPhwG8hKp4BbVDvX1s8cohM8a6Bvptu4l6Iingq5rW+yRUAhe/YRup/YcW2zCOlrysEWVhftIcKzrEZv3sA== dependencies: "@babel/helper-module-transforms" "^7.15.4" @@ -635,7 +635,7 @@ "@babel/plugin-transform-modules-systemjs@^7.15.4": version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.15.4.tgz#b42890c7349a78c827719f1d2d0cd38c7d268132" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.15.4.tgz" integrity sha512-fJUnlQrl/mezMneR72CKCgtOoahqGJNVKpompKwzv3BrEXdlPspTcyxrZ1XmDTIr9PpULrgEQo3qNKp6dW7ssw== dependencies: "@babel/helper-hoist-variables" "^7.15.4" @@ -646,7 +646,7 @@ "@babel/plugin-transform-modules-umd@^7.14.5": version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.14.5.tgz#fb662dfee697cce274a7cda525190a79096aa6e0" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.14.5.tgz" integrity sha512-RfPGoagSngC06LsGUYyM9QWSXZ8MysEjDJTAea1lqRjNECE3y0qIJF/qbvJxc4oA4s99HumIMdXOrd+TdKaAAA== dependencies: "@babel/helper-module-transforms" "^7.14.5" @@ -654,21 +654,21 @@ "@babel/plugin-transform-named-capturing-groups-regex@^7.14.9": version "7.14.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.14.9.tgz#c68f5c5d12d2ebaba3762e57c2c4f6347a46e7b2" + resolved "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.14.9.tgz" integrity sha512-l666wCVYO75mlAtGFfyFwnWmIXQm3kSH0C3IRnJqWcZbWkoihyAdDhFm2ZWaxWTqvBvhVFfJjMRQ0ez4oN1yYA== dependencies: "@babel/helper-create-regexp-features-plugin" "^7.14.5" "@babel/plugin-transform-new-target@^7.14.5": version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.14.5.tgz#31bdae8b925dc84076ebfcd2a9940143aed7dbf8" + resolved "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.14.5.tgz" integrity sha512-Nx054zovz6IIRWEB49RDRuXGI4Gy0GMgqG0cII9L3MxqgXz/+rgII+RU58qpo4g7tNEx1jG7rRVH4ihZoP4esQ== dependencies: "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-transform-object-super@^7.14.5": version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.14.5.tgz#d0b5faeac9e98597a161a9cf78c527ed934cdc45" + resolved "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.14.5.tgz" integrity sha512-MKfOBWzK0pZIrav9z/hkRqIk/2bTv9qvxHzPQc12RcVkMOzpIKnFCNYJip00ssKWYkd8Sf5g0Wr7pqJ+cmtuFg== dependencies: "@babel/helper-plugin-utils" "^7.14.5" @@ -676,42 +676,42 @@ "@babel/plugin-transform-parameters@^7.15.4": version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.15.4.tgz#5f2285cc3160bf48c8502432716b48504d29ed62" + resolved "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.15.4.tgz" integrity sha512-9WB/GUTO6lvJU3XQsSr6J/WKvBC2hcs4Pew8YxZagi6GkTdniyqp8On5kqdK8MN0LMeu0mGbhPN+O049NV/9FQ== dependencies: "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-transform-property-literals@^7.14.5": version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.14.5.tgz#0ddbaa1f83db3606f1cdf4846fa1dfb473458b34" + resolved "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.14.5.tgz" integrity sha512-r1uilDthkgXW8Z1vJz2dKYLV1tuw2xsbrp3MrZmD99Wh9vsfKoob+JTgri5VUb/JqyKRXotlOtwgu4stIYCmnw== dependencies: "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-transform-regenerator@^7.14.5": version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.14.5.tgz#9676fd5707ed28f522727c5b3c0aa8544440b04f" + resolved "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.14.5.tgz" integrity sha512-NVIY1W3ITDP5xQl50NgTKlZ0GrotKtLna08/uGY6ErQt6VEQZXla86x/CTddm5gZdcr+5GSsvMeTmWA5Ii6pkg== dependencies: regenerator-transform "^0.14.2" "@babel/plugin-transform-reserved-words@^7.14.5": version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.14.5.tgz#c44589b661cfdbef8d4300dcc7469dffa92f8304" + resolved "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.14.5.tgz" integrity sha512-cv4F2rv1nD4qdexOGsRQXJrOcyb5CrgjUH9PKrrtyhSDBNWGxd0UIitjyJiWagS+EbUGjG++22mGH1Pub8D6Vg== dependencies: "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-transform-shorthand-properties@^7.14.5": version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.14.5.tgz#97f13855f1409338d8cadcbaca670ad79e091a58" + resolved "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.14.5.tgz" integrity sha512-xLucks6T1VmGsTB+GWK5Pl9Jl5+nRXD1uoFdA5TSO6xtiNjtXTjKkmPdFXVLGlK5A2/or/wQMKfmQ2Y0XJfn5g== dependencies: "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-transform-spread@^7.14.6": version "7.14.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.14.6.tgz#6bd40e57fe7de94aa904851963b5616652f73144" + resolved "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.14.6.tgz" integrity sha512-Zr0x0YroFJku7n7+/HH3A2eIrGMjbmAIbJSVv0IZ+t3U2WUQUA64S/oeied2e+MaGSjmt4alzBCsK9E8gh+fag== dependencies: "@babel/helper-plugin-utils" "^7.14.5" @@ -719,35 +719,35 @@ "@babel/plugin-transform-sticky-regex@^7.14.5": version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.14.5.tgz#5b617542675e8b7761294381f3c28c633f40aeb9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.14.5.tgz" integrity sha512-Z7F7GyvEMzIIbwnziAZmnSNpdijdr4dWt+FJNBnBLz5mwDFkqIXU9wmBcWWad3QeJF5hMTkRe4dAq2sUZiG+8A== dependencies: "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-transform-template-literals@^7.14.5": version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.14.5.tgz#a5f2bc233937d8453885dc736bdd8d9ffabf3d93" + resolved "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.14.5.tgz" integrity sha512-22btZeURqiepOfuy/VkFr+zStqlujWaarpMErvay7goJS6BWwdd6BY9zQyDLDa4x2S3VugxFb162IZ4m/S/+Gg== dependencies: "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-transform-typeof-symbol@^7.14.5": version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.14.5.tgz#39af2739e989a2bd291bf6b53f16981423d457d4" + resolved "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.14.5.tgz" integrity sha512-lXzLD30ffCWseTbMQzrvDWqljvZlHkXU+CnseMhkMNqU1sASnCsz3tSzAaH3vCUXb9PHeUb90ZT1BdFTm1xxJw== dependencies: "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-transform-unicode-escapes@^7.14.5": version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.14.5.tgz#9d4bd2a681e3c5d7acf4f57fa9e51175d91d0c6b" + resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.14.5.tgz" integrity sha512-crTo4jATEOjxj7bt9lbYXcBAM3LZaUrbP2uUdxb6WIorLmjNKSpHfIybgY4B8SRpbf8tEVIWH3Vtm7ayCrKocA== dependencies: "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-transform-unicode-regex@^7.14.5": version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.14.5.tgz#4cd09b6c8425dd81255c7ceb3fb1836e7414382e" + resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.14.5.tgz" integrity sha512-UygduJpC5kHeCiRw/xDVzC+wj8VaYSoKl5JNVmbP7MadpNinAm3SvZCxZ42H37KZBKztz46YC73i9yV34d0Tzw== dependencies: "@babel/helper-create-regexp-features-plugin" "^7.14.5" @@ -755,7 +755,7 @@ "@babel/preset-env@^7.8.4": version "7.15.6" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.15.6.tgz#0f3898db9d63d320f21b17380d8462779de57659" + resolved "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.15.6.tgz" integrity sha512-L+6jcGn7EWu7zqaO2uoTDjjMBW+88FXzV8KvrBl2z6MtRNxlsmUNRlZPaNNPUTgqhyC5DHNFk/2Jmra+ublZWw== dependencies: "@babel/compat-data" "^7.15.0" @@ -834,7 +834,7 @@ "@babel/preset-modules@^0.1.4": version "0.1.4" - resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.4.tgz#362f2b68c662842970fdb5e254ffc8fc1c2e415e" + resolved "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.4.tgz" integrity sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg== dependencies: "@babel/helper-plugin-utils" "^7.0.0" @@ -845,7 +845,7 @@ "@babel/runtime-corejs3@^7.10.2": version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.15.4.tgz#403139af262b9a6e8f9ba04a6fdcebf8de692bf1" + resolved "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.15.4.tgz" integrity sha512-lWcAqKeB624/twtTc3w6w/2o9RqJPaNBhPGK6DKLSiwuVWC7WFkypWyNg+CpZoyJH0jVzv1uMtXZ/5/lQOLtCg== dependencies: core-js-pure "^3.16.0" @@ -853,21 +853,21 @@ "@babel/runtime@7.15.3": version "7.15.3" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.15.3.tgz#2e1c2880ca118e5b2f9988322bd8a7656a32502b" + resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.15.3.tgz" integrity sha512-OvwMLqNXkCXSz1kSm58sEsNuhqOx/fKpnUnKnFB5v8uDda5bLNEHNgKPvhDN6IU0LDcnHQ90LlJ0Q6jnyBSIBA== dependencies: regenerator-runtime "^0.13.4" "@babel/runtime@^7.0.0", "@babel/runtime@^7.10.2", "@babel/runtime@^7.10.5", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.0", "@babel/runtime@^7.13.10", "@babel/runtime@^7.13.8", "@babel/runtime@^7.14.0", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.3", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7": version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.15.4.tgz#fd17d16bfdf878e6dd02d19753a39fa8a8d9c84a" + resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.15.4.tgz" integrity sha512-99catp6bHCaxr4sJ/DbTGgHS4+Rs2RVd2g7iOap6SLGPDknRK9ztKNsE/Fg6QhSeh1FGE5f6gHGQmvvn3I3xhw== dependencies: regenerator-runtime "^0.13.4" "@babel/template@^7.15.4": version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.15.4.tgz#51898d35dcf3faa670c4ee6afcfd517ee139f194" + resolved "https://registry.npmjs.org/@babel/template/-/template-7.15.4.tgz" integrity sha512-UgBAfEa1oGuYgDIPM2G+aHa4Nlo9Lh6mGD2bDBGMTbYnc38vulXPuC1MGjYILIEmlwl6Rd+BPR9ee3gm20CBtg== dependencies: "@babel/code-frame" "^7.14.5" @@ -876,7 +876,7 @@ "@babel/traverse@^7.13.0", "@babel/traverse@^7.15.4", "@babel/traverse@^7.4.5": version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.15.4.tgz#ff8510367a144bfbff552d9e18e28f3e2889c22d" + resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.15.4.tgz" integrity sha512-W6lQD8l4rUbQR/vYgSuCAE75ADyyQvOpFVsvPPdkhf6lATXAsQIG9YdtOcu8BB1dZ0LKu+Zo3c1wEcbKeuhdlA== dependencies: "@babel/code-frame" "^7.14.5" @@ -891,7 +891,7 @@ "@babel/types@7.15.0": version "7.15.0" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.15.0.tgz#61af11f2286c4e9c69ca8deb5f4375a73c72dcbd" + resolved "https://registry.npmjs.org/@babel/types/-/types-7.15.0.tgz" integrity sha512-OBvfqnllOIdX4ojTHpwZbpvz4j3EWyjkZEdmjH0/cgsd6QOdSgU8rLSk6ard/pcW7rlmjdVSX/AWOaORR1uNOQ== dependencies: "@babel/helper-validator-identifier" "^7.14.9" @@ -899,7 +899,7 @@ "@babel/types@^7.15.4", "@babel/types@^7.15.6", "@babel/types@^7.4.4": version "7.15.6" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.15.6.tgz#99abdc48218b2881c058dd0a7ab05b99c9be758f" + resolved "https://registry.npmjs.org/@babel/types/-/types-7.15.6.tgz" integrity sha512-BPU+7QhqNjmWyDO0/vitH/CuhpV8ZmK1wpKva8nuyNF5MJfuRNWMc+hc14+u9xT93kvykMdncrJT19h74uB1Ig== dependencies: "@babel/helper-validator-identifier" "^7.14.9" @@ -907,7 +907,7 @@ "@emotion/cache@^11.4.0": version "11.4.0" - resolved "https://registry.yarnpkg.com/@emotion/cache/-/cache-11.4.0.tgz#293fc9d9a7a38b9aad8e9337e5014366c3b09ac0" + resolved "https://registry.npmjs.org/@emotion/cache/-/cache-11.4.0.tgz" integrity sha512-Zx70bjE7LErRO9OaZrhf22Qye1y4F7iDl+ITjet0J+i+B88PrAOBkKvaAWhxsZf72tDLajwCgfCjJ2dvH77C3g== dependencies: "@emotion/memoize" "^0.7.4" @@ -918,29 +918,29 @@ "@emotion/hash@^0.8.0": version "0.8.0" - resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.8.0.tgz#bbbff68978fefdbe68ccb533bc8cbe1d1afb5413" + resolved "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz" integrity sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow== "@emotion/is-prop-valid@^0.8.8": version "0.8.8" - resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz#db28b1c4368a259b60a97311d6a952d4fd01ac1a" + resolved "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz" integrity sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA== dependencies: "@emotion/memoize" "0.7.4" "@emotion/memoize@0.7.4": version "0.7.4" - resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.7.4.tgz#19bf0f5af19149111c40d98bb0cf82119f5d9eeb" + resolved "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz" integrity sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw== "@emotion/memoize@^0.7.4": version "0.7.5" - resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.7.5.tgz#2c40f81449a4e554e9fc6396910ed4843ec2be50" + resolved "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.5.tgz" integrity sha512-igX9a37DR2ZPGYtV6suZ6whr8pTFtyHL3K/oLUotxpSVO2ASaprmAe2Dkq7tBo7CRY7MMDrAa9nuQP9/YG8FxQ== "@emotion/react@^11.1.1": version "11.4.1" - resolved "https://registry.yarnpkg.com/@emotion/react/-/react-11.4.1.tgz#a1b0b767b5bad57515ffb0cad9349614d27f4d57" + resolved "https://registry.npmjs.org/@emotion/react/-/react-11.4.1.tgz" integrity sha512-pRegcsuGYj4FCdZN6j5vqCALkNytdrKw3TZMekTzNXixRg4wkLsU5QEaBG5LC6l01Vppxlp7FE3aTHpIG5phLg== dependencies: "@babel/runtime" "^7.13.10" @@ -953,7 +953,7 @@ "@emotion/serialize@^1.0.0", "@emotion/serialize@^1.0.2": version "1.0.2" - resolved "https://registry.yarnpkg.com/@emotion/serialize/-/serialize-1.0.2.tgz#77cb21a0571c9f68eb66087754a65fa97bfcd965" + resolved "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.0.2.tgz" integrity sha512-95MgNJ9+/ajxU7QIAruiOAdYNjxZX7G2mhgrtDWswA21VviYIRP1R5QilZ/bDY42xiKsaktP4egJb3QdYQZi1A== dependencies: "@emotion/hash" "^0.8.0" @@ -964,32 +964,32 @@ "@emotion/sheet@^1.0.0", "@emotion/sheet@^1.0.2": version "1.0.2" - resolved "https://registry.yarnpkg.com/@emotion/sheet/-/sheet-1.0.2.tgz#1d9ffde531714ba28e62dac6a996a8b1089719d0" + resolved "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.0.2.tgz" integrity sha512-QQPB1B70JEVUHuNtzjHftMGv6eC3Y9wqavyarj4x4lg47RACkeSfNo5pxIOKizwS9AEFLohsqoaxGQj4p0vSIw== "@emotion/stylis@^0.8.4": version "0.8.5" - resolved "https://registry.yarnpkg.com/@emotion/stylis/-/stylis-0.8.5.tgz#deacb389bd6ee77d1e7fcaccce9e16c5c7e78e04" + resolved "https://registry.npmjs.org/@emotion/stylis/-/stylis-0.8.5.tgz" integrity sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ== "@emotion/unitless@^0.7.4", "@emotion/unitless@^0.7.5": version "0.7.5" - resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.7.5.tgz#77211291c1900a700b8a78cfafda3160d76949ed" + resolved "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz" integrity sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg== "@emotion/utils@^1.0.0": version "1.0.0" - resolved "https://registry.yarnpkg.com/@emotion/utils/-/utils-1.0.0.tgz#abe06a83160b10570816c913990245813a2fd6af" + resolved "https://registry.npmjs.org/@emotion/utils/-/utils-1.0.0.tgz" integrity sha512-mQC2b3XLDs6QCW+pDQDiyO/EdGZYOygE8s5N5rrzjSI4M3IejPE/JPndCBwRT9z982aqQNi6beWs1UeayrQxxA== "@emotion/weak-memoize@^0.2.5": version "0.2.5" - resolved "https://registry.yarnpkg.com/@emotion/weak-memoize/-/weak-memoize-0.2.5.tgz#8eed982e2ee6f7f4e44c253e12962980791efd46" + resolved "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.2.5.tgz" integrity sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA== "@ente-io/next-with-workbox@^1.0.3": version "1.0.3" - resolved "https://registry.yarnpkg.com/@ente-io/next-with-workbox/-/next-with-workbox-1.0.3.tgz#20c0ce020afccf8bc5af5845a2af062564cf4b3a" + resolved "https://registry.npmjs.org/@ente-io/next-with-workbox/-/next-with-workbox-1.0.3.tgz" integrity sha512-+OAiY75RWj+15MqE64JVRUP7UZGONhTsNIx16p9NIAIvatn5ds4132o69mB3uj5eQQGs1eU2EIlpCi+3nfOJcQ== dependencies: clean-webpack-plugin "^3.0.0" @@ -998,7 +998,7 @@ "@eslint/eslintrc@^0.4.3": version "0.4.3" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.3.tgz#9e42981ef035beb3dd49add17acb96e8ff6f394c" + resolved "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz" integrity sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw== dependencies: ajv "^6.12.4" @@ -1013,12 +1013,12 @@ "@ffmpeg/core@^0.10.0": version "0.10.0" - resolved "https://registry.yarnpkg.com/@ffmpeg/core/-/core-0.10.0.tgz#f6a58361b22d7c23c6f7071b9fff6d572bc3f499" + resolved "https://registry.npmjs.org/@ffmpeg/core/-/core-0.10.0.tgz" integrity sha512-qunWJl5PezpXEm31tb8Qu5z37B5KVA1VYZCpXchMhuAb3X9T7PuE3SlhOwphEoRhzaOa3lpofDfzihAUMFaVPQ== "@ffmpeg/ffmpeg@^0.10.1": version "0.10.1" - resolved "https://registry.yarnpkg.com/@ffmpeg/ffmpeg/-/ffmpeg-0.10.1.tgz#3dacf3985de9c83a95fbf79fe709920cc009b00a" + resolved "https://registry.npmjs.org/@ffmpeg/ffmpeg/-/ffmpeg-0.10.1.tgz" integrity sha512-ChQkH7Rh57hmVo1LhfQFibWX/xqneolJKSwItwZdKPcLZuKigtYAYDIvB55pDfP17VtR1R77SxgkB2/UApB+Og== dependencies: is-url "^1.2.4" @@ -1028,7 +1028,7 @@ "@hapi/accept@5.0.2": version "5.0.2" - resolved "https://registry.yarnpkg.com/@hapi/accept/-/accept-5.0.2.tgz#ab7043b037e68b722f93f376afb05e85c0699523" + resolved "https://registry.npmjs.org/@hapi/accept/-/accept-5.0.2.tgz" integrity sha512-CmzBx/bXUR8451fnZRuZAJRlzgm0Jgu5dltTX/bszmR2lheb9BpyN47Q1RbaGTsvFzn0PXAEs+lXDKfshccYZw== dependencies: "@hapi/boom" "9.x.x" @@ -1036,34 +1036,34 @@ "@hapi/address@2.x.x": version "2.1.4" - resolved "https://registry.yarnpkg.com/@hapi/address/-/address-2.1.4.tgz#5d67ed43f3fd41a69d4b9ff7b56e7c0d1d0a81e5" + resolved "https://registry.npmjs.org/@hapi/address/-/address-2.1.4.tgz" integrity sha512-QD1PhQk+s31P1ixsX0H0Suoupp3VMXzIVMSwobR3F3MSUO2YCV0B7xqLcUw/Bh8yuvd3LhpyqLQWTNcRmp6IdQ== "@hapi/boom@9.x.x": version "9.1.4" - resolved "https://registry.yarnpkg.com/@hapi/boom/-/boom-9.1.4.tgz#1f9dad367c6a7da9f8def24b4a986fc5a7bd9db6" + resolved "https://registry.npmjs.org/@hapi/boom/-/boom-9.1.4.tgz" integrity sha512-Ls1oH8jaN1vNsqcaHVYJrKmgMcKsC1wcp8bujvXrHaAqD2iDYq3HoOwsxwo09Cuda5R5nC0o0IxlrlTuvPuzSw== dependencies: "@hapi/hoek" "9.x.x" "@hapi/bourne@1.x.x": version "1.3.2" - resolved "https://registry.yarnpkg.com/@hapi/bourne/-/bourne-1.3.2.tgz#0a7095adea067243ce3283e1b56b8a8f453b242a" + resolved "https://registry.npmjs.org/@hapi/bourne/-/bourne-1.3.2.tgz" integrity sha512-1dVNHT76Uu5N3eJNTYcvxee+jzX4Z9lfciqRRHCU27ihbUcYi+iSc2iml5Ke1LXe1SyJCLA0+14Jh4tXJgOppA== "@hapi/hoek@8.x.x", "@hapi/hoek@^8.3.0": version "8.5.1" - resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-8.5.1.tgz#fde96064ca446dec8c55a8c2f130957b070c6e06" + resolved "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.5.1.tgz" integrity sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow== "@hapi/hoek@9.x.x": version "9.2.0" - resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-9.2.0.tgz#f3933a44e365864f4dad5db94158106d511e8131" + resolved "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.2.0.tgz" integrity sha512-sqKVVVOe5ivCaXDWivIJYVSaEgdQK9ul7a4Kity5Iw7u9+wBAPbX1RMSnLLmp7O4Vzj0WOWwMAJsTL00xwaNug== "@hapi/joi@^15.1.0": version "15.1.1" - resolved "https://registry.yarnpkg.com/@hapi/joi/-/joi-15.1.1.tgz#c675b8a71296f02833f8d6d243b34c57b8ce19d7" + resolved "https://registry.npmjs.org/@hapi/joi/-/joi-15.1.1.tgz" integrity sha512-entf8ZMOK8sc+8YfeOlM8pCfg3b5+WZIKBfUaaJT8UsjAAPjartzxIYm3TIbjvA4u+u++KbcXD38k682nVHDAQ== dependencies: "@hapi/address" "2.x.x" @@ -1073,14 +1073,14 @@ "@hapi/topo@3.x.x": version "3.1.6" - resolved "https://registry.yarnpkg.com/@hapi/topo/-/topo-3.1.6.tgz#68d935fa3eae7fdd5ab0d7f953f3205d8b2bfc29" + resolved "https://registry.npmjs.org/@hapi/topo/-/topo-3.1.6.tgz" integrity sha512-tAag0jEcjwH+P2quUfipd7liWCNX2F8NvYjQp2wtInsZxnMlypdw0FtAOLxtvvkO+GSRRbmNi8m/5y42PQJYCQ== dependencies: "@hapi/hoek" "^8.3.0" "@humanwhocodes/config-array@^0.5.0": version "0.5.0" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.5.0.tgz#1407967d4c6eecd7388f83acf1eaf4d0c6e58ef9" + resolved "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz" integrity sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg== dependencies: "@humanwhocodes/object-schema" "^1.2.0" @@ -1089,34 +1089,34 @@ "@humanwhocodes/object-schema@^1.2.0": version "1.2.0" - resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz#87de7af9c231826fdd68ac7258f77c429e0e5fcf" + resolved "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz" integrity sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w== "@napi-rs/triples@^1.0.3": version "1.0.3" - resolved "https://registry.yarnpkg.com/@napi-rs/triples/-/triples-1.0.3.tgz#76d6d0c3f4d16013c61e45dfca5ff1e6c31ae53c" + resolved "https://registry.npmjs.org/@napi-rs/triples/-/triples-1.0.3.tgz" integrity sha512-jDJTpta+P4p1NZTFVLHJ/TLFVYVcOqv6l8xwOeBKNPMgY/zDYH/YH7SJbvrr/h1RcS9GzbPcLKGzpuK9cV56UA== "@next/bundle-analyzer@^9.5.3": version "9.5.5" - resolved "https://registry.yarnpkg.com/@next/bundle-analyzer/-/bundle-analyzer-9.5.5.tgz#9cb5f67e8d3012ccfb87c10f20715fb7f918dd66" + resolved "https://registry.npmjs.org/@next/bundle-analyzer/-/bundle-analyzer-9.5.5.tgz" integrity sha512-HDYa5oFtBlZXG/N1wsheOaj2XeOFEi0HzwPiyIP82TxjoDoB6HKDYRIV3JHIUCeGFjkA66jSh8r1EAHNOuU51A== dependencies: webpack-bundle-analyzer "3.6.1" "@next/env@11.1.2": version "11.1.2" - resolved "https://registry.yarnpkg.com/@next/env/-/env-11.1.2.tgz#27996efbbc54c5f949f5e8c0a156e3aa48369b99" + resolved "https://registry.npmjs.org/@next/env/-/env-11.1.2.tgz" integrity sha512-+fteyVdQ7C/OoulfcF6vd1Yk0FEli4453gr8kSFbU8sKseNSizYq6df5MKz/AjwLptsxrUeIkgBdAzbziyJ3mA== "@next/polyfill-module@11.1.2": version "11.1.2" - resolved "https://registry.yarnpkg.com/@next/polyfill-module/-/polyfill-module-11.1.2.tgz#1fe92c364fdc81add775a16c678f5057c6aace98" + resolved "https://registry.npmjs.org/@next/polyfill-module/-/polyfill-module-11.1.2.tgz" integrity sha512-xZmixqADM3xxtqBV0TpAwSFzWJP0MOQzRfzItHXf1LdQHWb0yofHHC+7eOrPFic8+ZGz5y7BdPkkgR1S25OymA== "@next/react-dev-overlay@11.1.2": version "11.1.2" - resolved "https://registry.yarnpkg.com/@next/react-dev-overlay/-/react-dev-overlay-11.1.2.tgz#73795dc5454b7af168bac93df7099965ebb603be" + resolved "https://registry.npmjs.org/@next/react-dev-overlay/-/react-dev-overlay-11.1.2.tgz" integrity sha512-rDF/mGY2NC69mMg2vDqzVpCOlWqnwPUXB2zkARhvknUHyS6QJphPYv9ozoPJuoT/QBs49JJd9KWaAzVBvq920A== dependencies: "@babel/code-frame" "7.12.11" @@ -1133,12 +1133,12 @@ "@next/react-refresh-utils@11.1.2": version "11.1.2" - resolved "https://registry.yarnpkg.com/@next/react-refresh-utils/-/react-refresh-utils-11.1.2.tgz#44ea40d8e773e4b77bad85e24f6ac041d5e4b4a5" + resolved "https://registry.npmjs.org/@next/react-refresh-utils/-/react-refresh-utils-11.1.2.tgz" integrity sha512-hsoJmPfhVqjZ8w4IFzoo8SyECVnN+8WMnImTbTKrRUHOVJcYMmKLL7xf7T0ft00tWwAl/3f3Q3poWIN2Ueql/Q== "@next/swc-darwin-arm64@11.1.2": version "11.1.2" - resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-11.1.2.tgz#93226c38db488c4b62b30a53b530e87c969b8251" + resolved "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-11.1.2.tgz" integrity sha512-hZuwOlGOwBZADA8EyDYyjx3+4JGIGjSHDHWrmpI7g5rFmQNltjlbaefAbiU5Kk7j3BUSDwt30quJRFv3nyJQ0w== "@next/swc-darwin-x64@11.1.2": @@ -1158,14 +1158,14 @@ "@node-rs/helper@1.2.1": version "1.2.1" - resolved "https://registry.yarnpkg.com/@node-rs/helper/-/helper-1.2.1.tgz#e079b05f21ff4329d82c4e1f71c0290e4ecdc70c" + resolved "https://registry.npmjs.org/@node-rs/helper/-/helper-1.2.1.tgz" integrity sha512-R5wEmm8nbuQU0YGGmYVjEc0OHtYsuXdpRG+Ut/3wZ9XAvQWyThN08bTh2cBJgoZxHQUPtvRfeQuxcAgLuiBISg== dependencies: "@napi-rs/triples" "^1.0.3" "@nodelib/fs.scandir@2.1.5": version "2.1.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== dependencies: "@nodelib/fs.stat" "2.0.5" @@ -1173,12 +1173,12 @@ "@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": version "2.0.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== "@nodelib/fs.walk@^1.2.3": version "1.2.8" - resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz" integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== dependencies: "@nodelib/fs.scandir" "2.1.5" @@ -1186,24 +1186,29 @@ "@popperjs/core@^2.8.6": version "2.10.1" - resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.10.1.tgz#728ecd95ab207aab8a9a4e421f0422db329232be" + resolved "https://registry.npmjs.org/@popperjs/core/-/core-2.10.1.tgz" integrity sha512-HnUhk1Sy9IuKrxEMdIRCxpIqPw6BFsbYSEUO9p/hNw5sMld/+3OLMWQP80F8/db9qsv3qUjs7ZR5bS/R+iinXw== +"@popperjs/core@^2.9.2": + version "2.10.2" + resolved "https://registry.npmjs.org/@popperjs/core/-/core-2.10.2.tgz" + integrity sha512-IXf3XA7+XyN7CP9gGh/XB0UxVMlvARGEgGXLubFICsUMGz6Q+DU+i4gGlpOxTjKvXjkJDJC8YdqdKkDj9qZHEQ== + "@restart/context@^2.1.4": version "2.1.4" - resolved "https://registry.yarnpkg.com/@restart/context/-/context-2.1.4.tgz#a99d87c299a34c28bd85bb489cb07bfd23149c02" + resolved "https://registry.npmjs.org/@restart/context/-/context-2.1.4.tgz" integrity sha512-INJYZQJP7g+IoDUh/475NlGiTeMfwTXUEr3tmRneckHIxNolGOW9CTq83S8cxq0CgJwwcMzMJFchxvlwe7Rk8Q== "@restart/hooks@^0.3.26": version "0.3.27" - resolved "https://registry.yarnpkg.com/@restart/hooks/-/hooks-0.3.27.tgz#91f356d66d4699a8cd8b3d008402708b6a9dc505" + resolved "https://registry.npmjs.org/@restart/hooks/-/hooks-0.3.27.tgz" integrity sha512-s984xV/EapUIfkjlf8wz9weP2O9TNKR96C68FfMEy2bE69+H4cNv3RD4Mf97lW7Htt7PjZrYTjSC8f3SB9VCXw== dependencies: dequal "^2.0.2" "@rollup/plugin-node-resolve@^7.1.1": version "7.1.3" - resolved "https://registry.yarnpkg.com/@rollup/plugin-node-resolve/-/plugin-node-resolve-7.1.3.tgz#80de384edfbd7bfc9101164910f86078151a3eca" + resolved "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-7.1.3.tgz" integrity sha512-RxtSL3XmdTAE2byxekYLnx+98kEUOrPHF/KRVjLH+DEIHy6kjIw7YINQzn+NXiH/NTrQLAwYs0GWB+csWygA9Q== dependencies: "@rollup/pluginutils" "^3.0.8" @@ -1214,7 +1219,7 @@ "@rollup/plugin-replace@^2.3.1": version "2.4.2" - resolved "https://registry.yarnpkg.com/@rollup/plugin-replace/-/plugin-replace-2.4.2.tgz#a2d539314fbc77c244858faa523012825068510a" + resolved "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-2.4.2.tgz" integrity sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg== dependencies: "@rollup/pluginutils" "^3.1.0" @@ -1222,7 +1227,7 @@ "@rollup/pluginutils@^3.0.8", "@rollup/pluginutils@^3.1.0": version "3.1.0" - resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-3.1.0.tgz#706b4524ee6dc8b103b3c995533e5ad680c02b9b" + resolved "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz" integrity sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg== dependencies: "@types/estree" "0.0.39" @@ -1231,7 +1236,7 @@ "@sentry/browser@6.12.0": version "6.12.0" - resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-6.12.0.tgz#970cd68fa117a1e1336fdb373e3b1fa76cd63e2d" + resolved "https://registry.npmjs.org/@sentry/browser/-/browser-6.12.0.tgz" integrity sha512-wsJi1NLOmfwtPNYxEC50dpDcVY7sdYckzwfqz1/zHrede1mtxpqSw+7iP4bHADOJXuF+ObYYTHND0v38GSXznQ== dependencies: "@sentry/core" "6.12.0" @@ -1241,7 +1246,7 @@ "@sentry/cli@^1.68.0": version "1.68.0" - resolved "https://registry.yarnpkg.com/@sentry/cli/-/cli-1.68.0.tgz#2ced8fac67ee01e746a45e8ee45a518d4526937e" + resolved "https://registry.npmjs.org/@sentry/cli/-/cli-1.68.0.tgz" integrity sha512-zc7+cxKDqpHLREGJKRH6KwE8fZW8bnczg3OLibJ0czleXoWPdAuOK1Xm1BTMcOnaXfg3VKAh0rI7S1PTdj+SrQ== dependencies: https-proxy-agent "^5.0.0" @@ -1253,7 +1258,7 @@ "@sentry/core@6.12.0": version "6.12.0" - resolved "https://registry.yarnpkg.com/@sentry/core/-/core-6.12.0.tgz#bc7c5f0785b6a392d9ad47bd9b1fae3f5389996c" + resolved "https://registry.npmjs.org/@sentry/core/-/core-6.12.0.tgz" integrity sha512-mU/zdjlzFHzdXDZCPZm8OeCw7c9xsbL49Mq0TrY0KJjLt4CJBkiq5SDTGfRsenBLgTedYhe5Z/J8Z+xVVq+MfQ== dependencies: "@sentry/hub" "6.12.0" @@ -1264,7 +1269,7 @@ "@sentry/hub@6.12.0": version "6.12.0" - resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-6.12.0.tgz#29e323ab6a95e178fb14fffb684aa0e09707197f" + resolved "https://registry.npmjs.org/@sentry/hub/-/hub-6.12.0.tgz" integrity sha512-yR/UQVU+ukr42bSYpeqvb989SowIXlKBanU0cqLFDmv5LPCnaQB8PGeXwJAwWhQgx44PARhmB82S6Xor8gYNxg== dependencies: "@sentry/types" "6.12.0" @@ -1273,7 +1278,7 @@ "@sentry/integrations@6.12.0": version "6.12.0" - resolved "https://registry.yarnpkg.com/@sentry/integrations/-/integrations-6.12.0.tgz#d900e89c588fbe6ce1b89ce74c042574daf638bb" + resolved "https://registry.npmjs.org/@sentry/integrations/-/integrations-6.12.0.tgz" integrity sha512-M9gsVdWZp5fAFFpTjK2IBuWzW4SBxGAI3tVbYZvVx16S/BY0GsPC1dYpjJx9OTBS/8CmCWdGxnUmjACo/8w1LA== dependencies: "@sentry/types" "6.12.0" @@ -1283,7 +1288,7 @@ "@sentry/minimal@6.12.0": version "6.12.0" - resolved "https://registry.yarnpkg.com/@sentry/minimal/-/minimal-6.12.0.tgz#cbe20e95056cedb9709d7d5b2119ef95206a9f8c" + resolved "https://registry.npmjs.org/@sentry/minimal/-/minimal-6.12.0.tgz" integrity sha512-r3C54Q1KN+xIqUvcgX9DlcoWE7ezWvFk2pSu1Ojx9De81hVqR9u5T3sdSAP2Xma+um0zr6coOtDJG4WtYlOtsw== dependencies: "@sentry/hub" "6.12.0" @@ -1292,7 +1297,7 @@ "@sentry/nextjs@^6.7.1": version "6.12.0" - resolved "https://registry.yarnpkg.com/@sentry/nextjs/-/nextjs-6.12.0.tgz#e70e7c7baa8a8f952edc1003b7fb94d32c0a2098" + resolved "https://registry.npmjs.org/@sentry/nextjs/-/nextjs-6.12.0.tgz" integrity sha512-b1UjIGpKcd7ZTtkZXHz84zpsPaEgpq6HkV0rnXg2+AXicdolRYJoHFUrlTJQgrVssYe0InuypV65xvKlIfZamA== dependencies: "@sentry/core" "6.12.0" @@ -1306,7 +1311,7 @@ "@sentry/node@6.12.0": version "6.12.0" - resolved "https://registry.yarnpkg.com/@sentry/node/-/node-6.12.0.tgz#6adf9f8d92d70f38dd4208ef89fe7c8534fe4016" + resolved "https://registry.npmjs.org/@sentry/node/-/node-6.12.0.tgz" integrity sha512-hfAU3cX5sNWgqyDQBCOIQOZj21l0w1z2dG4MjmrMMHKrQ18pfMaaOtEwRXMCdjTUlwsK+L3TOoUB23lbezmu1A== dependencies: "@sentry/core" "6.12.0" @@ -1321,7 +1326,7 @@ "@sentry/react@6.12.0": version "6.12.0" - resolved "https://registry.yarnpkg.com/@sentry/react/-/react-6.12.0.tgz#8ae2680d226fafb0da0f3d8366bb285004ba6c2e" + resolved "https://registry.npmjs.org/@sentry/react/-/react-6.12.0.tgz" integrity sha512-E8Nw9PPzP/EyMy64ksr9xcyYYlBmUA5ROnkPQp7o5wF0xf5/J+nMS1tQdyPnLQe2KUgHlN4kVs2HHft1m7mSYQ== dependencies: "@sentry/browser" "6.12.0" @@ -1333,7 +1338,7 @@ "@sentry/tracing@6.12.0": version "6.12.0" - resolved "https://registry.yarnpkg.com/@sentry/tracing/-/tracing-6.12.0.tgz#a05c8985ee7fed7310b029b147d8f9f14f2a2e67" + resolved "https://registry.npmjs.org/@sentry/tracing/-/tracing-6.12.0.tgz" integrity sha512-u10QHNknPBzbWSUUNMkvuH53sQd5NaBo6YdNPj4p5b7sE7445Sh0PwBpRbY3ZiUUiwyxV59fx9UQ4yVnPGxZQA== dependencies: "@sentry/hub" "6.12.0" @@ -1344,12 +1349,12 @@ "@sentry/types@6.12.0": version "6.12.0" - resolved "https://registry.yarnpkg.com/@sentry/types/-/types-6.12.0.tgz#b7395688a79403c6df8d8bb8d81deb8222519853" + resolved "https://registry.npmjs.org/@sentry/types/-/types-6.12.0.tgz" integrity sha512-urtgLzE4EDMAYQHYdkgC0Ei9QvLajodK1ntg71bGn0Pm84QUpaqpPDfHRU+i6jLeteyC7kWwa5O5W1m/jrjGXA== "@sentry/utils@6.12.0": version "6.12.0" - resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-6.12.0.tgz#3de261e8d11bdfdc7add64a3065d43517802e975" + resolved "https://registry.npmjs.org/@sentry/utils/-/utils-6.12.0.tgz" integrity sha512-oRHQ7TH5TSsJqoP9Gqq25Jvn9LKexXfAh/OoKwjMhYCGKGhqpDNUIZVgl9DWsGw5A5N5xnQyLOxDfyRV5RshdA== dependencies: "@sentry/types" "6.12.0" @@ -1357,19 +1362,19 @@ "@sentry/webpack-plugin@1.17.1": version "1.17.1" - resolved "https://registry.yarnpkg.com/@sentry/webpack-plugin/-/webpack-plugin-1.17.1.tgz#1b3ebbe9991e4d77125ace2b24594059a088268a" + resolved "https://registry.npmjs.org/@sentry/webpack-plugin/-/webpack-plugin-1.17.1.tgz" integrity sha512-L47a0hxano4a+9jbvQSBzHCT1Ph8fYAvGGUvFg8qc69yXS9si5lXRNIH/pavN6mqJjhQjAcEsEp+vxgvT4xZDQ== dependencies: "@sentry/cli" "^1.68.0" "@stripe/stripe-js@^1.13.2": version "1.17.1" - resolved "https://registry.yarnpkg.com/@stripe/stripe-js/-/stripe-js-1.17.1.tgz#afcb7e86d0b05d1a7af53af89111abd2e8d437ae" + resolved "https://registry.npmjs.org/@stripe/stripe-js/-/stripe-js-1.17.1.tgz" integrity sha512-c9MyDvdi5Xou0j0JPNy86NebtTDfh9o62Ifuzx6GSm2YO0oedBpy51WSyOue2L8Fb+mqESS5gd6mGVEIPUnXsA== "@surma/rollup-plugin-off-main-thread@^1.1.1": version "1.4.2" - resolved "https://registry.yarnpkg.com/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-1.4.2.tgz#e6786b6af5799f82f7ab3a82e53f6182d2b91a58" + resolved "https://registry.npmjs.org/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-1.4.2.tgz" integrity sha512-yBMPqmd1yEJo/280PAMkychuaALyQ9Lkb5q1ck3mjJrFuEobIfhnQ4J3mbvBoISmR3SWMWV+cGB/I0lCQee79A== dependencies: ejs "^2.6.1" @@ -1377,27 +1382,27 @@ "@tokenizer/token@^0.3.0": version "0.3.0" - resolved "https://registry.yarnpkg.com/@tokenizer/token/-/token-0.3.0.tgz#fe98a93fe789247e998c75e74e9c7c63217aa276" + resolved "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz" integrity sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A== "@types/debounce-promise@^3.1.3": version "3.1.4" - resolved "https://registry.yarnpkg.com/@types/debounce-promise/-/debounce-promise-3.1.4.tgz#bf10eead11724e666ea541df1c9d3969677a505b" + resolved "https://registry.npmjs.org/@types/debounce-promise/-/debounce-promise-3.1.4.tgz" integrity sha512-9SEVY3nsz+uMN2DwDocftB5TAgZe7D0cOzxxRhpotWs6T4QFqRaTXpXbOSzbk31/7iYcfCkJJPwWGzTxyuGhCg== "@types/estree@*": version "0.0.50" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.50.tgz#1e0caa9364d3fccd2931c3ed96fdbeaa5d4cca83" + resolved "https://registry.npmjs.org/@types/estree/-/estree-0.0.50.tgz" integrity sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw== "@types/estree@0.0.39": version "0.0.39" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f" + resolved "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz" integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== "@types/glob@^7.1.1": version "7.1.4" - resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.4.tgz#ea59e21d2ee5c517914cb4bc8e4153b99e566672" + resolved "https://registry.npmjs.org/@types/glob/-/glob-7.1.4.tgz" integrity sha512-w+LsMxKyYQm347Otw+IfBXOv9UWVjpHpCDdbBMt8Kz/xbvCYNjP+0qPh91Km3iKfSRLBB0P7fAMf0KHrPu+MyA== dependencies: "@types/minimatch" "*" @@ -1405,7 +1410,7 @@ "@types/hoist-non-react-statics@*": version "3.3.1" - resolved "https://registry.yarnpkg.com/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz#1124aafe5118cb591977aeb1ceaaed1070eb039f" + resolved "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz" integrity sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA== dependencies: "@types/react" "*" @@ -1413,85 +1418,95 @@ "@types/http-proxy@^1.17.5": version "1.17.7" - resolved "https://registry.yarnpkg.com/@types/http-proxy/-/http-proxy-1.17.7.tgz#30ea85cc2c868368352a37f0d0d3581e24834c6f" + resolved "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.7.tgz" integrity sha512-9hdj6iXH64tHSLTY+Vt2eYOGzSogC+JQ2H7bdPWkuh7KXP5qLllWx++t+K9Wk556c3dkDdPws/SpMRi0sdCT1w== dependencies: "@types/node" "*" "@types/invariant@^2.2.33": version "2.2.35" - resolved "https://registry.yarnpkg.com/@types/invariant/-/invariant-2.2.35.tgz#cd3ebf581a6557452735688d8daba6cf0bd5a3be" + resolved "https://registry.npmjs.org/@types/invariant/-/invariant-2.2.35.tgz" integrity sha512-DxX1V9P8zdJPYQat1gHyY0xj3efl8gnMVjiM9iCY6y27lj+PoQWkgjt8jDqmovPqULkKVpKRg8J36iQiA+EtEg== "@types/json-schema@^7.0.7": version "7.0.9" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.9.tgz#97edc9037ea0c38585320b28964dde3b39e4660d" + resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz" integrity sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ== "@types/json5@^0.0.29": version "0.0.29" - resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" + resolved "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz" integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4= "@types/libsodium-wrappers@^0.7.8": version "0.7.9" - resolved "https://registry.yarnpkg.com/@types/libsodium-wrappers/-/libsodium-wrappers-0.7.9.tgz#89c3ad2156d5143e64bce86cfeb0045a983aeccc" + resolved "https://registry.npmjs.org/@types/libsodium-wrappers/-/libsodium-wrappers-0.7.9.tgz" integrity sha512-LisgKLlYQk19baQwjkBZZXdJL0KbeTpdEnrAfz5hQACbklCY0gVFnsKUyjfNWF1UQsCSjw93Sj5jSbiO8RPfdw== "@types/minimatch@*": version "3.0.5" - resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.5.tgz#1001cc5e6a3704b83c236027e77f2f58ea010f40" + resolved "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz" integrity sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ== "@types/node@*": version "16.9.1" - resolved "https://registry.yarnpkg.com/@types/node/-/node-16.9.1.tgz#0611b37db4246c937feef529ddcc018cf8e35708" + resolved "https://registry.npmjs.org/@types/node/-/node-16.9.1.tgz" integrity sha512-QpLcX9ZSsq3YYUUnD3nFDY8H7wctAhQj/TFKL8Ya8v5fMm3CFXxo8zStsLAl780ltoYoo1WvKUVGBQK+1ifr7g== "@types/node@^14.6.4": version "14.17.15" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.17.15.tgz#d5ebfb62a69074ebb85cbe0529ad917bb8f2bae8" + resolved "https://registry.npmjs.org/@types/node/-/node-14.17.15.tgz" integrity sha512-D1sdW0EcSCmNdLKBGMYb38YsHUS6JcM7yQ6sLQ9KuZ35ck7LYCKE7kYFHOO59ayFOY3zobWVZxf4KXhYHcHYFA== "@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" + resolved "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz" integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== "@types/photoswipe@^4.1.1": version "4.1.2" - resolved "https://registry.yarnpkg.com/@types/photoswipe/-/photoswipe-4.1.2.tgz#3ddafb668bf6800f8dfab5bea2ba82dda879cd84" + resolved "https://registry.npmjs.org/@types/photoswipe/-/photoswipe-4.1.2.tgz" integrity sha512-HA9TtCAQKToldgxRiyJ1DbsElg/cQV/SQ8COVjqIqghjy60Zxfh78E1WiFotthquqkS86nz13Za9wEbToe0svQ== "@types/prop-types@*", "@types/prop-types@^15.7.3": version "15.7.4" - resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.4.tgz#fcf7205c25dff795ee79af1e30da2c9790808f11" + resolved "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.4.tgz" integrity sha512-rZ5drC/jWjrArrS8BR6SIr4cWpW09RNTYt9AMZo3Jwwif+iacXAqgVjm0B0Bv/S1jhDXKHqRVNCbACkJ89RAnQ== "@types/react-calendar@^3.0.0": version "3.4.3" - resolved "https://registry.yarnpkg.com/@types/react-calendar/-/react-calendar-3.4.3.tgz#f2475519b44a1495562c526556074df947ce5bc6" + resolved "https://registry.npmjs.org/@types/react-calendar/-/react-calendar-3.4.3.tgz" integrity sha512-k56OS9d62/g3OCTepULEpNoClVUKuWxHBBuKS4hX8/qNiNup+Gf1Qn0SXHakbqBGWEfdLK93RlIRy5XOA4+Iaw== dependencies: "@types/react" "*" "@types/react-collapse@^5.0.1": version "5.0.1" - resolved "https://registry.yarnpkg.com/@types/react-collapse/-/react-collapse-5.0.1.tgz#078ea1ad15e00ba2063f2e4d8d6760c9375a2023" + resolved "https://registry.npmjs.org/@types/react-collapse/-/react-collapse-5.0.1.tgz" integrity sha512-Iq3OrqvzCIP0DmAawU4T2VKH6XAplbjo/D7Qk14mcfQ92plU+OrA2SF10r2XrcFg1Wvya/5f8w1vS29RVpdoLQ== dependencies: "@types/react" "*" +"@types/react-datepicker@^4.1.7": + version "4.1.7" + resolved "https://registry.npmjs.org/@types/react-datepicker/-/react-datepicker-4.1.7.tgz" + integrity sha512-8FZt62redGDsO/Dptb8/kdu/JZsAD17lsU3E8OwJqxhtNk4EsdVT0v2ArP8efDGkmtonIKVF2usoPzF6ZeL8zw== + dependencies: + "@popperjs/core" "^2.9.2" + "@types/react" "*" + date-fns "^2.0.1" + react-popper "^2.2.5" + "@types/react-dom@*": version "17.0.9" - resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-17.0.9.tgz#441a981da9d7be117042e1a6fd3dac4b30f55add" + resolved "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.9.tgz" integrity sha512-wIvGxLfgpVDSAMH5utdL9Ngm5Owu0VsGmldro3ORLXV8CShrL8awVj06NuEXFQ5xyaYfdca7Sgbk/50Ri1GdPg== dependencies: "@types/react" "*" "@types/react-select@^4.0.15": version "4.0.17" - resolved "https://registry.yarnpkg.com/@types/react-select/-/react-select-4.0.17.tgz#2e5ab4042c09c988bfc2711550329b0c3c9f8513" + resolved "https://registry.npmjs.org/@types/react-select/-/react-select-4.0.17.tgz" integrity sha512-ZK5wcBhJaqC8ntQl0CJvK2KXNNsk1k5flM7jO+vNPPlceRzdJQazA6zTtQUyNr6exp5yrAiwiudtYxgGlgGHLg== dependencies: "@emotion/serialize" "^1.0.0" @@ -1501,14 +1516,14 @@ "@types/react-transition-group@*", "@types/react-transition-group@^4.4.1": version "4.4.2" - resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.2.tgz#38890fd9db68bf1f2252b99a942998dc7877c5b3" + resolved "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.2.tgz" integrity sha512-KibDWL6nshuOJ0fu8ll7QnV/LVTo3PzQ9aCPnRUYPfX7eZohHwLIdNHj7pftanREzHNP4/nJa8oeM73uSiavMQ== dependencies: "@types/react" "*" "@types/react-window-infinite-loader@^1.0.3": version "1.0.5" - resolved "https://registry.yarnpkg.com/@types/react-window-infinite-loader/-/react-window-infinite-loader-1.0.5.tgz#32469a6a47438d9ebf1b5f5719943f494ea0abdf" + resolved "https://registry.npmjs.org/@types/react-window-infinite-loader/-/react-window-infinite-loader-1.0.5.tgz" integrity sha512-3v45+4oBNJpSroULtb2EgTJyyK4pCjOMCg+RT/HnA3or5zY4jYufv6uH9NWPyLv0nx8dqt1s4nJqHilfthwKSw== dependencies: "@types/react" "*" @@ -1516,24 +1531,24 @@ "@types/react-window@*", "@types/react-window@^1.8.2": version "1.8.5" - resolved "https://registry.yarnpkg.com/@types/react-window/-/react-window-1.8.5.tgz#285fcc5cea703eef78d90f499e1457e9b5c02fc1" + resolved "https://registry.npmjs.org/@types/react-window/-/react-window-1.8.5.tgz" integrity sha512-V9q3CvhC9Jk9bWBOysPGaWy/Z0lxYcTXLtLipkt2cnRj1JOSFNF7wqGpkScSXMgBwC+fnVRg/7shwgddBG5ICw== dependencies: "@types/react" "*" -"@types/react@*", "@types/react@>=16.14.8", "@types/react@>=16.9.11": - version "17.0.20" - resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.20.tgz#a4284b184d47975c71658cd69e759b6bd37c3b8c" - integrity sha512-wWZrPlihslrPpcKyCSlmIlruakxr57/buQN1RjlIeaaTWDLtJkTtRW429MoQJergvVKc4IWBpRhWw7YNh/7GVA== +"@types/react@*", "@types/react@^16.9.49": + version "16.14.15" + resolved "https://registry.npmjs.org/@types/react/-/react-16.14.15.tgz" + integrity sha512-jOxlBV9RGZhphdeqJTCv35VZOkjY+XIEY2owwSk84BNDdDv2xS6Csj6fhi+B/q30SR9Tz8lDNt/F2Z5RF3TrRg== dependencies: "@types/prop-types" "*" "@types/scheduler" "*" csstype "^3.0.2" -"@types/react@^16.9.49": - version "16.14.15" - resolved "https://registry.yarnpkg.com/@types/react/-/react-16.14.15.tgz#95d8fa3148050e94bcdc5751447921adbe19f9e6" - integrity sha512-jOxlBV9RGZhphdeqJTCv35VZOkjY+XIEY2owwSk84BNDdDv2xS6Csj6fhi+B/q30SR9Tz8lDNt/F2Z5RF3TrRg== +"@types/react@>=16.14.8", "@types/react@>=16.9.11": + version "17.0.20" + resolved "https://registry.npmjs.org/@types/react/-/react-17.0.20.tgz" + integrity sha512-wWZrPlihslrPpcKyCSlmIlruakxr57/buQN1RjlIeaaTWDLtJkTtRW429MoQJergvVKc4IWBpRhWw7YNh/7GVA== dependencies: "@types/prop-types" "*" "@types/scheduler" "*" @@ -1541,24 +1556,24 @@ "@types/resolve@0.0.8": version "0.0.8" - resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-0.0.8.tgz#f26074d238e02659e323ce1a13d041eee280e194" + resolved "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.8.tgz" integrity sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ== dependencies: "@types/node" "*" "@types/scheduler@*": version "0.16.2" - resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.2.tgz#1a62f89525723dde24ba1b01b092bf5df8ad4d39" + resolved "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz" integrity sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew== "@types/source-list-map@*": version "0.1.2" - resolved "https://registry.yarnpkg.com/@types/source-list-map/-/source-list-map-0.1.2.tgz#0078836063ffaf17412349bba364087e0ac02ec9" + resolved "https://registry.npmjs.org/@types/source-list-map/-/source-list-map-0.1.2.tgz" integrity sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA== "@types/styled-components@^5.1.3": version "5.1.14" - resolved "https://registry.yarnpkg.com/@types/styled-components/-/styled-components-5.1.14.tgz#e9cf8cdb5eef9d139628183a84c083f630635d67" + resolved "https://registry.npmjs.org/@types/styled-components/-/styled-components-5.1.14.tgz" integrity sha512-d6P1/tyNytqKwam3cQXq7a9uPtovc/mdAs7dBiz1YbDdNIT3X4WmuFU78YdSYh84TXVuhOwezZ3EeKuNBhwsHQ== dependencies: "@types/hoist-non-react-statics" "*" @@ -1567,29 +1582,29 @@ "@types/tapable@^1": version "1.0.8" - resolved "https://registry.yarnpkg.com/@types/tapable/-/tapable-1.0.8.tgz#b94a4391c85666c7b73299fd3ad79d4faa435310" + resolved "https://registry.npmjs.org/@types/tapable/-/tapable-1.0.8.tgz" integrity sha512-ipixuVrh2OdNmauvtT51o3d8z12p6LtFW9in7U79der/kwejjdNchQC5UMn5u/KxNoM7VHHOs/l8KS8uHxhODQ== "@types/trusted-types@^2.0.2": version "2.0.2" - resolved "https://registry.yarnpkg.com/@types/trusted-types/-/trusted-types-2.0.2.tgz#fc25ad9943bcac11cceb8168db4f275e0e72e756" + resolved "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.2.tgz" integrity sha512-F5DIZ36YVLE+PN+Zwws4kJogq47hNgX3Nx6WyDJ3kcplxyke3XIzB8uK5n/Lpm1HBsbGzd6nmGehL8cPekP+Tg== "@types/uglify-js@*": version "3.13.1" - resolved "https://registry.yarnpkg.com/@types/uglify-js/-/uglify-js-3.13.1.tgz#5e889e9e81e94245c75b6450600e1c5ea2878aea" + resolved "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.13.1.tgz" integrity sha512-O3MmRAk6ZuAKa9CHgg0Pr0+lUOqoMLpc9AS4R8ano2auvsg7IE8syF3Xh/NPr26TWklxYcqoEEFdzLLs1fV9PQ== dependencies: source-map "^0.6.1" "@types/warning@^3.0.0": version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/warning/-/warning-3.0.0.tgz#0d2501268ad8f9962b740d387c4654f5f8e23e52" + resolved "https://registry.npmjs.org/@types/warning/-/warning-3.0.0.tgz" integrity sha1-DSUBJorY+ZYrdA04fEZU9fjiPlI= "@types/webpack-sources@*": version "3.2.0" - resolved "https://registry.yarnpkg.com/@types/webpack-sources/-/webpack-sources-3.2.0.tgz#16d759ba096c289034b26553d2df1bf45248d38b" + resolved "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-3.2.0.tgz" integrity sha512-Ft7YH3lEVRQ6ls8k4Ff1oB4jN6oy/XmU6tQISKdhfh+1mR+viZFphS6WL0IrtDOzvefmJg5a0s7ZQoRXwqTEFg== dependencies: "@types/node" "*" @@ -1598,7 +1613,7 @@ "@types/webpack@^4.4.31": version "4.41.30" - resolved "https://registry.yarnpkg.com/@types/webpack/-/webpack-4.41.30.tgz#fd3db6d0d41e145a8eeeafcd3c4a7ccde9068ddc" + resolved "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.30.tgz" integrity sha512-GUHyY+pfuQ6haAfzu4S14F+R5iGRwN6b2FRNJY7U0NilmFAqbsOfK6j1HwuLBAqwRIT+pVdNDJGJ6e8rpp0KHA== dependencies: "@types/node" "*" @@ -1610,12 +1625,12 @@ "@types/yup@^0.29.7": version "0.29.13" - resolved "https://registry.yarnpkg.com/@types/yup/-/yup-0.29.13.tgz#21b137ba60841307a3c8a1050d3bf4e63ad561e9" + resolved "https://registry.npmjs.org/@types/yup/-/yup-0.29.13.tgz" integrity sha512-qRyuv+P/1t1JK1rA+elmK1MmCL1BapEzKKfbEhDBV/LMMse4lmhZ/XbgETI39JveDJRpLjmToOI6uFtMW/WR2g== "@typescript-eslint/eslint-plugin@^4.25.0": version "4.31.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.31.0.tgz#9c3fa6f44bad789a962426ad951b54695bd3af6b" + resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.31.0.tgz" integrity sha512-iPKZTZNavAlOhfF4gymiSuUkgLne/nh5Oz2/mdiUmuZVD42m9PapnCnzjxuDsnpnbH3wT5s2D8bw6S39TC6GNw== dependencies: "@typescript-eslint/experimental-utils" "4.31.0" @@ -1628,7 +1643,7 @@ "@typescript-eslint/experimental-utils@4.31.0": version "4.31.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-4.31.0.tgz#0ef1d5d86c334f983a00f310e43c1ce4c14e054d" + resolved "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.31.0.tgz" integrity sha512-Hld+EQiKLMppgKKkdUsLeVIeEOrwKc2G983NmznY/r5/ZtZCDvIOXnXtwqJIgYz/ymsy7n7RGvMyrzf1WaSQrw== dependencies: "@types/json-schema" "^7.0.7" @@ -1640,7 +1655,7 @@ "@typescript-eslint/parser@^4.25.0": version "4.31.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-4.31.0.tgz#87b7cd16b24b9170c77595d8b1363f8047121e05" + resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.31.0.tgz" integrity sha512-oWbzvPh5amMuTmKaf1wp0ySxPt2ZXHnFQBN2Szu1O//7LmOvgaKTCIDNLK2NvzpmVd5A2M/1j/rujBqO37hj3w== dependencies: "@typescript-eslint/scope-manager" "4.31.0" @@ -1650,7 +1665,7 @@ "@typescript-eslint/scope-manager@4.31.0": version "4.31.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.31.0.tgz#9be33aed4e9901db753803ba233b70d79a87fc3e" + resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.31.0.tgz" integrity sha512-LJ+xtl34W76JMRLjbaQorhR0hfRAlp3Lscdiz9NeI/8i+q0hdBZ7BsiYieLoYWqy+AnRigaD3hUwPFugSzdocg== dependencies: "@typescript-eslint/types" "4.31.0" @@ -1658,12 +1673,12 @@ "@typescript-eslint/types@4.31.0": version "4.31.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.31.0.tgz#9a7c86fcc1620189567dc4e46cad7efa07ee8dce" + resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.31.0.tgz" integrity sha512-9XR5q9mk7DCXgXLS7REIVs+BaAswfdHhx91XqlJklmqWpTALGjygWVIb/UnLh4NWhfwhR5wNe1yTyCInxVhLqQ== "@typescript-eslint/typescript-estree@4.31.0": version "4.31.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.31.0.tgz#4da4cb6274a7ef3b21d53f9e7147cc76f278a078" + resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.31.0.tgz" integrity sha512-QHl2014t3ptg+xpmOSSPn5hm4mY8D4s97ftzyk9BZ8RxYQ3j73XcwuijnJ9cMa6DO4aLXeo8XS3z1omT9LA/Eg== dependencies: "@typescript-eslint/types" "4.31.0" @@ -1676,7 +1691,7 @@ "@typescript-eslint/visitor-keys@4.31.0": version "4.31.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.31.0.tgz#4e87b7761cb4e0e627dc2047021aa693fc76ea2b" + resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.31.0.tgz" integrity sha512-HUcRp2a9I+P21+O21yu3ezv3GEPGjyGiXoEUQwZXjR8UxRApGeLyWH4ZIIUSalE28aG4YsV6GjtaAVB3QKOu0w== dependencies: "@typescript-eslint/types" "4.31.0" @@ -1684,12 +1699,12 @@ "@wojtekmaj/date-utils@^1.0.0", "@wojtekmaj/date-utils@^1.0.2", "@wojtekmaj/date-utils@^1.0.3": version "1.0.3" - resolved "https://registry.yarnpkg.com/@wojtekmaj/date-utils/-/date-utils-1.0.3.tgz#2dcfd92881425c5923e429c2aec86fb3609032a1" + resolved "https://registry.npmjs.org/@wojtekmaj/date-utils/-/date-utils-1.0.3.tgz" integrity sha512-1VPkkTBk07gMR1fjpBtse4G+oJqpmE+0gUFB0dg3VIL7qJmUVaBoD/vlzMm/jNeOPfvlmerl1lpnsZyBUFIRuw== accepts@~1.3.7: version "1.3.7" - resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" + resolved "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz" integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA== dependencies: mime-types "~2.1.24" @@ -1697,29 +1712,29 @@ accepts@~1.3.7: acorn-jsx@^5.3.1: version "5.3.2" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== acorn-walk@^7.1.1: version "7.2.0" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" + resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz" integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== acorn@^7.1.0, acorn@^7.1.1, acorn@^7.4.0: version "7.4.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" + resolved "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== agent-base@6: version "6.0.2" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" + resolved "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz" 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" + resolved "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz" integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== dependencies: clean-stack "^2.0.0" @@ -1727,7 +1742,7 @@ aggregate-error@^3.0.0: ajv@^6.10.0, ajv@^6.12.4: version "6.12.6" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== dependencies: fast-deep-equal "^3.1.1" @@ -1737,7 +1752,7 @@ ajv@^6.10.0, ajv@^6.12.4: ajv@^8.0.1: version "8.6.2" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.6.2.tgz#2fb45e0e5fcbc0813326c1c3da535d1881bb0571" + resolved "https://registry.npmjs.org/ajv/-/ajv-8.6.2.tgz" integrity sha512-9807RlWAgT564wT+DjeyU5OFMPjmzxVobvDFmNAhY+5zD6A2ly3jDp6sgnfyDtlIQ+7H97oc/DGCzzfu9rjw9w== dependencies: fast-deep-equal "^3.1.1" @@ -1747,58 +1762,58 @@ ajv@^8.0.1: amdefine@>=0.0.4: version "1.0.1" - resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" + resolved "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz" integrity sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU= anser@1.4.9: version "1.4.9" - resolved "https://registry.yarnpkg.com/anser/-/anser-1.4.9.tgz#1f85423a5dcf8da4631a341665ff675b96845760" + resolved "https://registry.npmjs.org/anser/-/anser-1.4.9.tgz" integrity sha512-AI+BjTeGt2+WFk4eWcqbQ7snZpDBt8SaLlj0RT2h5xfdWaiy51OjYvqwMrNzJLGy8iOAL6nKDITWO+rd4MkYEA== ansi-colors@^4.1.1: version "4.1.1" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" + resolved "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz" integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== ansi-escapes@^4.3.0: version "4.3.2" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" + resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz" integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== dependencies: type-fest "^0.21.3" ansi-regex@^2.0.0: version "2.1.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz" integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= ansi-regex@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz" integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= ansi-regex@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz" integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== ansi-styles@^3.2.1: version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== dependencies: color-convert "^1.9.0" ansi-styles@^4.0.0, ansi-styles@^4.1.0: version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== dependencies: color-convert "^2.0.1" anymatch@^3.0.0, anymatch@~3.1.1: version "3.1.2" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" + resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz" integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== dependencies: normalize-path "^3.0.0" @@ -1806,12 +1821,12 @@ anymatch@^3.0.0, anymatch@~3.1.1: aproba@^1.0.3: version "1.2.0" - resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" + resolved "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz" integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== are-we-there-yet@~1.1.2: version "1.1.7" - resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz#b15474a932adab4ff8a50d9adfa7e4e926f21146" + resolved "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz" integrity sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g== dependencies: delegates "^1.0.0" @@ -1819,14 +1834,14 @@ are-we-there-yet@~1.1.2: argparse@^1.0.7: version "1.0.10" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + resolved "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz" integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== dependencies: sprintf-js "~1.0.2" aria-query@^4.2.2: version "4.2.2" - resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-4.2.2.tgz#0d2ca6c9aceb56b8977e9fed6aed7e15bbd2f83b" + resolved "https://registry.npmjs.org/aria-query/-/aria-query-4.2.2.tgz" integrity sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA== dependencies: "@babel/runtime" "^7.10.2" @@ -1834,12 +1849,12 @@ aria-query@^4.2.2: array-flatten@1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz" integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= array-includes@^3.1.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" + resolved "https://registry.npmjs.org/array-includes/-/array-includes-3.1.3.tgz" integrity sha512-gcem1KlBU7c9rB+Rq8/3PPKsK2kjqeEBa3bD5kkQo4nYlOHQCJqIJFqBXDEfwaRuYTT4E+FxA9xez7Gf/e3Q7A== dependencies: call-bind "^1.0.2" @@ -1850,24 +1865,24 @@ array-includes@^3.1.1, array-includes@^3.1.2, array-includes@^3.1.3: array-union@^1.0.1: version "1.0.2" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" + resolved "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz" integrity sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk= dependencies: array-uniq "^1.0.1" array-union@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + resolved "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz" integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== array-uniq@^1.0.1: version "1.0.3" - resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" + resolved "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz" integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY= array.prototype.flat@^1.2.4: version "1.2.4" - resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.2.4.tgz#6ef638b43312bd401b4c6199fdec7e2dc9e9a123" + resolved "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.4.tgz" integrity sha512-4470Xi3GAPAjZqFcljX2xzckv1qeKPizoNkiS0+O4IoPR2ZNpcjE0pkhdihlDouK+x6QOast26B4Q/O9DJnwSg== dependencies: call-bind "^1.0.0" @@ -1876,7 +1891,7 @@ array.prototype.flat@^1.2.4: array.prototype.flatmap@^1.2.4: version "1.2.4" - resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.2.4.tgz#94cfd47cc1556ec0747d97f7c7738c58122004c9" + resolved "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.2.4.tgz" integrity sha512-r9Z0zYoxqHz60vvQbWEdXIEtCwHF0yxaWfno9qzXeNHvfyl3BZqygmGzb84dsubyaXLH4husF+NFgMSdpZhk2Q== dependencies: call-bind "^1.0.0" @@ -1886,7 +1901,7 @@ array.prototype.flatmap@^1.2.4: asn1.js@^5.2.0: version "5.4.1" - resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-5.4.1.tgz#11a980b84ebb91781ce35b0fdc2ee294e3783f07" + resolved "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz" integrity sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA== dependencies: bn.js "^4.0.0" @@ -1896,7 +1911,7 @@ asn1.js@^5.2.0: assert@2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/assert/-/assert-2.0.0.tgz#95fc1c616d48713510680f2eaf2d10dd22e02d32" + resolved "https://registry.npmjs.org/assert/-/assert-2.0.0.tgz" integrity sha512-se5Cd+js9dXJnu6Ag2JFc00t+HmHOen+8Q+L7O9zI0PqQXr20uk2J0XQqMxZEeo5U50o8Nvmmx7dZrl+Ufr35A== dependencies: es6-object-assign "^1.1.0" @@ -1906,7 +1921,7 @@ assert@2.0.0: assert@^1.1.1: version "1.5.0" - resolved "https://registry.yarnpkg.com/assert/-/assert-1.5.0.tgz#55c109aaf6e0aefdb3dc4b71240c70bf574b18eb" + resolved "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz" integrity sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA== dependencies: object-assign "^4.1.1" @@ -1914,7 +1929,7 @@ assert@^1.1.1: ast-transform@0.0.0: version "0.0.0" - resolved "https://registry.yarnpkg.com/ast-transform/-/ast-transform-0.0.0.tgz#74944058887d8283e189d954600947bc98fe0062" + resolved "https://registry.npmjs.org/ast-transform/-/ast-transform-0.0.0.tgz" integrity sha1-dJRAWIh9goPhidlUYAlHvJj+AGI= dependencies: escodegen "~1.2.0" @@ -1923,73 +1938,73 @@ ast-transform@0.0.0: ast-types-flow@^0.0.7: version "0.0.7" - resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.7.tgz#f70b735c6bca1a5c9c22d982c3e39e7feba3bdad" + resolved "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz" integrity sha1-9wtzXGvKGlycItmCw+Oef+ujva0= ast-types@0.13.2: version "0.13.2" - resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.13.2.tgz#df39b677a911a83f3a049644fb74fdded23cea48" + resolved "https://registry.npmjs.org/ast-types/-/ast-types-0.13.2.tgz" integrity sha512-uWMHxJxtfj/1oZClOxDEV1sQ1HCDkA4MG8Gr69KKeBjEVH0R84WlejZ0y2DcwyBlpAEMltmVYkVgqfLFb2oyiA== ast-types@^0.7.0: version "0.7.8" - resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.7.8.tgz#902d2e0d60d071bdcd46dc115e1809ed11c138a9" + resolved "https://registry.npmjs.org/ast-types/-/ast-types-0.7.8.tgz" integrity sha1-kC0uDWDQcb3NRtwRXhgJ7RHBOKk= astral-regex@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" + resolved "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz" integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== async-limiter@~1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" + resolved "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz" integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== attr-accept@^2.2.1: version "2.2.2" - resolved "https://registry.yarnpkg.com/attr-accept/-/attr-accept-2.2.2.tgz#646613809660110749e92f2c10833b70968d929b" + resolved "https://registry.npmjs.org/attr-accept/-/attr-accept-2.2.2.tgz" integrity sha512-7prDjvt9HmqiZ0cl5CRjtS84sEyhsHP2coDkaZKRKVfCDo9s7iw7ChVmar78Gu9pC4SoR/28wFu/G5JJhTnqEg== 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" + resolved "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz" integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== axe-core@^4.0.2: version "4.3.3" - resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.3.3.tgz#b55cd8e8ddf659fe89b064680e1c6a4dceab0325" + resolved "https://registry.npmjs.org/axe-core/-/axe-core-4.3.3.tgz" integrity sha512-/lqqLAmuIPi79WYfRpy2i8z+x+vxU3zX2uAm0gs1q52qTuKwolOj1P8XbufpXcsydrpKx2yGn2wzAnxCMV86QA== axios@^0.21.3: version "0.21.4" - resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.4.tgz#c67b90dc0568e5c1cf2b0b858c43ba28e2eda575" + resolved "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz" integrity sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg== dependencies: follow-redirects "^1.14.0" axobject-query@^2.2.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-2.2.0.tgz#943d47e10c0b704aa42275e20edf3722648989be" + resolved "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz" integrity sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA== babel-extract-comments@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/babel-extract-comments/-/babel-extract-comments-1.0.0.tgz#0a2aedf81417ed391b85e18b4614e693a0351a21" + resolved "https://registry.npmjs.org/babel-extract-comments/-/babel-extract-comments-1.0.0.tgz" integrity sha512-qWWzi4TlddohA91bFwgt6zO/J0X+io7Qp184Fw0m2JYRSTZnJbFR8+07KmzudHCZgOiKRCrjhylwv9Xd8gfhVQ== dependencies: babylon "^6.18.0" babel-plugin-dynamic-import-node@^2.3.3: version "2.3.3" - resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3" + resolved "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz" integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ== dependencies: object.assign "^4.1.0" babel-plugin-polyfill-corejs2@^0.2.2: version "0.2.2" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.2.tgz#e9124785e6fd94f94b618a7954e5693053bf5327" + resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.2.tgz" integrity sha512-kISrENsJ0z5dNPq5eRvcctITNHYXWOA4DUZRFYCz3jYCcvTb/A546LIddmoGNMVYg2U38OyFeNosQwI9ENTqIQ== dependencies: "@babel/compat-data" "^7.13.11" @@ -1998,7 +2013,7 @@ babel-plugin-polyfill-corejs2@^0.2.2: babel-plugin-polyfill-corejs3@^0.2.2: version "0.2.4" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.4.tgz#68cb81316b0e8d9d721a92e0009ec6ecd4cd2ca9" + resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.4.tgz" integrity sha512-z3HnJE5TY/j4EFEa/qpQMSbcUJZ5JQi+3UFjXzn6pQCmIKc5Ug5j98SuYyH+m4xQnvKlMDIW4plLfgyVnd0IcQ== dependencies: "@babel/helper-define-polyfill-provider" "^0.2.2" @@ -2006,14 +2021,14 @@ babel-plugin-polyfill-corejs3@^0.2.2: babel-plugin-polyfill-regenerator@^0.2.2: version "0.2.2" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.2.tgz#b310c8d642acada348c1fa3b3e6ce0e851bee077" + resolved "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.2.tgz" integrity sha512-Goy5ghsc21HgPDFtzRkSirpZVW35meGoTmTOb2bxqdl60ghub4xOidgNTHaZfQ2FaxQsKmwvXtOAkcIS4SMBWg== dependencies: "@babel/helper-define-polyfill-provider" "^0.2.2" "babel-plugin-styled-components@>= 1.12.0", babel-plugin-styled-components@^1.11.1: version "1.13.2" - resolved "https://registry.yarnpkg.com/babel-plugin-styled-components/-/babel-plugin-styled-components-1.13.2.tgz#ebe0e6deff51d7f93fceda1819e9b96aeb88278d" + resolved "https://registry.npmjs.org/babel-plugin-styled-components/-/babel-plugin-styled-components-1.13.2.tgz" integrity sha512-Vb1R3d4g+MUfPQPVDMCGjm3cDocJEUTR7Xq7QS95JWWeksN1wdFRYpD2kulDgI3Huuaf1CZd+NK4KQmqUFh5dA== dependencies: "@babel/helper-annotate-as-pure" "^7.0.0" @@ -2023,17 +2038,17 @@ babel-plugin-polyfill-regenerator@^0.2.2: babel-plugin-syntax-jsx@^6.18.0: version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz#0af32a9a6e13ca7a3fd5069e62d7b0f58d0d8946" + resolved "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz" integrity sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY= babel-plugin-syntax-object-rest-spread@^6.8.0: version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5" + resolved "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz" integrity sha1-/WU28rzhODb/o6VFjEkDpZe7O/U= babel-plugin-transform-object-rest-spread@^6.26.0: version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz#0f36692d50fef6b7e2d4b3ac1478137a963b7b06" + resolved "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz" integrity sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY= dependencies: babel-plugin-syntax-object-rest-spread "^6.8.0" @@ -2041,7 +2056,7 @@ babel-plugin-transform-object-rest-spread@^6.26.0: babel-runtime@^6.26.0: version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" + resolved "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz" integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4= dependencies: core-js "^2.4.0" @@ -2049,22 +2064,22 @@ babel-runtime@^6.26.0: babylon@^6.18.0: version "6.18.0" - resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" + resolved "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz" integrity sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ== balanced-match@^1.0.0: version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== base64-js@^1.0.2: version "1.5.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== bfj@^6.1.1: version "6.1.2" - resolved "https://registry.yarnpkg.com/bfj/-/bfj-6.1.2.tgz#325c861a822bcb358a41c78a33b8e6e2086dde7f" + resolved "https://registry.npmjs.org/bfj/-/bfj-6.1.2.tgz" integrity sha512-BmBJa4Lip6BPRINSZ0BPEIfB1wUY/9rwbwvIHQA1KjX9om29B6id0wnWXq7m3bn5JrUVjeOTnVuhPT1FiHwPGw== dependencies: bluebird "^3.5.5" @@ -2074,32 +2089,32 @@ bfj@^6.1.1: big.js@^5.2.2: version "5.2.2" - resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" + resolved "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz" integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== binary-extensions@^2.0.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" + resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz" integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== bluebird@^3.5.5: version "3.7.2" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" + resolved "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz" integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.9: version "4.12.0" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" + resolved "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz" integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== bn.js@^5.0.0, bn.js@^5.1.1: version "5.2.0" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.0.tgz#358860674396c6997771a9d051fcc1b57d4ae002" + resolved "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz" integrity sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw== body-parser@1.19.0: version "1.19.0" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a" + resolved "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz" integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw== dependencies: bytes "3.1.0" @@ -2115,12 +2130,12 @@ body-parser@1.19.0: bootstrap@^4.5.2: version "4.6.0" - resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-4.6.0.tgz#97b9f29ac98f98dfa43bf7468262d84392552fd7" + resolved "https://registry.npmjs.org/bootstrap/-/bootstrap-4.6.0.tgz" integrity sha512-Io55IuQY3kydzHtbGvQya3H+KorS/M9rSNyfCGCg9WZ4pyT/lCxIlpJgG1GXW/PswzC84Tr2fBYi+7+jFVQQBw== brace-expansion@^1.1.7: version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== dependencies: balanced-match "^1.0.0" @@ -2128,26 +2143,26 @@ brace-expansion@^1.1.7: braces@^3.0.1, braces@~3.0.2: version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + resolved "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz" integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== dependencies: fill-range "^7.0.1" brorand@^1.0.1, brorand@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" + resolved "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz" integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= browser-resolve@^1.8.1: version "1.11.3" - resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.3.tgz#9b7cbb3d0f510e4cb86bdbd796124d28b5890af6" + resolved "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz" integrity sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ== dependencies: resolve "1.1.7" browserify-aes@^1.0.0, browserify-aes@^1.0.4: version "1.2.0" - resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" + resolved "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz" integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== dependencies: buffer-xor "^1.0.3" @@ -2159,7 +2174,7 @@ browserify-aes@^1.0.0, browserify-aes@^1.0.4: browserify-cipher@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" + resolved "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz" integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w== dependencies: browserify-aes "^1.0.4" @@ -2168,7 +2183,7 @@ browserify-cipher@^1.0.0: browserify-des@^1.0.0: version "1.0.2" - resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c" + resolved "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz" integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A== dependencies: cipher-base "^1.0.1" @@ -2178,7 +2193,7 @@ browserify-des@^1.0.0: browserify-optional@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/browserify-optional/-/browserify-optional-1.0.1.tgz#1e13722cfde0d85f121676c2a72ced533a018869" + resolved "https://registry.npmjs.org/browserify-optional/-/browserify-optional-1.0.1.tgz" integrity sha1-HhNyLP3g2F8SFnbCpyztUzoBiGk= dependencies: ast-transform "0.0.0" @@ -2187,7 +2202,7 @@ browserify-optional@^1.0.0: browserify-rsa@^4.0.0, browserify-rsa@^4.0.1: version "4.1.0" - resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.1.0.tgz#b2fd06b5b75ae297f7ce2dc651f918f5be158c8d" + resolved "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz" integrity sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog== dependencies: bn.js "^5.0.0" @@ -2195,7 +2210,7 @@ browserify-rsa@^4.0.0, browserify-rsa@^4.0.1: browserify-sign@^4.0.0: version "4.2.1" - resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.1.tgz#eaf4add46dd54be3bb3b36c0cf15abbeba7956c3" + resolved "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz" integrity sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg== dependencies: bn.js "^5.1.1" @@ -2210,14 +2225,14 @@ browserify-sign@^4.0.0: browserify-zlib@0.2.0, browserify-zlib@^0.2.0: version "0.2.0" - resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" + resolved "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz" integrity sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA== dependencies: pako "~1.0.5" browserslist@4.16.6: version "4.16.6" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.6.tgz#d7901277a5a88e554ed305b183ec9b0c08f66fa2" + resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz" integrity sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ== dependencies: caniuse-lite "^1.0.30001219" @@ -2228,7 +2243,7 @@ browserslist@4.16.6: browserslist@^4.16.6, browserslist@^4.17.0: version "4.17.0" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.17.0.tgz#1fcd81ec75b41d6d4994fb0831b92ac18c01649c" + resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.17.0.tgz" integrity sha512-g2BJ2a0nEYvEFQC208q8mVAhfNwpZ5Mu8BwgtCdZKO3qx98HChmeg448fPdUzld8aFmfLgVh7yymqV+q1lJZ5g== dependencies: caniuse-lite "^1.0.30001254" @@ -2239,17 +2254,17 @@ browserslist@^4.16.6, browserslist@^4.17.0: buffer-from@^1.0.0: version "1.1.2" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== buffer-xor@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" + resolved "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz" integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk= buffer@5.6.0: version "5.6.0" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.6.0.tgz#a31749dc7d81d84db08abf937b6b8c4033f62786" + resolved "https://registry.npmjs.org/buffer/-/buffer-5.6.0.tgz" integrity sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw== dependencies: base64-js "^1.0.2" @@ -2257,7 +2272,7 @@ buffer@5.6.0: buffer@^4.3.0: version "4.9.2" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.2.tgz#230ead344002988644841ab0244af8c44bbe3ef8" + resolved "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz" integrity sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg== dependencies: base64-js "^1.0.2" @@ -2266,22 +2281,22 @@ buffer@^4.3.0: builtin-modules@^3.1.0: version "3.2.0" - resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.2.0.tgz#45d5db99e7ee5e6bc4f362e008bf917ab5049887" + resolved "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.2.0.tgz" integrity sha512-lGzLKcioL90C7wMczpkY0n/oART3MbBa8R9OFGE1rJxoVI86u4WAGfEk8Wjv10eKSyTHVGkSo3bvBylCEtk7LA== builtin-status-codes@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" + resolved "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz" integrity sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug= bytes@3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" + resolved "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz" integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== 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" + resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz" integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== dependencies: function-bind "^1.1.1" @@ -2289,22 +2304,22 @@ call-bind@^1.0.0, call-bind@^1.0.2: callsites@^3.0.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== camelize@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/camelize/-/camelize-1.0.0.tgz#164a5483e630fa4321e5af07020e531831b2609b" + resolved "https://registry.npmjs.org/camelize/-/camelize-1.0.0.tgz" integrity sha1-FkpUg+Yw+kMh5a8HAg5TGDGyYJs= caniuse-lite@^1.0.30001202, caniuse-lite@^1.0.30001219, caniuse-lite@^1.0.30001228, caniuse-lite@^1.0.30001254: version "1.0.30001255" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001255.tgz#f3b09b59ab52e39e751a569523618f47c4298ca0" + resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001255.tgz" integrity sha512-F+A3N9jTZL882f/fg/WWVnKSu6IOo3ueLz4zwaOPbPYHNmM/ZaDUyzyJwS1mZhX7Ex5jqTyW599Gdelh5PDYLQ== chalk@2.4.2, chalk@^2.0.0, chalk@^2.4.1: version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== dependencies: ansi-styles "^3.2.1" @@ -2313,7 +2328,7 @@ chalk@2.4.2, chalk@^2.0.0, chalk@^2.4.1: chalk@4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.0.0.tgz#6e98081ed2d17faab615eb52ac66ec1fe6209e72" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.0.0.tgz" integrity sha512-N9oWFcegS0sFr9oh1oz2d7Npos6vNoWW9HvtCg5N1KRFpUhaAhvTv5Y58g880fZaEYSNm3qDz8SU1UrGvp+n7A== dependencies: ansi-styles "^4.1.0" @@ -2321,7 +2336,7 @@ chalk@4.0.0: chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.1: version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== dependencies: ansi-styles "^4.1.0" @@ -2329,12 +2344,12 @@ chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.1: check-types@^8.0.3: version "8.0.3" - resolved "https://registry.yarnpkg.com/check-types/-/check-types-8.0.3.tgz#3356cca19c889544f2d7a95ed49ce508a0ecf552" + resolved "https://registry.npmjs.org/check-types/-/check-types-8.0.3.tgz" integrity sha512-YpeKZngUmG65rLudJ4taU7VLkOCTMhNl/u4ctNC56LQS/zJTyNH0Lrtwm1tfTsbLlwvlfsA2d1c8vCf/Kh2KwQ== chokidar@3.5.1: version "3.5.1" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.1.tgz#ee9ce7bbebd2b79f49f304799d5468e31e14e68a" + resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz" integrity sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw== dependencies: anymatch "~3.1.1" @@ -2349,14 +2364,14 @@ chokidar@3.5.1: chrono-node@^2.2.6: version "2.3.1" - resolved "https://registry.yarnpkg.com/chrono-node/-/chrono-node-2.3.1.tgz#b47f1f6496ee8de676a2153e693856a5c53fe5ea" + resolved "https://registry.npmjs.org/chrono-node/-/chrono-node-2.3.1.tgz" integrity sha512-zx/o58qoIKNhZT3eFZyi7wAK4Yn+y7EVrWnYiPXbYWXnZdX1HzoU1u9pTfhHymNV1Rdk/IGjOVgQul54dR8Z0Q== dependencies: dayjs "^1.10.0" cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: version "1.0.4" - resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" + resolved "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz" integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== dependencies: inherits "^2.0.1" @@ -2364,22 +2379,22 @@ cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: classnames@2.2.6: version "2.2.6" - resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.2.6.tgz#43935bffdd291f326dad0a205309b38d00f650ce" + resolved "https://registry.npmjs.org/classnames/-/classnames-2.2.6.tgz" integrity sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q== classnames@^2.2.6, classnames@^2.3.1: version "2.3.1" - resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.3.1.tgz#dfcfa3891e306ec1dad105d0e88f4417b8535e8e" + resolved "https://registry.npmjs.org/classnames/-/classnames-2.3.1.tgz" integrity sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA== clean-stack@^2.0.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" + resolved "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz" integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== clean-webpack-plugin@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/clean-webpack-plugin/-/clean-webpack-plugin-3.0.0.tgz#a99d8ec34c1c628a4541567aa7b457446460c62b" + resolved "https://registry.npmjs.org/clean-webpack-plugin/-/clean-webpack-plugin-3.0.0.tgz" integrity sha512-MciirUH5r+cYLGCOL5JX/ZLzOZbVr1ot3Fw+KcvbhUb6PM+yycqd9ZhIlcigQ5gl+XhppNmw3bEFuaaMNyLj3A== dependencies: "@types/webpack" "^4.4.31" @@ -2387,14 +2402,14 @@ clean-webpack-plugin@^3.0.0: cli-cursor@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" + resolved "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz" integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== dependencies: restore-cursor "^3.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" + resolved "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz" integrity sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg== dependencies: slice-ansi "^3.0.0" @@ -2402,132 +2417,132 @@ cli-truncate@^2.1.0: code-point-at@^1.0.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" + resolved "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz" integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= color-convert@^1.9.0: version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== dependencies: color-name "1.1.3" color-convert@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== dependencies: color-name "~1.1.4" color-name@1.1.3: version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= color-name@~1.1.4: version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== colorette@^1.2.2, colorette@^1.3.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.4.0.tgz#5190fbb87276259a86ad700bff2c6d6faa3fca40" + resolved "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz" integrity sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g== comlink@^4.3.0: version "4.3.1" - resolved "https://registry.yarnpkg.com/comlink/-/comlink-4.3.1.tgz#0c6b9d69bcd293715c907c33fe8fc45aecad13c5" + resolved "https://registry.npmjs.org/comlink/-/comlink-4.3.1.tgz" integrity sha512-+YbhUdNrpBZggBAHWcgQMLPLH1KDF3wJpeqrCKieWQ8RL7atmgsgTQko1XEBK6PsecfopWNntopJ+ByYG1lRaA== commander@^2.18.0, commander@^2.20.0: version "2.20.3" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + resolved "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz" 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" + resolved "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz" integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== common-tags@^1.8.0: version "1.8.0" - resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.8.0.tgz#8e3153e542d4a39e9b10554434afaaf98956a937" + resolved "https://registry.npmjs.org/common-tags/-/common-tags-1.8.0.tgz" integrity sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw== commondir@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + resolved "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz" integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= concat-map@0.0.1: version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= confusing-browser-globals@^1.0.10: version "1.0.10" - resolved "https://registry.yarnpkg.com/confusing-browser-globals/-/confusing-browser-globals-1.0.10.tgz#30d1e7f3d1b882b25ec4933d1d1adac353d20a59" + resolved "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.10.tgz" integrity sha512-gNld/3lySHwuhaVluJUKLePYirM3QNCKzVxqAdhJII9/WXKVX5PURzMVJspS1jTslSqjeuG4KMVTSouit5YPHA== console-browserify@^1.1.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336" + resolved "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz" integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA== console-control-strings@^1.0.0, console-control-strings@~1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + resolved "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz" integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= constants-browserify@1.0.0, constants-browserify@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" + resolved "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz" integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U= content-disposition@0.5.3: version "0.5.3" - resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd" + resolved "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz" integrity sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g== dependencies: safe-buffer "5.1.2" content-type@~1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" + resolved "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz" integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== convert-source-map@1.7.0: version "1.7.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" + resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz" integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA== dependencies: safe-buffer "~5.1.1" convert-source-map@^1.7.0: version "1.8.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369" + resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz" integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA== dependencies: safe-buffer "~5.1.1" cookie-signature@1.0.6: version "1.0.6" - resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + resolved "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz" integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= cookie@0.4.0: version "0.4.0" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba" + resolved "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz" integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg== cookie@^0.4.1: version "0.4.1" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.1.tgz#afd713fe26ebd21ba95ceb61f9a8116e50a537d1" + resolved "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz" integrity sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA== core-js-compat@^3.14.0, core-js-compat@^3.16.0: version "3.17.3" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.17.3.tgz#b39c8e4dec71ecdc735c653ce5233466e561324e" + resolved "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.17.3.tgz" integrity sha512-+in61CKYs4hQERiADCJsdgewpdl/X0GhEX77pjKgbeibXviIt2oxEjTc8O2fqHX8mDdBrDvX8MYD/RYsBv4OiA== dependencies: browserslist "^4.17.0" @@ -2535,22 +2550,22 @@ core-js-compat@^3.14.0, core-js-compat@^3.16.0: core-js-pure@^3.16.0: version "3.17.3" - resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.17.3.tgz#98ea3587188ab7ef4695db6518eeb71aec42604a" + resolved "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.17.3.tgz" integrity sha512-YusrqwiOTTn8058JDa0cv9unbXdIiIgcgI9gXso0ey4WgkFLd3lYlV9rp9n7nDCsYxXsMDTjA4m1h3T348mdlQ== core-js@^2.4.0: version "2.6.12" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec" + resolved "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz" integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ== core-util-is@~1.0.0: version "1.0.3" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" + resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz" integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== cosmiconfig@^7.0.0: version "7.0.1" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.1.tgz#714d756522cace867867ccb4474c5d01bbae5d6d" + resolved "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz" integrity sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ== dependencies: "@types/parse-json" "^4.0.0" @@ -2561,7 +2576,7 @@ cosmiconfig@^7.0.0: create-ecdh@^4.0.0: version "4.0.4" - resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e" + resolved "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz" integrity sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A== dependencies: bn.js "^4.1.0" @@ -2569,7 +2584,7 @@ create-ecdh@^4.0.0: create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" + resolved "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz" integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== dependencies: cipher-base "^1.0.1" @@ -2580,7 +2595,7 @@ create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7: version "1.1.7" - resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" + resolved "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz" integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== dependencies: cipher-base "^1.0.3" @@ -2592,7 +2607,7 @@ create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7: 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" + resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz" integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== dependencies: path-key "^3.1.0" @@ -2601,7 +2616,7 @@ cross-spawn@^7.0.2, cross-spawn@^7.0.3: crypto-browserify@3.12.0, crypto-browserify@^3.11.0: version "3.12.0" - resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" + resolved "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz" integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg== dependencies: browserify-cipher "^1.0.0" @@ -2618,17 +2633,17 @@ crypto-browserify@3.12.0, crypto-browserify@^3.11.0: crypto-random-string@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e" + resolved "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz" integrity sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4= css-color-keywords@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/css-color-keywords/-/css-color-keywords-1.0.0.tgz#fea2616dc676b2962686b3af8dbdbe180b244e05" + resolved "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz" integrity sha1-/qJhbcZ2spYmhrOvjb2+GAskTgU= css-to-react-native@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/css-to-react-native/-/css-to-react-native-3.0.0.tgz#62dbe678072a824a689bcfee011fc96e02a7d756" + resolved "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.0.0.tgz" integrity sha512-Ro1yETZA813eoyUp2GDBhG2j+YggidUmzO1/v9eYBKR2EHVEniE2MI/NqpTQ954BMpTPZFsGNPm46qFB9dpaPQ== dependencies: camelize "^1.0.0" @@ -2637,89 +2652,94 @@ css-to-react-native@^3.0.0: css.escape@1.5.1: version "1.5.1" - resolved "https://registry.yarnpkg.com/css.escape/-/css.escape-1.5.1.tgz#42e27d4fa04ae32f931a4b4d4191fa9cddee97cb" + resolved "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz" integrity sha1-QuJ9T6BK4y+TGktNQZH6nN3ul8s= cssnano-preset-simple@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/cssnano-preset-simple/-/cssnano-preset-simple-3.0.0.tgz#e95d0012699ca2c741306e9a3b8eeb495a348dbe" + resolved "https://registry.npmjs.org/cssnano-preset-simple/-/cssnano-preset-simple-3.0.0.tgz" integrity sha512-vxQPeoMRqUT3c/9f0vWeVa2nKQIHFpogtoBvFdW4GQ3IvEJ6uauCP6p3Y5zQDLFcI7/+40FTgX12o7XUL0Ko+w== dependencies: caniuse-lite "^1.0.30001202" cssnano-simple@3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/cssnano-simple/-/cssnano-simple-3.0.0.tgz#a4b8ccdef4c7084af97e19bc5b93b4ecf211e90f" + resolved "https://registry.npmjs.org/cssnano-simple/-/cssnano-simple-3.0.0.tgz" integrity sha512-oU3ueli5Dtwgh0DyeohcIEE00QVfbPR3HzyXdAl89SfnQG3y0/qcpfLVW+jPIh3/rgMZGwuW96rejZGaYE9eUg== dependencies: cssnano-preset-simple "^3.0.0" csstype@^3.0.2: version "3.0.8" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.8.tgz#d2266a792729fb227cd216fb572f43728e1ad340" + resolved "https://registry.npmjs.org/csstype/-/csstype-3.0.8.tgz" integrity sha512-jXKhWqXPmlUeoQnF/EhTtTl4C9SnrxSH/jZUih3jmO6lBKr99rP3/+FmrMj4EFpOXzMtXHAZkd3x0E6h6Fgflw== damerau-levenshtein@^1.0.6: version "1.0.7" - resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.7.tgz#64368003512a1a6992593741a09a9d31a836f55d" + resolved "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.7.tgz" integrity sha512-VvdQIPGdWP0SqFXghj79Wf/5LArmreyMsGLa6FG6iC4t3j7j5s71TrwWmT/4akbDQIqjfACkLZmjXhA7g2oUZw== data-uri-to-buffer@3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-3.0.1.tgz#594b8973938c5bc2c33046535785341abc4f3636" + resolved "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-3.0.1.tgz" integrity sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og== +date-fns@^2.0.1, date-fns@^2.24.0: + version "2.25.0" + resolved "https://registry.npmjs.org/date-fns/-/date-fns-2.25.0.tgz" + integrity sha512-ovYRFnTrbGPD4nqaEqescPEv1mNwvt+UTqI3Ay9SzNtey9NZnYu6E2qCcBBgJ6/2VF1zGGygpyTDITqpQQ5e+w== + dayjs@^1.10.0: version "1.10.6" - resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.10.6.tgz#288b2aa82f2d8418a6c9d4df5898c0737ad02a63" + resolved "https://registry.npmjs.org/dayjs/-/dayjs-1.10.6.tgz" integrity sha512-AztC/IOW4L1Q41A86phW5Thhcrco3xuAA+YX/BLpLWWjRcTj5TOt/QImBLmCKlrF7u7k47arTnOyL6GnbG8Hvw== debounce-promise@^3.1.2: version "3.1.2" - resolved "https://registry.yarnpkg.com/debounce-promise/-/debounce-promise-3.1.2.tgz#320fb8c7d15a344455cd33cee5ab63530b6dc7c5" + resolved "https://registry.npmjs.org/debounce-promise/-/debounce-promise-3.1.2.tgz" integrity sha512-rZHcgBkbYavBeD9ej6sP56XfG53d51CD4dnaw989YX/nZ/ZJfgRx/9ePKmTNiUiyQvh4mtrMoS3OAWW+yoYtpg== debug@2, debug@2.6.9, debug@^2.6.9: version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== dependencies: ms "2.0.0" debug@4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1: version "4.3.2" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.2.tgz#f0a49c18ac8779e31d4a0c6029dfb76873c7428b" + resolved "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz" integrity sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw== dependencies: ms "2.1.2" debug@^3.2.7: version "3.2.7" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" + resolved "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz" integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== dependencies: ms "^2.1.1" deep-is@^0.1.3: version "0.1.4" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz" integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== deepmerge@^2.1.1: version "2.2.1" - resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-2.2.1.tgz#5d3ff22a01c00f645405a2fbc17d0778a1801170" + resolved "https://registry.npmjs.org/deepmerge/-/deepmerge-2.2.1.tgz" integrity sha512-R9hc1Xa/NOBi9WRVUWg19rl1UB7Tt4kuPd+thNJgFZoxXsTz7ncaPaeIm+40oSGuP33DfMb4sZt1QIGiJzC4EA== define-properties@^1.1.3: version "1.1.3" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" + resolved "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz" integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== dependencies: object-keys "^1.0.12" del@^4.1.1: version "4.1.1" - resolved "https://registry.yarnpkg.com/del/-/del-4.1.1.tgz#9e8f117222ea44a31ff3a156c049b99052a9f0b4" + resolved "https://registry.npmjs.org/del/-/del-4.1.1.tgz" integrity sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ== dependencies: "@types/glob" "^7.1.1" @@ -2732,22 +2752,22 @@ del@^4.1.1: delegates@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + resolved "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz" integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= depd@~1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + resolved "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz" integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= dequal@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.2.tgz#85ca22025e3a87e65ef75a7a437b35284a7e319d" + resolved "https://registry.npmjs.org/dequal/-/dequal-2.0.2.tgz" integrity sha512-q9K8BlJVxK7hQYqa6XISGmBZbtQQWVXSrRrWreHC94rMt1QL/Impruc+7p2CYSYuVIUr+YCt6hjrs1kkdJRTug== des.js@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843" + resolved "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz" integrity sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA== dependencies: inherits "^2.0.1" @@ -2755,17 +2775,17 @@ des.js@^1.0.0: destroy@~1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" + resolved "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz" integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= detect-element-overflow@^1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/detect-element-overflow/-/detect-element-overflow-1.2.0.tgz#86e504292ffedc3aef813395fbdf0261aaf6afa9" + resolved "https://registry.npmjs.org/detect-element-overflow/-/detect-element-overflow-1.2.0.tgz" integrity sha512-Jtr9ivYPhpd9OJux+hjL0QjUKiS1Ghgy8tvIufUjFslQgIWvgGr4mn57H190APbKkiOmXnmtMI6ytaKzMusecg== diffie-hellman@^5.0.0: version "5.0.3" - resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" + resolved "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz" integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg== dependencies: bn.js "^4.1.0" @@ -2774,28 +2794,28 @@ diffie-hellman@^5.0.0: dir-glob@^3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + resolved "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz" integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== dependencies: path-type "^4.0.0" doctrine@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + resolved "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz" integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== dependencies: esutils "^2.0.2" doctrine@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + resolved "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz" integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== dependencies: esutils "^2.0.2" dom-helpers@^5.0.1, dom-helpers@^5.2.0, dom-helpers@^5.2.1: version "5.2.1" - resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-5.2.1.tgz#d9400536b2bf8225ad98fe052e029451ac40e902" + resolved "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz" integrity sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA== dependencies: "@babel/runtime" "^7.8.7" @@ -2803,37 +2823,37 @@ dom-helpers@^5.0.1, dom-helpers@^5.2.0, dom-helpers@^5.2.1: domain-browser@4.19.0: version "4.19.0" - resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-4.19.0.tgz#1093e17c0a17dbd521182fe90d49ac1370054af1" + resolved "https://registry.npmjs.org/domain-browser/-/domain-browser-4.19.0.tgz" integrity sha512-fRA+BaAWOR/yr/t7T9E9GJztHPeFjj8U35ajyAjCDtAAnTn1Rc1f6W6VGPJrO1tkQv9zWu+JRof7z6oQtiYVFQ== domain-browser@^1.1.1: version "1.2.0" - resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" + resolved "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz" integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA== duplexer@^0.1.1: version "0.1.2" - resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" + resolved "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz" integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== ee-first@1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + resolved "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz" integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= ejs@^2.6.1: version "2.7.4" - resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.7.4.tgz#48661287573dcc53e366c7a1ae52c3a120eec9ba" + resolved "https://registry.npmjs.org/ejs/-/ejs-2.7.4.tgz" integrity sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA== electron-to-chromium@^1.3.723, electron-to-chromium@^1.3.830: version "1.3.835" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.835.tgz#98fa4402ab7bc6afbe4953a8ca9b63cb3a6bf08b" + resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.835.tgz" integrity sha512-rHQszGg2KLMqOWPNTpwCnlp7Kb85haJa8j089DJCreZueykoSN/in+EMlay3SSDMNKR4VGPvfskxofHV18xVJg== elliptic@^6.5.3: version "6.5.4" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" + resolved "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz" integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== dependencies: bn.js "^4.11.9" @@ -2846,49 +2866,49 @@ elliptic@^6.5.3: emoji-regex@^8.0.0: version "8.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== emoji-regex@^9.0.0: version "9.2.2" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz" integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== emojis-list@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" + resolved "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz" integrity sha1-TapNnbAPmBmIDHn6RXrlsJof04k= encodeurl@~1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + resolved "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz" integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= encoding@0.1.13: version "0.1.13" - resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" + resolved "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz" integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== dependencies: iconv-lite "^0.6.2" enquirer@^2.3.5, enquirer@^2.3.6: version "2.3.6" - resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" + resolved "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz" integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== dependencies: ansi-colors "^4.1.1" error-ex@^1.3.1: version "1.3.2" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + resolved "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz" integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== dependencies: is-arrayish "^0.2.1" es-abstract@^1.18.0-next.1, es-abstract@^1.18.0-next.2, es-abstract@^1.18.2, es-abstract@^1.18.5: - version "1.18.6" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.6.tgz#2c44e3ea7a6255039164d26559777a6d978cb456" - integrity sha512-kAeIT4cku5eNLNuUKhlmtuk1/TRZvQoYccn6TO0cSVdf1kzB0T7+dYuVK9MWM7l+/53W2Q8M7N2c6MQvhXFcUQ== + version "1.19.1" + resolved "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz" + integrity sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w== dependencies: call-bind "^1.0.2" es-to-primitive "^1.2.1" @@ -2901,7 +2921,9 @@ es-abstract@^1.18.0-next.1, es-abstract@^1.18.0-next.2, es-abstract@^1.18.2, es- is-callable "^1.2.4" is-negative-zero "^2.0.1" is-regex "^1.1.4" + is-shared-array-buffer "^1.0.1" is-string "^1.0.7" + is-weakref "^1.0.1" object-inspect "^1.11.0" object-keys "^1.1.1" object.assign "^4.1.2" @@ -2911,7 +2933,7 @@ es-abstract@^1.18.0-next.1, es-abstract@^1.18.0-next.2, es-abstract@^1.18.2, es- 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" + resolved "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz" integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== dependencies: is-callable "^1.1.4" @@ -2920,32 +2942,32 @@ es-to-primitive@^1.2.1: es6-object-assign@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/es6-object-assign/-/es6-object-assign-1.1.0.tgz#c2c3582656247c39ea107cb1e6652b6f9f24523c" + resolved "https://registry.npmjs.org/es6-object-assign/-/es6-object-assign-1.1.0.tgz" integrity sha1-wsNYJlYkfDnqEHyx5mUrb58kUjw= escalade@^3.1.1: version "3.1.1" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + resolved "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz" integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== escape-html@~1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + resolved "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz" integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= 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" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= 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" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== escodegen@~1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.2.0.tgz#09de7967791cc958b7f89a2ddb6d23451af327e1" + resolved "https://registry.npmjs.org/escodegen/-/escodegen-1.2.0.tgz" integrity sha1-Cd55Z3kcyVi3+Jot220jRRrzJ+E= dependencies: esprima "~1.0.4" @@ -2956,7 +2978,7 @@ escodegen@~1.2.0: eslint-config-airbnb-base@^14.2.1: version "14.2.1" - resolved "https://registry.yarnpkg.com/eslint-config-airbnb-base/-/eslint-config-airbnb-base-14.2.1.tgz#8a2eb38455dc5a312550193b319cdaeef042cd1e" + resolved "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-14.2.1.tgz" integrity sha512-GOrQyDtVEc1Xy20U7vsB2yAoB4nBlfH5HZJeatRXHleO+OS5Ot+MWij4Dpltw4/DyIkqUfqz1epfhVR5XWWQPA== dependencies: confusing-browser-globals "^1.0.10" @@ -2965,7 +2987,7 @@ eslint-config-airbnb-base@^14.2.1: eslint-config-airbnb@^18.2.1: version "18.2.1" - resolved "https://registry.yarnpkg.com/eslint-config-airbnb/-/eslint-config-airbnb-18.2.1.tgz#b7fe2b42f9f8173e825b73c8014b592e449c98d9" + resolved "https://registry.npmjs.org/eslint-config-airbnb/-/eslint-config-airbnb-18.2.1.tgz" integrity sha512-glZNDEZ36VdlZWoxn/bUR1r/sdFKPd1mHPbqUtkctgNG4yT2DLLtJ3D+yCV+jzZCc2V1nBVkmdknOJBZ5Hc0fg== dependencies: eslint-config-airbnb-base "^14.2.1" @@ -2974,17 +2996,17 @@ eslint-config-airbnb@^18.2.1: eslint-config-google@^0.14.0: version "0.14.0" - resolved "https://registry.yarnpkg.com/eslint-config-google/-/eslint-config-google-0.14.0.tgz#4f5f8759ba6e11b424294a219dbfa18c508bcc1a" + resolved "https://registry.npmjs.org/eslint-config-google/-/eslint-config-google-0.14.0.tgz" integrity sha512-WsbX4WbjuMvTdeVL6+J3rK1RGhCTqjsFjX7UMSMgZiyxxaNLkoJENbrGExzERFeoTpGw3F3FypTiWAP9ZXzkEw== eslint-config-prettier@^8.3.0: version "8.3.0" - resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.3.0.tgz#f7471b20b6fe8a9a9254cc684454202886a2dd7a" + resolved "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.3.0.tgz" integrity sha512-BgZuLUSeKzvlL/VUjx/Yb787VQ26RU3gGjA3iiFvdsp/2bMfVIWUVP7tjxtjS0e+HP409cPlPvNkQloz8C91ew== eslint-import-resolver-node@^0.3.6: version "0.3.6" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz#4048b958395da89668252001dbd9eca6b83bacbd" + resolved "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz" integrity sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw== dependencies: debug "^3.2.7" @@ -2992,7 +3014,7 @@ eslint-import-resolver-node@^0.3.6: eslint-module-utils@^2.6.2: version "2.6.2" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.6.2.tgz#94e5540dd15fe1522e8ffa3ec8db3b7fa7e7a534" + resolved "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.2.tgz" integrity sha512-QG8pcgThYOuqxupd06oYTZoNOGaUdTY1PqK+oS6ElF6vs4pBdk/aYxFVQQXzcrAqp9m7cl7lb2ubazX+g16k2Q== dependencies: debug "^3.2.7" @@ -3000,7 +3022,7 @@ eslint-module-utils@^2.6.2: eslint-plugin-import@^2.23.3: version "2.24.2" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.24.2.tgz#2c8cd2e341f3885918ee27d18479910ade7bb4da" + resolved "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.24.2.tgz" integrity sha512-hNVtyhiEtZmpsabL4neEj+6M5DCLgpYyG9nzJY8lZQeQXEn5UPW1DpUdsMHMXsq98dbNm7nt1w9ZMSVpfJdi8Q== dependencies: array-includes "^3.1.3" @@ -3021,7 +3043,7 @@ eslint-plugin-import@^2.23.3: eslint-plugin-jsx-a11y@^6.4.1: version "6.4.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.4.1.tgz#a2d84caa49756942f42f1ffab9002436391718fd" + resolved "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.4.1.tgz" integrity sha512-0rGPJBbwHoGNPU73/QCLP/vveMlM1b1Z9PponxO87jfr6tuH5ligXbDT6nHSSzBC8ovX2Z+BQu7Bk5D/Xgq9zg== dependencies: "@babel/runtime" "^7.11.2" @@ -3038,12 +3060,12 @@ eslint-plugin-jsx-a11y@^6.4.1: eslint-plugin-react-hooks@^4.2.0: version "4.2.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.2.0.tgz#8c229c268d468956334c943bb45fc860280f5556" + resolved "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.2.0.tgz" integrity sha512-623WEiZJqxR7VdxFCKLI6d6LLpwJkGPYKODnkH3D7WpOG5KM8yWueBd8TLsNAetEJNF5iJmolaAKO3F8yzyVBQ== eslint-plugin-react@^7.23.2: version "7.25.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.25.1.tgz#9286b7cd9bf917d40309760f403e53016eda8331" + resolved "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.25.1.tgz" integrity sha512-P4j9K1dHoFXxDNP05AtixcJEvIT6ht8FhYKsrkY0MPCPaUMYijhpWwNiRDZVtA8KFuZOkGSeft6QwH8KuVpJug== dependencies: array-includes "^3.1.3" @@ -3062,7 +3084,7 @@ eslint-plugin-react@^7.23.2: eslint-scope@^5.1.1: version "5.1.1" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" + resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz" integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== dependencies: esrecurse "^4.3.0" @@ -3070,31 +3092,31 @@ eslint-scope@^5.1.1: eslint-utils@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" + resolved "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz" integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== dependencies: eslint-visitor-keys "^1.1.0" eslint-utils@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672" + resolved "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz" integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA== dependencies: eslint-visitor-keys "^2.0.0" eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0: version "1.3.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" + resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz" integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== eslint-visitor-keys@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" + resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz" integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== eslint@^7.27.0: version "7.32.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.32.0.tgz#c6d328a14be3fb08c8d1d21e12c02fdb7a2a812d" + resolved "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz" integrity sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA== dependencies: "@babel/code-frame" "7.12.11" @@ -3140,7 +3162,7 @@ eslint@^7.27.0: espree@^7.3.0, espree@^7.3.1: version "7.3.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-7.3.1.tgz#f2df330b752c6f55019f8bd89b7660039c1bbbb6" + resolved "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz" integrity sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g== dependencies: acorn "^7.4.0" @@ -3149,86 +3171,86 @@ espree@^7.3.0, espree@^7.3.1: esprima@^4.0.0: version "4.0.1" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + resolved "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== esprima@~1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-1.0.4.tgz#9f557e08fc3b4d26ece9dd34f8fbf476b62585ad" + resolved "https://registry.npmjs.org/esprima/-/esprima-1.0.4.tgz" integrity sha1-n1V+CPw7TSbs6d00+Pv0drYlha0= esquery@^1.4.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" + resolved "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz" integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== dependencies: estraverse "^5.1.0" esrecurse@^4.3.0: version "4.3.0" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + resolved "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz" integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== dependencies: estraverse "^5.2.0" estraverse@^4.1.1: version "4.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz" integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== estraverse@^5.1.0, estraverse@^5.2.0: version "5.2.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.2.0.tgz#307df42547e6cc7324d3cf03c155d5cdb8c53880" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz" integrity sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ== estraverse@~1.5.0: version "1.5.1" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-1.5.1.tgz#867a3e8e58a9f84618afb6c2ddbcd916b7cbaf71" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-1.5.1.tgz" integrity sha1-hno+jlip+EYYr7bC3bzZFrfLr3E= estree-walker@^0.6.1: version "0.6.1" - resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.6.1.tgz#53049143f40c6eb918b23671d1fe3219f3a1b362" + resolved "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz" integrity sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w== estree-walker@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-1.0.1.tgz#31bc5d612c96b704106b477e6dd5d8aa138cb700" + resolved "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz" integrity sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg== esutils@^2.0.2: version "2.0.3" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== esutils@~1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-1.0.0.tgz#8151d358e20c8acc7fb745e7472c0025fe496570" + resolved "https://registry.npmjs.org/esutils/-/esutils-1.0.0.tgz" integrity sha1-gVHTWOIMisx/t0XnRywAJf5JZXA= etag@1.8.1, etag@~1.8.1: version "1.8.1" - resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + resolved "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz" integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= eve@~0.5.1: version "0.5.4" - resolved "https://registry.yarnpkg.com/eve/-/eve-0.5.4.tgz#67d080b9725291d7e389e34c26860dd97f1debaa" + resolved "https://registry.npmjs.org/eve/-/eve-0.5.4.tgz" integrity sha1-Z9CAuXJSkdfjieNMJoYN2X8d66o= eventemitter3@^4.0.0: version "4.0.7" - resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" + resolved "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz" integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== events@^3.0.0: version "3.3.0" - resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" + resolved "https://registry.npmjs.org/events/-/events-3.3.0.tgz" integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" + resolved "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz" integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== dependencies: md5.js "^1.3.4" @@ -3236,7 +3258,7 @@ evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: execa@^5.0.0: version "5.1.1" - resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" + resolved "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz" integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== dependencies: cross-spawn "^7.0.3" @@ -3251,12 +3273,12 @@ execa@^5.0.0: exifr@^7.1.3: version "7.1.3" - resolved "https://registry.yarnpkg.com/exifr/-/exifr-7.1.3.tgz#f6218012c36dbb7d843222011b27f065fddbab6f" + resolved "https://registry.npmjs.org/exifr/-/exifr-7.1.3.tgz" integrity sha512-g/aje2noHivrRSLbAUtBPWFbxKdKhgj/xr1vATDdUXPOFYJlQ62Ft0oy+72V6XLIpDJfHs6gXLbBLAolqOXYRw== express@^4.16.3: version "4.17.1" - resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134" + resolved "https://registry.npmjs.org/express/-/express-4.17.1.tgz" integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g== dependencies: accepts "~1.3.7" @@ -3292,12 +3314,12 @@ express@^4.16.3: 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" + resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== fast-glob@^3.1.1: version "3.2.7" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.7.tgz#fd6cb7a2d7e9aa7a7846111e85a196d6b2f766a1" + resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz" integrity sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q== dependencies: "@nodelib/fs.stat" "^2.0.2" @@ -3308,38 +3330,38 @@ fast-glob@^3.1.1: 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" + resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== fast-levenshtein@^2.0.6: version "2.0.6" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= fastq@^1.6.0: version "1.12.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.12.0.tgz#ed7b6ab5d62393fb2cc591c853652a5c318bf794" + resolved "https://registry.npmjs.org/fastq/-/fastq-1.12.0.tgz" integrity sha512-VNX0QkHK3RsXVKr9KrlUv/FoTa0NdbYoHHl7uXHv2rzyHSlxjdNAKug2twd9luJxpcyNeAgf5iPPMutJO67Dfg== dependencies: reusify "^1.0.4" 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" + resolved "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz" integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== dependencies: flat-cache "^3.0.4" file-selector@^0.2.2: version "0.2.4" - resolved "https://registry.yarnpkg.com/file-selector/-/file-selector-0.2.4.tgz#7b98286f9dbb9925f420130ea5ed0a69238d4d80" + resolved "https://registry.npmjs.org/file-selector/-/file-selector-0.2.4.tgz" integrity sha512-ZDsQNbrv6qRi1YTDOEWzf5J2KjZ9KMI1Q2SGeTkCJmNNW25Jg4TW4UMcmoqcg4WrAyKRcpBXdbWRxkfrOzVRbA== dependencies: tslib "^2.0.3" file-type@^16.5.3: version "16.5.3" - resolved "https://registry.yarnpkg.com/file-type/-/file-type-16.5.3.tgz#474b7e88c74724046abb505e9b8ed4db30c4fc06" + resolved "https://registry.npmjs.org/file-type/-/file-type-16.5.3.tgz" integrity sha512-uVsl7iFhHSOY4bEONLlTK47iAHtNsFHWP5YE4xJfZ4rnX7S1Q3wce09XgqSC7E/xh8Ncv/be1lNoyprlUH/x6A== dependencies: readable-web-to-node-stream "^3.0.0" @@ -3348,19 +3370,19 @@ file-type@^16.5.3: filesize@^3.6.1: version "3.6.1" - resolved "https://registry.yarnpkg.com/filesize/-/filesize-3.6.1.tgz#090bb3ee01b6f801a8a8be99d31710b3422bb317" + resolved "https://registry.npmjs.org/filesize/-/filesize-3.6.1.tgz" integrity sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg== fill-range@^7.0.1: version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz" integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== dependencies: to-regex-range "^5.0.1" finalhandler@~1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" + resolved "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz" integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== dependencies: debug "2.6.9" @@ -3373,7 +3395,7 @@ finalhandler@~1.1.2: find-cache-dir@3.3.1: version "3.3.1" - resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.1.tgz#89b33fad4a4670daa94f855f7fbe31d6d84fe880" + resolved "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz" integrity sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ== dependencies: commondir "^1.0.1" @@ -3382,14 +3404,14 @@ find-cache-dir@3.3.1: find-up@^2.0.0, find-up@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" + resolved "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz" integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= dependencies: locate-path "^2.0.0" find-up@^4.0.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + resolved "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz" integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== dependencies: locate-path "^5.0.0" @@ -3397,7 +3419,7 @@ find-up@^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" + resolved "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz" integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== dependencies: flatted "^3.1.0" @@ -3405,27 +3427,27 @@ flat-cache@^3.0.4: flatted@^3.1.0: version "3.2.2" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.2.tgz#64bfed5cb68fe3ca78b3eb214ad97b63bedce561" + resolved "https://registry.npmjs.org/flatted/-/flatted-3.2.2.tgz" integrity sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA== fn-name@~3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/fn-name/-/fn-name-3.0.0.tgz#0596707f635929634d791f452309ab41558e3c5c" + resolved "https://registry.npmjs.org/fn-name/-/fn-name-3.0.0.tgz" integrity sha512-eNMNr5exLoavuAMhIUVsOKF79SWd/zG104ef6sxBTSw+cZc6BXdQXDvYcGvp0VbxVVSp1XDUNoz7mg1xMtSznA== follow-redirects@^1.0.0, follow-redirects@^1.14.0: version "1.14.3" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.3.tgz#6ada78118d8d24caee595595accdc0ac6abd022e" + resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.3.tgz" integrity sha512-3MkHxknWMUtb23apkgz/83fDoe+y+qr0TdgacGIA7bew+QLBo3vdgEN2xEsuXNivpFy4CyDhBBZnNZOtalmenw== foreach@^2.0.5: version "2.0.5" - resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99" + resolved "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz" integrity sha1-C+4AUBiusmDQo6865ljdATbsG5k= formik@^2.1.5: version "2.2.9" - resolved "https://registry.yarnpkg.com/formik/-/formik-2.2.9.tgz#8594ba9c5e2e5cf1f42c5704128e119fc46232d0" + resolved "https://registry.npmjs.org/formik/-/formik-2.2.9.tgz" integrity sha512-LQLcISMmf1r5at4/gyJigGn0gOwFbeEAlji+N9InZF6LIMXnFNkO42sCI8Jt84YZggpD4cPWObAZaxpEFtSzNA== dependencies: deepmerge "^2.1.1" @@ -3438,17 +3460,17 @@ formik@^2.1.5: forwarded@0.2.0: version "0.2.0" - resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" + resolved "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz" integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== fresh@0.5.2: version "0.5.2" - resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + resolved "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz" integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= fs-extra@^8.1.0: version "8.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz" integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== dependencies: graceful-fs "^4.2.0" @@ -3457,27 +3479,27 @@ fs-extra@^8.1.0: fs.realpath@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= fsevents@~2.3.1: version "2.3.2" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz" 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" + resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== 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" + resolved "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz" integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= gauge@~2.7.3: version "2.7.4" - resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" + resolved "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz" integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= dependencies: aproba "^1.0.3" @@ -3491,12 +3513,12 @@ gauge@~2.7.3: 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" + resolved "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz" integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== 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" + resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz" integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== dependencies: function-bind "^1.1.1" @@ -3505,24 +3527,24 @@ get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: get-orientation@1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/get-orientation/-/get-orientation-1.1.2.tgz#20507928951814f8a91ded0a0e67b29dfab98947" + resolved "https://registry.npmjs.org/get-orientation/-/get-orientation-1.1.2.tgz" integrity sha512-/pViTfifW+gBbh/RnlFYHINvELT9Znt+SYyDKAUL6uV6By019AK/s+i9XP4jSwq7lwP38Fd8HVeTxym3+hkwmQ== dependencies: stream-parser "^0.3.1" 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" + resolved "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz" integrity sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g== get-stream@^6.0.0: version "6.0.1" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + resolved "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz" integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== get-symbol-description@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" + resolved "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz" integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== dependencies: call-bind "^1.0.2" @@ -3530,26 +3552,26 @@ get-symbol-description@^1.0.0: get-user-locale@^1.2.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/get-user-locale/-/get-user-locale-1.4.0.tgz#a2c4b5da46feec9f03c9b07d197b1620490a5370" + resolved "https://registry.npmjs.org/get-user-locale/-/get-user-locale-1.4.0.tgz" integrity sha512-gQo03lP1OArHLKlnoglqrGGl7b04u2EP9Xutmp72cMdtrrSD7ZgIsCsUKZynYWLDkVJW33Cj3pliP7uP0UonHQ== dependencies: lodash.once "^4.1.1" glob-parent@^5.1.2, glob-parent@~5.1.0: version "5.1.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== dependencies: is-glob "^4.0.1" glob-to-regexp@^0.4.1: version "0.4.1" - resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" + resolved "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz" integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== glob@^7.0.3, glob@^7.1.3, glob@^7.1.6: version "7.1.7" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" + resolved "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz" integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== dependencies: fs.realpath "^1.0.0" @@ -3561,19 +3583,19 @@ glob@^7.0.3, glob@^7.1.3, glob@^7.1.6: globals@^11.1.0: version "11.12.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + resolved "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== globals@^13.6.0, globals@^13.9.0: version "13.11.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.11.0.tgz#40ef678da117fe7bd2e28f1fab24951bd0255be7" + resolved "https://registry.npmjs.org/globals/-/globals-13.11.0.tgz" integrity sha512-08/xrJ7wQjK9kkkRoI3OFUBbLx4f+6x3SGwcPvQ0QH6goFDrOU2oyAWrmh3dJezu65buo+HBMzAMQy6rovVC3g== dependencies: type-fest "^0.20.2" globby@^11.0.3: version "11.0.4" - resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.4.tgz#2cbaff77c2f2a62e71e9b2813a67b97a3a3001a5" + resolved "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz" integrity sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg== dependencies: array-union "^2.1.0" @@ -3585,7 +3607,7 @@ globby@^11.0.3: globby@^6.1.0: version "6.1.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" + resolved "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz" integrity sha1-9abXDoOV4hyFj7BInWTfAkJNUGw= dependencies: array-union "^1.0.1" @@ -3596,12 +3618,12 @@ globby@^6.1.0: graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0: version "4.2.8" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.8.tgz#e412b8d33f5e006593cbd3cee6df9f2cebbe802a" + resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz" integrity sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg== gzip-size@^5.0.0: version "5.1.1" - resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-5.1.1.tgz#cb9bee692f87c0612b232840a873904e4c135274" + resolved "https://registry.npmjs.org/gzip-size/-/gzip-size-5.1.1.tgz" integrity sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA== dependencies: duplexer "^0.1.1" @@ -3609,46 +3631,46 @@ gzip-size@^5.0.0: has-bigints@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.1.tgz#64fe6acb020673e3b78db035a5af69aa9d07b113" + resolved "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz" integrity sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA== has-flag@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= has-flag@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== 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" + resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz" integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw== has-tostringtag@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" + resolved "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz" integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== dependencies: has-symbols "^1.0.2" has-unicode@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + resolved "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz" integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= has@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + resolved "https://registry.npmjs.org/has/-/has-1.0.3.tgz" integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== dependencies: function-bind "^1.1.1" hash-base@^3.0.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33" + resolved "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz" integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA== dependencies: inherits "^2.0.4" @@ -3657,7 +3679,7 @@ hash-base@^3.0.0: hash.js@^1.0.0, hash.js@^1.0.3: version "1.1.7" - resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" + resolved "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz" integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== dependencies: inherits "^2.0.3" @@ -3665,12 +3687,12 @@ hash.js@^1.0.0, hash.js@^1.0.3: he@1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" + resolved "https://registry.npmjs.org/he/-/he-1.2.0.tgz" integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== heic-convert@^1.2.4: version "1.2.4" - resolved "https://registry.yarnpkg.com/heic-convert/-/heic-convert-1.2.4.tgz#605820f98ace3949a40fc7b263ee0bc573a0176b" + resolved "https://registry.npmjs.org/heic-convert/-/heic-convert-1.2.4.tgz" integrity sha512-klJHyv+BqbgKiCQvCqI9IKIvweCcohDuDl0Jphearj8+16+v8eff2piVevHqq4dW9TK0r1onTR6PKHP1I4hdbA== dependencies: heic-decode "^1.1.2" @@ -3679,14 +3701,14 @@ heic-convert@^1.2.4: heic-decode@^1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/heic-decode/-/heic-decode-1.1.2.tgz#974701666432e31ed64b2263a1ece7cff5218209" + resolved "https://registry.npmjs.org/heic-decode/-/heic-decode-1.1.2.tgz" integrity sha512-UF8teegxvzQPdSTcx5frIUhitNDliz/9Pui0JFdIqVRE00spVE33DcCYtZqaLNyd4y5RP/QQWZFIc1YWVKKm2A== dependencies: libheif-js "^1.10.0" hmac-drbg@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" + resolved "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz" integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= dependencies: hash.js "^1.0.3" @@ -3695,24 +3717,24 @@ hmac-drbg@^1.0.1: hoist-non-react-statics@^3.0.0, hoist-non-react-statics@^3.3.0, hoist-non-react-statics@^3.3.1, hoist-non-react-statics@^3.3.2: version "3.3.2" - resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" + resolved "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz" integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== dependencies: react-is "^16.7.0" hoopy@^0.1.4: version "0.1.4" - resolved "https://registry.yarnpkg.com/hoopy/-/hoopy-0.1.4.tgz#609207d661100033a9a9402ad3dea677381c1b1d" + resolved "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz" integrity sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ== 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" + resolved "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz" integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== http-errors@1.7.2: version "1.7.2" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f" + resolved "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz" integrity sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg== dependencies: depd "~1.1.2" @@ -3723,7 +3745,7 @@ http-errors@1.7.2: http-errors@1.7.3, http-errors@~1.7.2: version "1.7.3" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" + resolved "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz" integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== dependencies: depd "~1.1.2" @@ -3734,7 +3756,7 @@ http-errors@1.7.3, http-errors@~1.7.2: http-proxy-middleware@^1.0.5: version "1.3.1" - resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-1.3.1.tgz#43700d6d9eecb7419bf086a128d0f7205d9eb665" + resolved "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-1.3.1.tgz" integrity sha512-13eVVDYS4z79w7f1+NPllJtOQFx/FdUW4btIvVRMaRlUY9VGstAbo5MOhLEuUgZFRHn3x50ufn25zkj/boZnEg== dependencies: "@types/http-proxy" "^1.17.5" @@ -3745,7 +3767,7 @@ http-proxy-middleware@^1.0.5: http-proxy@^1.18.1: version "1.18.1" - resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549" + resolved "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz" integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ== dependencies: eventemitter3 "^4.0.0" @@ -3754,12 +3776,12 @@ http-proxy@^1.18.1: https-browserify@1.0.0, https-browserify@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" + resolved "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz" integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= https-proxy-agent@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2" + resolved "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz" integrity sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA== dependencies: agent-base "6" @@ -3767,63 +3789,63 @@ https-proxy-agent@^5.0.0: human-signals@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" + resolved "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz" integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== husky@^7.0.1: version "7.0.2" - resolved "https://registry.yarnpkg.com/husky/-/husky-7.0.2.tgz#21900da0f30199acca43a46c043c4ad84ae88dff" + resolved "https://registry.npmjs.org/husky/-/husky-7.0.2.tgz" integrity sha512-8yKEWNX4z2YsofXAMT7KvA1g8p+GxtB1ffV8XtpAEGuXNAbCV5wdNKH+qTpw8SM9fh4aMPDR+yQuKfgnreyZlg== iconv-lite@0.4.24: version "0.4.24" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== dependencies: safer-buffer ">= 2.1.2 < 3" iconv-lite@^0.6.2: version "0.6.3" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" + resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz" integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== dependencies: safer-buffer ">= 2.1.2 < 3.0.0" idb@^6.0.0: version "6.1.3" - resolved "https://registry.yarnpkg.com/idb/-/idb-6.1.3.tgz#e6cd3b9c38f5c696a82a4b435754f3873c5a7891" + resolved "https://registry.npmjs.org/idb/-/idb-6.1.3.tgz" integrity sha512-oIRDpVcs5KXpI1hRnTJUwkY63RB/7iqu9nSNuzXN8TLHjs7oO20IoPFbBTsqxIL5IjzIUDi+FXlVcK4zm26J8A== ieee754@^1.1.4, ieee754@^1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== ignore@^4.0.6: version "4.0.6" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" + resolved "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz" integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== ignore@^5.1.4: version "5.1.8" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57" + resolved "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz" integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw== image-size@1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/image-size/-/image-size-1.0.0.tgz#58b31fe4743b1cec0a0ac26f5c914d3c5b2f0750" + resolved "https://registry.npmjs.org/image-size/-/image-size-1.0.0.tgz" integrity sha512-JLJ6OwBfO1KcA+TvJT+v8gbE6iWbj24LyDNFgFEN0lzegn6cC6a/p3NIDaepMsJjQjlUWqIC7wJv8lBFxPNjcw== dependencies: queue "6.0.2" immediate@~3.0.5: version "3.0.6" - resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b" + resolved "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz" integrity sha1-nbHb0Pr43m++D13V5Wu2BigN5ps= import-fresh@^3.0.0, import-fresh@^3.2.1: version "3.3.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz" integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== dependencies: parent-module "^1.0.0" @@ -3831,17 +3853,17 @@ import-fresh@^3.0.0, import-fresh@^3.2.1: imurmurhash@^0.1.4: version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= indent-string@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + resolved "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz" integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== inflight@^1.0.4: version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= dependencies: once "^1.3.0" @@ -3849,22 +3871,22 @@ inflight@^1.0.4: inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3, inherits@~2.0.4: version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== inherits@2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE= inherits@2.0.3: version "2.0.3" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz" integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= internal-slot@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c" + resolved "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz" integrity sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA== dependencies: get-intrinsic "^1.1.0" @@ -3873,19 +3895,19 @@ internal-slot@^1.0.3: invariant@^2.2.4: version "2.2.4" - resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + resolved "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz" integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== dependencies: loose-envify "^1.0.0" ipaddr.js@1.9.1: version "1.9.1" - resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" + resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz" integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== is-arguments@^1.0.4: version "1.1.1" - resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" + resolved "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz" integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== dependencies: call-bind "^1.0.2" @@ -3893,26 +3915,26 @@ is-arguments@^1.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" + resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz" integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= is-bigint@^1.0.1: version "1.0.4" - resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" + resolved "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz" integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== dependencies: has-bigints "^1.0.1" is-binary-path@~2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz" integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== dependencies: binary-extensions "^2.0.0" is-boolean-object@^1.1.0: version "1.1.2" - resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" + resolved "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz" integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== dependencies: call-bind "^1.0.2" @@ -3920,72 +3942,72 @@ is-boolean-object@^1.1.0: is-callable@^1.1.4, is-callable@^1.2.4: version "1.2.4" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945" + resolved "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz" integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w== is-core-module@^2.2.0, is-core-module@^2.6.0: version "2.6.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.6.0.tgz#d7553b2526fe59b92ba3e40c8df757ec8a709e19" + resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.6.0.tgz" integrity sha512-wShG8vs60jKfPWpF2KZRaAtvt3a20OAn7+IJ6hLPECpSABLcKtFKTTI4ZtH5QcBruBHlq+WsdHWyz0BCZW7svQ== dependencies: has "^1.0.3" is-date-object@^1.0.1: version "1.0.5" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" + resolved "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz" integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== dependencies: has-tostringtag "^1.0.0" is-electron@^2.2.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/is-electron/-/is-electron-2.2.0.tgz#8943084f09e8b731b3a7a0298a7b5d56f6b7eef0" + resolved "https://registry.npmjs.org/is-electron/-/is-electron-2.2.0.tgz" integrity sha512-SpMppC2XR3YdxSzczXReBjqs2zGscWQpBIKqwXYBFic0ERaxNVgwLCHwOLZeESfdJQjX0RDvrJ1lBXX2ij+G1Q== is-extglob@^2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= is-fullwidth-code-point@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz" integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= dependencies: number-is-nan "^1.0.0" is-fullwidth-code-point@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz" integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= is-fullwidth-code-point@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== is-generator-function@^1.0.7: version "1.0.10" - resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" + resolved "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz" integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== dependencies: has-tostringtag "^1.0.0" is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" + resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz" integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== dependencies: is-extglob "^2.1.1" is-module@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591" + resolved "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz" integrity sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE= is-nan@^1.2.1: version "1.3.2" - resolved "https://registry.yarnpkg.com/is-nan/-/is-nan-1.3.2.tgz#043a54adea31748b55b6cd4e09aadafa69bd9e1d" + resolved "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz" integrity sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w== dependencies: call-bind "^1.0.0" @@ -3993,53 +4015,53 @@ is-nan@^1.2.1: 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" + resolved "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz" integrity sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w== is-number-object@^1.0.4: version "1.0.6" - resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.6.tgz#6a7aaf838c7f0686a50b4553f7e54a96494e89f0" + resolved "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.6.tgz" integrity sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g== dependencies: has-tostringtag "^1.0.0" is-number@^7.0.0: version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== is-obj@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" + resolved "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz" integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8= is-path-cwd@^2.0.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.2.0.tgz#67d43b82664a7b5191fd9119127eb300048a9fdb" + resolved "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz" integrity sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ== is-path-in-cwd@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz#bfe2dca26c69f397265a4009963602935a053acb" + resolved "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz" integrity sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ== dependencies: is-path-inside "^2.1.0" is-path-inside@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-2.1.0.tgz#7c9810587d659a40d27bcdb4d5616eab059494b2" + resolved "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz" integrity sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg== dependencies: path-is-inside "^1.0.2" is-plain-obj@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-3.0.0.tgz#af6f2ea14ac5a646183a5bbdb5baabbc156ad9d7" + resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz" integrity sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA== is-regex@^1.1.4: version "1.1.4" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" + resolved "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz" integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== dependencies: call-bind "^1.0.2" @@ -4047,31 +4069,36 @@ 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" + resolved "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz" integrity sha1-/S2INUXEa6xaYz57mgnof6LLUGk= +is-shared-array-buffer@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz" + integrity sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA== + is-stream@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + resolved "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz" integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== 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" + resolved "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz" 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" + resolved "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz" integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== dependencies: has-symbols "^1.0.2" is-typed-array@^1.1.3, is-typed-array@^1.1.7: version "1.1.8" - resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.8.tgz#cbaa6585dc7db43318bc5b89523ea384a6f65e79" + resolved "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.8.tgz" integrity sha512-HqH41TNZq2fgtGT8WHVFVJhBVGuY3AnP3Q36K8JKXUxSxRgk/d+7NjmwG2vo2mYmXK8UYZKu0qH8bVP5gEisjA== dependencies: available-typed-arrays "^1.0.5" @@ -4082,27 +4109,34 @@ is-typed-array@^1.1.3, is-typed-array@^1.1.7: 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" + resolved "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz" integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== is-url@^1.2.4: version "1.2.4" - resolved "https://registry.yarnpkg.com/is-url/-/is-url-1.2.4.tgz#04a4df46d28c4cff3d73d01ff06abeb318a1aa52" + resolved "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz" integrity sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww== +is-weakref@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.1.tgz" + integrity sha512-b2jKc2pQZjaeFYWEf7ScFj+Be1I+PXmlu572Q8coTXZ+LD/QQZ7ShPMst8h16riVgyXTQwUsFEl74mDvc/3MHQ== + dependencies: + call-bind "^1.0.0" + isarray@^1.0.0, isarray@~1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + resolved "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= isexe@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= jest-worker@27.0.0-next.5: version "27.0.0-next.5" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.0.0-next.5.tgz#5985ee29b12a4e191f4aae4bb73b97971d86ec28" + resolved "https://registry.npmjs.org/jest-worker/-/jest-worker-27.0.0-next.5.tgz" integrity sha512-mk0umAQ5lT+CaOJ+Qp01N6kz48sJG2kr2n1rX0koqKf6FIygQV0qLOdN9SCYID4IVeSigDOcPeGLozdMLYfb5g== dependencies: "@types/node" "*" @@ -4111,7 +4145,7 @@ jest-worker@27.0.0-next.5: jest-worker@^24.9.0: version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-24.9.0.tgz#5dbfdb5b2d322e98567898238a9697bcce67b3e5" + resolved "https://registry.npmjs.org/jest-worker/-/jest-worker-24.9.0.tgz" integrity sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw== dependencies: merge-stream "^2.0.0" @@ -4119,17 +4153,17 @@ jest-worker@^24.9.0: jpeg-js@^0.4.1: version "0.4.3" - resolved "https://registry.yarnpkg.com/jpeg-js/-/jpeg-js-0.4.3.tgz#6158e09f1983ad773813704be80680550eff977b" + resolved "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.4.3.tgz" integrity sha512-ru1HWKek8octvUHFHvE5ZzQ1yAsJmIvRdGWvSoKV52XKyuyYA437QWDttXT8eZXDSbuMpHlLzPDZUPd6idIz+Q== "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" + resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== js-yaml@^3.13.1: version "3.14.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz" integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== dependencies: argparse "^1.0.7" @@ -4137,63 +4171,63 @@ js-yaml@^3.13.1: jsesc@^2.5.1: version "2.5.2" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + resolved "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz" integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== jsesc@~0.5.0: version "0.5.0" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + resolved "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz" integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= json-parse-better-errors@^1.0.1: version "1.0.2" - resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" + resolved "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz" integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== json-parse-even-better-errors@^2.3.0: version "2.3.1" - resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + resolved "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz" integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== json-schema-traverse@^0.4.1: version "0.4.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== json-schema-traverse@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" + resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz" integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== 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" + resolved "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz" integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= json5@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" + resolved "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz" integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== dependencies: minimist "^1.2.0" json5@^2.1.2: version "2.2.0" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.0.tgz#2dfefe720c6ba525d9ebd909950f0515316c89a3" + resolved "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz" integrity sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA== dependencies: minimist "^1.2.5" jsonfile@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" + resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz" integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= optionalDependencies: graceful-fs "^4.1.6" "jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.1.0: version "3.2.0" - resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.2.0.tgz#41108d2cec408c3453c1bbe8a4aae9e1e2bd8f82" + resolved "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.2.0.tgz" integrity sha512-EIsmt3O3ljsU6sot/J4E1zDRxfBNrhjyf/OKjlydwgEimQuznlM4Wv7U+ueONJMyEn1WRE0K8dhi3dVAXYT24Q== dependencies: array-includes "^3.1.2" @@ -4201,7 +4235,7 @@ jsonfile@^4.0.0: jszip@3.7.1: version "3.7.1" - resolved "https://registry.yarnpkg.com/jszip/-/jszip-3.7.1.tgz#bd63401221c15625a1228c556ca8a68da6fda3d9" + resolved "https://registry.npmjs.org/jszip/-/jszip-3.7.1.tgz" integrity sha512-ghL0tz1XG9ZEmRMcEN2vt7xabrDdqHHeykgARpmZ0BiIctWxM47Vt63ZO2dnp4QYt/xJVLLy5Zv1l/xRdh2byg== dependencies: lie "~3.3.0" @@ -4211,19 +4245,19 @@ jszip@3.7.1: language-subtag-registry@~0.3.2: version "0.3.21" - resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.21.tgz#04ac218bea46f04cb039084602c6da9e788dd45a" + resolved "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.21.tgz" integrity sha512-L0IqwlIXjilBVVYKFT37X9Ih11Um5NEl9cbJIuU/SwP/zEEAbBPOnEeeuxVMf45ydWQRDQN3Nqc96OgbH1K+Pg== language-tags@^1.0.5: version "1.0.5" - resolved "https://registry.yarnpkg.com/language-tags/-/language-tags-1.0.5.tgz#d321dbc4da30ba8bf3024e040fa5c14661f9193a" + resolved "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz" integrity sha1-0yHbxNowuovzAk4ED6XBRmH5GTo= dependencies: language-subtag-registry "~0.3.2" levn@^0.4.1: version "0.4.1" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + resolved "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz" integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== dependencies: prelude-ls "^1.2.1" @@ -4231,43 +4265,43 @@ levn@^0.4.1: libheif-js@^1.10.0: version "1.12.0" - resolved "https://registry.yarnpkg.com/libheif-js/-/libheif-js-1.12.0.tgz#9ad1ed16a8e6412b4d3d83565d285465a00e7305" + resolved "https://registry.npmjs.org/libheif-js/-/libheif-js-1.12.0.tgz" integrity sha512-hDs6xQ7028VOwAFwEtM0Q+B2x2NW69Jb2MhQFUbk3rUrHzz4qo5mqS8VrqNgYnSc8TiUGnR691LnO4uIfEE23w== libsodium-wrappers@^0.7.8: version "0.7.9" - resolved "https://registry.yarnpkg.com/libsodium-wrappers/-/libsodium-wrappers-0.7.9.tgz#4ffc2b69b8f7c7c7c5594a93a4803f80f6d0f346" + resolved "https://registry.npmjs.org/libsodium-wrappers/-/libsodium-wrappers-0.7.9.tgz" integrity sha512-9HaAeBGk1nKTRFRHkt7nzxqCvnkWTjn1pdjKgcUnZxj0FyOP4CnhgFhMdrFfgNsukijBGyBLpP2m2uKT1vuWhQ== dependencies: libsodium "^0.7.0" libsodium@^0.7.0: version "0.7.9" - resolved "https://registry.yarnpkg.com/libsodium/-/libsodium-0.7.9.tgz#4bb7bcbf662ddd920d8795c227ae25bbbfa3821b" + resolved "https://registry.npmjs.org/libsodium/-/libsodium-0.7.9.tgz" integrity sha512-gfeADtR4D/CM0oRUviKBViMGXZDgnFdMKMzHsvBdqLBHd9ySi6EtYnmuhHVDDYgYpAO8eU8hEY+F8vIUAPh08A== lie@3.1.1: version "3.1.1" - resolved "https://registry.yarnpkg.com/lie/-/lie-3.1.1.tgz#9a436b2cc7746ca59de7a41fa469b3efb76bd87e" + resolved "https://registry.npmjs.org/lie/-/lie-3.1.1.tgz" integrity sha1-mkNrLMd0bKWd56QfpGmz77dr2H4= dependencies: immediate "~3.0.5" lie@~3.3.0: version "3.3.0" - resolved "https://registry.yarnpkg.com/lie/-/lie-3.3.0.tgz#dcf82dee545f46074daf200c7c1c5a08e0f40f6a" + resolved "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz" integrity sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ== dependencies: immediate "~3.0.5" 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" + resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz" integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA= lint-staged@^11.1.2: version "11.1.2" - resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-11.1.2.tgz#4dd78782ae43ee6ebf2969cad9af67a46b33cd90" + resolved "https://registry.npmjs.org/lint-staged/-/lint-staged-11.1.2.tgz" integrity sha512-6lYpNoA9wGqkL6Hew/4n1H6lRqF3qCsujVT0Oq5Z4hiSAM7S6NksPJ3gnr7A7R52xCtiZMcEUNNQ6d6X5Bvh9w== dependencies: chalk "^4.1.1" @@ -4287,7 +4321,7 @@ lint-staged@^11.1.2: listr2@^3.8.2: version "3.11.1" - resolved "https://registry.yarnpkg.com/listr2/-/listr2-3.11.1.tgz#a9bab5cd5874fd3cb7827118dbea6fedefbcb43f" + resolved "https://registry.npmjs.org/listr2/-/listr2-3.11.1.tgz" integrity sha512-ZXQvQfmH9iWLlb4n3hh31yicXDxlzB0pE7MM1zu6kgbVL4ivEsO4H8IPh4E682sC8RjnYO9anose+zT52rrpyg== dependencies: cli-truncate "^2.1.0" @@ -4300,7 +4334,7 @@ listr2@^3.8.2: load-json-file@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" + resolved "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz" integrity sha1-L19Fq5HjMhYjT9U62rZo607AmTs= dependencies: graceful-fs "^4.1.2" @@ -4310,7 +4344,7 @@ load-json-file@^4.0.0: loader-utils@1.2.3: version "1.2.3" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.2.3.tgz#1ff5dc6911c9f0a062531a4c04b609406108c2c7" + resolved "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz" integrity sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA== dependencies: big.js "^5.2.2" @@ -4319,14 +4353,14 @@ loader-utils@1.2.3: localforage@^1.8.1, localforage@^1.9.0: version "1.10.0" - resolved "https://registry.yarnpkg.com/localforage/-/localforage-1.10.0.tgz#5c465dc5f62b2807c3a84c0c6a1b1b3212781dd4" + resolved "https://registry.npmjs.org/localforage/-/localforage-1.10.0.tgz" integrity sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg== dependencies: lie "3.1.1" locate-path@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz" integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= dependencies: p-locate "^2.0.0" @@ -4334,49 +4368,49 @@ locate-path@^2.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" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz" integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== dependencies: p-locate "^4.1.0" lodash-es@^4.17.11, lodash-es@^4.17.21: version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.21.tgz#43e626c46e6591b7750beb2b50117390c609e3ee" + resolved "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz" integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw== lodash._reinterpolate@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" + resolved "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz" integrity sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0= lodash.clonedeep@^4.5.0: version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" + resolved "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz" integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8= lodash.debounce@^4.0.8: version "4.0.8" - resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" + resolved "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz" integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= lodash.merge@^4.6.2: version "4.6.2" - resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== lodash.once@^4.1.1: version "4.1.1" - resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac" + resolved "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz" integrity sha1-DdOXEhPHxW34gJd9UEyI+0cal6w= lodash.sortby@^4.7.0: version "4.7.0" - resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" + resolved "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz" integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg= lodash.template@^4.5.0: version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.5.0.tgz#f976195cf3f347d0d5f52483569fe8031ccce8ab" + resolved "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz" integrity sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A== dependencies: lodash._reinterpolate "^3.0.0" @@ -4384,24 +4418,24 @@ lodash.template@^4.5.0: lodash.templatesettings@^4.0.0: version "4.2.0" - resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz#e481310f049d3cf6d47e912ad09313b154f0fb33" + resolved "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz" integrity sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ== dependencies: lodash._reinterpolate "^3.0.0" lodash.truncate@^4.4.2: version "4.4.2" - resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" + resolved "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz" integrity sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM= lodash@^4.17.11, lodash@^4.17.15, lodash@^4.17.21: version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" 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" + resolved "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz" integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== dependencies: chalk "^4.1.0" @@ -4409,7 +4443,7 @@ log-symbols@^4.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" + resolved "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz" integrity sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg== dependencies: ansi-escapes "^4.3.0" @@ -4419,45 +4453,45 @@ log-update@^4.0.0: loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + resolved "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz" integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== dependencies: js-tokens "^3.0.0 || ^4.0.0" lru-cache@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz" integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== dependencies: yallist "^4.0.0" lru_map@^0.3.3: version "0.3.3" - resolved "https://registry.yarnpkg.com/lru_map/-/lru_map-0.3.3.tgz#b5c8351b9464cbd750335a79650a0ec0e56118dd" + resolved "https://registry.npmjs.org/lru_map/-/lru_map-0.3.3.tgz" integrity sha1-tcg1G5Rky9dQM1p5ZQoOwOVhGN0= magic-string@^0.25.0, magic-string@^0.25.7: version "0.25.7" - resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.7.tgz#3f497d6fd34c669c6798dcb821f2ef31f5445051" + resolved "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz" integrity sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA== dependencies: sourcemap-codec "^1.4.4" make-dir@^3.0.2: version "3.1.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" + resolved "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz" integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== dependencies: semver "^6.0.0" make-event-props@^1.1.0: version "1.3.0" - resolved "https://registry.yarnpkg.com/make-event-props/-/make-event-props-1.3.0.tgz#2434cb390d58bcf40898d009ef5b1f936de9671b" + resolved "https://registry.npmjs.org/make-event-props/-/make-event-props-1.3.0.tgz" integrity sha512-oWiDZMcVB1/A487251hEWza1xzgCzl6MXxe9aF24l5Bt9N9UEbqTqKumEfuuLhmlhRZYnc+suVvW4vUs8bwO7Q== md5.js@^1.3.4: version "1.3.5" - resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" + resolved "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz" integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== dependencies: hash-base "^3.0.0" @@ -4466,47 +4500,47 @@ md5.js@^1.3.4: media-typer@0.3.0: version "0.3.0" - resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + resolved "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz" integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= "memoize-one@>=3.1.1 <6", memoize-one@^5.0.0: version "5.2.1" - resolved "https://registry.yarnpkg.com/memoize-one/-/memoize-one-5.2.1.tgz#8337aa3c4335581839ec01c3d594090cebe8f00e" + resolved "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz" integrity sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q== merge-class-names@^1.1.1: version "1.4.2" - resolved "https://registry.yarnpkg.com/merge-class-names/-/merge-class-names-1.4.2.tgz#78d6d95ab259e7e647252a7988fd25a27d5a8835" + resolved "https://registry.npmjs.org/merge-class-names/-/merge-class-names-1.4.2.tgz" integrity sha512-bOl98VzwCGi25Gcn3xKxnR5p/WrhWFQB59MS/aGENcmUc6iSm96yrFDF0XSNurX9qN4LbJm0R9kfvsQ17i8zCw== merge-descriptors@1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + resolved "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz" integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= merge-refs@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/merge-refs/-/merge-refs-1.0.0.tgz#388348bce22e623782c6df9d3c4fc55888276120" + resolved "https://registry.npmjs.org/merge-refs/-/merge-refs-1.0.0.tgz" integrity sha512-WZ4S5wqD9FCR9hxkLgvcHJCBxzXzy3VVE6p8W2OzxRzB+hLRlcadGE2bW9xp2KSzk10rvp4y+pwwKO6JQVguMg== merge-stream@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + resolved "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz" integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== merge2@^1.3.0: version "1.4.1" - resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== methods@~1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + resolved "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz" integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= micromatch@^4.0.2, micromatch@^4.0.4: version "4.0.4" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9" + resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz" integrity sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg== dependencies: braces "^3.0.1" @@ -4514,7 +4548,7 @@ micromatch@^4.0.2, micromatch@^4.0.4: miller-rabin@^4.0.0: version "4.0.1" - resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" + resolved "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz" integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA== dependencies: bn.js "^4.0.0" @@ -4522,100 +4556,100 @@ miller-rabin@^4.0.0: mime-db@1.49.0: version "1.49.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.49.0.tgz#f3dfde60c99e9cf3bc9701d687778f537001cbed" + resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.49.0.tgz" integrity sha512-CIc8j9URtOVApSFCQIF+VBkX1RwXp/oMMOrqdyXSBXq5RWNEsRfyj1kiRnQgmNXmHxPoFIxOroKA3zcU9P+nAA== mime-types@~2.1.24: version "2.1.32" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.32.tgz#1d00e89e7de7fe02008db61001d9e02852670fd5" + resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.32.tgz" integrity sha512-hJGaVS4G4c9TSMYh2n6SQAGrC4RnfU+daP8G7cSCmaqNjiOoUY0VHCMS42pxnQmVF1GWwFhbHWn3RIxCqTmZ9A== dependencies: mime-db "1.49.0" mime@1.6.0: version "1.6.0" - resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + resolved "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz" integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== mimic-fn@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + resolved "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz" integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== minimalistic-crypto-utils@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" + resolved "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz" integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= minimatch@^3.0.4: version "3.0.4" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz" integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== dependencies: brace-expansion "^1.1.7" minimist@^1.2.0, minimist@^1.2.5: version "1.2.5" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" + resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz" integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== mkdirp@^0.5.1, mkdirp@^0.5.5: version "0.5.5" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" + resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz" integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== dependencies: minimist "^1.2.5" +moment@^2.29.1: + version "2.29.1" + resolved "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz" + integrity sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ== + ms@2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= ms@2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz" integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== -ms@2.1.2: +ms@2.1.2, ms@^2.1.1: version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== -ms@^2.1.1: - version "2.1.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - nanoid@^3.1.23: version "3.1.25" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.25.tgz#09ca32747c0e543f0e1814b7d3793477f9c8e152" + resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.1.25.tgz" integrity sha512-rdwtIXaXCLFAQbnfqDRnI6jaRHp9fTcYBjtFKE8eezcZ7LuLjhUaQGNeMXf1HmRoCH32CLz6XwX0TtxEOS/A3Q== native-url@0.3.4: version "0.3.4" - resolved "https://registry.yarnpkg.com/native-url/-/native-url-0.3.4.tgz#29c943172aed86c63cee62c8c04db7f5756661f8" + resolved "https://registry.npmjs.org/native-url/-/native-url-0.3.4.tgz" integrity sha512-6iM8R99ze45ivyH8vybJ7X0yekIcPf5GgLV5K0ENCbmRcaRIDoj37BC8iLEmaaBfqqb8enuZ5p0uhY+lVAbAcA== dependencies: querystring "^0.2.0" natural-compare@^1.4.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= negotiator@0.6.2: version "0.6.2" - resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" + resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz" integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== next@^11.1.2: version "11.1.2" - resolved "https://registry.yarnpkg.com/next/-/next-11.1.2.tgz#527475787a9a362f1bc916962b0c0655cc05bc91" + resolved "https://registry.npmjs.org/next/-/next-11.1.2.tgz" integrity sha512-azEYL0L+wFjv8lstLru3bgvrzPvK0P7/bz6B/4EJ9sYkXeW8r5Bjh78D/Ol7VOg0EIPz0CXoe72hzAlSAXo9hw== dependencies: "@babel/runtime" "7.15.3" @@ -4676,29 +4710,29 @@ next@^11.1.2: node-fetch@2.6.1: version "2.6.1" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" + resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz" integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== node-fetch@^2.6.0, node-fetch@^2.6.1: version "2.6.2" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.2.tgz#986996818b73785e47b1965cc34eb093a1d464d0" + resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.2.tgz" integrity sha512-aLoxToI6RfZ+0NOjmWAgn9+LEd30YCkJKFSyWacNZdEKTit/ZMcKjGkTRo8uWEsnIb/hfKecNPEbln02PdWbcA== node-forge@^0.10.0: version "0.10.0" - resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.10.0.tgz#32dea2afb3e9926f02ee5ce8794902691a676bf3" + resolved "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz" integrity sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA== node-html-parser@1.4.9: version "1.4.9" - resolved "https://registry.yarnpkg.com/node-html-parser/-/node-html-parser-1.4.9.tgz#3c8f6cac46479fae5800725edb532e9ae8fd816c" + resolved "https://registry.npmjs.org/node-html-parser/-/node-html-parser-1.4.9.tgz" integrity sha512-UVcirFD1Bn0O+TSmloHeHqZZCxHjvtIeGdVdGMhyZ8/PWlEiZaZ5iJzR189yKZr8p0FXN58BUeC7RHRkf/KYGw== dependencies: he "1.2.0" node-libs-browser@^2.2.1: version "2.2.1" - resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.1.tgz#b64f513d18338625f90346d27b0d235e631f6425" + resolved "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz" integrity sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q== dependencies: assert "^1.1.1" @@ -4727,12 +4761,12 @@ node-libs-browser@^2.2.1: node-releases@^1.1.71, node-releases@^1.1.75: version "1.1.75" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.75.tgz#6dd8c876b9897a1b8e5a02de26afa79bb54ebbfe" + resolved "https://registry.npmjs.org/node-releases/-/node-releases-1.1.75.tgz" integrity sha512-Qe5OUajvqrqDSy6wrWFmMwfJ0jVgwiw4T3KqmbTcZ62qW0gQkheXYhcFM1+lOVcGUoRxcEcfyvFMAnDgaF1VWw== normalize-package-data@^2.3.2: version "2.5.0" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" + resolved "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz" integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== dependencies: hosted-git-info "^2.1.4" @@ -4742,19 +4776,19 @@ normalize-package-data@^2.3.2: normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== npm-run-path@^4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz" integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== dependencies: path-key "^3.0.0" npmlog@^4.1.2: version "4.1.2" - resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" + resolved "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz" integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== dependencies: are-we-there-yet "~1.1.2" @@ -4764,22 +4798,22 @@ npmlog@^4.1.2: number-is-nan@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + resolved "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz" integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= object-inspect@^1.11.0, object-inspect@^1.9.0: version "1.11.0" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.11.0.tgz#9dceb146cedd4148a0d9e51ab88d34cf509922b1" + resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz" integrity sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg== object-is@^1.0.1: version "1.1.5" - resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac" + resolved "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz" integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw== dependencies: call-bind "^1.0.2" @@ -4787,12 +4821,12 @@ object-is@^1.0.1: 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" + resolved "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== object.assign@^4.1.0, object.assign@^4.1.2: version "4.1.2" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" + resolved "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz" integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== dependencies: call-bind "^1.0.0" @@ -4802,7 +4836,7 @@ object.assign@^4.1.0, object.assign@^4.1.2: object.entries@^1.1.2, object.entries@^1.1.4: version "1.1.4" - resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.4.tgz#43ccf9a50bc5fd5b649d45ab1a579f24e088cafd" + resolved "https://registry.npmjs.org/object.entries/-/object.entries-1.1.4.tgz" integrity sha512-h4LWKWE+wKQGhtMjZEBud7uLGhqyLwj8fpHOarZhD2uY3C9cRtk57VQ89ke3moByLXMedqs3XCHzyb4AmA2DjA== dependencies: call-bind "^1.0.2" @@ -4811,7 +4845,7 @@ object.entries@^1.1.2, object.entries@^1.1.4: object.fromentries@^2.0.4: version "2.0.4" - resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.4.tgz#26e1ba5c4571c5c6f0890cef4473066456a120b8" + resolved "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.4.tgz" integrity sha512-EsFBshs5RUUpQEY1D4q/m59kMfz4YJvxuNCJcv/jWwOJr34EaVnG11ZrZa0UHB3wnzV1wx8m58T4hQL8IuNXlQ== dependencies: call-bind "^1.0.2" @@ -4821,7 +4855,7 @@ object.fromentries@^2.0.4: object.values@^1.1.4: version "1.1.4" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.4.tgz#0d273762833e816b693a637d30073e7051535b30" + resolved "https://registry.npmjs.org/object.values/-/object.values-1.1.4.tgz" integrity sha512-TnGo7j4XSnKQoK3MfvkzqKCi0nVe/D9I9IjwTNYdb/fxYHpjrluHVOgw0AF6jrRFGMPHdfuidR09tIDiIvnaSg== dependencies: call-bind "^1.0.2" @@ -4830,33 +4864,33 @@ object.values@^1.1.4: on-finished@~2.3.0: version "2.3.0" - resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + resolved "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz" integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= dependencies: ee-first "1.1.1" once@^1.3.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= dependencies: wrappy "1" onetime@^5.1.0, onetime@^5.1.2: version "5.1.2" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + resolved "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz" integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== dependencies: mimic-fn "^2.1.0" opener@^1.5.1: version "1.5.2" - resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.2.tgz#5d37e1f35077b9dcac4301372271afdeb2a13598" + resolved "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz" integrity sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A== optionator@^0.9.1: version "0.9.1" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" + resolved "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz" integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== dependencies: deep-is "^0.1.3" @@ -4868,81 +4902,81 @@ optionator@^0.9.1: os-browserify@0.3.0, os-browserify@^0.3.0: version "0.3.0" - resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" + resolved "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz" integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc= p-limit@3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== dependencies: yocto-queue "^0.1.0" p-limit@^1.1.0: version "1.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz" integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== 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" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz" integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== dependencies: p-try "^2.0.0" p-locate@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz" integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= 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" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz" integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== dependencies: p-limit "^2.2.0" p-map@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175" + resolved "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz" integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw== p-map@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" + resolved "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz" integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== dependencies: aggregate-error "^3.0.0" p-try@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" + resolved "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz" 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" + resolved "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== pako@~1.0.2, pako@~1.0.5: version "1.0.11" - resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" + resolved "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz" integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== parent-module@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz" integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== dependencies: callsites "^3.0.0" parse-asn1@^5.0.0, parse-asn1@^5.1.5: version "5.1.6" - resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.6.tgz#385080a3ec13cb62a62d39409cb3e88844cdaed4" + resolved "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz" integrity sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw== dependencies: asn1.js "^5.2.0" @@ -4953,7 +4987,7 @@ parse-asn1@^5.0.0, parse-asn1@^5.1.5: parse-json@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" + resolved "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz" integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= dependencies: error-ex "^1.3.1" @@ -4961,7 +4995,7 @@ parse-json@^4.0.0: parse-json@^5.0.0: version "5.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" + resolved "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz" integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== dependencies: "@babel/code-frame" "^7.0.0" @@ -4971,69 +5005,69 @@ parse-json@^5.0.0: parseurl@~1.3.3: version "1.3.3" - resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + resolved "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz" integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== path-browserify@0.0.1: version "0.0.1" - resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.1.tgz#e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a" + resolved "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz" integrity sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ== path-browserify@1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-1.0.1.tgz#d98454a9c3753d5790860f16f68867b9e46be1fd" + resolved "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz" integrity sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g== path-exists@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + resolved "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz" 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" + resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" 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" + resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= path-is-inside@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" + resolved "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz" integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= 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" + resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== path-parse@^1.0.6: version "1.0.7" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== path-to-regexp@0.1.7: version "0.1.7" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" + resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz" integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= path-type@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" + resolved "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz" integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== dependencies: pify "^3.0.0" path-type@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== pbkdf2@^3.0.3: version "3.1.2" - resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075" + resolved "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz" integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA== dependencies: create-hash "^1.1.2" @@ -5044,7 +5078,7 @@ pbkdf2@^3.0.3: peek-readable@^4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/peek-readable/-/peek-readable-4.0.1.tgz#9a045f291db254111c3412c1ce4fec27ddd4d202" + resolved "https://registry.npmjs.org/peek-readable/-/peek-readable-4.0.1.tgz" integrity sha512-7qmhptnR0WMSpxT5rMHG9bW/mYSR1uqaPFj2MHvT+y/aOUu6msJijpKt5SkTDKySwg65OWG2JwTMBlgcbwMHrQ== "photoswipe@file:./thirdparty/photoswipe": @@ -5052,89 +5086,89 @@ peek-readable@^4.0.1: picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.2, picomatch@^2.2.3: version "2.3.0" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972" + resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz" integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw== pify@^2.0.0: version "2.3.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + resolved "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz" integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= pify@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" + resolved "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz" integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= pify@^4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" + resolved "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz" integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== pinkie-promise@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" + resolved "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz" integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o= dependencies: pinkie "^2.0.0" pinkie@^2.0.0: version "2.0.4" - resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" + resolved "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz" integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= pkg-dir@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" + resolved "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz" integrity sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s= dependencies: find-up "^2.1.0" pkg-dir@^4.1.0: version "4.2.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" + resolved "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz" 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" + resolved "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz" integrity sha1-yBmscoBZpGHKscOImivjxJoATX8= dependencies: find-up "^2.1.0" platform@1.3.6: version "1.3.6" - resolved "https://registry.yarnpkg.com/platform/-/platform-1.3.6.tgz#48b4ce983164b209c2d45a107adb31f473a6e7a7" + resolved "https://registry.npmjs.org/platform/-/platform-1.3.6.tgz" integrity sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg== please-upgrade-node@^3.2.0: version "3.2.0" - resolved "https://registry.yarnpkg.com/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz#aeddd3f994c933e4ad98b99d9a556efa0e2fe942" + resolved "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz" integrity sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg== dependencies: semver-compare "^1.0.0" pngjs@^3.4.0: version "3.4.0" - resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-3.4.0.tgz#99ca7d725965fb655814eaf65f38f12bbdbf555f" + resolved "https://registry.npmjs.org/pngjs/-/pngjs-3.4.0.tgz" integrity sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w== pnp-webpack-plugin@1.6.4: version "1.6.4" - resolved "https://registry.yarnpkg.com/pnp-webpack-plugin/-/pnp-webpack-plugin-1.6.4.tgz#c9711ac4dc48a685dabafc86f8b6dd9f8df84149" + resolved "https://registry.npmjs.org/pnp-webpack-plugin/-/pnp-webpack-plugin-1.6.4.tgz" integrity sha512-7Wjy+9E3WwLOEL30D+m8TSTF7qJJUJLONBnwQp0518siuMxUQUbgZwssaFX+QKlZkjHZcw/IpZCt/H0srrntSg== dependencies: ts-pnp "^1.1.6" postcss-value-parser@^4.0.2: version "4.1.0" - resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz#443f6a20ced6481a2bda4fa8532a6e55d789a2cb" + resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz" integrity sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ== postcss@8.2.15: version "8.2.15" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.2.15.tgz#9e66ccf07292817d226fc315cbbf9bc148fbca65" + resolved "https://registry.npmjs.org/postcss/-/postcss-8.2.15.tgz" integrity sha512-2zO3b26eJD/8rb106Qu2o7Qgg52ND5HPjcyQiK2B98O388h43A448LCslC0dI2P97wCAQRJsFvwTRcXxTKds+Q== dependencies: colorette "^1.2.2" @@ -5143,45 +5177,45 @@ postcss@8.2.15: prelude-ls@^1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz" integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== prettier@2.3.2: version "2.3.2" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.3.2.tgz#ef280a05ec253712e486233db5c6f23441e7342d" + resolved "https://registry.npmjs.org/prettier/-/prettier-2.3.2.tgz" integrity sha512-lnJzDfJ66zkMy58OL5/NY5zp70S7Nz6KqcKkXYzn2tMVrNxvbqaBpg7H3qHaLxCJ5lNMsGuM8+ohS7cZrthdLQ== pretty-bytes@^5.3.0: version "5.6.0" - resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.6.0.tgz#356256f643804773c82f64723fe78c92c62beaeb" + resolved "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz" integrity sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg== process-nextick-args@~2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + resolved "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz" integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== process@0.11.10, process@^0.11.10: version "0.11.10" - resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + resolved "https://registry.npmjs.org/process/-/process-0.11.10.tgz" integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= progress@^2.0.0, progress@^2.0.3: version "2.0.3" - resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" + resolved "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz" integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== prop-types-extra@^1.1.0: version "1.1.1" - resolved "https://registry.yarnpkg.com/prop-types-extra/-/prop-types-extra-1.1.1.tgz#58c3b74cbfbb95d304625975aa2f0848329a010b" + resolved "https://registry.npmjs.org/prop-types-extra/-/prop-types-extra-1.1.1.tgz" integrity sha512-59+AHNnHYCdiC+vMwY52WmvP5dM3QLeoumYuEyceQDi9aEhtwN9zIQ2ZNo25sMyXnbh32h+P1ezDsUpUH3JAew== dependencies: react-is "^16.3.2" warning "^4.0.0" -prop-types@^15.5.8, prop-types@^15.6.0, prop-types@^15.6.2, prop-types@^15.7.2: +prop-types@^15.5.7, prop-types@^15.5.8, prop-types@^15.6.0, prop-types@^15.6.2, prop-types@^15.7.2: version "15.7.2" - resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5" + resolved "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz" integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ== dependencies: loose-envify "^1.4.0" @@ -5190,12 +5224,12 @@ prop-types@^15.5.8, prop-types@^15.6.0, prop-types@^15.6.2, prop-types@^15.7.2: property-expr@^2.0.2: version "2.0.4" - resolved "https://registry.yarnpkg.com/property-expr/-/property-expr-2.0.4.tgz#37b925478e58965031bb612ec5b3260f8241e910" + resolved "https://registry.npmjs.org/property-expr/-/property-expr-2.0.4.tgz" integrity sha512-sFPkHQjVKheDNnPvotjQmm3KD3uk1fWKUN7CrpdbwmUx3CrG3QiM8QpTSimvig5vTXmTvjz7+TDvXOI9+4rkcg== proxy-addr@~2.0.5: version "2.0.7" - resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" + resolved "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz" integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== dependencies: forwarded "0.2.0" @@ -5203,12 +5237,12 @@ proxy-addr@~2.0.5: 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" + resolved "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz" integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== public-encrypt@^4.0.0: version "4.0.3" - resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" + resolved "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz" integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q== dependencies: bn.js "^4.1.0" @@ -5220,61 +5254,61 @@ public-encrypt@^4.0.0: punycode@1.3.2: version "1.3.2" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" + resolved "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz" integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= punycode@^1.2.4: version "1.4.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + resolved "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz" integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= punycode@^2.1.0: version "2.1.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + resolved "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== qs@6.7.0: version "6.7.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" + resolved "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz" integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== querystring-es3@0.2.1, querystring-es3@^0.2.0: version "0.2.1" - resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" + resolved "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz" integrity sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM= querystring@0.2.0: version "0.2.0" - resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" + resolved "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz" integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= querystring@^0.2.0: version "0.2.1" - resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.1.tgz#40d77615bb09d16902a85c3e38aa8b5ed761c2dd" + resolved "https://registry.npmjs.org/querystring/-/querystring-0.2.1.tgz" integrity sha512-wkvS7mL/JMugcup3/rMitHmd9ecIGd2lhFhK9N3UUQ450h66d1r3Y9nvXzQAW1Lq+wyx61k/1pfKS5KuKiyEbg== queue-microtask@^1.2.2: version "1.2.3" - resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== queue@6.0.2: version "6.0.2" - resolved "https://registry.yarnpkg.com/queue/-/queue-6.0.2.tgz#b91525283e2315c7553d2efa18d83e76432fed65" + resolved "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz" integrity sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA== dependencies: inherits "~2.0.3" randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + resolved "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz" integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== dependencies: safe-buffer "^5.1.0" randomfill@^1.0.3: version "1.0.4" - resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" + resolved "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz" integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw== dependencies: randombytes "^2.0.5" @@ -5282,12 +5316,12 @@ randomfill@^1.0.3: range-parser@~1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz" integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== raw-body@2.4.0: version "2.4.0" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332" + resolved "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz" integrity sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q== dependencies: bytes "3.1.0" @@ -5297,7 +5331,7 @@ raw-body@2.4.0: raw-body@2.4.1: version "2.4.1" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.1.tgz#30ac82f98bb5ae8c152e67149dac8d55153b168c" + resolved "https://registry.npmjs.org/raw-body/-/raw-body-2.4.1.tgz" integrity sha512-9WmIKF6mkvA0SLmA2Knm9+qj89e+j1zqgyn8aXGd7+nAduPoqgI9lO57SAZNn/Byzo5P7JhXTyg9PzaJbH73bA== dependencies: bytes "3.1.0" @@ -5307,7 +5341,7 @@ raw-body@2.4.1: react-bootstrap@^1.3.0: version "1.6.3" - resolved "https://registry.yarnpkg.com/react-bootstrap/-/react-bootstrap-1.6.3.tgz#6c2b27ed320b95a690ac416ddbb11983de1f954d" + resolved "https://registry.npmjs.org/react-bootstrap/-/react-bootstrap-1.6.3.tgz" integrity sha512-zsd4l0g68pusOmJ/R5LhTfofT+9RniCwcZsMMNFGJo97d1vT1H2nGlbhLWp/j/pfeXXj9zzR8ugUtKkadcoWnA== dependencies: "@babel/runtime" "^7.14.0" @@ -5330,7 +5364,7 @@ react-bootstrap@^1.3.0: react-burger-menu@^3.0.4: version "3.0.6" - resolved "https://registry.yarnpkg.com/react-burger-menu/-/react-burger-menu-3.0.6.tgz#9003cc1d65dc9e70d1460e5d8d8982f6b1a79d1d" + resolved "https://registry.npmjs.org/react-burger-menu/-/react-burger-menu-3.0.6.tgz" integrity sha512-Xikyl8VRkQBOyFVoMKpbScTLG6LlW64rajiquyCGwtpPswrDxaifusKckzTWAOH0At40Boguhj5lXq451NO0LA== dependencies: browserify-optional "^1.0.0" @@ -5341,7 +5375,7 @@ react-burger-menu@^3.0.4: react-calendar@^3.3.1: version "3.4.0" - resolved "https://registry.yarnpkg.com/react-calendar/-/react-calendar-3.4.0.tgz#25396ca0992b3b2042abca334515f6ff4d9878bc" + resolved "https://registry.npmjs.org/react-calendar/-/react-calendar-3.4.0.tgz" integrity sha512-ykbvXASArQQ8KZlCEXEdE+w+KFGSj7kDpdTRzbLVJeN26oUIu+EFavFDAqg4G//zTO0tSq5SMfqAa6fjrdGQjQ== dependencies: "@wojtekmaj/date-utils" "^1.0.2" @@ -5351,7 +5385,7 @@ react-calendar@^3.3.1: react-clock@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/react-clock/-/react-clock-3.0.0.tgz#0d29f8e682ef516574061d1d24b1a286cb2da89b" + resolved "https://registry.npmjs.org/react-clock/-/react-clock-3.0.0.tgz" integrity sha512-D3K82D3YGcDtzxZCfiACLcDTL8cJXSgpdrzTY9ff3H5vflxlLzTSLF8apZRo6JZzOFrZQvw5mrS7TkQzj9nG0A== dependencies: "@wojtekmaj/date-utils" "^1.0.0" @@ -5360,12 +5394,12 @@ react-clock@^3.0.0: react-collapse@^5.1.0: version "5.1.0" - resolved "https://registry.yarnpkg.com/react-collapse/-/react-collapse-5.1.0.tgz#36f69ecb0fe797f976aaf5e4f2b2c248d2760140" + resolved "https://registry.npmjs.org/react-collapse/-/react-collapse-5.1.0.tgz" integrity sha512-5v0ywsn9HjiR/odNzbRDs0RZfrnbdSippJebWOBCFFDA12Vx8DddrbI4qWVf1P2wTiVagrpcSy07AU0b6+gM9Q== react-date-picker@^8.3.3: version "8.3.4" - resolved "https://registry.yarnpkg.com/react-date-picker/-/react-date-picker-8.3.4.tgz#6445d4c2c3cddc0f073928851f598abe3a9fd76a" + resolved "https://registry.npmjs.org/react-date-picker/-/react-date-picker-8.3.4.tgz" integrity sha512-6DdeMjg5ji1W2ZBMADhDhOipZndAey24yQyUIIfMXKOOuehcnmb5MuGuGmdqd4zzMmktyGTIzf51c2E3u2P+7Q== dependencies: "@types/react-calendar" "^3.0.0" @@ -5379,9 +5413,21 @@ react-date-picker@^8.3.3: react-fit "^1.0.3" update-input-width "^1.2.2" +react-datepicker@^4.3.0: + version "4.3.0" + resolved "https://registry.npmjs.org/react-datepicker/-/react-datepicker-4.3.0.tgz" + integrity sha512-cg+gp4YnPcZc6iZ0+v7VuRgcFG22KL7izHYrCxXeSLOn5VGkyxTfcu5qA/cGIsngurCt/u0NtgVTlHB1Fwap1g== + dependencies: + "@popperjs/core" "^2.9.2" + classnames "^2.2.6" + date-fns "^2.24.0" + prop-types "^15.7.2" + react-onclickoutside "^6.12.0" + react-popper "^2.2.5" + react-datetime-picker@^3.4.2: version "3.4.2" - resolved "https://registry.yarnpkg.com/react-datetime-picker/-/react-datetime-picker-3.4.2.tgz#0a6620b82354a9096766394f0411d76655fb26b4" + resolved "https://registry.npmjs.org/react-datetime-picker/-/react-datetime-picker-3.4.2.tgz" integrity sha512-i/Iw7Qbz8Zl0Bo3rMbHQ1+dnWtImNexF8Nh+bsKxaK6wFTmpE1l8ugTGHDKT8gbZ2DRtzscjSMC/LVz/gIE8DA== dependencies: "@wojtekmaj/date-utils" "^1.0.3" @@ -5395,9 +5441,16 @@ react-datetime-picker@^3.4.2: react-fit "^1.0.3" react-time-picker "^4.4.2" +react-datetime@^3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/react-datetime/-/react-datetime-3.1.1.tgz" + integrity sha512-gHCTjAniCcMb6jdXpz+MpVe/uCeaHNDOofg+l41nLlJI3uBLBMV40CQbGB2TCTUpCzGT1mCs4vQzKGMjXO/WWQ== + dependencies: + prop-types "^15.5.7" + react-dom@^17.0.2: version "17.0.2" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-17.0.2.tgz#ecffb6845e3ad8dbfcdc498f0d0a939736502c23" + resolved "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz" integrity sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA== dependencies: loose-envify "^1.1.0" @@ -5406,7 +5459,7 @@ react-dom@^17.0.2: react-dropzone@^11.2.4: version "11.3.4" - resolved "https://registry.yarnpkg.com/react-dropzone/-/react-dropzone-11.3.4.tgz#aeb098df5c4491e165042c9f0b5e2e7185484740" + resolved "https://registry.npmjs.org/react-dropzone/-/react-dropzone-11.3.4.tgz" integrity sha512-B1nzNRZ4F1cnrfEC0T6KXeBN1mCPinu4JCoTrp7NjB+442KSPxqfDrw41QIA2kAwlYs1+wj/0BTedeM5hc2+xw== dependencies: attr-accept "^2.2.1" @@ -5415,12 +5468,17 @@ react-dropzone@^11.2.4: react-fast-compare@^2.0.1: version "2.0.4" - resolved "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-2.0.4.tgz#e84b4d455b0fec113e0402c329352715196f81f9" + resolved "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-2.0.4.tgz" integrity sha512-suNP+J1VU1MWFKcyt7RtjiSWUjvidmQSlqu+eHslq+342xCbGTYmC0mEhPCOHxlW0CywylOC1u2DFAT+bv4dBw== +react-fast-compare@^3.0.1: + version "3.2.0" + resolved "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.0.tgz" + integrity sha512-rtGImPZ0YyLrscKI9xTpV8psd6I8VAtjKCzQDlzyDvqJA8XOW78TXYQwNRNd8g8JZnDu8q9Fu/1v4HPAVwVdHA== + react-fit@^1.0.3: version "1.3.2" - resolved "https://registry.yarnpkg.com/react-fit/-/react-fit-1.3.2.tgz#dea734d1dbe4d540037a766c316ae7a4141cf421" + resolved "https://registry.npmjs.org/react-fit/-/react-fit-1.3.2.tgz" integrity sha512-Ih/ee8/I/N6EcGZjOqfo/yFq6Q/xuZ62uai21rMyud208ixx8V5xJxuRLIxedLcwNAEtyyEPEJ2Y47qeKljQHA== dependencies: detect-element-overflow "^1.2.0" @@ -5428,34 +5486,39 @@ react-fit@^1.0.3: react-input-autosize@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/react-input-autosize/-/react-input-autosize-3.0.0.tgz#6b5898c790d4478d69420b55441fcc31d5c50a85" + resolved "https://registry.npmjs.org/react-input-autosize/-/react-input-autosize-3.0.0.tgz" integrity sha512-nL9uS7jEs/zu8sqwFE5MAPx6pPkNAriACQ2rGLlqmKr2sPGtN7TXTyDdQt4lbNXVx7Uzadb40x8qotIuru6Rhg== dependencies: prop-types "^15.5.8" react-is@17.0.2: version "17.0.2" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" + resolved "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz" integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== react-is@^16.3.2, react-is@^16.7.0, react-is@^16.8.1: version "16.13.1" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" + resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== react-lifecycles-compat@^3.0.4: version "3.0.4" - resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362" + resolved "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz" integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA== +react-onclickoutside@^6.12.0: + version "6.12.0" + resolved "https://registry.npmjs.org/react-onclickoutside/-/react-onclickoutside-6.12.0.tgz" + integrity sha512-oPlOTYcISLHfpMog2lUZMFSbqOs4LFcA4+vo7fpfevB5v9Z0D5VBDBkfeO5lv+hpEcGoaGk67braLT+QT+eICA== + react-otp-input@^2.3.1: version "2.4.0" - resolved "https://registry.yarnpkg.com/react-otp-input/-/react-otp-input-2.4.0.tgz#0f0a3de1d8c8d564e2e4fbe5d6b7b56e29e3a6e6" + resolved "https://registry.npmjs.org/react-otp-input/-/react-otp-input-2.4.0.tgz" integrity sha512-AIgl7u4sS9BTNCxX1xlaS5fPWay/Zml8Ho5LszXZKXrH1C/TiFsTQGmtl13UecQYO3mSF3HUzG2rrDf0sjEFmg== react-overlays@^5.1.1: version "5.1.1" - resolved "https://registry.yarnpkg.com/react-overlays/-/react-overlays-5.1.1.tgz#2e7cf49744b56537c7828ccb94cfc63dd778ae4f" + resolved "https://registry.npmjs.org/react-overlays/-/react-overlays-5.1.1.tgz" integrity sha512-eCN2s2/+GVZzpnId4XVWtvDPYYBD2EtOGP74hE+8yDskPzFy9+pV1H3ZZihxuRdEbQzzacySaaDkR7xE0ydl4Q== dependencies: "@babel/runtime" "^7.13.8" @@ -5467,14 +5530,22 @@ react-overlays@^5.1.1: uncontrollable "^7.2.1" warning "^4.0.3" +react-popper@^2.2.5: + version "2.2.5" + resolved "https://registry.npmjs.org/react-popper/-/react-popper-2.2.5.tgz" + integrity sha512-kxGkS80eQGtLl18+uig1UIf9MKixFSyPxglsgLBxlYnyDf65BiY9B3nZSc6C9XUNDgStROB0fMQlTEz1KxGddw== + dependencies: + react-fast-compare "^3.0.1" + warning "^4.0.2" + react-refresh@0.8.3: version "0.8.3" - resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.8.3.tgz#721d4657672d400c5e3c75d063c4a85fb2d5d68f" + resolved "https://registry.npmjs.org/react-refresh/-/react-refresh-0.8.3.tgz" integrity sha512-X8jZHc7nCMjaCqoU+V2I0cOhNW+QMBwSUkeXnTi8IPe6zaRWfn60ZzvFDZqWPfmSJfjub7dDW1SP0jaHWLu/hg== react-select@^4.3.1: version "4.3.1" - resolved "https://registry.yarnpkg.com/react-select/-/react-select-4.3.1.tgz#389fc07c9bc7cf7d3c377b7a05ea18cd7399cb81" + resolved "https://registry.npmjs.org/react-select/-/react-select-4.3.1.tgz" integrity sha512-HBBd0dYwkF5aZk1zP81Wx5UsLIIT2lSvAY2JiJo199LjoLHoivjn9//KsmvQMEFGNhe58xyuOITjfxKCcGc62Q== dependencies: "@babel/runtime" "^7.12.0" @@ -5487,7 +5558,7 @@ react-select@^4.3.1: react-time-picker@^4.4.2: version "4.4.3" - resolved "https://registry.yarnpkg.com/react-time-picker/-/react-time-picker-4.4.3.tgz#1b27a3288b8f290ae2aa08a5232a6b92968137f1" + resolved "https://registry.npmjs.org/react-time-picker/-/react-time-picker-4.4.3.tgz" integrity sha512-YnEC9Qpbgy1fWBbjzM89LJ8O81G33MXSM8dUsEpSJXQSSHnEQ/kYEytWCnmi7joXGzBUOzHLRK6mxkgJnoL4zQ== dependencies: "@wojtekmaj/date-utils" "^1.0.0" @@ -5502,12 +5573,12 @@ react-time-picker@^4.4.2: react-top-loading-bar@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/react-top-loading-bar/-/react-top-loading-bar-2.0.1.tgz#c8805ad9c1068766fdd3cadd414e67cfdf1878e9" + resolved "https://registry.npmjs.org/react-top-loading-bar/-/react-top-loading-bar-2.0.1.tgz" integrity sha512-wkRlK9Rte4TU817GDcjlsCoDOxrrnvsNvK609FKyio0EIrmmqjQDz5DB8HbN88CHNZBy5Lh/OBALc03ioWFPuQ== react-transition-group@^4.3.0, react-transition-group@^4.4.1: version "4.4.2" - resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-4.4.2.tgz#8b59a56f09ced7b55cbd53c36768b922890d5470" + resolved "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.2.tgz" integrity sha512-/RNYfRAMlZwDSr6z4zNKV6xu53/e2BuaBbGhbyYIXTrmgu/bGHzmqOs7mJSJBHy9Ud+ApHx3QjrkKSp1pxvlFg== dependencies: "@babel/runtime" "^7.5.5" @@ -5517,17 +5588,17 @@ react-transition-group@^4.3.0, react-transition-group@^4.4.1: react-virtualized-auto-sizer@^1.0.2: version "1.0.6" - resolved "https://registry.yarnpkg.com/react-virtualized-auto-sizer/-/react-virtualized-auto-sizer-1.0.6.tgz#66c5b1c9278064c5ef1699ed40a29c11518f97ca" + resolved "https://registry.npmjs.org/react-virtualized-auto-sizer/-/react-virtualized-auto-sizer-1.0.6.tgz" integrity sha512-7tQ0BmZqfVF6YYEWcIGuoR3OdYe8I/ZFbNclFlGOC3pMqunkYF/oL30NCjSGl9sMEb17AnzixDz98Kqc3N76HQ== react-window-infinite-loader@^1.0.5: version "1.0.7" - resolved "https://registry.yarnpkg.com/react-window-infinite-loader/-/react-window-infinite-loader-1.0.7.tgz#958ef1a689d20dce122ef377583acd987760aee8" + resolved "https://registry.npmjs.org/react-window-infinite-loader/-/react-window-infinite-loader-1.0.7.tgz" integrity sha512-wg3LWkUpG21lhv+cZvNy+p0+vtclZw+9nP2vO6T9PKT50EN1cUq37Dq6FzcM38h/c2domE0gsUhb6jHXtGogAA== react-window@^1.8.6: version "1.8.6" - resolved "https://registry.yarnpkg.com/react-window/-/react-window-1.8.6.tgz#d011950ac643a994118632665aad0c6382e2a112" + resolved "https://registry.npmjs.org/react-window/-/react-window-1.8.6.tgz" integrity sha512-8VwEEYyjz6DCnGBsd+MgkD0KJ2/OXFULyDtorIiTz+QzwoP94tBoA7CnbtyXMm+cCeAUER5KJcPtWl9cpKbOBg== dependencies: "@babel/runtime" "^7.0.0" @@ -5535,7 +5606,7 @@ react-window@^1.8.6: react@^17.0.2: version "17.0.2" - resolved "https://registry.yarnpkg.com/react/-/react-17.0.2.tgz#d0b5cc516d29eb3eee383f75b62864cfb6800037" + resolved "https://registry.npmjs.org/react/-/react-17.0.2.tgz" integrity sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA== dependencies: loose-envify "^1.1.0" @@ -5543,7 +5614,7 @@ react@^17.0.2: read-pkg-up@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-3.0.0.tgz#3ed496685dba0f8fe118d0691dc51f4a1ff96f07" + resolved "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz" integrity sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc= dependencies: find-up "^2.0.0" @@ -5551,7 +5622,7 @@ read-pkg-up@^3.0.0: read-pkg@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" + resolved "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz" integrity sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k= dependencies: load-json-file "^4.0.0" @@ -5560,7 +5631,7 @@ read-pkg@^3.0.0: readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.6: version "2.3.7" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz" integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== dependencies: core-util-is "~1.0.0" @@ -5573,7 +5644,7 @@ readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.3.3, readable readable-stream@^3.5.0, readable-stream@^3.6.0: version "3.6.0" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz" integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== dependencies: inherits "^2.0.3" @@ -5582,50 +5653,50 @@ readable-stream@^3.5.0, readable-stream@^3.6.0: readable-web-to-node-stream@^3.0.0: version "3.0.2" - resolved "https://registry.yarnpkg.com/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.2.tgz#5d52bb5df7b54861fd48d015e93a2cb87b3ee0bb" + resolved "https://registry.npmjs.org/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.2.tgz" integrity sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw== dependencies: readable-stream "^3.6.0" readdirp@~3.5.0: version "3.5.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.5.0.tgz#9ba74c019b15d365278d2e91bb8c48d7b4d42c9e" + resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz" integrity sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ== dependencies: picomatch "^2.2.1" regenerate-unicode-properties@^8.2.0: version "8.2.0" - resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz#e5de7111d655e7ba60c057dbe9ff37c87e65cdec" + resolved "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz" integrity sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA== dependencies: regenerate "^1.4.0" regenerate@^1.4.0: version "1.4.2" - resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" + resolved "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz" integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== regenerator-runtime@^0.11.0: version "0.11.1" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" + resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz" integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== regenerator-runtime@^0.13.4, regenerator-runtime@^0.13.7: version "0.13.9" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52" + resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz" integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA== regenerator-transform@^0.14.2: version "0.14.5" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.5.tgz#c98da154683671c9c4dcb16ece736517e1b7feb4" + resolved "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz" integrity sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw== dependencies: "@babel/runtime" "^7.8.4" regexp.prototype.flags@^1.3.1: version "1.3.1" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz#7ef352ae8d159e758c0eadca6f8fcb4eef07be26" + resolved "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz" integrity sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA== dependencies: call-bind "^1.0.2" @@ -5633,12 +5704,12 @@ regexp.prototype.flags@^1.3.1: regexpp@^3.1.0: version "3.2.0" - resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" + resolved "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz" integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== regexpu-core@^4.7.1: version "4.7.1" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.7.1.tgz#2dea5a9a07233298fbf0db91fa9abc4c6e0f8ad6" + resolved "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.1.tgz" integrity sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ== dependencies: regenerate "^1.4.0" @@ -5650,44 +5721,44 @@ regexpu-core@^4.7.1: regjsgen@^0.5.1: version "0.5.2" - resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.2.tgz#92ff295fb1deecbf6ecdab2543d207e91aa33733" + resolved "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz" integrity sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A== regjsparser@^0.6.4: version "0.6.9" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.9.tgz#b489eef7c9a2ce43727627011429cf833a7183e6" + resolved "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.9.tgz" integrity sha512-ZqbNRz1SNjLAiYuwY0zoXW8Ne675IX5q+YHioAGbCw4X96Mjl2+dcX9B2ciaeyYjViDAfvIjFpQjJgLttTEERQ== dependencies: jsesc "~0.5.0" 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" + resolved "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz" 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" + resolved "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz" integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8= resolve-from@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== resolve-url@^0.2.1: version "0.2.1" - resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" + resolved "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz" integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= resolve@1.1.7: version "1.1.7" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" + resolved "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz" integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs= resolve@^1.10.0, resolve@^1.14.2, resolve@^1.20.0: version "1.20.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" + resolved "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz" integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== dependencies: is-core-module "^2.2.0" @@ -5695,7 +5766,7 @@ resolve@^1.10.0, resolve@^1.14.2, resolve@^1.20.0: resolve@^2.0.0-next.3: version "2.0.0-next.3" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.3.tgz#d41016293d4a8586a39ca5d9b5f15cbea1f55e46" + resolved "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.3.tgz" integrity sha512-W8LucSynKUIDu9ylraa7ueVZ7hc0uAgJBxVsQSKOXOyle8a93qXhcz+XAXZ8bIq2d6i4Ehddn6Evt+0/UwKk6Q== dependencies: is-core-module "^2.2.0" @@ -5703,7 +5774,7 @@ resolve@^2.0.0-next.3: restore-cursor@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" + resolved "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz" integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== dependencies: onetime "^5.1.0" @@ -5711,26 +5782,26 @@ restore-cursor@^3.1.0: reusify@^1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== rimraf@^2.6.3: version "2.7.1" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" + resolved "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz" integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== dependencies: glob "^7.1.3" rimraf@^3.0.2: version "3.0.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz" integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== dependencies: glob "^7.1.3" ripemd160@^2.0.0, ripemd160@^2.0.1: version "2.0.2" - resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" + resolved "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz" integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== dependencies: hash-base "^3.0.0" @@ -5738,7 +5809,7 @@ ripemd160@^2.0.0, ripemd160@^2.0.1: rollup-plugin-babel@^4.3.3: version "4.4.0" - resolved "https://registry.yarnpkg.com/rollup-plugin-babel/-/rollup-plugin-babel-4.4.0.tgz#d15bd259466a9d1accbdb2fe2fff17c52d030acb" + resolved "https://registry.npmjs.org/rollup-plugin-babel/-/rollup-plugin-babel-4.4.0.tgz" integrity sha512-Lek/TYp1+7g7I+uMfJnnSJ7YWoD58ajo6Oarhlex7lvUce+RCKRuGRSgztDO3/MF/PuGKmUL5iTHKf208UNszw== dependencies: "@babel/helper-module-imports" "^7.0.0" @@ -5746,7 +5817,7 @@ rollup-plugin-babel@^4.3.3: rollup-plugin-terser@^5.3.1: version "5.3.1" - resolved "https://registry.yarnpkg.com/rollup-plugin-terser/-/rollup-plugin-terser-5.3.1.tgz#8c650062c22a8426c64268548957463bf981b413" + resolved "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-5.3.1.tgz" integrity sha512-1pkwkervMJQGFYvM9nscrUoncPwiKR/K+bHdjv6PFgRo3cgPHoRT83y2Aa3GvINj4539S15t/tpFPb775TDs6w== dependencies: "@babel/code-frame" "^7.5.5" @@ -5757,14 +5828,14 @@ rollup-plugin-terser@^5.3.1: rollup-pluginutils@^2.8.1, rollup-pluginutils@^2.8.2: version "2.8.2" - resolved "https://registry.yarnpkg.com/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz#72f2af0748b592364dbd3389e600e5a9444a351e" + resolved "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz" integrity sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ== dependencies: estree-walker "^0.6.1" rollup@^1.31.1: version "1.32.1" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-1.32.1.tgz#4480e52d9d9e2ae4b46ba0d9ddeaf3163940f9c4" + resolved "https://registry.npmjs.org/rollup/-/rollup-1.32.1.tgz" integrity sha512-/2HA0Ec70TvQnXdzynFffkjA6XN+1e2pEv/uKS5Ulca40g2L7KuOE3riasHoNVHOsFD5KKZgDsMk1CP3Tw9s+A== dependencies: "@types/estree" "*" @@ -5773,41 +5844,41 @@ rollup@^1.31.1: run-parallel@^1.1.9: version "1.2.0" - resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz" integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== 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" + resolved "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz" integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== dependencies: tslib "^1.9.0" safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== "safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.1.0: version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== sax@^1.2.4: version "1.2.4" - resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" + resolved "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== scheduler@^0.20.2: version "0.20.2" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.20.2.tgz#4baee39436e34aa93b4874bddcbf0fe8b8b50e91" + resolved "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz" integrity sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ== dependencies: loose-envify "^1.1.0" @@ -5815,39 +5886,39 @@ scheduler@^0.20.2: scrypt-js@^3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-3.0.1.tgz#d314a57c2aef69d1ad98a138a21fe9eafa9ee312" + resolved "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz" integrity sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA== semver-compare@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc" + resolved "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz" integrity sha1-De4hahyUGrN+nvsXiPavxf9VN/w= "semver@2 || 3 || 4 || 5": version "5.7.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + resolved "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== semver@7.0.0: version "7.0.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" + resolved "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz" integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== semver@^6.0.0, 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" + resolved "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== semver@^7.2.1, semver@^7.3.5: version "7.3.5" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" + resolved "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz" integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== dependencies: lru-cache "^6.0.0" send@0.17.1: version "0.17.1" - resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" + resolved "https://registry.npmjs.org/send/-/send-0.17.1.tgz" integrity sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg== dependencies: debug "2.6.9" @@ -5866,14 +5937,14 @@ send@0.17.1: serialize-javascript@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-4.0.0.tgz#b525e1238489a5ecfc42afacc3fe99e666f4b1aa" + resolved "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz" integrity sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw== dependencies: randombytes "^2.1.0" serve-static@1.14.1: version "1.14.1" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9" + resolved "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz" integrity sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg== dependencies: encodeurl "~1.0.2" @@ -5883,27 +5954,27 @@ serve-static@1.14.1: set-blocking@~2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + resolved "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz" integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= set-immediate-shim@~1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" + resolved "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz" integrity sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E= setimmediate@^1.0.4: version "1.0.5" - resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + resolved "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz" integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= setprototypeof@1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" + resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz" integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== sha.js@^2.4.0, sha.js@^2.4.8: version "2.4.11" - resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" + resolved "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz" integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== dependencies: inherits "^2.0.1" @@ -5911,29 +5982,29 @@ sha.js@^2.4.0, sha.js@^2.4.8: shallowequal@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-1.1.0.tgz#188d521de95b9087404fd4dcb68b13df0ae4e7f8" + resolved "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz" integrity sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ== shebang-command@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== dependencies: shebang-regex "^3.0.0" shebang-regex@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== shell-quote@1.7.2: version "1.7.2" - resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.2.tgz#67a7d02c76c9da24f99d20808fcaded0e0e04be2" + resolved "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.2.tgz" integrity sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg== side-channel@^1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" + resolved "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz" integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== dependencies: call-bind "^1.0.0" @@ -5942,17 +6013,17 @@ side-channel@^1.0.4: signal-exit@^3.0.0, 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" + resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz" integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== slash@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + resolved "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== slice-ansi@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-3.0.0.tgz#31ddc10930a1b7e0b67b08c96c2f49b77a789787" + resolved "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz" integrity sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ== dependencies: ansi-styles "^4.0.0" @@ -5961,7 +6032,7 @@ slice-ansi@^3.0.0: slice-ansi@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" + resolved "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz" integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== dependencies: ansi-styles "^4.0.0" @@ -5970,26 +6041,26 @@ slice-ansi@^4.0.0: snapsvg-cjs@0.0.6: version "0.0.6" - resolved "https://registry.yarnpkg.com/snapsvg-cjs/-/snapsvg-cjs-0.0.6.tgz#3b2f56af2573d3d364c3ed5bf8885745f4d2dde1" + resolved "https://registry.npmjs.org/snapsvg-cjs/-/snapsvg-cjs-0.0.6.tgz" integrity sha1-Oy9WryVz09Nkw+1b+IhXRfTS3eE= dependencies: snapsvg "0.5.1" snapsvg@0.5.1: version "0.5.1" - resolved "https://registry.yarnpkg.com/snapsvg/-/snapsvg-0.5.1.tgz#0caf52c79189a290746fc446cc5e863f6bdddfe3" + resolved "https://registry.npmjs.org/snapsvg/-/snapsvg-0.5.1.tgz" integrity sha1-DK9Sx5GJopB0b8RGzF6GP2vd3+M= dependencies: eve "~0.5.1" source-list-map@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" + resolved "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz" integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== source-map-support@~0.5.12: version "0.5.20" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.20.tgz#12166089f8f5e5e8c56926b377633392dd2cb6c9" + resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.20.tgz" integrity sha512-n1lZZ8Ve4ksRqizaBQgxXDgKwttHDhyfQjA6YZZn8+AroHbsIz+JjwxQDxbp+7y5OYCI8t1Yk7etjD9CRd2hIw== dependencies: buffer-from "^1.0.0" @@ -5997,46 +6068,46 @@ source-map-support@~0.5.12: source-map-url@^0.4.0: version "0.4.1" - resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.1.tgz#0af66605a745a5a2f91cf1bbf8a7afbc283dec56" + resolved "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz" integrity sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw== source-map@0.7.3, source-map@^0.7.3: version "0.7.3" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz" integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== source-map@0.8.0-beta.0: version "0.8.0-beta.0" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.8.0-beta.0.tgz#d4c1bb42c3f7ee925f005927ba10709e0d1d1f11" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz" integrity sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA== dependencies: whatwg-url "^7.0.0" source-map@^0.5.0: version "0.5.7" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz" integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= 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" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== source-map@~0.1.30: version "0.1.43" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.1.43.tgz#c24bc146ca517c1471f5dacbe2571b2b7f9e3346" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz" integrity sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y= dependencies: amdefine ">=0.0.4" sourcemap-codec@^1.4.4: version "1.4.8" - resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4" + resolved "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz" integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== spdx-correct@^3.0.0: version "3.1.1" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" + resolved "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz" integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w== dependencies: spdx-expression-parse "^3.0.0" @@ -6044,12 +6115,12 @@ spdx-correct@^3.0.0: spdx-exceptions@^2.1.0: version "2.3.0" - resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" + resolved "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz" integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== spdx-expression-parse@^3.0.0: version "3.0.1" - resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" + resolved "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz" integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== dependencies: spdx-exceptions "^2.1.0" @@ -6057,29 +6128,29 @@ spdx-expression-parse@^3.0.0: spdx-license-ids@^3.0.0: version "3.0.10" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.10.tgz#0d9becccde7003d6c658d487dd48a32f0bf3014b" + resolved "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.10.tgz" integrity sha512-oie3/+gKf7QtpitB0LYLETe+k8SifzsX4KixvpOsbI6S0kRiRQ5MKOio8eMSAKQ17N06+wdEOXRiId+zOxo0hA== sprintf-js@~1.0.2: version "1.0.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz" integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= stacktrace-parser@0.1.10: version "0.1.10" - resolved "https://registry.yarnpkg.com/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz#29fb0cae4e0d0b85155879402857a1639eb6051a" + resolved "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz" integrity sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg== dependencies: type-fest "^0.7.1" "statuses@>= 1.5.0 < 2", statuses@~1.5.0: version "1.5.0" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + resolved "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz" integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= stream-browserify@3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-3.0.0.tgz#22b0a2850cdf6503e73085da1fc7b7d0c2122f2f" + resolved "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz" integrity sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA== dependencies: inherits "~2.0.4" @@ -6087,7 +6158,7 @@ stream-browserify@3.0.0: stream-browserify@^2.0.1: version "2.0.2" - resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b" + resolved "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz" integrity sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg== dependencies: inherits "~2.0.1" @@ -6095,7 +6166,7 @@ stream-browserify@^2.0.1: stream-http@3.1.1: version "3.1.1" - resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-3.1.1.tgz#0370a8017cf8d050b9a8554afe608f043eaff564" + resolved "https://registry.npmjs.org/stream-http/-/stream-http-3.1.1.tgz" integrity sha512-S7OqaYu0EkFpgeGFb/NPOoPLxFko7TPqtEeFg5DXPB4v/KETHG0Ln6fRFrNezoelpaDKmycEmmZ81cC9DAwgYg== dependencies: builtin-status-codes "^3.0.0" @@ -6105,7 +6176,7 @@ stream-http@3.1.1: stream-http@^2.7.2: version "2.8.3" - resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc" + resolved "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz" integrity sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw== dependencies: builtin-status-codes "^3.0.0" @@ -6116,24 +6187,24 @@ stream-http@^2.7.2: stream-parser@^0.3.1: version "0.3.1" - resolved "https://registry.yarnpkg.com/stream-parser/-/stream-parser-0.3.1.tgz#1618548694420021a1182ff0af1911c129761773" + resolved "https://registry.npmjs.org/stream-parser/-/stream-parser-0.3.1.tgz" integrity sha1-FhhUhpRCACGhGC/wrxkRwSl2F3M= dependencies: debug "2" string-argv@0.3.1: version "0.3.1" - resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.1.tgz#95e2fbec0427ae19184935f816d74aaa4c5c19da" + resolved "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz" integrity sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg== string-hash@1.1.3: version "1.1.3" - resolved "https://registry.yarnpkg.com/string-hash/-/string-hash-1.1.3.tgz#e8aafc0ac1855b4666929ed7dd1275df5d6c811b" + resolved "https://registry.npmjs.org/string-hash/-/string-hash-1.1.3.tgz" integrity sha1-6Kr8CsGFW0Zmkp7X3RJ1311sgRs= string-width@^1.0.1: version "1.0.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + resolved "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz" integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= dependencies: code-point-at "^1.0.0" @@ -6142,7 +6213,7 @@ string-width@^1.0.1: "string-width@^1.0.2 || 2": version "2.1.1" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + resolved "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz" integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== dependencies: is-fullwidth-code-point "^2.0.0" @@ -6150,7 +6221,7 @@ string-width@^1.0.1: 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" + resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz" integrity sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA== dependencies: emoji-regex "^8.0.0" @@ -6159,7 +6230,7 @@ string-width@^4.1.0, string-width@^4.2.0: 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" + resolved "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.5.tgz" integrity sha512-Z5ZaXO0svs0M2xd/6By3qpeKpLKd9mO4v4q3oMEQrk8Ck4xOD5d5XeBOOjGrmVZZ/AHB1S0CgG4N5r1G9N3E2Q== dependencies: call-bind "^1.0.2" @@ -6173,7 +6244,7 @@ string.prototype.matchall@^4.0.5: 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" + resolved "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz" integrity sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A== dependencies: call-bind "^1.0.2" @@ -6181,7 +6252,7 @@ string.prototype.trimend@^1.0.4: 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" + resolved "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz" integrity sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw== dependencies: call-bind "^1.0.2" @@ -6189,21 +6260,21 @@ string.prototype.trimstart@^1.0.4: string_decoder@1.3.0, string_decoder@^1.0.0, string_decoder@^1.1.1: version "1.3.0" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== dependencies: safe-buffer "~5.2.0" string_decoder@~1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== dependencies: safe-buffer "~5.1.0" stringify-object@^3.3.0: version "3.3.0" - resolved "https://registry.yarnpkg.com/stringify-object/-/stringify-object-3.3.0.tgz#703065aefca19300d3ce88af4f5b3956d7556629" + resolved "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz" integrity sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw== dependencies: get-own-enumerable-property-symbols "^3.0.0" @@ -6212,33 +6283,33 @@ stringify-object@^3.3.0: strip-ansi@6.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" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz" integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== dependencies: ansi-regex "^5.0.0" strip-ansi@^3.0.0, strip-ansi@^3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz" integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= dependencies: ansi-regex "^2.0.0" strip-ansi@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz" integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= dependencies: ansi-regex "^3.0.0" strip-bom@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz" integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= strip-comments@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/strip-comments/-/strip-comments-1.0.2.tgz#82b9c45e7f05873bee53f37168af930aa368679d" + resolved "https://registry.npmjs.org/strip-comments/-/strip-comments-1.0.2.tgz" integrity sha512-kL97alc47hoyIQSV165tTt9rG5dn4w1dNnBhOQ3bOU1Nc1hel09jnXANaHJ7vzHLd4Ju8kseDGzlev96pghLFw== dependencies: babel-extract-comments "^1.0.0" @@ -6246,17 +6317,17 @@ strip-comments@^1.0.2: 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" + resolved "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz" integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== 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" + resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== strtok3@^6.2.4: version "6.2.4" - resolved "https://registry.yarnpkg.com/strtok3/-/strtok3-6.2.4.tgz#302aea64c0fa25d12a0385069ba66253fdc38a81" + resolved "https://registry.npmjs.org/strtok3/-/strtok3-6.2.4.tgz" integrity sha512-GO8IcFF9GmFDvqduIspUBwCzCbqzegyVKIsSymcMgiZKeCfrN9SowtUoi8+b59WZMAjIzVZic/Ft97+pynR3Iw== dependencies: "@tokenizer/token" "^0.3.0" @@ -6264,7 +6335,7 @@ strtok3@^6.2.4: styled-components@^5.2.0: version "5.3.1" - resolved "https://registry.yarnpkg.com/styled-components/-/styled-components-5.3.1.tgz#8a86dcd31bff7049c2ed408bae36fa23f03f071a" + resolved "https://registry.npmjs.org/styled-components/-/styled-components-5.3.1.tgz" integrity sha512-JThv2JRzyH0NOIURrk9iskdxMSAAtCfj/b2Sf1WJaCUsloQkblepy1jaCLX/bYE+mhYo3unmwVSI9I5d9ncSiQ== dependencies: "@babel/helper-module-imports" "^7.0.0" @@ -6280,7 +6351,7 @@ styled-components@^5.2.0: styled-jsx@4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/styled-jsx/-/styled-jsx-4.0.1.tgz#ae3f716eacc0792f7050389de88add6d5245b9e9" + resolved "https://registry.npmjs.org/styled-jsx/-/styled-jsx-4.0.1.tgz" integrity sha512-Gcb49/dRB1k8B4hdK8vhW27Rlb2zujCk1fISrizCcToIs+55B4vmUM0N9Gi4nnVfFZWe55jRdWpAqH1ldAKWvQ== dependencies: "@babel/plugin-syntax-jsx" "7.14.5" @@ -6294,55 +6365,55 @@ styled-jsx@4.0.1: stylis-rule-sheet@0.0.10: version "0.0.10" - resolved "https://registry.yarnpkg.com/stylis-rule-sheet/-/stylis-rule-sheet-0.0.10.tgz#44e64a2b076643f4b52e5ff71efc04d8c3c4a430" + resolved "https://registry.npmjs.org/stylis-rule-sheet/-/stylis-rule-sheet-0.0.10.tgz" integrity sha512-nTbZoaqoBnmK+ptANthb10ZRZOGC+EmTLLUxeYIuHNkEKcmKgXX1XWKkUBT2Ac4es3NybooPe0SmvKdhKJZAuw== stylis@3.5.4: version "3.5.4" - resolved "https://registry.yarnpkg.com/stylis/-/stylis-3.5.4.tgz#f665f25f5e299cf3d64654ab949a57c768b73fbe" + resolved "https://registry.npmjs.org/stylis/-/stylis-3.5.4.tgz" integrity sha512-8/3pSmthWM7lsPBKv7NXkzn2Uc9W7NotcwGNpJaa3k7WMM1XDCA4MgT5k/8BIexd5ydZdboXtU90XH9Ec4Bv/Q== stylis@^4.0.3: version "4.0.10" - resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.0.10.tgz#446512d1097197ab3f02fb3c258358c3f7a14240" + resolved "https://registry.npmjs.org/stylis/-/stylis-4.0.10.tgz" integrity sha512-m3k+dk7QeJw660eIKRRn3xPF6uuvHs/FFzjX3HQ5ove0qYsiygoAhwn5a3IYKaZPo5LrYD0rfVmtv1gNY1uYwg== supports-color@^5.3.0, supports-color@^5.5.0: version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== dependencies: has-flag "^3.0.0" supports-color@^6.1.0: version "6.1.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz" integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ== dependencies: has-flag "^3.0.0" supports-color@^7.1.0: version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== 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" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz" integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== dependencies: has-flag "^4.0.0" synchronous-promise@^2.0.13: version "2.0.15" - resolved "https://registry.yarnpkg.com/synchronous-promise/-/synchronous-promise-2.0.15.tgz#07ca1822b9de0001f5ff73595f3d08c4f720eb8e" + resolved "https://registry.npmjs.org/synchronous-promise/-/synchronous-promise-2.0.15.tgz" integrity sha512-k8uzYIkIVwmT+TcglpdN50pS2y1BDcUnBPK9iJeGu0Pl1lOI8pD6wtzgw91Pjpe+RxtTncw32tLxs/R0yNL2Mg== table@^6.0.9: version "6.7.1" - resolved "https://registry.yarnpkg.com/table/-/table-6.7.1.tgz#ee05592b7143831a8c94f3cee6aae4c1ccef33e2" + resolved "https://registry.npmjs.org/table/-/table-6.7.1.tgz" integrity sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg== dependencies: ajv "^8.0.1" @@ -6354,12 +6425,12 @@ table@^6.0.9: temp-dir@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-1.0.0.tgz#0a7c0ea26d3a39afa7e0ebea9c1fc0bc4daa011d" + resolved "https://registry.npmjs.org/temp-dir/-/temp-dir-1.0.0.tgz" integrity sha1-CnwOom06Oa+n4OvqnB/AvE2qAR0= tempy@^0.3.0: version "0.3.0" - resolved "https://registry.yarnpkg.com/tempy/-/tempy-0.3.0.tgz#6f6c5b295695a16130996ad5ab01a8bd726e8bf8" + resolved "https://registry.npmjs.org/tempy/-/tempy-0.3.0.tgz" integrity sha512-WrH/pui8YCwmeiAoxV+lpRH9HpRtgBhSR2ViBPgpGb/wnYDzp21R4MN45fsCGvLROvY67o3byhJRYRONJyImVQ== dependencies: temp-dir "^1.0.0" @@ -6368,7 +6439,7 @@ tempy@^0.3.0: terser@^4.6.2: version "4.8.0" - resolved "https://registry.yarnpkg.com/terser/-/terser-4.8.0.tgz#63056343d7c70bb29f3af665865a46fe03a0df17" + resolved "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz" integrity sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw== dependencies: commander "^2.20.0" @@ -6377,51 +6448,51 @@ terser@^4.6.2: text-table@^0.2.0: version "0.2.0" - resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= through@^2.3.8, through@~2.3.4: version "2.3.8" - resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + resolved "https://registry.npmjs.org/through/-/through-2.3.8.tgz" integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= timers-browserify@2.0.12, timers-browserify@^2.0.4: version "2.0.12" - resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.12.tgz#44a45c11fbf407f34f97bccd1577c652361b00ee" + resolved "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz" integrity sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ== dependencies: setimmediate "^1.0.4" tiny-warning@^1.0.2: version "1.0.3" - resolved "https://registry.yarnpkg.com/tiny-warning/-/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754" + resolved "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz" integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA== to-arraybuffer@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" + resolved "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz" integrity sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M= 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" + resolved "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz" integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= to-regex-range@^5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== dependencies: is-number "^7.0.0" toidentifier@1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" + resolved "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz" integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== token-types@^4.1.1: version "4.1.1" - resolved "https://registry.yarnpkg.com/token-types/-/token-types-4.1.1.tgz#ef9e8c8e2e0ded9f1b3f8dbaa46a3228b113ba1a" + resolved "https://registry.npmjs.org/token-types/-/token-types-4.1.1.tgz" integrity sha512-hD+QyuUAyI2spzsI0B7gf/jJ2ggR4RjkAo37j3StuePhApJUwcWDjnHDOFdIWYSwNR28H14hpwm4EI+V1Ted1w== dependencies: "@tokenizer/token" "^0.3.0" @@ -6429,29 +6500,29 @@ token-types@^4.1.1: toposort@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/toposort/-/toposort-2.0.2.tgz#ae21768175d1559d48bef35420b2f4962f09c330" + resolved "https://registry.npmjs.org/toposort/-/toposort-2.0.2.tgz" integrity sha1-riF2gXXRVZ1IvvNUILL0li8JwzA= tr46@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09" + resolved "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz" integrity sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk= dependencies: punycode "^2.1.0" tryer@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/tryer/-/tryer-1.0.1.tgz#f2c85406800b9b0f74c9f7465b81eaad241252f8" + resolved "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz" integrity sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA== ts-pnp@^1.1.6: version "1.2.0" - resolved "https://registry.yarnpkg.com/ts-pnp/-/ts-pnp-1.2.0.tgz#a500ad084b0798f1c3071af391e65912c86bca92" + resolved "https://registry.npmjs.org/ts-pnp/-/ts-pnp-1.2.0.tgz" integrity sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw== tsconfig-paths@^3.11.0: version "3.11.0" - resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.11.0.tgz#954c1fe973da6339c78e06b03ce2e48810b65f36" + resolved "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.11.0.tgz" integrity sha512-7ecdYDnIdmv639mmDwslG6KQg1Z9STTz1j7Gcz0xa+nshh/gKDAHcPxRbWOsA3SPp0tXP2leTcY9Kw+NAkfZzA== dependencies: "@types/json5" "^0.0.29" @@ -6461,61 +6532,61 @@ tsconfig-paths@^3.11.0: tslib@^1.10.0, tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3: version "1.14.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== tslib@^2.0.3: version "2.3.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01" + resolved "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz" integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw== tsutils@^3.21.0: version "3.21.0" - resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" + resolved "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz" integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== dependencies: tslib "^1.8.1" tty-browserify@0.0.0: version "0.0.0" - resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" + resolved "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz" integrity sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY= tty-browserify@0.0.1: version "0.0.1" - resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.1.tgz#3f05251ee17904dfd0677546670db9651682b811" + resolved "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz" integrity sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw== type-check@^0.4.0, type-check@~0.4.0: version "0.4.0" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + resolved "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz" integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== dependencies: prelude-ls "^1.2.1" type-fest@^0.20.2: version "0.20.2" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz" integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== type-fest@^0.21.3: version "0.21.3" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz" integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== type-fest@^0.3.1: version "0.3.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.3.1.tgz#63d00d204e059474fe5e1b7c011112bbd1dc29e1" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz" integrity sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ== type-fest@^0.7.1: version "0.7.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.7.1.tgz#8dda65feaf03ed78f0a3f9678f1869147f7c5c48" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz" integrity sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg== type-is@~1.6.17, type-is@~1.6.18: version "1.6.18" - resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" + resolved "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz" integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== dependencies: media-typer "0.3.0" @@ -6523,12 +6594,12 @@ type-is@~1.6.17, type-is@~1.6.18: typescript@^4.1.3: version "4.4.2" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.4.2.tgz#6d618640d430e3569a1dfb44f7d7e600ced3ee86" + resolved "https://registry.npmjs.org/typescript/-/typescript-4.4.2.tgz" integrity sha512-gzP+t5W4hdy4c+68bfcv0t400HVJMMd2+H9B7gae1nQlBzCqvrXX+6GL/b3GAgyTH966pzrZ70/fRjwAtZksSQ== unbox-primitive@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.1.tgz#085e215625ec3162574dc8859abee78a59b14471" + resolved "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz" integrity sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw== dependencies: function-bind "^1.1.1" @@ -6538,7 +6609,7 @@ unbox-primitive@^1.0.1: uncontrollable@^7.2.1: version "7.2.1" - resolved "https://registry.yarnpkg.com/uncontrollable/-/uncontrollable-7.2.1.tgz#1fa70ba0c57a14d5f78905d533cf63916dc75738" + resolved "https://registry.npmjs.org/uncontrollable/-/uncontrollable-7.2.1.tgz" integrity sha512-svtcfoTADIB0nT9nltgjujTi7BzVmwjZClOmskKu/E8FW9BXzg9os8OLr4f8Dlnk0rYWJIWr4wv9eKUXiQvQwQ== dependencies: "@babel/runtime" "^7.6.3" @@ -6548,12 +6619,12 @@ uncontrollable@^7.2.1: unicode-canonical-property-names-ecmascript@^1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818" + resolved "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz" integrity sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ== unicode-match-property-ecmascript@^1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz#8ed2a32569961bce9227d09cd3ffbb8fed5f020c" + resolved "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz" integrity sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg== dependencies: unicode-canonical-property-names-ecmascript "^1.0.4" @@ -6561,51 +6632,51 @@ unicode-match-property-ecmascript@^1.0.4: unicode-match-property-value-ecmascript@^1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz#0d91f600eeeb3096aa962b1d6fc88876e64ea531" + resolved "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz" integrity sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ== unicode-property-aliases-ecmascript@^1.0.4: version "1.1.0" - resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz#dd57a99f6207bedff4628abefb94c50db941c8f4" + resolved "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz" integrity sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg== unique-string@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-1.0.0.tgz#9e1057cca851abb93398f8b33ae187b99caec11a" + resolved "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz" integrity sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo= dependencies: crypto-random-string "^1.0.0" universalify@^0.1.0: version "0.1.2" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" + resolved "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz" integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + resolved "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= upath@^1.1.2, upath@^1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" + resolved "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz" integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== update-input-width@^1.2.2: version "1.2.2" - resolved "https://registry.yarnpkg.com/update-input-width/-/update-input-width-1.2.2.tgz#9a6a35858ae8e66fbfe0304437b23a4934fc7d37" + resolved "https://registry.npmjs.org/update-input-width/-/update-input-width-1.2.2.tgz" integrity sha512-6QwD9ZVSXb96PxOZ01DU0DJTPwQGY7qBYgdniZKJN02Xzom2m+9J6EPxMbefskqtj4x78qbe5psDSALq9iNEYg== uri-js@^4.2.2: version "4.4.1" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz" integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== dependencies: punycode "^2.1.0" url@^0.11.0: version "0.11.0" - resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" + resolved "https://registry.npmjs.org/url/-/url-0.11.0.tgz" integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE= dependencies: punycode "1.3.2" @@ -6613,26 +6684,26 @@ url@^0.11.0: use-subscription@1.5.1: version "1.5.1" - resolved "https://registry.yarnpkg.com/use-subscription/-/use-subscription-1.5.1.tgz#73501107f02fad84c6dd57965beb0b75c68c42d1" + resolved "https://registry.npmjs.org/use-subscription/-/use-subscription-1.5.1.tgz" integrity sha512-Xv2a1P/yReAjAbhylMfFplFKj9GssgTwN7RlcTxBujFQcloStWNDQdc4g4NRWH9xS4i/FDk04vQBptAXoF3VcA== dependencies: object-assign "^4.1.1" util-deprecate@^1.0.1, util-deprecate@~1.0.1: version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= util@0.10.3: version "0.10.3" - resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" + resolved "https://registry.npmjs.org/util/-/util-0.10.3.tgz" integrity sha1-evsa/lCAUkZInj23/g7TeTNqwPk= dependencies: inherits "2.0.1" util@0.12.4, util@^0.12.0: version "0.12.4" - resolved "https://registry.yarnpkg.com/util/-/util-0.12.4.tgz#66121a31420df8f01ca0c464be15dfa1d1850253" + resolved "https://registry.npmjs.org/util/-/util-0.12.4.tgz" integrity sha512-bxZ9qtSlGUWSOy9Qa9Xgk11kSslpuZwaxCg4sNIDj6FLucDab2JxnHwyNTCpHMtK1MjoQiWQ6DiUMZYbSrO+Sw== dependencies: inherits "^2.0.3" @@ -6644,24 +6715,24 @@ util@0.12.4, util@^0.12.0: util@^0.11.0: version "0.11.1" - resolved "https://registry.yarnpkg.com/util/-/util-0.11.1.tgz#3236733720ec64bb27f6e26f421aaa2e1b588d61" + resolved "https://registry.npmjs.org/util/-/util-0.11.1.tgz" integrity sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ== dependencies: inherits "2.0.3" utils-merge@1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + resolved "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz" integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= 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" + resolved "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz" integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== 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" + resolved "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz" integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== dependencies: spdx-correct "^3.0.0" @@ -6669,24 +6740,24 @@ validate-npm-package-license@^3.0.1: vary@~1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + resolved "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz" integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= vm-browserify@1.1.2, vm-browserify@^1.0.1: version "1.1.2" - resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" + resolved "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz" integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== -warning@^4.0.0, warning@^4.0.3: +warning@^4.0.0, warning@^4.0.2, warning@^4.0.3: version "4.0.3" - resolved "https://registry.yarnpkg.com/warning/-/warning-4.0.3.tgz#16e9e077eb8a86d6af7d64aa1e05fd85b4678ca3" + resolved "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz" integrity sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w== dependencies: loose-envify "^1.0.0" watchpack@2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.1.1.tgz#e99630550fca07df9f90a06056987baa40a689c7" + resolved "https://registry.npmjs.org/watchpack/-/watchpack-2.1.1.tgz" integrity sha512-Oo7LXCmc1eE1AjyuSBmtC3+Wy4HcV8PxWh2kP6fOl8yTlNS7r0K9l1ao2lrrUza7V39Y3D/BbJgY8VeSlc5JKw== dependencies: glob-to-regexp "^0.4.1" @@ -6694,12 +6765,12 @@ watchpack@2.1.1: webidl-conversions@^4.0.2: version "4.0.2" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" + resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz" integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== webpack-bundle-analyzer@3.6.1: version "3.6.1" - resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-3.6.1.tgz#bdb637c2304424f2fbff9a950c7be42a839ae73b" + resolved "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-3.6.1.tgz" integrity sha512-Nfd8HDwfSx1xBwC+P8QMGvHAOITxNBSvu/J/mCJvOwv+G4VWkU7zir9SSenTtyCi0LnVtmsc7G5SZo1uV+bxRw== dependencies: acorn "^7.1.1" @@ -6718,7 +6789,7 @@ webpack-bundle-analyzer@3.6.1: webpack-sources@^1.3.0: version "1.4.3" - resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.4.3.tgz#eedd8ec0b928fbf1cbfe994e22d2d890f330a933" + resolved "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz" integrity sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ== dependencies: source-list-map "^2.0.0" @@ -6726,7 +6797,7 @@ webpack-sources@^1.3.0: whatwg-url@^7.0.0: version "7.1.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-7.1.0.tgz#c2c492f1eca612988efd3d2266be1b9fc6170d06" + resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz" integrity sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg== dependencies: lodash.sortby "^4.7.0" @@ -6735,7 +6806,7 @@ whatwg-url@^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" + resolved "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz" integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== dependencies: is-bigint "^1.0.1" @@ -6746,7 +6817,7 @@ which-boxed-primitive@^1.0.2: which-typed-array@^1.1.2: version "1.1.7" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.7.tgz#2761799b9a22d4b8660b3c1b40abaa7739691793" + resolved "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.7.tgz" integrity sha512-vjxaB4nfDqwKI0ws7wZpxIlde1XrLX5uB0ZjpfshgmapJMD7jJWhZI+yToJTqaFByF0eNBcYxbjmCzoRP7CfEw== dependencies: available-typed-arrays "^1.0.5" @@ -6758,40 +6829,40 @@ which-typed-array@^1.1.2: which@^2.0.1: version "2.0.2" - resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== dependencies: isexe "^2.0.0" wide-align@^1.1.0: version "1.1.3" - resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" + resolved "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz" integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== dependencies: string-width "^1.0.2 || 2" word-wrap@^1.2.3: version "1.2.3" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" + resolved "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz" integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== workbox-background-sync@^5.1.4: version "5.1.4" - resolved "https://registry.yarnpkg.com/workbox-background-sync/-/workbox-background-sync-5.1.4.tgz#5ae0bbd455f4e9c319e8d827c055bb86c894fd12" + resolved "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-5.1.4.tgz" integrity sha512-AH6x5pYq4vwQvfRDWH+vfOePfPIYQ00nCEB7dJRU1e0n9+9HMRyvI63FlDvtFT2AvXVRsXvUt7DNMEToyJLpSA== dependencies: workbox-core "^5.1.4" workbox-broadcast-update@^5.1.4: version "5.1.4" - resolved "https://registry.yarnpkg.com/workbox-broadcast-update/-/workbox-broadcast-update-5.1.4.tgz#0eeb89170ddca7f6914fa3523fb14462891f2cfc" + resolved "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-5.1.4.tgz" integrity sha512-HTyTWkqXvHRuqY73XrwvXPud/FN6x3ROzkfFPsRjtw/kGZuZkPzfeH531qdUGfhtwjmtO/ZzXcWErqVzJNdXaA== dependencies: workbox-core "^5.1.4" workbox-build@^5.1.4: version "5.1.4" - resolved "https://registry.yarnpkg.com/workbox-build/-/workbox-build-5.1.4.tgz#23d17ed5c32060c363030c8823b39d0eabf4c8c7" + resolved "https://registry.npmjs.org/workbox-build/-/workbox-build-5.1.4.tgz" integrity sha512-xUcZn6SYU8usjOlfLb9Y2/f86Gdo+fy1fXgH8tJHjxgpo53VVsqRX0lUDw8/JuyzNmXuo8vXX14pXX2oIm9Bow== dependencies: "@babel/core" "^7.8.4" @@ -6833,31 +6904,31 @@ workbox-build@^5.1.4: workbox-cacheable-response@6.3.0: version "6.3.0" - resolved "https://registry.yarnpkg.com/workbox-cacheable-response/-/workbox-cacheable-response-6.3.0.tgz#9900980035ab8f70f2582711299d3c0ce09d9419" + resolved "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-6.3.0.tgz" integrity sha512-oYCRGF6PFEmJJkktdxYw/tcrU8N5u/2ihxVSHd+9sNqjNMDiXLqsewcEG544f1yx7gq5/u6VcvUA5N62KzN1GQ== dependencies: workbox-core "6.3.0" workbox-cacheable-response@^5.1.4: version "5.1.4" - resolved "https://registry.yarnpkg.com/workbox-cacheable-response/-/workbox-cacheable-response-5.1.4.tgz#9ff26e1366214bdd05cf5a43da9305b274078a54" + resolved "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-5.1.4.tgz" integrity sha512-0bfvMZs0Of1S5cdswfQK0BXt6ulU5kVD4lwer2CeI+03czHprXR3V4Y8lPTooamn7eHP8Iywi5QjyAMjw0qauA== dependencies: workbox-core "^5.1.4" workbox-core@6.3.0: version "6.3.0" - resolved "https://registry.yarnpkg.com/workbox-core/-/workbox-core-6.3.0.tgz#a7d82bae6f623f342e04028a0a2cef39af71af55" + resolved "https://registry.npmjs.org/workbox-core/-/workbox-core-6.3.0.tgz" integrity sha512-SufToEV3SOLwwz3j+P4pgkfpzLRUlR17sX3p/LrMHP/brYKvJQqjTwtSvaCkkAX0RPHX2TFHmN8xhPP1bpmomg== workbox-core@^5.1.4: version "5.1.4" - resolved "https://registry.yarnpkg.com/workbox-core/-/workbox-core-5.1.4.tgz#8bbfb2362ecdff30e25d123c82c79ac65d9264f4" + resolved "https://registry.npmjs.org/workbox-core/-/workbox-core-5.1.4.tgz" integrity sha512-+4iRQan/1D8I81nR2L5vcbaaFskZC2CL17TLbvWVzQ4qiF/ytOGF6XeV54pVxAvKUtkLANhk8TyIUMtiMw2oDg== workbox-expiration@6.3.0: version "6.3.0" - resolved "https://registry.yarnpkg.com/workbox-expiration/-/workbox-expiration-6.3.0.tgz#1d36c456f9282c39cda6b59a32b99732da7c3535" + resolved "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-6.3.0.tgz" integrity sha512-teYuYfM3HFbwAD/nlZDw/dCMOrCKjsAiMRhz0uOy9IkfBb7vBynO3xf118lY62X6BfqjZdeahiHh10N0/aYICg== dependencies: idb "^6.0.0" @@ -6865,14 +6936,14 @@ workbox-expiration@6.3.0: workbox-expiration@^5.1.4: version "5.1.4" - resolved "https://registry.yarnpkg.com/workbox-expiration/-/workbox-expiration-5.1.4.tgz#92b5df461e8126114943a3b15c55e4ecb920b163" + resolved "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-5.1.4.tgz" integrity sha512-oDO/5iC65h2Eq7jctAv858W2+CeRW5e0jZBMNRXpzp0ZPvuT6GblUiHnAsC5W5lANs1QS9atVOm4ifrBiYY7AQ== dependencies: workbox-core "^5.1.4" workbox-google-analytics@^5.1.4: version "5.1.4" - resolved "https://registry.yarnpkg.com/workbox-google-analytics/-/workbox-google-analytics-5.1.4.tgz#b3376806b1ac7d7df8418304d379707195fa8517" + resolved "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-5.1.4.tgz" integrity sha512-0IFhKoEVrreHpKgcOoddV+oIaVXBFKXUzJVBI+nb0bxmcwYuZMdteBTp8AEDJacENtc9xbR0wa9RDCnYsCDLjA== dependencies: workbox-background-sync "^5.1.4" @@ -6882,14 +6953,14 @@ workbox-google-analytics@^5.1.4: workbox-navigation-preload@^5.1.4: version "5.1.4" - resolved "https://registry.yarnpkg.com/workbox-navigation-preload/-/workbox-navigation-preload-5.1.4.tgz#30d1b720d26a05efc5fa11503e5cc1ed5a78902a" + resolved "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-5.1.4.tgz" integrity sha512-Wf03osvK0wTflAfKXba//QmWC5BIaIZARU03JIhAEO2wSB2BDROWI8Q/zmianf54kdV7e1eLaIEZhth4K4MyfQ== dependencies: workbox-core "^5.1.4" workbox-precaching@6.3.0, workbox-precaching@^6.1.5: version "6.3.0" - resolved "https://registry.yarnpkg.com/workbox-precaching/-/workbox-precaching-6.3.0.tgz#5dc34161ef03ef3cc23af6d78f0b1583f3d180d0" + resolved "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-6.3.0.tgz" integrity sha512-bND3rUxiuzFmDfeKywdvOqK0LQ5LLbOPk0eX22PlMQNOOduHRxzglMpgHo/MR6h+8cPJ3GpxT8hZ895/7bHMqQ== dependencies: workbox-core "6.3.0" @@ -6898,21 +6969,21 @@ workbox-precaching@6.3.0, workbox-precaching@^6.1.5: workbox-precaching@^5.1.4: version "5.1.4" - resolved "https://registry.yarnpkg.com/workbox-precaching/-/workbox-precaching-5.1.4.tgz#874f7ebdd750dd3e04249efae9a1b3f48285fe6b" + resolved "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-5.1.4.tgz" integrity sha512-gCIFrBXmVQLFwvAzuGLCmkUYGVhBb7D1k/IL7pUJUO5xacjLcFUaLnnsoVepBGAiKw34HU1y/YuqvTKim9qAZA== dependencies: workbox-core "^5.1.4" workbox-range-requests@^5.1.4: version "5.1.4" - resolved "https://registry.yarnpkg.com/workbox-range-requests/-/workbox-range-requests-5.1.4.tgz#7066a12c121df65bf76fdf2b0868016aa2bab859" + resolved "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-5.1.4.tgz" integrity sha512-1HSujLjgTeoxHrMR2muDW2dKdxqCGMc1KbeyGcmjZZAizJTFwu7CWLDmLv6O1ceWYrhfuLFJO+umYMddk2XMhw== dependencies: workbox-core "^5.1.4" workbox-recipes@^6.1.5: version "6.3.0" - resolved "https://registry.yarnpkg.com/workbox-recipes/-/workbox-recipes-6.3.0.tgz#16926f0ff3bc07ddef30bc19a68bacc339d023a3" + resolved "https://registry.npmjs.org/workbox-recipes/-/workbox-recipes-6.3.0.tgz" integrity sha512-f0AZyxd48E4t+PV+ifgIf8WodfJqRj8/E0t+PwppDIdTPyD59cIh0HZBtgPKFdIMVnltodpMz4zioxym1H3GjQ== dependencies: workbox-cacheable-response "6.3.0" @@ -6924,28 +6995,28 @@ workbox-recipes@^6.1.5: workbox-routing@6.3.0, workbox-routing@^6.1.5: version "6.3.0" - resolved "https://registry.yarnpkg.com/workbox-routing/-/workbox-routing-6.3.0.tgz#d21d39883baf66594fd8365af5c72aff44fc98b5" + resolved "https://registry.npmjs.org/workbox-routing/-/workbox-routing-6.3.0.tgz" integrity sha512-asajX5UPkaoU4PB9pEpxKWKkcpA+KJQUEeYU6NlK0rXTCpdWQ6iieMRDoBTZBjTzUdL3j3s1Zo2qCOSvtXSYGg== dependencies: workbox-core "6.3.0" workbox-routing@^5.1.4: version "5.1.4" - resolved "https://registry.yarnpkg.com/workbox-routing/-/workbox-routing-5.1.4.tgz#3e8cd86bd3b6573488d1a2ce7385e547b547e970" + resolved "https://registry.npmjs.org/workbox-routing/-/workbox-routing-5.1.4.tgz" integrity sha512-8ljknRfqE1vEQtnMtzfksL+UXO822jJlHTIR7+BtJuxQ17+WPZfsHqvk1ynR/v0EHik4x2+826Hkwpgh4GKDCw== dependencies: workbox-core "^5.1.4" workbox-strategies@6.3.0, workbox-strategies@^6.1.5: version "6.3.0" - resolved "https://registry.yarnpkg.com/workbox-strategies/-/workbox-strategies-6.3.0.tgz#1d004f42b309cbfa48812c6cc7a8da6458b928c6" + resolved "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-6.3.0.tgz" integrity sha512-SYZt40y+Iu5nA+UEPQOrAuAMMNTxtUBPLCIaMMb4lcADpBYrNP1CD+/s2QsrxzS651a8hfi06REKt+uTp1tqfw== dependencies: workbox-core "6.3.0" workbox-strategies@^5.1.4: version "5.1.4" - resolved "https://registry.yarnpkg.com/workbox-strategies/-/workbox-strategies-5.1.4.tgz#96b1418ccdfde5354612914964074d466c52d08c" + resolved "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-5.1.4.tgz" integrity sha512-VVS57LpaJTdjW3RgZvPwX0NlhNmscR7OQ9bP+N/34cYMDzXLyA6kqWffP6QKXSkca1OFo/v6v7hW7zrrguo6EA== dependencies: workbox-core "^5.1.4" @@ -6953,7 +7024,7 @@ workbox-strategies@^5.1.4: workbox-streams@^5.1.4: version "5.1.4" - resolved "https://registry.yarnpkg.com/workbox-streams/-/workbox-streams-5.1.4.tgz#05754e5e3667bdc078df2c9315b3f41210d8cac0" + resolved "https://registry.npmjs.org/workbox-streams/-/workbox-streams-5.1.4.tgz" integrity sha512-xU8yuF1hI/XcVhJUAfbQLa1guQUhdLMPQJkdT0kn6HP5CwiPOGiXnSFq80rAG4b1kJUChQQIGPrq439FQUNVrw== dependencies: workbox-core "^5.1.4" @@ -6961,12 +7032,12 @@ workbox-streams@^5.1.4: workbox-sw@^5.1.4: version "5.1.4" - resolved "https://registry.yarnpkg.com/workbox-sw/-/workbox-sw-5.1.4.tgz#2bb34c9f7381f90d84cef644816d45150011d3db" + resolved "https://registry.npmjs.org/workbox-sw/-/workbox-sw-5.1.4.tgz" integrity sha512-9xKnKw95aXwSNc8kk8gki4HU0g0W6KXu+xks7wFuC7h0sembFnTrKtckqZxbSod41TDaGh+gWUA5IRXrL0ECRA== workbox-webpack-plugin@^5.1.4: version "5.1.4" - resolved "https://registry.yarnpkg.com/workbox-webpack-plugin/-/workbox-webpack-plugin-5.1.4.tgz#7bfe8c16e40fe9ed8937080ac7ae9c8bde01e79c" + resolved "https://registry.npmjs.org/workbox-webpack-plugin/-/workbox-webpack-plugin-5.1.4.tgz" integrity sha512-PZafF4HpugZndqISi3rZ4ZK4A4DxO8rAqt2FwRptgsDx7NF8TVKP86/huHquUsRjMGQllsNdn4FNl8CD/UvKmQ== dependencies: "@babel/runtime" "^7.5.5" @@ -6985,7 +7056,7 @@ workbox-window@^5.1.4: workbox-window@^6.1.5: version "6.3.0" - resolved "https://registry.yarnpkg.com/workbox-window/-/workbox-window-6.3.0.tgz#f669a0715363c35e519d1b6d919e04da7ce369ea" + resolved "https://registry.npmjs.org/workbox-window/-/workbox-window-6.3.0.tgz" integrity sha512-CFP84assX9srH/TOx4OD8z4EBPO/Cq4WKdV2YLcJIFJmVTS/cB63XKeidKl2KJk8qOOLVIKnaO7BLmb0MxGFtA== dependencies: "@types/trusted-types" "^2.0.2" @@ -6993,7 +7064,7 @@ workbox-window@^6.1.5: wrap-ansi@^6.2.0: version "6.2.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz" integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== dependencies: ansi-styles "^4.0.0" @@ -7002,7 +7073,7 @@ wrap-ansi@^6.2.0: wrap-ansi@^7.0.0: version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== dependencies: ansi-styles "^4.0.0" @@ -7011,46 +7082,46 @@ wrap-ansi@^7.0.0: wrappy@1: version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= ws@^6.0.0: version "6.2.2" - resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.2.tgz#dd5cdbd57a9979916097652d78f1cc5faea0c32e" + resolved "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz" integrity sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw== dependencies: async-limiter "~1.0.0" xml-js@^1.6.11: version "1.6.11" - resolved "https://registry.yarnpkg.com/xml-js/-/xml-js-1.6.11.tgz#927d2f6947f7f1c19a316dd8eea3614e8b18f8e9" + resolved "https://registry.npmjs.org/xml-js/-/xml-js-1.6.11.tgz" integrity sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g== dependencies: sax "^1.2.4" xtend@^4.0.0, xtend@^4.0.2: version "4.0.2" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + resolved "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz" integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== yallist@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" 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" + resolved "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz" integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== yocto-queue@^0.1.0: version "0.1.0" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== yup@^0.29.3: version "0.29.3" - resolved "https://registry.yarnpkg.com/yup/-/yup-0.29.3.tgz#69a30fd3f1c19f5d9e31b1cf1c2b851ce8045fea" + resolved "https://registry.npmjs.org/yup/-/yup-0.29.3.tgz" integrity sha512-RNUGiZ/sQ37CkhzKFoedkeMfJM0vNQyaz+wRZJzxdKE7VfDeVKH8bb4rr7XhRLbHJz5hSjoDNwMEIaKhuMZ8gQ== dependencies: "@babel/runtime" "^7.10.5" From e25e2e4e433effd868ab3f86ec0b3429c450f61c Mon Sep 17 00:00:00 2001 From: Abhinav Date: Mon, 1 Nov 2021 18:05:27 +0530 Subject: [PATCH 113/147] resize edit button --- src/components/icons/EditIcon.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/icons/EditIcon.tsx b/src/components/icons/EditIcon.tsx index 19a719e14..78c679f88 100644 --- a/src/components/icons/EditIcon.tsx +++ b/src/components/icons/EditIcon.tsx @@ -17,7 +17,7 @@ export default function AddIcon(props) { } AddIcon.defaultProps = { - height: 24, - width: 24, + height: 20, + width: 20, viewBox: '0 0 24 24', }; From 445bc64731f405b383c9c0950d4d9402095a5dd4 Mon Sep 17 00:00:00 2001 From: Abhinav Date: Mon, 1 Nov 2021 18:07:20 +0530 Subject: [PATCH 114/147] update blacnk space added hieght --- src/components/PhotoSwipe/PhotoSwipe.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/PhotoSwipe/PhotoSwipe.tsx b/src/components/PhotoSwipe/PhotoSwipe.tsx index faf319b32..d9bd24f26 100644 --- a/src/components/PhotoSwipe/PhotoSwipe.tsx +++ b/src/components/PhotoSwipe/PhotoSwipe.tsx @@ -149,7 +149,7 @@ function RenderCreationTime({ )} - {isInEditMode &&
} + {isInEditMode &&
} ); } From 45ef18b45101265874b017cdb1010e2d46a0b50a Mon Sep 17 00:00:00 2001 From: Abhinav Date: Mon, 1 Nov 2021 22:19:31 +0530 Subject: [PATCH 115/147] update List key to only active collection so that its re-rendered only on collection change --- src/components/PhotoList.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/PhotoList.tsx b/src/components/PhotoList.tsx index fb64359a6..f5c1d134e 100644 --- a/src/components/PhotoList.tsx +++ b/src/components/PhotoList.tsx @@ -363,7 +363,7 @@ export function PhotoList({ return ( Date: Mon, 1 Nov 2021 23:53:34 +0530 Subject: [PATCH 116/147] adds max and min date limit --- src/components/PhotoSwipe/PhotoSwipe.tsx | 8 +++++++- src/services/fileService.ts | 2 ++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/components/PhotoSwipe/PhotoSwipe.tsx b/src/components/PhotoSwipe/PhotoSwipe.tsx index d9bd24f26..bc3901175 100644 --- a/src/components/PhotoSwipe/PhotoSwipe.tsx +++ b/src/components/PhotoSwipe/PhotoSwipe.tsx @@ -7,7 +7,11 @@ import { addToFavorites, removeFromFavorites, } from 'services/collectionService'; -import { File, updatePublicMagicMetadata } from 'services/fileService'; +import { + File, + MIN_EDITED_CREATION_TIME, + updatePublicMagicMetadata, +} from 'services/fileService'; import constants from 'utils/strings/constants'; import exifr from 'exifr'; import Modal from 'react-bootstrap/Modal'; @@ -125,6 +129,8 @@ function RenderCreationTime({ timeInputLabel="Time:" dateFormat="dd/MM/yyyy h:mm aa" showTimeInput + minDate={new Date(MIN_EDITED_CREATION_TIME)} + maxDate={new Date()} /> ) : ( formatDateTime(pickedTime) diff --git a/src/services/fileService.ts b/src/services/fileService.ts index 9c2c183c1..dbfe8c920 100644 --- a/src/services/fileService.ts +++ b/src/services/fileService.ts @@ -17,6 +17,8 @@ const ENDPOINT = getEndpoint(); const FILES = 'files'; +export const MIN_EDITED_CREATION_TIME = '1800-01-01T00:00:00.000Z'; + export interface fileAttribute { encryptedData?: DataStream | Uint8Array; objectKey?: string; From 8180d471233adfdfb07e69481a4ab8e4f03ed314 Mon Sep 17 00:00:00 2001 From: Abhinav Date: Tue, 2 Nov 2021 00:18:28 +0530 Subject: [PATCH 117/147] update date picker style --- src/components/PhotoSwipe/PhotoSwipe.tsx | 47 +++++++++++++++--------- 1 file changed, 29 insertions(+), 18 deletions(-) diff --git a/src/components/PhotoSwipe/PhotoSwipe.tsx b/src/components/PhotoSwipe/PhotoSwipe.tsx index bc3901175..effc05cd0 100644 --- a/src/components/PhotoSwipe/PhotoSwipe.tsx +++ b/src/components/PhotoSwipe/PhotoSwipe.tsx @@ -28,8 +28,6 @@ import { FormCheck } from 'react-bootstrap'; import { prettyPrintExif } from 'utils/exif'; import EditIcon from 'components/icons/EditIcon'; import { FlexWrapper, Label, Row, Value } from 'components/Container'; -import TickIcon from 'components/icons/TickIcon'; -import CrossIcon from 'components/icons/CrossIcon'; import { logError } from 'utils/sentry'; import DatePicker from 'react-datepicker'; @@ -129,9 +127,34 @@ function RenderCreationTime({ timeInputLabel="Time:" dateFormat="dd/MM/yyyy h:mm aa" showTimeInput + autoFocus + shouldCloseOnSelect={false} + onClickOutside={discardEdits} minDate={new Date(MIN_EDITED_CREATION_TIME)} maxDate={new Date()} - /> + showYearDropdown + showMonthDropdown + withPortal> + + + + + ) : ( formatDateTime(pickedTime) )} @@ -139,23 +162,11 @@ function RenderCreationTime({ - {isInEditMode ? ( - - - - - - - - - ) : ( - - - - )} + + + - {isInEditMode &&
} ); } From a3b6a2860ec3de17aaeacb40969fbeb0912139ef Mon Sep 17 00:00:00 2001 From: Abhinav Date: Tue, 2 Nov 2021 10:23:45 +0530 Subject: [PATCH 118/147] fix save and cancel button container styles --- src/components/PhotoSwipe/PhotoSwipe.tsx | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/components/PhotoSwipe/PhotoSwipe.tsx b/src/components/PhotoSwipe/PhotoSwipe.tsx index effc05cd0..c89f35780 100644 --- a/src/components/PhotoSwipe/PhotoSwipe.tsx +++ b/src/components/PhotoSwipe/PhotoSwipe.tsx @@ -27,7 +27,7 @@ import { import { FormCheck } from 'react-bootstrap'; import { prettyPrintExif } from 'utils/exif'; import EditIcon from 'components/icons/EditIcon'; -import { FlexWrapper, Label, Row, Value } from 'components/Container'; +import { Label, Row, Value } from 'components/Container'; import { logError } from 'utils/sentry'; import DatePicker from 'react-datepicker'; @@ -63,6 +63,12 @@ const Pre = styled.pre` padding: 7px 15px; `; +const ButtonContainer = styled.div` + margin-left: auto; + width: 200px; + padding: 5px 10px; +`; + const ClickWrapper = (props) =>
; const renderInfoItem = (label: string, value: string | JSX.Element) => ( @@ -135,7 +141,7 @@ function RenderCreationTime({ showYearDropdown showMonthDropdown withPortal> - {constants.SAVE} - + ) : ( formatDateTime(pickedTime) From 5b95215e072e84898402b1d77794cd8d506a96d3 Mon Sep 17 00:00:00 2001 From: Abhinav Date: Tue, 2 Nov 2021 11:13:35 +0530 Subject: [PATCH 119/147] mergeMetadata before every setFiles call --- src/pages/gallery/index.tsx | 5 +++-- src/services/fileService.ts | 25 ++++++++++--------------- src/services/trashService.ts | 23 +++++++++++++++-------- 3 files changed, 28 insertions(+), 25 deletions(-) diff --git a/src/pages/gallery/index.tsx b/src/pages/gallery/index.tsx index cc54e0362..2e4106371 100644 --- a/src/pages/gallery/index.tsx +++ b/src/pages/gallery/index.tsx @@ -52,6 +52,7 @@ import { changeFilesVisibility, getSelectedFiles, mergeMetadata, + sortFiles, sortFilesIntoCollections, } from 'utils/file'; import SearchBar, { DateValue } from 'components/SearchBar'; @@ -218,11 +219,11 @@ export default function Gallery() { setPlanModalView(true); } setIsFirstLogin(false); - const files = await getLocalFiles(); + const files = mergeMetadata(await getLocalFiles()); const collections = await getLocalCollections(); const trash = await getLocalTrash(); const trashedFile = getTrashedFiles(trash); - setFiles([...files, ...trashedFile]); + setFiles(sortFiles([...files, ...trashedFile])); setCollections(collections); setTrash(trash); await setDerivativeState(collections, files); diff --git a/src/services/fileService.ts b/src/services/fileService.ts index dbfe8c920..acac21226 100644 --- a/src/services/fileService.ts +++ b/src/services/fileService.ts @@ -10,7 +10,12 @@ import { import { Collection } from './collectionService'; import HTTPService from './HTTPService'; import { logError } from 'utils/sentry'; -import { decryptFile, mergeMetadata, sortFiles } from 'utils/file'; +import { + appendPhotoSwipeProps, + decryptFile, + mergeMetadata, + sortFiles, +} from 'utils/file'; import CryptoWorker from 'utils/crypto'; const ENDPOINT = getEndpoint(); @@ -137,7 +142,7 @@ export const syncFiles = async ( let files = await removeDeletedCollectionFiles(collections, localFiles); if (files.length !== localFiles.length) { await localForage.setItem('files', files); - setFiles(files); + setFiles(sortFiles(mergeMetadata(files))); } for (const collection of collections) { if (!getToken()) { @@ -174,20 +179,10 @@ export const syncFiles = async ( `${collection.id}-time`, collection.updationTime ); - files = sortFiles(mergeMetadata(files)); - setFiles( - files.map((item) => ({ - ...item, - w: window.innerWidth, - h: window.innerHeight, - })) - ); + files = sortFiles(mergeMetadata(appendPhotoSwipeProps(files))); + setFiles(files); } - return files.map((item) => ({ - ...item, - w: window.innerWidth, - h: window.innerHeight, - })); + return mergeMetadata(appendPhotoSwipeProps(files)); }; export const getFiles = async ( diff --git a/src/services/trashService.ts b/src/services/trashService.ts index 5fcdd0e6d..882d6abc1 100644 --- a/src/services/trashService.ts +++ b/src/services/trashService.ts @@ -1,7 +1,12 @@ import { SetFiles } from 'pages/gallery'; import { getEndpoint } from 'utils/common/apiUtil'; import { getToken } from 'utils/common/key'; -import { appendPhotoSwipeProps, decryptFile, sortFiles } from 'utils/file'; +import { + appendPhotoSwipeProps, + decryptFile, + mergeMetadata, + sortFiles, +} from 'utils/file'; import { logError } from 'utils/sentry'; import localForage from 'utils/storage/localForage'; import { Collection, getCollection } from './collectionService'; @@ -161,13 +166,15 @@ function removeRestoredOrDeletedTrashItems(trash: Trash) { } export function getTrashedFiles(trash: Trash) { - return appendPhotoSwipeProps( - trash.map((trashedFile) => ({ - ...trashedFile.file, - updationTime: trashedFile.updatedAt, - isTrashed: true, - deleteBy: trashedFile.deleteBy, - })) + return mergeMetadata( + appendPhotoSwipeProps( + trash.map((trashedFile) => ({ + ...trashedFile.file, + updationTime: trashedFile.updatedAt, + isTrashed: true, + deleteBy: trashedFile.deleteBy, + })) + ) ); } From 19074bd7536ee256fc7fa4cc428ffc2542be2591 Mon Sep 17 00:00:00 2001 From: Abhinav Date: Tue, 2 Nov 2021 11:17:16 +0530 Subject: [PATCH 120/147] remove react-datetime-picker package --- package.json | 1 - yarn.lock | 137 +-------------------------------------------------- 2 files changed, 1 insertion(+), 137 deletions(-) diff --git a/package.json b/package.json index 9b5de3785..f75ed3afb 100644 --- a/package.json +++ b/package.json @@ -45,7 +45,6 @@ "react-burger-menu": "^3.0.4", "react-collapse": "^5.1.0", "react-datepicker": "^4.3.0", - "react-datetime-picker": "^3.4.2", "react-dom": "^17.0.2", "react-dropzone": "^11.2.4", "react-otp-input": "^2.3.1", diff --git a/yarn.lock b/yarn.lock index 9f0209c4b..143b09bb9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1473,13 +1473,6 @@ resolved "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.4.tgz" integrity sha512-rZ5drC/jWjrArrS8BR6SIr4cWpW09RNTYt9AMZo3Jwwif+iacXAqgVjm0B0Bv/S1jhDXKHqRVNCbACkJ89RAnQ== -"@types/react-calendar@^3.0.0": - version "3.4.3" - resolved "https://registry.npmjs.org/@types/react-calendar/-/react-calendar-3.4.3.tgz" - integrity sha512-k56OS9d62/g3OCTepULEpNoClVUKuWxHBBuKS4hX8/qNiNup+Gf1Qn0SXHakbqBGWEfdLK93RlIRy5XOA4+Iaw== - dependencies: - "@types/react" "*" - "@types/react-collapse@^5.0.1": version "5.0.1" resolved "https://registry.npmjs.org/@types/react-collapse/-/react-collapse-5.0.1.tgz" @@ -1697,11 +1690,6 @@ "@typescript-eslint/types" "4.31.0" eslint-visitor-keys "^2.0.0" -"@wojtekmaj/date-utils@^1.0.0", "@wojtekmaj/date-utils@^1.0.2", "@wojtekmaj/date-utils@^1.0.3": - version "1.0.3" - resolved "https://registry.npmjs.org/@wojtekmaj/date-utils/-/date-utils-1.0.3.tgz" - integrity sha512-1VPkkTBk07gMR1fjpBtse4G+oJqpmE+0gUFB0dg3VIL7qJmUVaBoD/vlzMm/jNeOPfvlmerl1lpnsZyBUFIRuw== - accepts@~1.3.7: version "1.3.7" resolved "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz" @@ -2778,11 +2766,6 @@ destroy@~1.0.4: resolved "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz" integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= -detect-element-overflow@^1.2.0: - version "1.2.0" - resolved "https://registry.npmjs.org/detect-element-overflow/-/detect-element-overflow-1.2.0.tgz" - integrity sha512-Jtr9ivYPhpd9OJux+hjL0QjUKiS1Ghgy8tvIufUjFslQgIWvgGr4mn57H190APbKkiOmXnmtMI6ytaKzMusecg== - diffie-hellman@^5.0.0: version "5.0.3" resolved "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz" @@ -3550,13 +3533,6 @@ get-symbol-description@^1.0.0: call-bind "^1.0.2" get-intrinsic "^1.1.1" -get-user-locale@^1.2.0: - version "1.4.0" - resolved "https://registry.npmjs.org/get-user-locale/-/get-user-locale-1.4.0.tgz" - integrity sha512-gQo03lP1OArHLKlnoglqrGGl7b04u2EP9Xutmp72cMdtrrSD7ZgIsCsUKZynYWLDkVJW33Cj3pliP7uP0UonHQ== - dependencies: - lodash.once "^4.1.1" - glob-parent@^5.1.2, glob-parent@~5.1.0: version "5.1.2" resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" @@ -4398,11 +4374,6 @@ lodash.merge@^4.6.2: resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== -lodash.once@^4.1.1: - version "4.1.1" - resolved "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz" - integrity sha1-DdOXEhPHxW34gJd9UEyI+0cal6w= - lodash.sortby@^4.7.0: version "4.7.0" resolved "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz" @@ -4484,11 +4455,6 @@ make-dir@^3.0.2: dependencies: semver "^6.0.0" -make-event-props@^1.1.0: - version "1.3.0" - resolved "https://registry.npmjs.org/make-event-props/-/make-event-props-1.3.0.tgz" - integrity sha512-oWiDZMcVB1/A487251hEWza1xzgCzl6MXxe9aF24l5Bt9N9UEbqTqKumEfuuLhmlhRZYnc+suVvW4vUs8bwO7Q== - md5.js@^1.3.4: version "1.3.5" resolved "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz" @@ -4508,21 +4474,11 @@ media-typer@0.3.0: resolved "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz" integrity sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q== -merge-class-names@^1.1.1: - version "1.4.2" - resolved "https://registry.npmjs.org/merge-class-names/-/merge-class-names-1.4.2.tgz" - integrity sha512-bOl98VzwCGi25Gcn3xKxnR5p/WrhWFQB59MS/aGENcmUc6iSm96yrFDF0XSNurX9qN4LbJm0R9kfvsQ17i8zCw== - merge-descriptors@1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz" integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= -merge-refs@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/merge-refs/-/merge-refs-1.0.0.tgz" - integrity sha512-WZ4S5wqD9FCR9hxkLgvcHJCBxzXzy3VVE6p8W2OzxRzB+hLRlcadGE2bW9xp2KSzk10rvp4y+pwwKO6JQVguMg== - merge-stream@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz" @@ -4605,11 +4561,6 @@ mkdirp@^0.5.1, mkdirp@^0.5.5: dependencies: minimist "^1.2.5" -moment@^2.29.1: - version "2.29.1" - resolved "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz" - integrity sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ== - ms@2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" @@ -5213,7 +5164,7 @@ prop-types-extra@^1.1.0: react-is "^16.3.2" warning "^4.0.0" -prop-types@^15.5.7, prop-types@^15.5.8, prop-types@^15.6.0, prop-types@^15.6.2, prop-types@^15.7.2: +prop-types@^15.5.8, prop-types@^15.6.0, prop-types@^15.6.2, prop-types@^15.7.2: version "15.7.2" resolved "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz" integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ== @@ -5373,46 +5324,11 @@ react-burger-menu@^3.0.4: prop-types "^15.7.2" snapsvg-cjs "0.0.6" -react-calendar@^3.3.1: - version "3.4.0" - resolved "https://registry.npmjs.org/react-calendar/-/react-calendar-3.4.0.tgz" - integrity sha512-ykbvXASArQQ8KZlCEXEdE+w+KFGSj7kDpdTRzbLVJeN26oUIu+EFavFDAqg4G//zTO0tSq5SMfqAa6fjrdGQjQ== - dependencies: - "@wojtekmaj/date-utils" "^1.0.2" - get-user-locale "^1.2.0" - merge-class-names "^1.1.1" - prop-types "^15.6.0" - -react-clock@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/react-clock/-/react-clock-3.0.0.tgz" - integrity sha512-D3K82D3YGcDtzxZCfiACLcDTL8cJXSgpdrzTY9ff3H5vflxlLzTSLF8apZRo6JZzOFrZQvw5mrS7TkQzj9nG0A== - dependencies: - "@wojtekmaj/date-utils" "^1.0.0" - merge-class-names "^1.1.1" - prop-types "^15.6.0" - react-collapse@^5.1.0: version "5.1.0" resolved "https://registry.npmjs.org/react-collapse/-/react-collapse-5.1.0.tgz" integrity sha512-5v0ywsn9HjiR/odNzbRDs0RZfrnbdSippJebWOBCFFDA12Vx8DddrbI4qWVf1P2wTiVagrpcSy07AU0b6+gM9Q== -react-date-picker@^8.3.3: - version "8.3.4" - resolved "https://registry.npmjs.org/react-date-picker/-/react-date-picker-8.3.4.tgz" - integrity sha512-6DdeMjg5ji1W2ZBMADhDhOipZndAey24yQyUIIfMXKOOuehcnmb5MuGuGmdqd4zzMmktyGTIzf51c2E3u2P+7Q== - dependencies: - "@types/react-calendar" "^3.0.0" - "@wojtekmaj/date-utils" "^1.0.3" - get-user-locale "^1.2.0" - make-event-props "^1.1.0" - merge-class-names "^1.1.1" - merge-refs "^1.0.0" - prop-types "^15.6.0" - react-calendar "^3.3.1" - react-fit "^1.0.3" - update-input-width "^1.2.2" - react-datepicker@^4.3.0: version "4.3.0" resolved "https://registry.npmjs.org/react-datepicker/-/react-datepicker-4.3.0.tgz" @@ -5425,29 +5341,6 @@ react-datepicker@^4.3.0: react-onclickoutside "^6.12.0" react-popper "^2.2.5" -react-datetime-picker@^3.4.2: - version "3.4.2" - resolved "https://registry.npmjs.org/react-datetime-picker/-/react-datetime-picker-3.4.2.tgz" - integrity sha512-i/Iw7Qbz8Zl0Bo3rMbHQ1+dnWtImNexF8Nh+bsKxaK6wFTmpE1l8ugTGHDKT8gbZ2DRtzscjSMC/LVz/gIE8DA== - dependencies: - "@wojtekmaj/date-utils" "^1.0.3" - get-user-locale "^1.2.0" - make-event-props "^1.1.0" - merge-class-names "^1.1.1" - prop-types "^15.6.0" - react-calendar "^3.3.1" - react-clock "^3.0.0" - react-date-picker "^8.3.3" - react-fit "^1.0.3" - react-time-picker "^4.4.2" - -react-datetime@^3.1.1: - version "3.1.1" - resolved "https://registry.npmjs.org/react-datetime/-/react-datetime-3.1.1.tgz" - integrity sha512-gHCTjAniCcMb6jdXpz+MpVe/uCeaHNDOofg+l41nLlJI3uBLBMV40CQbGB2TCTUpCzGT1mCs4vQzKGMjXO/WWQ== - dependencies: - prop-types "^15.5.7" - react-dom@^17.0.2: version "17.0.2" resolved "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz" @@ -5476,14 +5369,6 @@ react-fast-compare@^3.0.1: resolved "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.0.tgz" integrity sha512-rtGImPZ0YyLrscKI9xTpV8psd6I8VAtjKCzQDlzyDvqJA8XOW78TXYQwNRNd8g8JZnDu8q9Fu/1v4HPAVwVdHA== -react-fit@^1.0.3: - version "1.3.2" - resolved "https://registry.npmjs.org/react-fit/-/react-fit-1.3.2.tgz" - integrity sha512-Ih/ee8/I/N6EcGZjOqfo/yFq6Q/xuZ62uai21rMyud208ixx8V5xJxuRLIxedLcwNAEtyyEPEJ2Y47qeKljQHA== - dependencies: - detect-element-overflow "^1.2.0" - prop-types "^15.6.0" - react-input-autosize@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/react-input-autosize/-/react-input-autosize-3.0.0.tgz" @@ -5556,21 +5441,6 @@ react-select@^4.3.1: react-input-autosize "^3.0.0" react-transition-group "^4.3.0" -react-time-picker@^4.4.2: - version "4.4.3" - resolved "https://registry.npmjs.org/react-time-picker/-/react-time-picker-4.4.3.tgz" - integrity sha512-YnEC9Qpbgy1fWBbjzM89LJ8O81G33MXSM8dUsEpSJXQSSHnEQ/kYEytWCnmi7joXGzBUOzHLRK6mxkgJnoL4zQ== - dependencies: - "@wojtekmaj/date-utils" "^1.0.0" - get-user-locale "^1.2.0" - make-event-props "^1.1.0" - merge-class-names "^1.1.1" - merge-refs "^1.0.0" - prop-types "^15.6.0" - react-clock "^3.0.0" - react-fit "^1.0.3" - update-input-width "^1.2.2" - react-top-loading-bar@^2.0.1: version "2.0.1" resolved "https://registry.npmjs.org/react-top-loading-bar/-/react-top-loading-bar-2.0.1.tgz" @@ -6662,11 +6532,6 @@ upath@^1.1.2, upath@^1.2.0: resolved "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz" integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== -update-input-width@^1.2.2: - version "1.2.2" - resolved "https://registry.npmjs.org/update-input-width/-/update-input-width-1.2.2.tgz" - integrity sha512-6QwD9ZVSXb96PxOZ01DU0DJTPwQGY7qBYgdniZKJN02Xzom2m+9J6EPxMbefskqtj4x78qbe5psDSALq9iNEYg== - uri-js@^4.2.2: version "4.4.1" resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz" From 7300a85e5ef3f7bb60b19ab21273bd25899c752e Mon Sep 17 00:00:00 2001 From: Abhinav Date: Tue, 2 Nov 2021 11:24:26 +0530 Subject: [PATCH 121/147] rename updateMagicMetadata property updater to updateMagicMetadataProps --- src/utils/file/index.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/utils/file/index.ts b/src/utils/file/index.ts index 39c1e4ad1..cf4a4d893 100644 --- a/src/utils/file/index.ts +++ b/src/utils/file/index.ts @@ -280,7 +280,7 @@ export function fileIsArchived(file: File) { return file.magicMetadata.data.visibility === VISIBILITY_STATE.ARCHIVED; } -export async function updateMagicMetadata( +export async function updateMagicMetadataProps( file: File, magicMetadataUpdates: MagicMetadataProps ) { @@ -315,7 +315,7 @@ export async function updateMagicMetadata( return file; } } -export async function updatePublicMagicMetadata( +export async function updatePublicMagicMetadataProps( file: File, publicMetadataUpdates: PublicMagicMetadataProps ) { @@ -362,7 +362,7 @@ export async function changeFilesVisibility( }; updatedFiles.push( - await updateMagicMetadata(file, updatedMagicMetadataProps) + await updateMagicMetadataProps(file, updatedMagicMetadataProps) ); } return updatedFiles; @@ -373,7 +373,7 @@ export async function changeFileCreationTime(file: File, editedTime: number) { editedTime, }; - return await updatePublicMagicMetadata( + return await updatePublicMagicMetadataProps( file, updatedPublicMagicMetadataProps ); From 916e84c58e37a3365f8d46133254d3a316672355 Mon Sep 17 00:00:00 2001 From: Abhinav Date: Tue, 2 Nov 2021 11:52:13 +0530 Subject: [PATCH 122/147] reafactor code --- src/components/PhotoSwipe/PhotoSwipe.tsx | 10 ++++------ src/services/fileService.ts | 9 +++++++++ src/utils/file/index.ts | 10 ++++++++++ 3 files changed, 23 insertions(+), 6 deletions(-) diff --git a/src/components/PhotoSwipe/PhotoSwipe.tsx b/src/components/PhotoSwipe/PhotoSwipe.tsx index c89f35780..be65cce4e 100644 --- a/src/components/PhotoSwipe/PhotoSwipe.tsx +++ b/src/components/PhotoSwipe/PhotoSwipe.tsx @@ -22,7 +22,7 @@ import { changeFileCreationTime, downloadFile, formatDateTime, - mergeMetadata, + updateExistingFilePubMetadata, } from 'utils/file'; import { FormCheck } from 'react-bootstrap'; import { prettyPrintExif } from 'utils/exif'; @@ -96,14 +96,12 @@ function RenderCreationTime({ try { if (isInEditMode && file) { const unixTimeInMicroSec = pickedTime.getTime() * 1000; - const updatedFile = await changeFileCreationTime( + let updatedFile = await changeFileCreationTime( file, unixTimeInMicroSec ); - await updatePublicMagicMetadata([updatedFile]); - updatedFile.pubMagicMetadata.version += 1; - file.pubMagicMetadata = updatedFile.pubMagicMetadata; - file.metadata = mergeMetadata([file])[0].metadata; + updatedFile = await updatePublicMagicMetadata([updatedFile])[0]; + updateExistingFilePubMetadata(file, updatedFile); scheduleUpdate(); } } catch (e) { diff --git a/src/services/fileService.ts b/src/services/fileService.ts index acac21226..f65569193 100644 --- a/src/services/fileService.ts +++ b/src/services/fileService.ts @@ -350,4 +350,13 @@ export const updatePublicMagicMetadata = async (files: File[]) => { 'X-Auth-Token': token, } ); + return files.map( + (file): File => ({ + ...file, + pubMagicMetadata: { + ...file.pubMagicMetadata, + version: file.pubMagicMetadata.version + 1, + }, + }) + ); }; diff --git a/src/utils/file/index.ts b/src/utils/file/index.ts index cf4a4d893..9963bcaa3 100644 --- a/src/utils/file/index.ts +++ b/src/utils/file/index.ts @@ -309,6 +309,7 @@ export async function updateMagicMetadataProps( magicMetadata: { ...file.magicMetadata, data: magicMetadataProps, + count: Object.keys(file.pubMagicMetadata).length, }, }; } else { @@ -342,6 +343,7 @@ export async function updatePublicMagicMetadataProps( pubMagicMetadata: { ...file.pubMagicMetadata, data: publicMetadataProps, + count: Object.keys(file.pubMagicMetadata).length, }, }; } else { @@ -411,3 +413,11 @@ export function appendPhotoSwipeProps(files: File[]) { h: window.innerHeight, })) as File[]; } + +export function updateExistingFilePubMetadata( + existingFile: File, + updatedFile: File +) { + existingFile.pubMagicMetadata = updatedFile.pubMagicMetadata; + existingFile.metadata = mergeMetadata([existingFile])[0].metadata; +} From 99d8d4266e4f2756c2cd98d055bc5483c1d6bdb3 Mon Sep 17 00:00:00 2001 From: Abhinav Date: Tue, 2 Nov 2021 11:56:25 +0530 Subject: [PATCH 123/147] minor fixes --- src/components/PhotoSwipe/PhotoSwipe.tsx | 4 +++- src/utils/file/index.ts | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/components/PhotoSwipe/PhotoSwipe.tsx b/src/components/PhotoSwipe/PhotoSwipe.tsx index be65cce4e..b5ef0e505 100644 --- a/src/components/PhotoSwipe/PhotoSwipe.tsx +++ b/src/components/PhotoSwipe/PhotoSwipe.tsx @@ -100,7 +100,9 @@ function RenderCreationTime({ file, unixTimeInMicroSec ); - updatedFile = await updatePublicMagicMetadata([updatedFile])[0]; + updatedFile = ( + await updatePublicMagicMetadata([updatedFile]) + )[0]; updateExistingFilePubMetadata(file, updatedFile); scheduleUpdate(); } diff --git a/src/utils/file/index.ts b/src/utils/file/index.ts index 9963bcaa3..ae3ec7317 100644 --- a/src/utils/file/index.ts +++ b/src/utils/file/index.ts @@ -343,7 +343,7 @@ export async function updatePublicMagicMetadataProps( pubMagicMetadata: { ...file.pubMagicMetadata, data: publicMetadataProps, - count: Object.keys(file.pubMagicMetadata).length, + count: Object.keys(file.pubMagicMetadata.data).length, }, }; } else { From d0baa20cc8f5fe4af0c7ecdd0e91b808dbcc97a5 Mon Sep 17 00:00:00 2001 From: Abhinav Date: Tue, 2 Nov 2021 12:01:32 +0530 Subject: [PATCH 124/147] skip update if pickedTime same as creationTime --- src/components/PhotoSwipe/PhotoSwipe.tsx | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/components/PhotoSwipe/PhotoSwipe.tsx b/src/components/PhotoSwipe/PhotoSwipe.tsx index b5ef0e505..083723de8 100644 --- a/src/components/PhotoSwipe/PhotoSwipe.tsx +++ b/src/components/PhotoSwipe/PhotoSwipe.tsx @@ -96,6 +96,9 @@ function RenderCreationTime({ try { if (isInEditMode && file) { const unixTimeInMicroSec = pickedTime.getTime() * 1000; + if (unixTimeInMicroSec === file.metadata.creationTime) { + return; + } let updatedFile = await changeFileCreationTime( file, unixTimeInMicroSec From 5c62ff04723b54787e986772e40fac44d789e032 Mon Sep 17 00:00:00 2001 From: Abhinav Date: Tue, 2 Nov 2021 12:15:18 +0530 Subject: [PATCH 125/147] updated icons --- src/components/Container.ts | 10 -------- src/components/FullScreenDropZone.tsx | 4 ++-- src/components/PhotoSwipe/PhotoSwipe.tsx | 8 +++---- src/components/SearchBar.tsx | 17 ++++++-------- src/components/icons/CloseIcon.tsx | 19 +++++++++++++++ src/components/icons/CrossIcon.tsx | 22 ------------------ src/components/icons/EditIcon.tsx | 23 ++++++++----------- src/components/icons/TickIcon.tsx | 19 +++++++-------- .../pages/gallery/SelectedFileOptions.tsx | 4 ++-- 9 files changed, 51 insertions(+), 75 deletions(-) create mode 100644 src/components/icons/CloseIcon.tsx delete mode 100644 src/components/icons/CrossIcon.tsx diff --git a/src/components/Container.ts b/src/components/Container.ts index ba7c35257..0061f8a47 100644 --- a/src/components/Container.ts +++ b/src/components/Container.ts @@ -22,8 +22,6 @@ export const IconButton = styled.button` background: none; border: none; border-radius: 50%; - width: 40px; - height: 40px; padding: 5px; color: inherit; margin: 0 10px; @@ -62,11 +60,3 @@ export const FlexWrapper = styled.div` text-align: center; justify-content: center; `; - -export const HighLightWrapper = styled.div` - &:hover { - background-color: #555; - } - border-radius: 50%; - padding: 5px; -`; diff --git a/src/components/FullScreenDropZone.tsx b/src/components/FullScreenDropZone.tsx index 82b44364f..be43537f8 100644 --- a/src/components/FullScreenDropZone.tsx +++ b/src/components/FullScreenDropZone.tsx @@ -1,7 +1,7 @@ import React, { useEffect, useState } from 'react'; import styled from 'styled-components'; import constants from 'utils/strings/constants'; -import CrossIcon from './icons/CrossIcon'; +import CloseIcon from './icons/CloseIcon'; const CloseButtonWrapper = styled.div` position: absolute; @@ -62,7 +62,7 @@ export default function FullScreenDropZone(props: Props) { {isDragActive && ( - + {constants.UPLOAD_DROPZONE_MESSAGE} diff --git a/src/components/PhotoSwipe/PhotoSwipe.tsx b/src/components/PhotoSwipe/PhotoSwipe.tsx index 083723de8..76e0a373b 100644 --- a/src/components/PhotoSwipe/PhotoSwipe.tsx +++ b/src/components/PhotoSwipe/PhotoSwipe.tsx @@ -27,7 +27,7 @@ import { import { FormCheck } from 'react-bootstrap'; import { prettyPrintExif } from 'utils/exif'; import EditIcon from 'components/icons/EditIcon'; -import { Label, Row, Value } from 'components/Container'; +import { IconButton, Label, Row, Value } from 'components/Container'; import { logError } from 'utils/sentry'; import DatePicker from 'react-datepicker'; @@ -69,8 +69,6 @@ const ButtonContainer = styled.div` padding: 5px 10px; `; -const ClickWrapper = (props) =>
; - const renderInfoItem = (label: string, value: string | JSX.Element) => ( @@ -171,9 +169,9 @@ function RenderCreationTime({ - + - + diff --git a/src/components/SearchBar.tsx b/src/components/SearchBar.tsx index 2463ffa75..f3f42615d 100644 --- a/src/components/SearchBar.tsx +++ b/src/components/SearchBar.tsx @@ -18,12 +18,13 @@ import constants from 'utils/strings/constants'; import LocationIcon from './icons/LocationIcon'; import DateIcon from './icons/DateIcon'; import SearchIcon from './icons/SearchIcon'; -import CrossIcon from './icons/CrossIcon'; +import CloseIcon from './icons/CloseIcon'; import { Collection } from 'services/collectionService'; import CollectionIcon from './icons/CollectionIcon'; import { File, FILE_TYPE } from 'services/fileService'; import ImageIcon from './icons/ImageIcon'; import VideoIcon from './icons/VideoIcon'; +import { IconButton } from './Container'; const Wrapper = styled.div<{ isDisabled: boolean; isOpen: boolean }>` position: fixed; @@ -346,15 +347,11 @@ export default function SearchBar(props: Props) { noOptionsMessage={() => null} />
-
- {props.isOpen && ( -
resetSearch()}> - -
- )} -
+ {props.isOpen && ( + resetSearch()}> + + + )} + + + ); +} + +CloseIcon.defaultProps = { + height: 24, + width: 24, + viewBox: '0 0 24 24', +}; diff --git a/src/components/icons/CrossIcon.tsx b/src/components/icons/CrossIcon.tsx deleted file mode 100644 index 18eb9c333..000000000 --- a/src/components/icons/CrossIcon.tsx +++ /dev/null @@ -1,22 +0,0 @@ -import { HighLightWrapper } from 'components/Container'; -import React from 'react'; - -export default function CrossIcon(props) { - return ( - - - - - - ); -} - -CrossIcon.defaultProps = { - height: 24, - width: 24, - viewBox: '0 0 24 24', -}; diff --git a/src/components/icons/EditIcon.tsx b/src/components/icons/EditIcon.tsx index 78c679f88..443f3cd91 100644 --- a/src/components/icons/EditIcon.tsx +++ b/src/components/icons/EditIcon.tsx @@ -1,22 +1,19 @@ -import { HighLightWrapper } from 'components/Container'; import React from 'react'; -export default function AddIcon(props) { +export default function EditIcon(props) { return ( - - - - - + + + ); } -AddIcon.defaultProps = { +EditIcon.defaultProps = { height: 20, width: 20, viewBox: '0 0 24 24', diff --git a/src/components/icons/TickIcon.tsx b/src/components/icons/TickIcon.tsx index 8d230b961..8bd76968f 100644 --- a/src/components/icons/TickIcon.tsx +++ b/src/components/icons/TickIcon.tsx @@ -1,18 +1,15 @@ -import { HighLightWrapper } from 'components/Container'; import React from 'react'; export default function TickIcon(props) { return ( - - - - - + + + ); } diff --git a/src/components/pages/gallery/SelectedFileOptions.tsx b/src/components/pages/gallery/SelectedFileOptions.tsx index 882aabe2e..2c9276954 100644 --- a/src/components/pages/gallery/SelectedFileOptions.tsx +++ b/src/components/pages/gallery/SelectedFileOptions.tsx @@ -4,7 +4,7 @@ import { SetCollectionSelectorAttributes } from './CollectionSelector'; import styled from 'styled-components'; import Navbar from 'components/Navbar'; import DeleteIcon from 'components/icons/DeleteIcon'; -import CrossIcon from 'components/icons/CrossIcon'; +import CloseIcon from 'components/icons/CloseIcon'; import AddIcon from 'components/icons/AddIcon'; import { IconButton } from 'components/Container'; import constants from 'utils/strings/constants'; @@ -147,7 +147,7 @@ const SelectedFileOptions = ({ - +
{count} {constants.SELECTED} From 4cc1ff354711db5bc9ba90f6706475c3a40d52f1 Mon Sep 17 00:00:00 2001 From: Abhinav Date: Tue, 2 Nov 2021 12:19:07 +0530 Subject: [PATCH 126/147] no need to remerge metadata --- src/pages/gallery/index.tsx | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/pages/gallery/index.tsx b/src/pages/gallery/index.tsx index 2e4106371..cdaedcf0b 100644 --- a/src/pages/gallery/index.tsx +++ b/src/pages/gallery/index.tsx @@ -324,8 +324,6 @@ export default function Gallery() { collections: Collection[], files: File[] ) => { - const filesWithMergedMetadata = mergeMetadata(files); - setFiles(filesWithMergedMetadata); const favItemIds = await getFavItemIds(files); setFavItemIds(favItemIds); const nonEmptyCollections = getNonEmptyCollections(collections, files); From 3eaf583f7b679a2186b4bd9cf47823b95a88dd87 Mon Sep 17 00:00:00 2001 From: Abhinav Date: Tue, 2 Nov 2021 12:22:38 +0530 Subject: [PATCH 127/147] return upated file as updateMagicMetadata response --- src/services/fileService.ts | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/services/fileService.ts b/src/services/fileService.ts index f65569193..45d2062f3 100644 --- a/src/services/fileService.ts +++ b/src/services/fileService.ts @@ -320,6 +320,15 @@ export const updateMagicMetadata = async (files: File[]) => { await HTTPService.put(`${ENDPOINT}/files/magic-metadata`, reqBody, null, { 'X-Auth-Token': token, }); + return files.map( + (file): File => ({ + ...file, + magicMetadata: { + ...file.magicMetadata, + version: file.magicMetadata.version + 1, + }, + }) + ); }; export const updatePublicMagicMetadata = async (files: File[]) => { From 20388566fe70a852c07c81e201521fe198cd3a4b Mon Sep 17 00:00:00 2001 From: Abhinav Date: Tue, 2 Nov 2021 12:25:12 +0530 Subject: [PATCH 128/147] fix typo --- src/utils/file/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils/file/index.ts b/src/utils/file/index.ts index ae3ec7317..13d5bec00 100644 --- a/src/utils/file/index.ts +++ b/src/utils/file/index.ts @@ -309,7 +309,7 @@ export async function updateMagicMetadataProps( magicMetadata: { ...file.magicMetadata, data: magicMetadataProps, - count: Object.keys(file.pubMagicMetadata).length, + count: Object.keys(file.magicMetadata.data).length, }, }; } else { From 99169e407ade2d58b867a53c2aa22a6bd64f84ce Mon Sep 17 00:00:00 2001 From: Abhinav Date: Tue, 2 Nov 2021 14:10:03 +0530 Subject: [PATCH 129/147] correct lower limit edited time --- src/services/fileService.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/services/fileService.ts b/src/services/fileService.ts index 45d2062f3..67a68813c 100644 --- a/src/services/fileService.ts +++ b/src/services/fileService.ts @@ -22,7 +22,7 @@ const ENDPOINT = getEndpoint(); const FILES = 'files'; -export const MIN_EDITED_CREATION_TIME = '1800-01-01T00:00:00.000Z'; +export const MIN_EDITED_CREATION_TIME = '1881-01-01T00:00:00.000Z'; export interface fileAttribute { encryptedData?: DataStream | Uint8Array; From af302f69808eeb57ad11989a1efc946c79781409 Mon Sep 17 00:00:00 2001 From: Abhinav Date: Tue, 2 Nov 2021 20:50:07 +0530 Subject: [PATCH 130/147] send fileType info with exif data missing logs --- src/services/upload/exifService.ts | 22 ++++++++-------------- src/services/upload/metadataService.ts | 9 ++++++++- 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/src/services/upload/exifService.ts b/src/services/upload/exifService.ts index cacd81f2c..004958b6f 100644 --- a/src/services/upload/exifService.ts +++ b/src/services/upload/exifService.ts @@ -1,6 +1,5 @@ import exifr from 'exifr'; -import { logError } from 'utils/sentry'; import { NULL_LOCATION, Location } from './metadataService'; const EXIF_TAGS_NEEDED = [ @@ -20,20 +19,15 @@ interface ParsedEXIFData { export async function getExifData( receivedFile: globalThis.File ): Promise { - try { - const exifData = await exifr.parse(receivedFile, EXIF_TAGS_NEEDED); - if (!exifData) { - return { location: NULL_LOCATION, creationTime: null }; - } - const parsedEXIFData = { - location: getEXIFLocation(exifData), - creationTime: getUNIXTime(exifData), - }; - return parsedEXIFData; - } catch (e) { - logError(e, 'error reading exif data'); - // ignore exif parsing errors + const exifData = await exifr.parse(receivedFile, EXIF_TAGS_NEEDED); + if (!exifData) { + return { location: NULL_LOCATION, creationTime: null }; } + const parsedEXIFData = { + location: getEXIFLocation(exifData), + creationTime: getUNIXTime(exifData), + }; + return parsedEXIFData; } function getUNIXTime(exifData: any) { diff --git a/src/services/upload/metadataService.ts b/src/services/upload/metadataService.ts index 530f77084..fab027ba6 100644 --- a/src/services/upload/metadataService.ts +++ b/src/services/upload/metadataService.ts @@ -34,7 +34,14 @@ export async function extractMetadata( ) { let exifData = null; if (fileTypeInfo.fileType === FILE_TYPE.IMAGE) { - exifData = await getExifData(receivedFile); + try { + exifData = await getExifData(receivedFile); + } catch (e) { + logError(e, 'file missing exif data ', { + fileType: fileTypeInfo.exactType, + }); + // ignore exif parsing errors + } } const extractedMetadata: MetadataObject = { From ee67921a7581931ce2914ea44e6dbce2c517574d Mon Sep 17 00:00:00 2001 From: Abhinav Date: Tue, 2 Nov 2021 20:59:31 +0530 Subject: [PATCH 131/147] migrate trashFiles thumbnail too --- src/services/migrateThumbnailService.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/services/migrateThumbnailService.ts b/src/services/migrateThumbnailService.ts index a6a16e349..d7ece7b9f 100644 --- a/src/services/migrateThumbnailService.ts +++ b/src/services/migrateThumbnailService.ts @@ -10,6 +10,7 @@ import uploadHttpClient from 'services/upload/uploadHttpClient'; import { EncryptionResult, UploadURL } from 'services/upload/uploadService'; import { SetProgressTracker } from 'components/FixLargeThumbnail'; import { getFileType } from './upload/readFileService'; +import { getLocalTrash, getTrashedFiles } from './trashService'; const ENDPOINT = getEndpoint(); const REPLACE_THUMBNAIL_THRESHOLD = 500 * 1024; // 500KB @@ -43,7 +44,9 @@ export async function replaceThumbnail( const token = getToken(); const worker = await new CryptoWorker(); const files = await getLocalFiles(); - const largeThumbnailFiles = files.filter((file) => + const trash = await getLocalTrash(); + const trashFiles = getTrashedFiles(trash); + const largeThumbnailFiles = [...files, ...trashFiles].filter((file) => largeThumbnailFileIDs.has(file.id) ); From 801de8f3cc727dcc4e85f8aabf09c7a6aa326eae Mon Sep 17 00:00:00 2001 From: Abhinav Date: Tue, 2 Nov 2021 21:05:23 +0530 Subject: [PATCH 132/147] add log if all large thumbnail are not present locally --- src/services/migrateThumbnailService.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/services/migrateThumbnailService.ts b/src/services/migrateThumbnailService.ts index d7ece7b9f..2eb769707 100644 --- a/src/services/migrateThumbnailService.ts +++ b/src/services/migrateThumbnailService.ts @@ -49,7 +49,9 @@ export async function replaceThumbnail( const largeThumbnailFiles = [...files, ...trashFiles].filter((file) => largeThumbnailFileIDs.has(file.id) ); - + if (largeThumbnailFileIDs.size !== largeThumbnailFiles.length) { + logError(Error(), 'all large thumbnail files not found locally'); + } if (largeThumbnailFiles.length === 0) { return completedWithError; } From b372c3892b705fd33df65e79623a3eeaa7a97dba Mon Sep 17 00:00:00 2001 From: Abhinav Date: Tue, 2 Nov 2021 21:36:14 +0530 Subject: [PATCH 133/147] fixed install mobile app banner not shown on empty screen --- src/components/PhotoFrame.tsx | 7 +------ src/components/PhotoList.tsx | 26 +++++++++++++++++++++++++- 2 files changed, 26 insertions(+), 7 deletions(-) diff --git a/src/components/PhotoFrame.tsx b/src/components/PhotoFrame.tsx index 0a25b51e3..9eb896734 100644 --- a/src/components/PhotoFrame.tsx +++ b/src/components/PhotoFrame.tsx @@ -1,5 +1,4 @@ import { - DeadCenter, GalleryContext, Search, SelectedState, @@ -426,7 +425,7 @@ const PhotoFrame = ({ {constants.UPLOAD_FIRST_PHOTO} - ) : filteredData.length ? ( + ) : ( {({ height, width }) => ( @@ -455,10 +454,6 @@ const PhotoFrame = ({ isTrashCollection={activeCollection === TRASH_SECTION} /> - ) : ( - -
{constants.NOTHING_HERE}
-
)} ); diff --git a/src/components/PhotoList.tsx b/src/components/PhotoList.tsx index f5c1d134e..f8dce46ab 100644 --- a/src/components/PhotoList.tsx +++ b/src/components/PhotoList.tsx @@ -90,6 +90,15 @@ const BannerContainer = styled.div<{ span: number }>` align-items: flex-end; `; +const NothingContainer = styled.div<{ span: number }>` + color: #979797; + text-align: center; + grid-column: span ${(props) => props.span}; + display: flex; + justify-content: center; + align-items: center; +`; + interface Props { height: number; width: number; @@ -183,7 +192,9 @@ export function PhotoList({ if (!skipMerge) { timeStampList = mergeTimeStampList(timeStampList, columns); } - + if (timeStampList.length === 0) { + timeStampList.push(getEmptyListItem()); + } if (showBanner) { timeStampList.push(getBannerItem(timeStampList)); } @@ -198,6 +209,19 @@ export function PhotoList({ first.getMonth() === second.getMonth() && first.getDate() === second.getDate(); + const getEmptyListItem = () => { + return { + itemType: ITEM_TYPE.BANNER, + banner: ( + +
{constants.NOTHING_HERE}
+
+ ), + id: 'empty-list-banner', + height: height - 48, + }; + }; + const getBannerItem = (timeStampList) => { const photoFrameHeight = (() => { let sum = 0; From 5a879f50ae909d3203a7f8f49447dbed582db138 Mon Sep 17 00:00:00 2001 From: Abhinav Date: Wed, 3 Nov 2021 16:26:41 +0530 Subject: [PATCH 134/147] fix range start nulled on selected second item --- src/components/PhotoFrame.tsx | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/components/PhotoFrame.tsx b/src/components/PhotoFrame.tsx index 9eb896734..ed61d0e48 100644 --- a/src/components/PhotoFrame.tsx +++ b/src/components/PhotoFrame.tsx @@ -287,9 +287,7 @@ const PhotoFrame = ({ if (selected.collectionID !== activeCollection) { setSelected({ count: 0, collectionID: 0 }); } - if (rangeStart || rangeStart === 0) { - setRangeStart(null); - } else if (checked) { + if (checked) { setRangeStart(index); } From 49e3fa00f0631ed54dc484eab16091adf9dc2e45 Mon Sep 17 00:00:00 2001 From: Abhinav Date: Wed, 3 Nov 2021 16:57:46 +0530 Subject: [PATCH 135/147] select file on click even if range select is active --- src/components/pages/gallery/PreviewCard.tsx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/components/pages/gallery/PreviewCard.tsx b/src/components/pages/gallery/PreviewCard.tsx index f3dcd4a31..b04963826 100644 --- a/src/components/pages/gallery/PreviewCard.tsx +++ b/src/components/pages/gallery/PreviewCard.tsx @@ -217,9 +217,8 @@ export default function PreviewCard(props: IProps) { if (selectOnClick) { if (isRangeSelectActive) { onRangeSelect(); - } else { - onSelect?.(!selected); } + onSelect?.(!selected); } else if (file?.msrc || imgSrc) { onClick?.(); } From 040776bb07dcae131abbf979e85db487128ea049 Mon Sep 17 00:00:00 2001 From: Abhinav Date: Wed, 3 Nov 2021 16:58:51 +0530 Subject: [PATCH 136/147] fire select event only for items between the ends as they are already selected by click --- src/components/PhotoFrame.tsx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/components/PhotoFrame.tsx b/src/components/PhotoFrame.tsx index ed61d0e48..17dde2bce 100644 --- a/src/components/PhotoFrame.tsx +++ b/src/components/PhotoFrame.tsx @@ -307,11 +307,11 @@ const PhotoFrame = ({ let leftEnd = -1; let rightEnd = -1; if (index < rangeStart) { - leftEnd = index; - rightEnd = rangeStart; + leftEnd = index + 1; + rightEnd = rangeStart - 1; } else { - leftEnd = rangeStart; - rightEnd = index; + leftEnd = rangeStart + 1; + rightEnd = index - 1; } for (let i = leftEnd; i <= rightEnd; i++) { handleSelect(filteredData[i].id)(true); From 3eb6f68da034ab3f11c06d3280b81752ec8632a9 Mon Sep 17 00:00:00 2001 From: Abhinav Date: Wed, 3 Nov 2021 16:59:23 +0530 Subject: [PATCH 137/147] highlight all in range --- src/components/PhotoFrame.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/PhotoFrame.tsx b/src/components/PhotoFrame.tsx index 17dde2bce..ffd4bf8ad 100644 --- a/src/components/PhotoFrame.tsx +++ b/src/components/PhotoFrame.tsx @@ -339,8 +339,8 @@ const PhotoFrame = ({ isShiftKeyPressed && (rangeStart || rangeStart === 0) } isInsSelectRange={ - (index >= rangeStart + 1 && index <= currentHover) || - (index >= currentHover && index <= rangeStart - 1) + (index >= rangeStart && index <= currentHover) || + (index >= currentHover && index <= rangeStart) } /> ); From df23ea80d725090ec6b62728b13dd7868fdd010b Mon Sep 17 00:00:00 2001 From: Abhinav Date: Wed, 3 Nov 2021 17:03:12 +0530 Subject: [PATCH 138/147] upadated strings --- src/utils/strings/englishConstants.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/utils/strings/englishConstants.tsx b/src/utils/strings/englishConstants.tsx index 03a5b4544..204afc798 100644 --- a/src/utils/strings/englishConstants.tsx +++ b/src/utils/strings/englishConstants.tsx @@ -561,8 +561,8 @@ const englishConstants = { RESTORE_TO_COLLECTION: 'restore to album', AUTOMATIC_BIN_DELETE_MESSAGE: (relativeTime: string) => `permanently deleted ${relativeTime}`, - EMPTY_TRASH: 'empty trash?', - CONFIRM_EMPTY_TRASH: 'confirm empty trash', + EMPTY_TRASH: 'empty trash', + CONFIRM_EMPTY_TRASH: 'empty trash?', EMPTY_TRASH_MESSAGE: 'all files will be permanently removed from your ente account', From 425cf21f282ce69d90faa6fba51bdf1445c83e4d Mon Sep 17 00:00:00 2001 From: Abhinav Date: Wed, 3 Nov 2021 17:03:24 +0530 Subject: [PATCH 139/147] redirect to all section after empty trash --- src/pages/gallery/index.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/pages/gallery/index.tsx b/src/pages/gallery/index.tsx index cdaedcf0b..e16145f72 100644 --- a/src/pages/gallery/index.tsx +++ b/src/pages/gallery/index.tsx @@ -509,6 +509,7 @@ export default function Gallery() { clearSelection(); } await clearLocalTrash(); + setActiveCollection(ALL_SECTION); } catch (e) { setDialogMessage({ title: constants.ERROR, From 9afe465e91997f0bd2acf5e39e712426962d0043 Mon Sep 17 00:00:00 2001 From: Abhinav Date: Wed, 3 Nov 2021 19:07:46 +0530 Subject: [PATCH 140/147] updated tick icon --- src/components/icons/TickIcon.tsx | 2 +- src/components/pages/gallery/CollectionSortOptions.tsx | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/components/icons/TickIcon.tsx b/src/components/icons/TickIcon.tsx index 8bd76968f..633d869a2 100644 --- a/src/components/icons/TickIcon.tsx +++ b/src/components/icons/TickIcon.tsx @@ -14,7 +14,7 @@ export default function TickIcon(props) { } TickIcon.defaultProps = { - height: 28, + height: 20, width: 20, viewBox: '0 0 24 24', }; diff --git a/src/components/pages/gallery/CollectionSortOptions.tsx b/src/components/pages/gallery/CollectionSortOptions.tsx index 73241c145..aff226140 100644 --- a/src/components/pages/gallery/CollectionSortOptions.tsx +++ b/src/components/pages/gallery/CollectionSortOptions.tsx @@ -1,4 +1,4 @@ -import { Label, Value } from 'components/Container'; +import { Value } from 'components/Container'; import TickIcon from 'components/icons/TickIcon'; import React from 'react'; import { ListGroup, Popover, Row } from 'react-bootstrap'; @@ -23,13 +23,13 @@ const SortByOptionCreator = ( - + setCollectionSortBy(props.sortBy)} From 70fc35549bf5c1eaf6f100e26eb0836ce852e9ac Mon Sep 17 00:00:00 2001 From: Abhinav Date: Wed, 3 Nov 2021 19:11:11 +0530 Subject: [PATCH 141/147] update style and remove button from calender --- src/components/PhotoSwipe/PhotoSwipe.tsx | 59 +++++++++--------------- src/pages/_app.tsx | 26 +++++++++++ 2 files changed, 48 insertions(+), 37 deletions(-) diff --git a/src/components/PhotoSwipe/PhotoSwipe.tsx b/src/components/PhotoSwipe/PhotoSwipe.tsx index 76e0a373b..76eeccff7 100644 --- a/src/components/PhotoSwipe/PhotoSwipe.tsx +++ b/src/components/PhotoSwipe/PhotoSwipe.tsx @@ -32,6 +32,8 @@ import { logError } from 'utils/sentry'; import DatePicker from 'react-datepicker'; import 'react-datepicker/dist/react-datepicker.css'; +import CloseIcon from 'components/icons/CloseIcon'; +import TickIcon from 'components/icons/TickIcon'; interface Iprops { isOpen: boolean; @@ -63,12 +65,6 @@ const Pre = styled.pre` padding: 7px 15px; `; -const ButtonContainer = styled.div` - margin-left: auto; - width: 200px; - padding: 5px 10px; -`; - const renderInfoItem = (label: string, value: string | JSX.Element) => ( @@ -89,6 +85,7 @@ function RenderCreationTime({ const [pickedTime, setPickedTime] = useState(originalCreationTime); const openEditMode = () => setIsInEditMode(true); + const closeEditMode = () => setIsInEditMode(false); const saveEdits = async () => { try { @@ -110,11 +107,11 @@ function RenderCreationTime({ } catch (e) { logError(e, 'failed to update creationTime'); } - setIsInEditMode(false); + closeEditMode(); }; const discardEdits = () => { setPickedTime(originalCreationTime); - setIsInEditMode(false); + closeEditMode(); }; const handleChange = (newDate) => { if (newDate instanceof Date) { @@ -133,35 +130,12 @@ function RenderCreationTime({ onChange={handleChange} timeInputLabel="Time:" dateFormat="dd/MM/yyyy h:mm aa" - showTimeInput + showTimeSelect autoFocus - shouldCloseOnSelect={false} - onClickOutside={discardEdits} minDate={new Date(MIN_EDITED_CREATION_TIME)} maxDate={new Date()} - showYearDropdown - showMonthDropdown - withPortal> - - - - - + fixedHeight + withPortal> ) : ( formatDateTime(pickedTime) )} @@ -169,9 +143,20 @@ function RenderCreationTime({ - - - + {!isInEditMode ? ( + + + + ) : ( + <> + + + + + + + + )} diff --git a/src/pages/_app.tsx b/src/pages/_app.tsx index 332e30bac..70915b407 100644 --- a/src/pages/_app.tsx +++ b/src/pages/_app.tsx @@ -413,6 +413,32 @@ const GlobalStyles = createGlobalStyle` .react-datepicker__input-container > input { width:100%; } + .react-datepicker__navigation{ + top:14px; + } + .react-datepicker, .react-datepicker__header,.react-datepicker__time-container .react-datepicker__time,.react-datepicker-time__header{ + background-color: #202020; + color:#fff; + border-color: #444; + } + .react-datepicker__current-month,.react-datepicker__day-name, .react-datepicker__day, .react-datepicker__time-name{ + color:#fff; + } + .react-datepicker__day--disabled{ + color:#5b5656; + } + .react-datepicker__time-container .react-datepicker__time .react-datepicker__time-box ul.react-datepicker__time-list li.react-datepicker__time-list-item:hover{ + background-color:#686868 + } + .react-datepicker{ + padding-bottom:10px; + } + .react-datepicker__day:hover { + background-color:#686868 + } + .react-datepicker__day--disabled:hover { + background-color: #202020; + } `; export const LogoImage = styled.img` From 4c5df92e51f055471297f944b82a001b6ec0e35c Mon Sep 17 00:00:00 2001 From: Abhinav Date: Wed, 3 Nov 2021 20:06:00 +0530 Subject: [PATCH 142/147] add max and min time limit --- src/components/PhotoSwipe/PhotoSwipe.tsx | 17 +++++++++++++++-- src/pages/_app.tsx | 7 +++++++ src/services/fileService.ts | 4 +++- 3 files changed, 25 insertions(+), 3 deletions(-) diff --git a/src/components/PhotoSwipe/PhotoSwipe.tsx b/src/components/PhotoSwipe/PhotoSwipe.tsx index 76eeccff7..e688b0afd 100644 --- a/src/components/PhotoSwipe/PhotoSwipe.tsx +++ b/src/components/PhotoSwipe/PhotoSwipe.tsx @@ -8,7 +8,9 @@ import { removeFromFavorites, } from 'services/collectionService'; import { + ALL_TIME, File, + MAX_EDITED_CREATION_TIME, MIN_EDITED_CREATION_TIME, updatePublicMagicMetadata, } from 'services/fileService'; @@ -72,6 +74,11 @@ const renderInfoItem = (label: string, value: string | JSX.Element) => ( ); +const isSameDay = (first, second) => + first.getFullYear() === second.getFullYear() && + first.getMonth() === second.getMonth() && + first.getDate() === second.getDate(); + function RenderCreationTime({ file, scheduleUpdate, @@ -132,8 +139,14 @@ function RenderCreationTime({ dateFormat="dd/MM/yyyy h:mm aa" showTimeSelect autoFocus - minDate={new Date(MIN_EDITED_CREATION_TIME)} - maxDate={new Date()} + minDate={MIN_EDITED_CREATION_TIME} + maxDate={MAX_EDITED_CREATION_TIME} + maxTime={ + isSameDay(pickedTime, new Date()) + ? MAX_EDITED_CREATION_TIME + : ALL_TIME + } + minTime={MIN_EDITED_CREATION_TIME} fixedHeight withPortal> ) : ( diff --git a/src/pages/_app.tsx b/src/pages/_app.tsx index 70915b407..b324f1eea 100644 --- a/src/pages/_app.tsx +++ b/src/pages/_app.tsx @@ -430,6 +430,13 @@ const GlobalStyles = createGlobalStyle` .react-datepicker__time-container .react-datepicker__time .react-datepicker__time-box ul.react-datepicker__time-list li.react-datepicker__time-list-item:hover{ background-color:#686868 } + .react-datepicker__time-container .react-datepicker__time .react-datepicker__time-box ul.react-datepicker__time-list li.react-datepicker__time-list-item--disabled :hover{ + background-color: #202020; + } + + .react-datepicker__time-container .react-datepicker__time .react-datepicker__time-box ul.react-datepicker__time-list li.react-datepicker__time-list-item--disabled{ + color:#5b5656; + } .react-datepicker{ padding-bottom:10px; } diff --git a/src/services/fileService.ts b/src/services/fileService.ts index 67a68813c..dfe90092a 100644 --- a/src/services/fileService.ts +++ b/src/services/fileService.ts @@ -22,7 +22,9 @@ const ENDPOINT = getEndpoint(); const FILES = 'files'; -export const MIN_EDITED_CREATION_TIME = '1881-01-01T00:00:00.000Z'; +export const MIN_EDITED_CREATION_TIME = new Date(1800, 0, 1); +export const MAX_EDITED_CREATION_TIME = new Date(); +export const ALL_TIME = new Date(1800, 0, 1, 23, 59, 59); export interface fileAttribute { encryptedData?: DataStream | Uint8Array; From e573a7f1802b614d65b3491d19443011a9f09b7f Mon Sep 17 00:00:00 2001 From: Abhinav Date: Wed, 3 Nov 2021 21:24:46 +0530 Subject: [PATCH 143/147] fix file not found chrome error --- src/services/fileService.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/services/fileService.ts b/src/services/fileService.ts index 67a68813c..8d1fdb8b8 100644 --- a/src/services/fileService.ts +++ b/src/services/fileService.ts @@ -14,6 +14,7 @@ import { appendPhotoSwipeProps, decryptFile, mergeMetadata, + removeUnnecessaryFileProps, sortFiles, } from 'utils/file'; import CryptoWorker from 'utils/crypto'; @@ -131,7 +132,7 @@ interface TrashRequestItems { } export const getLocalFiles = async () => { const files: Array = (await localForage.getItem(FILES)) || []; - return files; + return removeUnnecessaryFileProps(files); }; export const syncFiles = async ( From 8d79b443feda5ccda2ef7b422a8bd42df9385abb Mon Sep 17 00:00:00 2001 From: Abhinav Date: Thu, 4 Nov 2021 18:37:35 +0530 Subject: [PATCH 144/147] add setLocalFile and remove appendPhotoSwipeProps funcitons --- src/services/fileService.ts | 27 +++++++++++++-------------- src/services/trashService.ts | 21 +++++++-------------- src/services/upload/uploadManager.ts | 6 ++---- src/utils/file/index.ts | 7 ------- 4 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/services/fileService.ts b/src/services/fileService.ts index f89169287..8ab6a6b7a 100644 --- a/src/services/fileService.ts +++ b/src/services/fileService.ts @@ -10,18 +10,12 @@ import { import { Collection } from './collectionService'; import HTTPService from './HTTPService'; import { logError } from 'utils/sentry'; -import { - appendPhotoSwipeProps, - decryptFile, - mergeMetadata, - removeUnnecessaryFileProps, - sortFiles, -} from 'utils/file'; +import { decryptFile, mergeMetadata, sortFiles } from 'utils/file'; import CryptoWorker from 'utils/crypto'; const ENDPOINT = getEndpoint(); -const FILES = 'files'; +const FILES_TABLE = 'files'; export const MIN_EDITED_CREATION_TIME = new Date(1800, 0, 1); export const MAX_EDITED_CREATION_TIME = new Date(); @@ -133,8 +127,13 @@ interface TrashRequestItems { collectionID: number; } export const getLocalFiles = async () => { - const files: Array = (await localForage.getItem(FILES)) || []; - return removeUnnecessaryFileProps(files); + const files: Array = + (await localForage.getItem(FILES_TABLE)) || []; + return files; +}; + +export const setLocalFiles = async (files: File[]) => { + await localForage.setItem(FILES_TABLE, files); }; export const syncFiles = async ( @@ -144,7 +143,7 @@ export const syncFiles = async ( const localFiles = await getLocalFiles(); let files = await removeDeletedCollectionFiles(collections, localFiles); if (files.length !== localFiles.length) { - await localForage.setItem('files', files); + await setLocalFiles(files); setFiles(sortFiles(mergeMetadata(files))); } for (const collection of collections) { @@ -177,15 +176,15 @@ export const syncFiles = async ( } files.push(file); } - await localForage.setItem('files', files); + await setLocalFiles(files); await localForage.setItem( `${collection.id}-time`, collection.updationTime ); - files = sortFiles(mergeMetadata(appendPhotoSwipeProps(files))); + files = sortFiles(mergeMetadata(files)); setFiles(files); } - return mergeMetadata(appendPhotoSwipeProps(files)); + return mergeMetadata(files); }; export const getFiles = async ( diff --git a/src/services/trashService.ts b/src/services/trashService.ts index 882d6abc1..11cc3933a 100644 --- a/src/services/trashService.ts +++ b/src/services/trashService.ts @@ -1,12 +1,7 @@ import { SetFiles } from 'pages/gallery'; import { getEndpoint } from 'utils/common/apiUtil'; import { getToken } from 'utils/common/key'; -import { - appendPhotoSwipeProps, - decryptFile, - mergeMetadata, - sortFiles, -} from 'utils/file'; +import { decryptFile, mergeMetadata, sortFiles } from 'utils/file'; import { logError } from 'utils/sentry'; import localForage from 'utils/storage/localForage'; import { Collection, getCollection } from './collectionService'; @@ -167,14 +162,12 @@ function removeRestoredOrDeletedTrashItems(trash: Trash) { export function getTrashedFiles(trash: Trash) { return mergeMetadata( - appendPhotoSwipeProps( - trash.map((trashedFile) => ({ - ...trashedFile.file, - updationTime: trashedFile.updatedAt, - isTrashed: true, - deleteBy: trashedFile.deleteBy, - })) - ) + trash.map((trashedFile) => ({ + ...trashedFile.file, + updationTime: trashedFile.updatedAt, + isTrashed: true, + deleteBy: trashedFile.deleteBy, + })) ); } diff --git a/src/services/upload/uploadManager.ts b/src/services/upload/uploadManager.ts index 7cb91377b..1c67cbb6d 100644 --- a/src/services/upload/uploadManager.ts +++ b/src/services/upload/uploadManager.ts @@ -1,4 +1,4 @@ -import { File, getLocalFiles } from '../fileService'; +import { File, getLocalFiles, setLocalFiles } from '../fileService'; import { Collection, getLocalCollections } from '../collectionService'; import { SetFiles } from 'pages/gallery'; import { ComlinkWorker, getDedicatedCryptoWorker } from 'utils/crypto'; @@ -8,7 +8,6 @@ import { removeUnnecessaryFileProps, } from 'utils/file'; import { logError } from 'utils/sentry'; -import localForage from 'utils/storage/localForage'; import { getMetadataMapKey, ParsedMetaDataJSON, @@ -185,8 +184,7 @@ class UploadManager { if (fileUploadResult === FileUploadResults.UPLOADED) { this.existingFiles.push(file); this.existingFiles = sortFiles(this.existingFiles); - await localForage.setItem( - 'files', + await setLocalFiles( removeUnnecessaryFileProps(this.existingFiles) ); this.setFiles(this.existingFiles); diff --git a/src/utils/file/index.ts b/src/utils/file/index.ts index 13d5bec00..5eaecea62 100644 --- a/src/utils/file/index.ts +++ b/src/utils/file/index.ts @@ -406,13 +406,6 @@ export function mergeMetadata(files: File[]): File[] { }, })); } -export function appendPhotoSwipeProps(files: File[]) { - return files.map((file) => ({ - ...file, - w: window.innerWidth, - h: window.innerHeight, - })) as File[]; -} export function updateExistingFilePubMetadata( existingFile: File, From d2ee821977756a6fff7688aa2ae6fa6407674323 Mon Sep 17 00:00:00 2001 From: Abhinav Date: Thu, 4 Nov 2021 18:53:35 +0530 Subject: [PATCH 145/147] refactored getCollectionLastSyncTime --- src/services/fileService.ts | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/services/fileService.ts b/src/services/fileService.ts index 8ab6a6b7a..9c3e892c9 100644 --- a/src/services/fileService.ts +++ b/src/services/fileService.ts @@ -136,6 +136,9 @@ export const setLocalFiles = async (files: File[]) => { await localForage.setItem(FILES_TABLE, files); }; +export const getCollectionLastSyncTime = async (collection: Collection) => + (await localForage.getItem(`${collection.id}-time`)) ?? 0; + export const syncFiles = async ( collections: Collection[], setFiles: (files: File[]) => void @@ -150,8 +153,7 @@ export const syncFiles = async ( if (!getToken()) { continue; } - const lastSyncTime = - (await localForage.getItem(`${collection.id}-time`)) ?? 0; + const lastSyncTime = await getCollectionLastSyncTime(collection); if (collection.updationTime === lastSyncTime) { continue; } @@ -195,10 +197,7 @@ export const getFiles = async ( ): Promise => { try { const decryptedFiles: File[] = []; - let time = - sinceTime || - (await localForage.getItem(`${collection.id}-time`)) || - 0; + let time = sinceTime; let resp; do { const token = getToken(); From 7444ad183ea7006b48abaafbd9221049bf47999b Mon Sep 17 00:00:00 2001 From: Abhinav Date: Thu, 4 Nov 2021 19:01:02 +0530 Subject: [PATCH 146/147] dont set files directly to state, use a copy --- src/services/fileService.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/services/fileService.ts b/src/services/fileService.ts index 9c3e892c9..f3391d4b8 100644 --- a/src/services/fileService.ts +++ b/src/services/fileService.ts @@ -183,8 +183,7 @@ export const syncFiles = async ( `${collection.id}-time`, collection.updationTime ); - files = sortFiles(mergeMetadata(files)); - setFiles(files); + setFiles(sortFiles(mergeMetadata(files))); } return mergeMetadata(files); }; From 80ba92c98c7199a532ec37277d83e1ef1c7da48a Mon Sep 17 00:00:00 2001 From: Abhinav Date: Thu, 4 Nov 2021 19:25:19 +0530 Subject: [PATCH 147/147] dont export getCollectionLastSyncTime --- src/services/fileService.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/services/fileService.ts b/src/services/fileService.ts index f3391d4b8..09570391a 100644 --- a/src/services/fileService.ts +++ b/src/services/fileService.ts @@ -136,7 +136,7 @@ export const setLocalFiles = async (files: File[]) => { await localForage.setItem(FILES_TABLE, files); }; -export const getCollectionLastSyncTime = async (collection: Collection) => +const getCollectionLastSyncTime = async (collection: Collection) => (await localForage.getItem(`${collection.id}-time`)) ?? 0; export const syncFiles = async (