From 73966fdfb563765fc32c343d8e5ad62decb3bbd7 Mon Sep 17 00:00:00 2001 From: NilsXitaso Date: Thu, 27 Jun 2024 15:20:51 +0200 Subject: [PATCH 01/55] Update README.md (#14) (#15) Small bug fix in the README --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 18c3979..25f7d89 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ -XITASO Logo -

+XITASO Logo +

Mnestix Logo

Mnestix

From af44c2aec7310b3902c0085e32d496b5907c079f Mon Sep 17 00:00:00 2001 From: Jonathan Sigrist Date: Thu, 22 Aug 2024 09:28:03 +0200 Subject: [PATCH 02/55] feat(qr-scanner): implement scanner feature in dashboard and compare view (#64) # Description new component: Clicking on the QR scanner logo will open the camera. It will continuously scan for a qr code and execute the onScan callback if a valid one was found: - Dashboard: Will open the page with the specific ID - Compare: Will add the AAS to the compare list Fixes # (MNES-1175) ## Type of change Please delete options that are not relevant. - [x] New feature (non-breaking change which adds functionality) # Checklist: - [x] I have performed a self-review of my code - [x] I have commented my code, particularly in hard-to-understand areas - [x] I have made corresponding changes to the documentation - [x] My changes generate no new warnings - [ ] I have added tests that prove my fix or my feature works - [x] New and existing tests pass locally with my changes - [x] My changes contain no console logs --- package.json | 1 + .../[locale]/_components/DashboardInput.tsx | 69 +++++---- .../[locale]/_components/ManualAasInput.tsx | 92 ++++++++++++ src/app/[locale]/_components/QrScanner.tsx | 99 +++++++++++++ src/app/[locale]/_components/QrStream.tsx | 49 +++++++ .../compare/_components/CompareView.tsx | 40 +++++- .../add-aas/AddAasToCompareCard.tsx | 2 +- .../add-aas/CompareAasAddDialog.tsx | 34 ++--- .../_components/add-aas/ManualAasAddInput.tsx | 122 ---------------- .../[locale]/viewer/[base64AasId]/page.tsx | 4 +- .../_components/ManualAasViewerInput.tsx | 132 ------------------ .../_components/SubmodelsOverviewCard.tsx | 2 +- .../_components/DiscoveryListView.tsx | 2 +- src/assets/ScannerLogo.svg | 13 +- src/components/contexts/CompareAasContext.tsx | 16 ++- src/lib/i18n/de.mnestix.ts | 6 + src/lib/i18n/en.mnestix.ts | 6 + src/lib/searchUtilActions/searchClient.ts | 58 ++++++++ .../{search.ts => searchServer.ts} | 0 src/lib/util/LocalizedError.ts | 12 ++ yarn.lock | 44 +++++- 21 files changed, 460 insertions(+), 343 deletions(-) create mode 100644 src/app/[locale]/_components/ManualAasInput.tsx create mode 100644 src/app/[locale]/_components/QrScanner.tsx create mode 100644 src/app/[locale]/_components/QrStream.tsx delete mode 100644 src/app/[locale]/compare/_components/add-aas/ManualAasAddInput.tsx delete mode 100644 src/app/[locale]/viewer/_components/ManualAasViewerInput.tsx create mode 100644 src/lib/searchUtilActions/searchClient.ts rename src/lib/searchUtilActions/{search.ts => searchServer.ts} (100%) create mode 100644 src/lib/util/LocalizedError.ts diff --git a/package.json b/package.json index 33fb66f..a80d98b 100644 --- a/package.json +++ b/package.json @@ -57,6 +57,7 @@ "next-auth": "^4.24.7", "next-intl": "^3.14.0", "ol": "^9.1.0", + "qr-scanner": "^1.4.2", "react": "^18.2.0", "react-dom": "^18.2.0", "react-hook-form": "^7.51.3", diff --git a/src/app/[locale]/_components/DashboardInput.tsx b/src/app/[locale]/_components/DashboardInput.tsx index 62ff292..2a6ce49 100644 --- a/src/app/[locale]/_components/DashboardInput.tsx +++ b/src/app/[locale]/_components/DashboardInput.tsx @@ -1,50 +1,45 @@ 'use client'; -import { Box, Typography, useTheme } from '@mui/material'; -import ScannerLogo from 'assets/ScannerLogo.svg'; -import { useIsMobile } from 'lib/hooks/UseBreakpoints'; +import { Typography } from '@mui/material'; import { messages } from 'lib/i18n/localization'; -import { useState } from 'react'; import { FormattedMessage } from 'react-intl'; -import { ManualAASViewerInput } from '../viewer/_components/ManualAasViewerInput'; +import { ManualAasInput } from 'app/[locale]/_components/ManualAasInput'; +import { QrScanner } from 'app/[locale]/_components/QrScanner'; +import { handleSearchForAas } from 'lib/searchUtilActions/searchClient'; +import { useRouter } from 'next/navigation'; +import { useAasState, useRegistryAasState } from 'components/contexts/CurrentAasContext'; +import { LocalizedError } from 'lib/util/LocalizedError'; +import { useApis } from 'components/azureAuthentication/ApiProvider'; export const DashboardInput = () => { - const isMobile = useIsMobile(); - const theme = useTheme(); - const [inputFocus, setInputFocus] = useState(true); - const logoStyle = { - color: theme.palette.primary.main, - }; + const [, setAas] = useAasState(); + const [, setRegistryAasData] = useRegistryAasState(); + const navigate = useRouter(); + const { repositoryClient } = useApis(); + + const browseAasUrl = async (val: string) => { + try { + const aasSearch = await handleSearchForAas(val, repositoryClient); - const focusInput = () => { - // The value gets toggled to trigger the useEffect in the child input component 'ManualAASViewerInput'. - setInputFocus(!inputFocus); + if (aasSearch.aas) { + setAas(aasSearch.aas); + setRegistryAasData(aasSearch.aasData); + } + navigate.push(aasSearch.redirectUrl); + } catch (e) { + throw new LocalizedError(messages.mnestix.aasUrlNotFound); + } }; return ( <> - {!isMobile && ( - - - - - - - - - : - - - )} - + + + + + + : + + ); }; diff --git a/src/app/[locale]/_components/ManualAasInput.tsx b/src/app/[locale]/_components/ManualAasInput.tsx new file mode 100644 index 0000000..bd88df6 --- /dev/null +++ b/src/app/[locale]/_components/ManualAasInput.tsx @@ -0,0 +1,92 @@ +import { Box, IconButton, InputAdornment, TextField } from '@mui/material'; +import { FormattedMessage, useIntl } from 'react-intl'; +import React, { useEffect, useRef, useState } from 'react'; +import { ArrowForward } from '@mui/icons-material'; +import { messages } from 'lib/i18n/localization'; +import CloseIcon from '@mui/icons-material/Close'; +import { SquaredIconButton } from 'components/basics/Buttons'; +import { LocalizedError } from 'lib/util/LocalizedError'; + +export function ManualAasInput(props: { onSubmit: (input: string) => Promise }) { + const [inputValue, setInputValue] = useState(''); + const [isLoading, setIsLoading] = useState(false); + const [isError, setIsError] = useState(false); + const [errorText, setErrorText] = useState(''); + const intl = useIntl(); + const inputRef = useRef(null); + + useEffect(() => { + inputRef?.current?.focus(); + }, []); + + const setError = (msg: string) => { + setIsError(true); + setErrorText(msg); + }; + + const clearError = () => { + setIsError(false); + setErrorText(''); + }; + + const handleSubmit = async () => { + try { + setIsLoading(true); + await props.onSubmit(inputValue); + } catch (e) { + setIsLoading(false); + const msg = e instanceof LocalizedError ? e.descriptor : messages.mnestix.unexpectedError; + setError(intl.formatMessage(msg)); + } + }; + + const handleKeyPress = async (event: React.KeyboardEvent) => { + // Allow submit via enter + if (event.key === 'Enter' && !!inputValue) { + await handleSubmit(); + } + }; + + const handleChange = (event: React.ChangeEvent) => { + setInputValue(event.target.value); + clearError(); + }; + + return ( + + } + error={isError} + helperText={errorText} + onChange={handleChange} + onKeyDown={handleKeyPress} + data-testid="aasId-input" + autoFocus={true} + value={inputValue} + inputRef={inputRef} + InputProps={{ + endAdornment: ( + + { + setInputValue(''); + }} + > + + + + ), + }} + /> + } + disabled={!inputValue} + loading={isLoading} + onClick={handleSubmit} + data-testid="aasId-submit-button" + /> + + ); +} diff --git a/src/app/[locale]/_components/QrScanner.tsx b/src/app/[locale]/_components/QrScanner.tsx new file mode 100644 index 0000000..797562f --- /dev/null +++ b/src/app/[locale]/_components/QrScanner.tsx @@ -0,0 +1,99 @@ +'use client'; + +import { useState } from 'react'; +import ScannerLogo from 'assets/ScannerLogo.svg'; +import { Box, CircularProgress, IconButton, useTheme } from '@mui/material'; +import { QrStream } from 'app/[locale]/_components/QrStream'; +import HighlightOffRoundedIcon from '@mui/icons-material/HighlightOffRounded'; +import { useNotificationSpawner } from 'lib/hooks/UseNotificationSpawner'; +import { messages } from 'lib/i18n/localization'; +import { useIntl } from 'react-intl'; +import { LocalizedError } from 'lib/util/LocalizedError'; + +enum State { + Stopped, + LoadScanner, + ShowVideo, + HandleQr, +} + +export function QrScanner(props: { onScan: (scanResult: string) => Promise; size?: number | undefined }) { + // Camera and QR on/off logic + + const [state, setState] = useState(State.Stopped); + + const notificationSpawner = useNotificationSpawner(); + const intl = useIntl(); + + const theme = useTheme(); + const size = props.size || 250; + + const switchToVideoStream = (loadingSuccessful: boolean) => { + if (loadingSuccessful) { + setState(State.ShowVideo); + } else { + notificationSpawner.spawn({ + message: intl.formatMessage(messages.mnestix.qrScanner.errorOnQrScannerOpen), + severity: 'error', + }); + setState(State.Stopped); + } + }; + + const handleScan = async (result: string) => { + setState(State.HandleQr); + try { + await props.onScan(result); + setState(State.Stopped); + } catch (e) { + const msg = e instanceof LocalizedError ? e.descriptor : messages.mnestix.qrScanner.defaultCallbackErrorMsg; + notificationSpawner.spawn({ + message: intl.formatMessage(msg), + severity: 'error', + }); + setState(State.LoadScanner); + } + }; + + return ( + <> + + {state === State.Stopped && ( + setState(State.LoadScanner)} + padding="50px" + position="absolute" + height={size} + width={size} + > + + + )} + {state === State.ShowVideo && ( + setState(State.Stopped)} + style={{ + position: 'absolute', + zIndex: 999, + right: 0, + }} // Align to the right and render in front of everything + > + + + )} + {(state === State.LoadScanner || state === State.HandleQr) && ( + + + + + )} + {(state === State.LoadScanner || state === State.ShowVideo) && ( + + )} + + + ); +} diff --git a/src/app/[locale]/_components/QrStream.tsx b/src/app/[locale]/_components/QrStream.tsx new file mode 100644 index 0000000..f6871ad --- /dev/null +++ b/src/app/[locale]/_components/QrStream.tsx @@ -0,0 +1,49 @@ +'use client'; + +import { useEffect, useRef, useState } from 'react'; +import Scanner from 'qr-scanner'; + +export function QrStream(props: { + onScan: (scanResult: string) => Promise; + onLoadingFinished: (successful: boolean) => void; +}) { + const videoEl = useRef(null); + const scanner = useRef(); + + const [showBorder, setShowBorder] = useState(false); + + const onScanSuccess = async (result: Scanner.ScanResult) => { + await props.onScan(result.data); + }; + + useEffect(() => { + if (videoEl?.current && !scanner.current) { + scanner.current = new Scanner(videoEl?.current, onScanSuccess, { + preferredCamera: 'environment', + }); + + scanner?.current + ?.start() + .then(() => { + setShowBorder(true); + props.onLoadingFinished(true); + }) + .catch(() => props.onLoadingFinished(false)); + } + + return () => { + if (!videoEl?.current) { + scanner?.current?.stop(); + } + }; + }, []); + + return ( + + ); +} diff --git a/src/app/[locale]/compare/_components/CompareView.tsx b/src/app/[locale]/compare/_components/CompareView.tsx index 1441de4..917f6a4 100644 --- a/src/app/[locale]/compare/_components/CompareView.tsx +++ b/src/app/[locale]/compare/_components/CompareView.tsx @@ -11,9 +11,12 @@ import { useEffect, useState } from 'react'; import { useNotificationSpawner } from 'lib/hooks/UseNotificationSpawner'; import { useSearchParams } from 'next/navigation'; import { showError } from 'lib/util/ErrorHandlerUtil'; +import { AasSearchResult, handleSearchForAas } from 'lib/searchUtilActions/searchClient'; +import { LocalizedError } from 'lib/util/LocalizedError'; +import { useApis } from 'components/azureAuthentication/ApiProvider'; export function CompareView() { - const { compareAas, addSeveralAas, deleteAas } = useCompareAasContext(); + const { compareAas, addSeveralAas, deleteAas, addAas } = useCompareAasContext(); const [isLoadingAas, setIsLoadingAas] = useState(false); const notificationSpawner = useNotificationSpawner(); const searchParams = useSearchParams(); @@ -22,6 +25,8 @@ export function CompareView() { }); const [addModalOpen, setAddModalOpen] = useState(false); + const { repositoryClient } = useApis(); + useEffect(() => { async function _fetchAas() { try { @@ -36,7 +41,9 @@ export function CompareView() { } } - _fetchAas(); + _fetchAas().catch((reason) => { + showError(reason, notificationSpawner); + }); }, []); const handleDetailsModalOpen = () => { @@ -50,6 +57,33 @@ export function CompareView() { const handleDeleteAas = (aasId: string) => { deleteAas(aasId); }; + + const handleAddAas = async (aasId: string) => { + let aasSearch: AasSearchResult; + try { + aasSearch = await handleSearchForAas(aasId, repositoryClient); + } catch (e) { + throw new LocalizedError(messages.mnestix.aasUrlNotFound); + } + + if (!aasSearch.aas) { + throw new LocalizedError(messages.mnestix.compare.moreAasFound); + } + + const aasExists = compareAas.find((aas) => aas.id === aasSearch.aas!.id); + if (aasExists) { + throw new LocalizedError(messages.mnestix.compare.aasAlreadyAdded); + } + + try { + await addAas(aasSearch.aas!, aasSearch.aasData?.submodelDescriptors); + } catch (e) { + throw new LocalizedError(messages.mnestix.compare.aasAddError); + } + + setAddModalOpen(false); + }; + return ( <> @@ -98,7 +132,7 @@ export function CompareView() { )} - + ); } diff --git a/src/app/[locale]/compare/_components/add-aas/AddAasToCompareCard.tsx b/src/app/[locale]/compare/_components/add-aas/AddAasToCompareCard.tsx index 579f37c..78f62d5 100644 --- a/src/app/[locale]/compare/_components/add-aas/AddAasToCompareCard.tsx +++ b/src/app/[locale]/compare/_components/add-aas/AddAasToCompareCard.tsx @@ -37,7 +37,7 @@ export function AddAasToCompareCard(props: AddAasToCompareCardProps) { display: 'flex', justifyContent: 'center', alignItems: 'center', - marginBottom: -40, + padding: '10px', }} > diff --git a/src/app/[locale]/compare/_components/add-aas/CompareAasAddDialog.tsx b/src/app/[locale]/compare/_components/add-aas/CompareAasAddDialog.tsx index 02d1d78..e735dda 100644 --- a/src/app/[locale]/compare/_components/add-aas/CompareAasAddDialog.tsx +++ b/src/app/[locale]/compare/_components/add-aas/CompareAasAddDialog.tsx @@ -1,37 +1,28 @@ import { Box, Dialog, DialogContent, IconButton, Typography } from '@mui/material'; import { FormattedMessage } from 'react-intl'; import { messages } from 'lib/i18n/localization'; -import ScannerLogo from 'assets/ScannerLogo.svg'; import CloseIcon from '@mui/icons-material/Close'; -import { ManualAasAddInput } from './ManualAasAddInput'; -import { useState } from 'react'; -import { useTheme } from '@mui/material/styles'; +import { QrScanner } from 'app/[locale]/_components/QrScanner'; +import { ManualAasInput } from 'app/[locale]/_components/ManualAasInput'; type AddAasModalProps = { - readonly handleClose: () => void; + readonly onSubmit: (result: string) => Promise; + readonly onClose: () => void; readonly open: boolean; }; export function CompareAasAddDialog(props: AddAasModalProps) { - const [inputFocus, setInputFocus] = useState(true); - const theme = useTheme(); - - const focusInput = () => { - // The value gets toggled to trigger the useEffect in the child input component 'ManualAasAddInput'. - setInputFocus(!inputFocus); - }; - return ( - - - + : - + diff --git a/src/app/[locale]/compare/_components/add-aas/ManualAasAddInput.tsx b/src/app/[locale]/compare/_components/add-aas/ManualAasAddInput.tsx deleted file mode 100644 index cd218f1..0000000 --- a/src/app/[locale]/compare/_components/add-aas/ManualAasAddInput.tsx +++ /dev/null @@ -1,122 +0,0 @@ -import { Box, IconButton, InputAdornment, TextField } from '@mui/material'; -import { FormattedMessage, useIntl } from 'react-intl'; -import { messages } from 'lib/i18n/localization'; -import { ArrowForward } from '@mui/icons-material'; -import React, { useEffect, useState } from 'react'; -import { useCompareAasContext } from 'components/contexts/CompareAasContext'; -import { showError } from 'lib/util/ErrorHandlerUtil'; -import { useNotificationSpawner } from 'lib/hooks/UseNotificationSpawner'; -import CloseIcon from '@mui/icons-material/Close'; -import { useRef } from 'react'; -import { handleAasDiscoverySearch, handleAasRegistrySearch } from 'lib/searchUtilActions/search'; -import { AssetAdministrationShell } from '@aas-core-works/aas-core3.0-typescript/types'; -import { SubmodelDescriptor } from 'lib/types/registryServiceTypes'; -import { useApis } from 'components/azureAuthentication/ApiProvider'; -import { encodeBase64 } from 'lib/util/Base64Util'; -import { SquaredIconButton } from 'components/basics/Buttons'; - -type ManualAasAddInputProps = { - onSubmit: () => void; - focus: boolean; -}; - -export function ManualAasAddInput(props: ManualAasAddInputProps) { - const { compareAas, addAas } = useCompareAasContext(); - const [inputValue, setInputValue] = useState(''); - const notificationSpawner = useNotificationSpawner(); - const intl = useIntl(); - const [isLoading, setIsLoading] = useState(false); - const inputRef = useRef(null); - const { repositoryClient } = useApis(); - - useEffect(() => { - inputRef?.current?.focus(); - }, [props.focus]); - - function handleChange(event: React.ChangeEvent): void { - setInputValue(event.target.value); - } - - const handleSubmit = async () => { - try { - setIsLoading(true); - let submodelDescriptorsFromRegistry: SubmodelDescriptor[] = []; - - const aasIds = await handleAasDiscoverySearch(inputValue); - if (aasIds && aasIds.length > 1) { - setIsLoading(false); - notificationSpawner.spawn({ - message: intl.formatMessage(messages.mnestix.compare.moreAasFound), - severity: 'warning', - }); - } else { - const aasId = aasIds && aasIds.length === 1 ? aasIds[0] : inputValue; - const registrySearchResult = await handleAasRegistrySearch(aasId); - const aasToAdd = - registrySearchResult != null - ? registrySearchResult.registryAas - : await repositoryClient.getAssetAdministrationShellById(encodeBase64(aasId)); - - const aasExists = compareAas.find((aas) => aas.id === aasToAdd.id); - if (aasExists) { - setIsLoading(false); - notificationSpawner.spawn({ - message: intl.formatMessage(messages.mnestix.compare.aasAlreadyAdded), - severity: 'error', - }); - } else { - submodelDescriptorsFromRegistry = registrySearchResult?.registryAasData - ?.submodelDescriptors as SubmodelDescriptor[]; - await addAas(aasToAdd as AssetAdministrationShell, submodelDescriptorsFromRegistry); - props.onSubmit(); - } - } - } catch (e: unknown) { - setIsLoading(false); - showError(e, notificationSpawner); - } - }; - - const handleKeyPress = (event: React.KeyboardEvent) => { - // Allow submit via enter - if (event.key === 'Enter' && !!inputValue) { - handleSubmit(); - } - }; - - return ( - - } - data-testid="aasId-input" - autoFocus={true} - onChange={handleChange} - onKeyDown={handleKeyPress} - value={inputValue} - inputRef={inputRef} - InputProps={{ - endAdornment: ( - - { - setInputValue(''); - }} - > - - - - ), - }} - /> - } - data-testid="aasId-submit-button" - disabled={!inputValue} - onClick={handleSubmit} - loading={isLoading} - /> - - ); -} diff --git a/src/app/[locale]/viewer/[base64AasId]/page.tsx b/src/app/[locale]/viewer/[base64AasId]/page.tsx index b8bbc69..6a8bae2 100644 --- a/src/app/[locale]/viewer/[base64AasId]/page.tsx +++ b/src/app/[locale]/viewer/[base64AasId]/page.tsx @@ -13,12 +13,12 @@ import { showError } from 'lib/util/ErrorHandlerUtil'; import { AssetAdministrationShell, LangStringNameType, Reference } from '@aas-core-works/aas-core3.0-typescript/types'; import { useIsMobile } from 'lib/hooks/UseBreakpoints'; import { getTranslationText } from 'lib/util/SubmodelResolverUtil'; -import { useRouter, useParams } from 'next/navigation'; +import { useParams, useRouter } from 'next/navigation'; import { SubmodelsOverviewCard } from '../_components/SubmodelsOverviewCard'; import { AASOverviewCard } from 'app/[locale]/viewer/_components/AASOverviewCard'; import { useApis } from 'components/azureAuthentication/ApiProvider'; import { useEnv } from 'app/env/provider'; -import { handleAasRegistrySearch } from 'lib/searchUtilActions/search'; +import { handleAasRegistrySearch } from 'lib/searchUtilActions/searchServer'; export default function Page() { const navigate = useRouter(); diff --git a/src/app/[locale]/viewer/_components/ManualAasViewerInput.tsx b/src/app/[locale]/viewer/_components/ManualAasViewerInput.tsx deleted file mode 100644 index 7740137..0000000 --- a/src/app/[locale]/viewer/_components/ManualAasViewerInput.tsx +++ /dev/null @@ -1,132 +0,0 @@ -import { Box, IconButton, InputAdornment, TextField } from '@mui/material'; -import { FormattedMessage, useIntl } from 'react-intl'; -import React, { useEffect, useState } from 'react'; -import { ArrowForward } from '@mui/icons-material'; -import { useAasState, useRegistryAasState } from 'components/contexts/CurrentAasContext'; -import { messages } from 'lib/i18n/localization'; -import { useNotificationSpawner } from 'lib/hooks/UseNotificationSpawner'; -import { encodeBase64 } from 'lib/util/Base64Util'; -import { showError } from 'lib/util/ErrorHandlerUtil'; -import CloseIcon from '@mui/icons-material/Close'; -import { useRef } from 'react'; -import { useRouter } from 'next/navigation'; -import { handleAasDiscoverySearch, handleAasRegistrySearch } from 'lib/searchUtilActions/search'; -import { useApis } from 'components/azureAuthentication/ApiProvider'; -import { SquaredIconButton } from 'components/basics/Buttons'; - -export function ManualAASViewerInput(props: { focus: boolean }) { - const [val, setVal] = useState(''); - const [isLoading, setIsLoading] = useState(false); - const [isError, setIsError] = useState(false); - const [errorText, setErrorText] = useState(''); - const navigate = useRouter(); - const intl = useIntl(); - const notificationSpawner = useNotificationSpawner(); - const inputRef = useRef(null); - const [, setAas] = useAasState(); - const [, setRegistryAasData] = useRegistryAasState(); - const { repositoryClient } = useApis(); - - useEffect(() => { - inputRef?.current?.focus(); - }, [props.focus]); - - const setError = (msg: string) => { - setIsError(true); - setErrorText(msg); - }; - - const clearError = () => { - setIsError(false); - setErrorText(''); - }; - - const handleSubmit = async () => { - try { - setIsLoading(true); - - const aasIds = await handleAasDiscoverySearch(val); - if (aasIds && aasIds.length > 1) { - navigate.push(`/viewer/discovery?assetId=${val}`); - } else { - // Check if an AAS ID is found in the Discovery service, or assign the input parameter for further search. - // If there is exactly one AAS ID in the aasIds array, use it; otherwise, use the input parameter 'val'. - const aasId = aasIds && aasIds.length === 1 ? aasIds[0] : val; - const registrySearchResult = await handleAasRegistrySearch(aasId); - const aas = - registrySearchResult != null - ? registrySearchResult.registryAas - : await repositoryClient.getAssetAdministrationShellById(encodeBase64(aasId)); - - setAas(aas); - registrySearchResult?.registryAasData != null - ? setRegistryAasData({ - submodelDescriptors: registrySearchResult?.registryAasData?.submodelDescriptors, - aasRegistryRepositoryOrigin: - registrySearchResult?.registryAasData?.aasRegistryRepositoryOrigin, - }) - : setRegistryAasData(null); - - navigate.push(`/viewer/${encodeBase64(aas.id)}`); - } - } catch (e: unknown) { - setIsLoading(false); - showError(e, notificationSpawner); - if (e instanceof Response && e.status === 404) { - setError(intl.formatMessage(messages.mnestix.notFound)); - return; - } - setError(intl.formatMessage(messages.mnestix.unexpectedError)); - } - }; - - const handleKeyPress = (event: React.KeyboardEvent) => { - // Allow submit via enter - if (event.key === 'Enter' && !!val) { - handleSubmit(); - } - }; - - const handleChange = (event: React.ChangeEvent) => { - setVal(event.target.value); - clearError(); - }; - - return ( - - } - error={isError} - helperText={errorText} - onChange={handleChange} - onKeyDown={handleKeyPress} - data-testid="aasId-input" - autoFocus={true} - value={val} - inputRef={inputRef} - InputProps={{ - endAdornment: ( - - { - setVal(''); - }} - > - - - - ), - }} - /> - } - disabled={!val} - loading={isLoading} - onClick={handleSubmit} - data-testid="aasId-submit-button" - /> - - ); -} diff --git a/src/app/[locale]/viewer/_components/SubmodelsOverviewCard.tsx b/src/app/[locale]/viewer/_components/SubmodelsOverviewCard.tsx index 07ccfab..1fe0746 100644 --- a/src/app/[locale]/viewer/_components/SubmodelsOverviewCard.tsx +++ b/src/app/[locale]/viewer/_components/SubmodelsOverviewCard.tsx @@ -11,7 +11,7 @@ import { TabSelectorItem, VerticalTabSelector } from 'components/basics/Vertical import { MobileModal } from 'components/basics/MobileModal'; import { useApis } from 'components/azureAuthentication/ApiProvider'; import { useRegistryAasState } from 'components/contexts/CurrentAasContext'; -import { getSubmodelFromSubmodelDescriptor } from 'lib/searchUtilActions/search'; +import { getSubmodelFromSubmodelDescriptor } from 'lib/searchUtilActions/searchServer'; import { useEnv } from 'app/env/provider'; export type SubmodelsOverviewCardProps = { readonly smReferences?: Reference[]; readonly isLoading?: boolean }; diff --git a/src/app/[locale]/viewer/discovery/_components/DiscoveryListView.tsx b/src/app/[locale]/viewer/discovery/_components/DiscoveryListView.tsx index 4af5b86..62ca31b 100644 --- a/src/app/[locale]/viewer/discovery/_components/DiscoveryListView.tsx +++ b/src/app/[locale]/viewer/discovery/_components/DiscoveryListView.tsx @@ -7,7 +7,7 @@ import { useState } from 'react'; import DiscoveryList from 'app/[locale]/viewer/discovery/_components/DiscoveryList'; import { useSearchParams } from 'next/navigation'; import { Box, Typography } from '@mui/material'; -import { handleAasDiscoverySearch, handleAasRegistrySearch } from 'lib/searchUtilActions/search'; +import { handleAasDiscoverySearch, handleAasRegistrySearch } from 'lib/searchUtilActions/searchServer'; import { useAsyncEffect } from 'lib/hooks/UseAsyncEffect'; import { IDiscoveryListEntry } from 'lib/types/DiscoveryListEntry'; import AssetNotFound from 'components/basics/AssetNotFound'; diff --git a/src/assets/ScannerLogo.svg b/src/assets/ScannerLogo.svg index cc8e582..af7e623 100644 --- a/src/assets/ScannerLogo.svg +++ b/src/assets/ScannerLogo.svg @@ -1,14 +1,9 @@ - + Scanner Button - - - - - - - - + + + \ No newline at end of file diff --git a/src/components/contexts/CompareAasContext.tsx b/src/components/contexts/CompareAasContext.tsx index 7496269..41c393d 100644 --- a/src/components/contexts/CompareAasContext.tsx +++ b/src/components/contexts/CompareAasContext.tsx @@ -4,7 +4,7 @@ import { SubmodelCompareData } from 'lib/types/SubmodelCompareData'; import { generateSubmodelCompareData, isCompareData, isCompareDataRecord } from 'lib/util/CompareAasUtil'; import { encodeBase64 } from 'lib/util/Base64Util'; import { useApis } from 'components/azureAuthentication/ApiProvider'; -import { getSubmodelFromSubmodelDescriptor, handleAasRegistrySearch } from 'lib/searchUtilActions/search'; +import { getSubmodelFromSubmodelDescriptor, handleAasRegistrySearch } from 'lib/searchUtilActions/searchServer'; import { SubmodelDescriptor } from 'lib/types/registryServiceTypes'; type CompareAasContextType = { @@ -144,7 +144,8 @@ export const CompareAasContextProvider = (props: PropsWithChildren) => { if (submodelDescriptors && submodelDescriptors.length > 0) { for (const submodelDescriptor of submodelDescriptors) { const submodelData = await getSubmodelFromSubmodelDescriptor( - submodelDescriptor.endpoints[0].protocolInformation.href); + submodelDescriptor.endpoints[0].protocolInformation.href, + ); const dataRecord = generateSubmodelCompareData(submodelData); newCompareData.push(dataRecord); } @@ -152,14 +153,19 @@ export const CompareAasContextProvider = (props: PropsWithChildren) => { for (const reference of input as Reference[]) { let submodelAdded = false; try { - const submodelDescriptor = await submodelRegistryServiceClient.getSubmodelDescriptorsById(reference.keys[0].value); + const submodelDescriptor = await submodelRegistryServiceClient.getSubmodelDescriptorsById( + reference.keys[0].value, + ); const submodelData = await getSubmodelFromSubmodelDescriptor( - submodelDescriptor.endpoints[0].protocolInformation.href); + submodelDescriptor.endpoints[0].protocolInformation.href, + ); const dataRecord = generateSubmodelCompareData(submodelData); newCompareData.push(dataRecord); submodelAdded = true; } catch (e) { - console.warn(`Could not be found in Submodel Registry, will continue to look in the repository. ${e}`); + console.warn( + `Could not be found in Submodel Registry, will continue to look in the repository. ${e}`, + ); } // Submodel registry is not available or submodel not found there -> search in repo if (!submodelAdded) { diff --git a/src/lib/i18n/de.mnestix.ts b/src/lib/i18n/de.mnestix.ts index 14a29de..f22876a 100644 --- a/src/lib/i18n/de.mnestix.ts +++ b/src/lib/i18n/de.mnestix.ts @@ -2,6 +2,7 @@ export const deMnestix = { welcome: 'Willkommen bei Mnestix', digitalTwinMadeEasy: 'Digitaler Zwilling leicht gemacht.', notFound: 'Nicht gefunden', + aasUrlNotFound: 'Keine Verwaltungsschale unter dieser ID.', cannotLoadAasId: { header: 'Verwaltungsschale konnte nicht geladen werden.', text: 'Es konnte keine Verwaltungsschale für das Asset mit id {assetId} geladen werden.', @@ -168,6 +169,7 @@ export const deMnestix = { assetIdNotFound: 'Asset Id nicht gefunden', aasAlreadyAdded: 'Verwaltungsschale kann nicht mehrmals hinzugefügt werden', moreAasFound: 'Mehr als eine Verwaltungsschale im Discovery Service gefunden, bitte geben Sie die AAS-ID an.', + aasAddError: 'Verwaltungsschale konnte nicht hinzugefügt werden.', }, compareCollection: { show: '{idShort}', @@ -234,4 +236,8 @@ export const deMnestix = { repositoryUrl: 'Repository Url', subtitle: 'Asset ID', }, + qrScanner: { + defaultCallbackErrorMsg: 'QR Code konnte nicht geöffnet werden!', + errorOnQrScannerOpen: 'QR Scanner konnte nicht geöffnet werden!', + }, }; diff --git a/src/lib/i18n/en.mnestix.ts b/src/lib/i18n/en.mnestix.ts index 6578456..96ab137 100644 --- a/src/lib/i18n/en.mnestix.ts +++ b/src/lib/i18n/en.mnestix.ts @@ -2,6 +2,7 @@ export const enMnestix = { welcome: 'Welcome to Mnestix', digitalTwinMadeEasy: 'Digital Twin made easy.', notFound: 'Not found', + aasUrlNotFound: 'No AAS with the given ID.', cannotLoadAasId: { header: 'AAS could not be loaded.', text: 'Unable to load AAS for asset with id {assetId}', @@ -168,6 +169,7 @@ export const enMnestix = { assetIdNotFound: 'Asset Id not found', aasAlreadyAdded: 'AAS cannot be added more than once', moreAasFound: 'More than one AAS found in the discovery service, please provide the AAS ID instead.', + aasAddError: 'AAS could not be added.', }, compareCollection: { show: '{idShort}', @@ -233,4 +235,8 @@ export const enMnestix = { repositoryUrl: 'Repository Url', subtitle: 'Asset ID', }, + qrScanner: { + defaultCallbackErrorMsg: 'Could not open the QR code!', + errorOnQrScannerOpen: 'Could not open the QR scanner!', + }, }; diff --git a/src/lib/searchUtilActions/searchClient.ts b/src/lib/searchUtilActions/searchClient.ts new file mode 100644 index 0000000..c8acc59 --- /dev/null +++ b/src/lib/searchUtilActions/searchClient.ts @@ -0,0 +1,58 @@ +'use client'; + +import { SubmodelDescriptor } from 'lib/types/registryServiceTypes'; +import { AssetAdministrationShell } from '@aas-core-works/aas-core3.0-typescript/types'; +import { encodeBase64 } from 'lib/util/Base64Util'; +import { AssetAdministrationShellRepositoryApi } from 'lib/api/basyx-v3/api'; +import { handleAasDiscoverySearch, handleAasRegistrySearch } from 'lib/searchUtilActions/searchServer'; + +export type AasData = { + submodelDescriptors: SubmodelDescriptor[] | undefined; + aasRegistryRepositoryOrigin: string | undefined; +}; + +export type AasSearchResult = { + redirectUrl: string; + aas: AssetAdministrationShell | null; + aasData: AasData | null; +}; + +export async function handleSearchForAas( + val: string, + repositoryClient: AssetAdministrationShellRepositoryApi, +): Promise { + const aasIds = await handleAasDiscoverySearch(val); + if (aasIds && aasIds.length > 1) { + return { + redirectUrl: `/viewer/discovery?assetId=${val}`, + aas: null, + aasData: null, + }; + } else { + // Check if an AAS ID is found in the Discovery service, or assign the input parameter for further search. + // If there is exactly one AAS ID in the aasIds array, use it; otherwise, use the input parameter 'val'. + const aasId = aasIds && aasIds.length === 1 ? aasIds[0] : val; + const registrySearchResult = await handleAasRegistrySearch(aasId); + + const aas = + registrySearchResult != null + ? registrySearchResult.registryAas + : await repositoryClient.getAssetAdministrationShellById(encodeBase64(aasId)); + + const aasData = + registrySearchResult?.registryAasData != null + ? { + submodelDescriptors: registrySearchResult.registryAasData.submodelDescriptors, + aasRegistryRepositoryOrigin: registrySearchResult.registryAasData.aasRegistryRepositoryOrigin, + } + : null; + + // If not found: Error: AAS could not be found + + return { + redirectUrl: `/viewer/${encodeBase64(aas.id)}`, + aas: aas, + aasData: aasData, + }; + } +} diff --git a/src/lib/searchUtilActions/search.ts b/src/lib/searchUtilActions/searchServer.ts similarity index 100% rename from src/lib/searchUtilActions/search.ts rename to src/lib/searchUtilActions/searchServer.ts diff --git a/src/lib/util/LocalizedError.ts b/src/lib/util/LocalizedError.ts new file mode 100644 index 0000000..02ffac1 --- /dev/null +++ b/src/lib/util/LocalizedError.ts @@ -0,0 +1,12 @@ +import { MessageDescriptorWithId } from 'lib/i18n/localization'; + +export class LocalizedError extends Error { + descriptor: MessageDescriptorWithId; + + constructor(message: MessageDescriptorWithId) { + const trueProto = new.target.prototype; + super(); + Object.setPrototypeOf(this, trueProto); + this.descriptor = message; + } +} diff --git a/yarn.lock b/yarn.lock index 2132524..ef0c39d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1998,6 +1998,11 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.45.tgz#2c0fafd78705e7a18b7906b5201a522719dc5190" integrity sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw== +"@types/offscreencanvas@^2019.6.4": + version "2019.7.3" + resolved "https://registry.yarnpkg.com/@types/offscreencanvas/-/offscreencanvas-2019.7.3.tgz#90267db13f64d6e9ccb5ae3eac92786a7c77a516" + integrity sha512-ieXiYmgSRXUDeOntE1InxjWyvEelZGP63M+cGuquuRLuIKKT1osnkXjxev9B7d1nXSug5vpunx+gNlbVxMlC9A== + "@types/parse-json@^4.0.0": version "4.0.2" resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.2.tgz#5950e50960793055845e956c427fc2b0d70c5239" @@ -5412,6 +5417,13 @@ punycode@^2.1.0, punycode@^2.1.1: resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== +qr-scanner@^1.4.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/qr-scanner/-/qr-scanner-1.4.2.tgz#bc4fb88022a8c9be95c49527a1c8fb8724b47dc4" + integrity sha512-kV1yQUe2FENvn59tMZW6mOVfpq9mGxGf8l6+EGaXUOd4RBOLg7tRC83OrirM5AtDvZRpdjdlXURsHreAOSPOUw== + dependencies: + "@types/offscreencanvas" "^2019.6.4" + qs@6.10.4: version "6.10.4" resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.4.tgz#6a3003755add91c0ec9eacdc5f878b034e73f9e7" @@ -5875,7 +5887,16 @@ streamsearch@^1.1.0: resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-1.1.0.tgz#404dd1e2247ca94af554e841a8ef0eaa238da764" integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg== -"string-width-cjs@npm:string-width@^4.2.0", string-width@4.2.3, string-width@^4.1.0, string-width@^4.2.0, string-width@^5.0.1, string-width@^5.1.2: +"string-width-cjs@npm:string-width@^4.2.0": + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string-width@4.2.3, string-width@^4.1.0, string-width@^4.2.0, string-width@^5.0.1, string-width@^5.1.2: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -5930,7 +5951,7 @@ string.prototype.trimstart@^1.0.8: define-properties "^1.2.1" es-object-atoms "^1.0.0" -"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: +"strip-ansi-cjs@npm:strip-ansi@^6.0.1": version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -5944,6 +5965,13 @@ strip-ansi@^4.0.0: dependencies: ansi-regex "^3.0.0" +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + strip-ansi@^7.0.1: version "7.1.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" @@ -6409,8 +6437,7 @@ word-wrap@^1.2.5: resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: - name wrap-ansi-cjs +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== @@ -6428,6 +6455,15 @@ wrap-ansi@^6.2.0: string-width "^4.1.0" strip-ansi "^6.0.0" +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + wrap-ansi@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" From 75301942cb7cd55572ea97b5e3a869d2285ddf66 Mon Sep 17 00:00:00 2001 From: Melanie Gail Date: Mon, 26 Aug 2024 11:18:33 +0200 Subject: [PATCH 03/55] Mnes 1186 add sqlite db (#69) # Description Added SQLite database and schema + seeding with prisma. ## Type of change Please delete options that are not relevant. - [ ] New feature (non-breaking change which adds functionality) # Checklist: - [ ] I have performed a self-review of my code - [ ] I have commented my code, particularly in hard-to-understand areas - [ ] I have made corresponding changes to the documentation - [ ] My changes generate no new warnings - [ ] I have added tests that prove my fix or my feature works - [ ] New and existing tests pass locally with my changes - [ ] My changes contain no console logs --- .gitignore | 1 + Dockerfile | 6 + README.md | 2 +- compose.yml | 5 + package.json | 9 +- .../20240822112149_0_init_db/migration.sql | 24 + prisma/migrations/migration_lock.toml | 3 + prisma/schema.prisma | 25 + .../id-settings/IdSettingsCard.tsx | 4 +- .../MnestixConnectionsCard.tsx | 18 + src/app/[locale]/settings/page.tsx | 62 +- src/app/api/mnestixConnections/route.ts | 36 + src/lib/database/prisma.ts | 17 + src/lib/i18n/de.mnestix.ts | 2 + src/lib/i18n/en.mnestix.ts | 2 + yarn.lock | 734 +++++++++++++++++- 16 files changed, 915 insertions(+), 35 deletions(-) create mode 100644 prisma/migrations/20240822112149_0_init_db/migration.sql create mode 100644 prisma/migrations/migration_lock.toml create mode 100644 prisma/schema.prisma create mode 100644 src/app/[locale]/settings/_components/mnestix-connections/MnestixConnectionsCard.tsx create mode 100644 src/app/api/mnestixConnections/route.ts create mode 100644 src/lib/database/prisma.ts diff --git a/.gitignore b/.gitignore index c80c276..8d8d8dd 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,4 @@ cypress-artifacts .env /cypress/videos/ /cypress/screenshots/ +/prisma/mnestix-database.db diff --git a/Dockerfile b/Dockerfile index c01ee1b..001d808 100644 --- a/Dockerfile +++ b/Dockerfile @@ -13,6 +13,9 @@ FROM deps AS builder WORKDIR /app COPY . . +RUN yarn prisma migrate deploy +RUN yarn prisma generate + RUN yarn build FROM base AS production @@ -39,4 +42,7 @@ FROM deps AS dev ENV NODE_ENV=development COPY . . +RUN yarn prisma migrate deploy +RUN yarn prisma generate + CMD [ "yarn", "dev"] diff --git a/README.md b/README.md index e16cf44..7ab8ebe 100644 --- a/README.md +++ b/README.md @@ -256,7 +256,7 @@ Mnestix provides the following configuration options. You can adapt the values i | `THEME_LOGO_URL` | | This variable **overwrites** the Logo in the theme, and thus the environment variable `THEME_LOGO_MIME_TYPE` will not be evaluated and it is not necessary to mount the image as specified below | optional | | `KEYCLOAK_ENABLED` | false | By default, it is set to false, meaning Keycloak authentication will be disabled, and the default authentication method will be Azure Entra ID. If you set this variable to true, Keycloak authentication will be enabled instead. | optional | | `KEYCLOAK_CLIENT_ID` | mnestix-browser-client-demo | Configuration variable that specifies the client unique identifier used by your application when connecting to the Keycloak server. | optional | -| `KEYCLOAK_ISSUER` | | Configuration variable that specifies the URL of the Keycloak servers issuer endpoint. This endpoint provides the base URL for the Keycloak server that issues tokens and handles authentication requests | optional | +| `KEYCLOAK_ISSUER` | | Configuration variable that specifies the URL of the Keycloak servers issuer endpoint. This endpoint provides the base URL for the Keycloak server that issues tokens and handles authentication requests | optional | | `KEYCLOAK_LOCAL_URL` | | Optional configuration variable specifically used for development environments within Docker. This allows your application to connect to a Keycloak instance running in a Docker container | optional | | `KEYCLOAK_REALM` | BaSyx | Configuration variable that specifies the name of the Keycloak realm your application will use for authentication and authorization. | optional | diff --git a/compose.yml b/compose.yml index d380fc3..85364e0 100644 --- a/compose.yml +++ b/compose.yml @@ -2,6 +2,9 @@ networks: mnestix-network: driver: bridge name: mnestix-network + +volumes: + mnestix-database: services: mnestix-browser: @@ -29,6 +32,8 @@ services: condition: service_healthy # only after the healthcheck in aas is successful, the mnestix container is being created networks: - mnestix-network + volumes: + - mnestix-database:/app/prisma/database mnestix-api: image: mnestix/mnestix-api:latest diff --git a/package.json b/package.json index 33fb66f..816d57e 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,7 @@ "@types/flat": "^5.0.5", "@types/jest": "^29.5.12", "@types/lodash": "^4.17.0", - "@types/node": "^20.12.7", + "@types/node": "^22.4.2", "@types/react": "^18.2.79", "@types/react-dom": "^18.2.25", "@typescript-eslint/eslint-plugin": "^7.7.1", @@ -26,6 +26,7 @@ "globals": "^15.1.0", "lodash": "^4.17.21", "prettier": "^3.2.5", + "prisma": "^5.18.0", "typescript-eslint": "^7.8.0" }, "dependencies": { @@ -46,6 +47,7 @@ "@mui/styled-engine": "latest", "@mui/x-date-pickers": "^7.2.0", "@mui/x-tree-view": "^7.3.0", + "@prisma/client": "^5.18.0", "@svgr/webpack": "^8.1.0", "buffer": "^6.0.3", "date-fns": "^2.28.0", @@ -63,6 +65,7 @@ "react-intl": "^6.6.5", "recharts": "^2.12.6", "sass": "^1.75.0", + "sqlite3": "^5.1.7", "typescript": "^5.4.5", "url": "^0.11.3", "web-vitals": "^3.5.2" @@ -71,9 +74,9 @@ "string-width": "4.2.3" }, "scripts": { - "dev": "next dev", + "dev": "yarn prisma migrate deploy && yarn prisma generate && next dev", "build": "next build", - "start": "next start", + "start": "yarn prisma migrate deploy && yarn prisma generate && next start", "prettier": "prettier --check ./", "format": "prettier --write ./", "lint": "next lint", diff --git a/prisma/migrations/20240822112149_0_init_db/migration.sql b/prisma/migrations/20240822112149_0_init_db/migration.sql new file mode 100644 index 0000000..2fc37a4 --- /dev/null +++ b/prisma/migrations/20240822112149_0_init_db/migration.sql @@ -0,0 +1,24 @@ +-- CreateTable +CREATE TABLE "ConnectionType" ( + "id" TEXT NOT NULL PRIMARY KEY, + "typeName" TEXT NOT NULL +); + +-- CreateTable +CREATE TABLE "MnestixConnection" ( + "id" TEXT NOT NULL PRIMARY KEY, + "url" TEXT NOT NULL, + "typeId" TEXT NOT NULL, + CONSTRAINT "MnestixConnection_typeId_fkey" FOREIGN KEY ("typeId") REFERENCES "ConnectionType" ("id") ON DELETE RESTRICT ON UPDATE CASCADE +); + +--- CHANGED MANUALLY --- +-- Insert ConnectionType Enum values as SQLite does not support Enums +-- Create a new migration if you need to expand this Enum! +INSERT INTO "ConnectionType" (id, typeName) +VALUES (0, 'AAS_REPOSITORY'), + (1, 'AAS_REGISTRY'), + (2, 'SUBMODEL_REPOSITORY'), + (3, 'SUBMODEL_REGISTRY'), + (4, 'DISCOVERY_SERVICE'), + (5, 'CONCEPT_DESCRIPTION'); diff --git a/prisma/migrations/migration_lock.toml b/prisma/migrations/migration_lock.toml new file mode 100644 index 0000000..e5e5c47 --- /dev/null +++ b/prisma/migrations/migration_lock.toml @@ -0,0 +1,3 @@ +# Please do not edit this file manually +# It should be added in your version-control system (i.e. Git) +provider = "sqlite" \ No newline at end of file diff --git a/prisma/schema.prisma b/prisma/schema.prisma new file mode 100644 index 0000000..03ac772 --- /dev/null +++ b/prisma/schema.prisma @@ -0,0 +1,25 @@ +// This is our Prisma schema file. +// Changing the schema requires a new migration to apply those changes to all database instances. +// Migrations can be generated by prisma. + +generator client { + provider = "prisma-client-js" +} + +datasource db { + provider = "sqlite" + url = "file:./database/mnestix-database.db" +} + +model ConnectionType { + id String @id @default(cuid()) + typeName String + connection MnestixConnection[] +} + +model MnestixConnection { + id String @id @default(cuid()) + url String + type ConnectionType @relation(fields: [typeId], references: [id]) + typeId String +} \ No newline at end of file diff --git a/src/app/[locale]/settings/_components/id-settings/IdSettingsCard.tsx b/src/app/[locale]/settings/_components/id-settings/IdSettingsCard.tsx index 85b4d2a..e005d17 100644 --- a/src/app/[locale]/settings/_components/id-settings/IdSettingsCard.tsx +++ b/src/app/[locale]/settings/_components/id-settings/IdSettingsCard.tsx @@ -44,7 +44,7 @@ export function IdSettingsCard(props: IdSettingsCardProps) { } } return ( - + } subtitle={} @@ -86,6 +86,6 @@ export function IdSettingsCard(props: IdSettingsCardProps) { open={documentationModalOpen} onClose={() => setDocumentationModalOpen(false)} /> - + ); } diff --git a/src/app/[locale]/settings/_components/mnestix-connections/MnestixConnectionsCard.tsx b/src/app/[locale]/settings/_components/mnestix-connections/MnestixConnectionsCard.tsx new file mode 100644 index 0000000..d1bd78e --- /dev/null +++ b/src/app/[locale]/settings/_components/mnestix-connections/MnestixConnectionsCard.tsx @@ -0,0 +1,18 @@ +import { CardHeading } from 'components/basics/CardHeading'; +import { FormattedMessage } from 'react-intl'; +import { messages } from 'lib/i18n/localization'; +import { Box } from '@mui/material'; + +export function MnestixConnectionsCard() { + return ( + + } + subtitle={} + /> + + todo: content will follow + + + ); +} \ No newline at end of file diff --git a/src/app/[locale]/settings/page.tsx b/src/app/[locale]/settings/page.tsx index 680796c..8053757 100644 --- a/src/app/[locale]/settings/page.tsx +++ b/src/app/[locale]/settings/page.tsx @@ -1,9 +1,10 @@ 'use client'; import { PrivateRoute } from 'components/azureAuthentication/PrivateRoute'; -import { Box } from '@mui/material'; +import { Box, Card } from '@mui/material'; import { FormattedMessage, useIntl } from 'react-intl'; import { ViewHeading } from 'components/basics/ViewHeading'; +import { TabSelectorItem, VerticalTabSelector } from 'components/basics/VerticalTabSelector'; import { messages } from 'lib/i18n/localization'; import { useState } from 'react'; import { IdGenerationSettingFrontend } from 'lib/types/IdGenerationSettingFrontend'; @@ -20,16 +21,35 @@ import { useAsyncEffect } from 'lib/hooks/UseAsyncEffect'; import { useAuth } from 'lib/hooks/UseAuth'; import { IdSettingsCard } from './_components/id-settings/IdSettingsCard'; import { useApis } from 'components/azureAuthentication/ApiProvider'; +import { useIsMobile } from 'lib/hooks/UseBreakpoints'; +import { MnestixConnectionsCard } from 'app/[locale]/settings/_components/mnestix-connections/MnestixConnectionsCard'; + +enum settingsPageTypes { + ID_STRUCTURE, + MNESTIX_CONNECTIONS +} export default function Page() { const notificationSpawner = useNotificationSpawner(); const intl = useIntl(); const [settings, setSettings] = useState([]); const [isLoading, setIsLoading] = useState(false); + const isMobile = useIsMobile(); + + const settingsTabItems: TabSelectorItem[] = [ + { + id: settingsPageTypes[settingsPageTypes.ID_STRUCTURE], + label: intl.formatMessage(messages.mnestix.idStructure) + }, + { + id: settingsPageTypes[settingsPageTypes.MNESTIX_CONNECTIONS], + label: intl.formatMessage(messages.mnestix.mnestixConnections) + }] + const [selectedTab, setSelectedTab] = useState(settingsTabItems[0]); const auth = useAuth(); const bearerToken = auth.getBearerToken(); - const { configurationClient } = useApis(); + const {configurationClient} = useApis(); const fetchSettings = async () => { try { @@ -105,19 +125,37 @@ export default function Page() { await fetchSettings(); }, [bearerToken]); + + const renderActiveSettingsTab = () => { + switch (selectedTab.id) { + case settingsPageTypes[settingsPageTypes.ID_STRUCTURE]: + return + case settingsPageTypes[settingsPageTypes.MNESTIX_CONNECTIONS]: + return + default: + return <> + } + } + return ( - - - } /> - {/* TODO: Place action buttons here (e.g. specification button) */} + + + }/> - - + + + + {renderActiveSettingsTab()} + + + +

{}

diff --git a/src/app/api/mnestixConnections/route.ts b/src/app/api/mnestixConnections/route.ts new file mode 100644 index 0000000..e8aaca8 --- /dev/null +++ b/src/app/api/mnestixConnections/route.ts @@ -0,0 +1,36 @@ +import { prisma } from 'lib/database/prisma'; +import { NextRequest } from 'next/server'; + +export async function GET() { + try { + const mnestixConnections = await prisma.mnestixConnection.findMany({include: {type: true}}) + + return Response.json(mnestixConnections); + } catch (error) { + return Response.json({ error: (error as Error).message }); + } +} + +export async function POST(req: NextRequest) { + const mnestixConnectionRequest = await req.json() + + if (!mnestixConnectionRequest.url || !mnestixConnectionRequest.type) { + return Response.json({ error: 'Url and type are required' }); + } + + try { + const mnestixType = await prisma.connectionType.findFirst({ where: { typeName: mnestixConnectionRequest.type } }) + if (!mnestixType) { + return Response.json({ error: 'Invalid type' }) + } + await prisma.mnestixConnection.create({ + data: { + url: mnestixConnectionRequest.url, + typeId: mnestixType.id + } + }) + return Response.json({ message: 'MnestixConnection created' }); + } catch (error) { + return Response.json({ error: (error as Error).message }); + } +} diff --git a/src/lib/database/prisma.ts b/src/lib/database/prisma.ts new file mode 100644 index 0000000..47bb9d2 --- /dev/null +++ b/src/lib/database/prisma.ts @@ -0,0 +1,17 @@ +import { PrismaClient } from '@prisma/client'; + +/** + * For using prisma with Next.js, it is recommended to use the PrismaClient as Singleton. + */ +const prismaClientSingleton = () => { + return new PrismaClient(); +}; + +declare global { + // eslint-disable-next-line + var prisma: undefined | ReturnType; +} + +export const prisma = globalThis.prisma ?? prismaClientSingleton(); + +if (process.env.NODE_ENV !== 'production') globalThis.prisma = prisma; diff --git a/src/lib/i18n/de.mnestix.ts b/src/lib/i18n/de.mnestix.ts index 14a29de..0fad8c4 100644 --- a/src/lib/i18n/de.mnestix.ts +++ b/src/lib/i18n/de.mnestix.ts @@ -20,6 +20,8 @@ export const deMnestix = { idStructure: 'ID Struktur', idStructureExplanation: 'Definieren Sie, wie Ihre IDs aussehen sollen. Dies ist eine Basis-Einstellung, die für individuelle Importe angepasst werden kann.', + mnestixConnections: 'Mnestix Quellen', + mnestixConnectionsExplanation: 'Definieren Sie, welche Daten Quellen verwendet werden sollen.', submodels: 'Submodelle', unknownModelType: 'Unbekannter ModelType: {type}', nameplateAddressTypes: { diff --git a/src/lib/i18n/en.mnestix.ts b/src/lib/i18n/en.mnestix.ts index 6578456..5e47bea 100644 --- a/src/lib/i18n/en.mnestix.ts +++ b/src/lib/i18n/en.mnestix.ts @@ -20,6 +20,8 @@ export const enMnestix = { idStructure: 'ID structure', idStructureExplanation: 'Define, how your IDs are represented. This is a standard setting that can be adjusted for individual imports.', + mnestixConnections: 'Mnestix Connections', + mnestixConnectionsExplanation: 'Define which data connections should be used.', submodels: 'Submodels', unknownModelType: 'Unknown ModelType: {type}', nameplateAddressTypes: { diff --git a/yarn.lock b/yarn.lock index 2132524..675e8de 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1397,6 +1397,11 @@ tslib "^2.4.0" typescript "5" +"@gar/promisify@^1.0.1": + version "1.1.3" + resolved "https://registry.yarnpkg.com/@gar/promisify/-/promisify-1.1.3.tgz#555193ab2e3bb3b6adc3d551c9c030d9e860daf6" + integrity sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw== + "@humanwhocodes/config-array@^0.11.14": version "0.11.14" resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.14.tgz#d78e481a039f7566ecc9660b4ea7fe6b1fec442b" @@ -1708,6 +1713,22 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" +"@npmcli/fs@^1.0.0": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-1.1.1.tgz#72f719fe935e687c56a4faecf3c03d06ba593257" + integrity sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ== + dependencies: + "@gar/promisify" "^1.0.1" + semver "^7.3.5" + +"@npmcli/move-file@^1.0.1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@npmcli/move-file/-/move-file-1.1.2.tgz#1a82c3e372f7cae9253eb66d72543d6b8685c674" + integrity sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg== + dependencies: + mkdirp "^1.0.4" + rimraf "^3.0.2" + "@panva/hkdf@^1.0.2": version "1.2.1" resolved "https://registry.yarnpkg.com/@panva/hkdf/-/hkdf-1.2.1.tgz#cb0d111ef700136f4580349ff0226bf25c853f23" @@ -1728,6 +1749,47 @@ resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.8.tgz#6b79032e760a0899cd4204710beede972a3a185f" integrity sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A== +"@prisma/client@^5.18.0": + version "5.18.0" + resolved "https://registry.yarnpkg.com/@prisma/client/-/client-5.18.0.tgz#526e4281a448f214c0ff81d65c39243608c98294" + integrity sha512-BWivkLh+af1kqC89zCJYkHsRcyWsM8/JHpsDMM76DjP3ZdEquJhXa4IeX+HkWPnwJ5FanxEJFZZDTWiDs/Kvyw== + +"@prisma/debug@5.18.0": + version "5.18.0" + resolved "https://registry.yarnpkg.com/@prisma/debug/-/debug-5.18.0.tgz#527799e044d2903a35945e61ac2d8916e4b61ead" + integrity sha512-f+ZvpTLidSo3LMJxQPVgAxdAjzv5OpzAo/eF8qZqbwvgi2F5cTOI9XCpdRzJYA0iGfajjwjOKKrVq64vkxEfUw== + +"@prisma/engines-version@5.18.0-25.4c784e32044a8a016d99474bd02a3b6123742169": + version "5.18.0-25.4c784e32044a8a016d99474bd02a3b6123742169" + resolved "https://registry.yarnpkg.com/@prisma/engines-version/-/engines-version-5.18.0-25.4c784e32044a8a016d99474bd02a3b6123742169.tgz#203426ebf4ec4e1acce7da4a59ec8f0df92b29e7" + integrity sha512-a/+LpJj8vYU3nmtkg+N3X51ddbt35yYrRe8wqHTJtYQt7l1f8kjIBcCs6sHJvodW/EK5XGvboOiwm47fmNrbgg== + +"@prisma/engines@5.18.0": + version "5.18.0" + resolved "https://registry.yarnpkg.com/@prisma/engines/-/engines-5.18.0.tgz#26ea46e26498be622407cf95663d7fb4c39c895b" + integrity sha512-ofmpGLeJ2q2P0wa/XaEgTnX/IsLnvSp/gZts0zjgLNdBhfuj2lowOOPmDcfKljLQUXMvAek3lw5T01kHmCG8rg== + dependencies: + "@prisma/debug" "5.18.0" + "@prisma/engines-version" "5.18.0-25.4c784e32044a8a016d99474bd02a3b6123742169" + "@prisma/fetch-engine" "5.18.0" + "@prisma/get-platform" "5.18.0" + +"@prisma/fetch-engine@5.18.0": + version "5.18.0" + resolved "https://registry.yarnpkg.com/@prisma/fetch-engine/-/fetch-engine-5.18.0.tgz#5b343e2b36b27e2713901ddd032ddd6932b3d55f" + integrity sha512-I/3u0x2n31rGaAuBRx2YK4eB7R/1zCuayo2DGwSpGyrJWsZesrV7QVw7ND0/Suxeo/vLkJ5OwuBqHoCxvTHpOg== + dependencies: + "@prisma/debug" "5.18.0" + "@prisma/engines-version" "5.18.0-25.4c784e32044a8a016d99474bd02a3b6123742169" + "@prisma/get-platform" "5.18.0" + +"@prisma/get-platform@5.18.0": + version "5.18.0" + resolved "https://registry.yarnpkg.com/@prisma/get-platform/-/get-platform-5.18.0.tgz#0dc4c82fe9a4971f4519a57cb2dd69d8e0df4b71" + integrity sha512-Tk+m7+uhqcKDgnMnFN0lRiH7Ewea0OEsZZs9pqXa7i3+7svS3FSCqDBCaM9x5fmhhkufiG0BtunJVDka+46DlA== + dependencies: + "@prisma/debug" "5.18.0" + "@rushstack/eslint-patch@^1.3.3": version "1.10.2" resolved "https://registry.yarnpkg.com/@rushstack/eslint-patch/-/eslint-patch-1.10.2.tgz#053f1540703faa81dea2966b768ee5581c66aeda" @@ -1857,6 +1919,11 @@ "@swc/counter" "^0.1.3" tslib "^2.4.0" +"@tootallnate/once@1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" + integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== + "@trysound/sax@0.2.0": version "0.2.0" resolved "https://registry.yarnpkg.com/@trysound/sax/-/sax-0.2.0.tgz#cccaab758af56761eb7bf37af6f03f326dd798ad" @@ -1986,7 +2053,7 @@ resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.17.1.tgz#0fabfcf2f2127ef73b119d98452bd317c4a17eb8" integrity sha512-X+2qazGS3jxLAIz5JDXDzglAF3KpijdhFxlf/V1+hEsOUc+HnWi81L/uv/EvGuV90WY+7mPGFCUDGfQC3Gj95Q== -"@types/node@*", "@types/node@^20.12.7": +"@types/node@*": version "20.12.12" resolved "https://registry.yarnpkg.com/@types/node/-/node-20.12.12.tgz#7cbecdf902085cec634fdb362172dfe12b8f2050" integrity sha512-eWLDGF/FOSPtAvEqeRAQ4C8LSA7M1I7i0ky1I8U7kD1J5ITyW3AsRhQrKVoWf5pFKZ2kILsEGJhsI9r93PYnOw== @@ -1998,6 +2065,13 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.45.tgz#2c0fafd78705e7a18b7906b5201a522719dc5190" integrity sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw== +"@types/node@^22.4.2": + version "22.5.0" + resolved "https://registry.yarnpkg.com/@types/node/-/node-22.5.0.tgz#10f01fe9465166b4cab72e75f60d8b99d019f958" + integrity sha512-DkFrJOe+rfdHTqqMg0bSNlGlQ85hSoh2TPzZyhHsXnMtligRWpxUySiyw8FY14ITt24HVCiQPWxS3KO/QlGmWg== + dependencies: + undici-types "~6.19.2" + "@types/parse-json@^4.0.0": version "4.0.2" resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.2.tgz#5950e50960793055845e956c427fc2b0d70c5239" @@ -2254,6 +2328,11 @@ resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== +abbrev@1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== + acorn-jsx@^5.3.2: version "5.3.2" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" @@ -2264,6 +2343,20 @@ acorn@^8.9.0: resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a" integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== +agent-base@6, agent-base@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" + integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== + dependencies: + debug "4" + +agentkeepalive@^4.1.3: + version "4.5.0" + resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.5.0.tgz#2673ad1389b3c418c5a20c5d7364f93ca04be923" + integrity sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew== + dependencies: + humanize-ms "^1.2.1" + aggregate-error@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" @@ -2341,11 +2434,24 @@ anymatch@~3.1.2: normalize-path "^3.0.0" picomatch "^2.0.4" +"aproba@^1.0.3 || ^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-2.0.0.tgz#52520b8ae5b569215b354efc0caa3fe1e45a8adc" + integrity sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ== + arch@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/arch/-/arch-2.2.0.tgz#1bc47818f305764f23ab3306b0bfc086c5a29d11" integrity sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ== +are-we-there-yet@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz#679df222b278c64f2cdba1175cdc00b0d96164bd" + integrity sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg== + dependencies: + delegates "^1.0.0" + readable-stream "^3.6.0" + argparse@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" @@ -2583,6 +2689,22 @@ binary-extensions@^2.0.0: resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== +bindings@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" + integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== + dependencies: + file-uri-to-path "1.0.0" + +bl@^4.0.3: + version "4.1.0" + resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" + integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== + dependencies: + buffer "^5.5.0" + inherits "^2.0.4" + readable-stream "^3.4.0" + blob-util@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/blob-util/-/blob-util-2.0.2.tgz#3b4e3c281111bb7f11128518006cdc60b403a1eb" @@ -2635,7 +2757,7 @@ buffer-crc32@~0.2.3: resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" integrity sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ== -buffer@^5.7.1: +buffer@^5.5.0, buffer@^5.7.1: version "5.7.1" resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== @@ -2658,6 +2780,30 @@ busboy@1.6.0: dependencies: streamsearch "^1.1.0" +cacache@^15.2.0: + version "15.3.0" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-15.3.0.tgz#dc85380fb2f556fe3dda4c719bfa0ec875a7f1eb" + integrity sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ== + dependencies: + "@npmcli/fs" "^1.0.0" + "@npmcli/move-file" "^1.0.1" + chownr "^2.0.0" + fs-minipass "^2.0.0" + glob "^7.1.4" + infer-owner "^1.0.4" + lru-cache "^6.0.0" + minipass "^3.1.1" + minipass-collect "^1.0.2" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.2" + mkdirp "^1.0.3" + p-map "^4.0.0" + promise-inflight "^1.0.1" + rimraf "^3.0.2" + ssri "^8.0.1" + tar "^6.0.2" + unique-filename "^1.1.1" + cachedir@^2.3.0: version "2.4.0" resolved "https://registry.yarnpkg.com/cachedir/-/cachedir-2.4.0.tgz#7fef9cf7367233d7c88068fe6e34ed0d355a610d" @@ -2736,6 +2882,16 @@ check-more-types@^2.24.0: optionalDependencies: fsevents "~2.3.2" +chownr@^1.1.1: + version "1.1.4" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" + integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== + +chownr@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" + integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== + ci-info@^3.2.0: version "3.9.0" resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" @@ -2829,6 +2985,11 @@ color-space@^2.0.0, color-space@^2.0.1: resolved "https://registry.yarnpkg.com/color-space/-/color-space-2.0.1.tgz#da39871175baf4a5785ba519397df04b8d67e0fa" integrity sha512-nKqUYlo0vZATVOFHY810BSYjmCARrG7e5R3UE3CQlyjJTvv5kSSmPG1kzm/oDyyqjehM+lW1RnEt9It9GNa5JA== +color-support@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" + integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== + colorette@^2.0.16: version "2.0.20" resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" @@ -2861,6 +3022,11 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== +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" + integrity sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ== + convert-source-map@^1.5.0: version "1.9.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" @@ -3153,6 +3319,13 @@ dayjs@^1.10.4: resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.11.tgz#dfe0e9d54c5f8b68ccf8ca5f72ac603e7e5ed59e" integrity sha512-okzr3f11N6WuqYtZSvm+F776mB41wRZMhKP+hc34YdW+KmtYYK9iqvHSwo2k9FEH3fhGXvOPV6yz2IcSrfRUDg== +debug@4, debug@^4.3.3: + version "4.3.6" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.6.tgz#2ab2c38fbaffebf8aa95fdfe6d88438c7a13c52b" + integrity sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg== + dependencies: + ms "2.1.2" + debug@^2.2.0: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" @@ -3179,6 +3352,18 @@ decimal.js-light@^2.4.1: resolved "https://registry.yarnpkg.com/decimal.js-light/-/decimal.js-light-2.5.1.tgz#134fd32508f19e208f4fb2f8dac0d2626a867934" integrity sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg== +decompress-response@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc" + integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ== + dependencies: + mimic-response "^3.1.0" + +deep-extend@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== + deep-is@^0.1.3: version "0.1.4" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" @@ -3212,11 +3397,21 @@ delayed-stream@~1.0.0: resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + integrity sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ== + dequal@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be" integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== +detect-libc@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.3.tgz#f0cd503b40f9939b894697d19ad50895e30cf700" + integrity sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw== + diff-sequences@^29.6.3: version "29.6.3" resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.6.3.tgz#4deaf894d11407c51efc8418012f9e70b84ea921" @@ -3322,7 +3517,14 @@ emoji-regex@^9.2.2: resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== -end-of-stream@^1.1.0: +encoding@^0.1.12: + version "0.1.13" + resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" + integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== + dependencies: + iconv-lite "^0.6.2" + +end-of-stream@^1.1.0, end-of-stream@^1.4.1: version "1.4.4" resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== @@ -3350,6 +3552,16 @@ entities@^4.2.0, entities@^4.4.0: resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== +env-paths@^2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" + integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== + +err-code@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/err-code/-/err-code-2.0.3.tgz#23c2f3b756ffdfc608d30e27c9a941024807e7f9" + integrity sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA== + error-ex@^1.3.1: version "1.3.2" resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" @@ -3757,6 +3969,11 @@ executable@^4.1.1: dependencies: pify "^2.2.0" +expand-template@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-2.0.3.tgz#6e14b3fcee0f3a6340ecb57d2e8918692052a47c" + integrity sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg== + expect@^29.0.0: version "29.7.0" resolved "https://registry.yarnpkg.com/expect/-/expect-29.7.0.tgz#578874590dcb3214514084c08115d8aee61e11bc" @@ -3853,6 +4070,11 @@ file-entry-cache@^6.0.1: dependencies: flat-cache "^3.0.4" +file-uri-to-path@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" + integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== + fill-range@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" @@ -3921,6 +4143,11 @@ form-data@~2.3.2: combined-stream "^1.0.6" mime-types "^2.1.12" +fs-constants@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" + integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== + fs-extra@^9.1.0: version "9.1.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" @@ -3931,6 +4158,13 @@ fs-extra@^9.1.0: jsonfile "^6.0.1" universalify "^2.0.0" +fs-minipass@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" + integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== + dependencies: + minipass "^3.0.0" + fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" @@ -3961,6 +4195,20 @@ functions-have-names@^1.2.3: resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== +gauge@^4.0.3: + version "4.0.4" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-4.0.4.tgz#52ff0652f2bbf607a989793d53b751bef2328dce" + integrity sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg== + dependencies: + aproba "^1.0.3 || ^2.0.0" + color-support "^1.1.3" + console-control-strings "^1.1.0" + has-unicode "^2.0.1" + signal-exit "^3.0.7" + string-width "^4.2.3" + strip-ansi "^6.0.1" + wide-align "^1.1.5" + 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" @@ -4028,6 +4276,11 @@ getpass@^0.1.1: dependencies: assert-plus "^1.0.0" +github-from-package@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce" + integrity sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw== + glob-parent@^5.1.2, glob-parent@~5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" @@ -4053,7 +4306,7 @@ glob@10.3.10: minipass "^5.0.0 || ^6.0.2 || ^7.0.0" path-scurry "^1.10.1" -glob@^7.1.3: +glob@^7.1.3, glob@^7.1.4: version "7.2.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== @@ -4116,7 +4369,7 @@ gopd@^1.0.1: dependencies: get-intrinsic "^1.1.3" -graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.11, graceful-fs@^4.2.4, graceful-fs@^4.2.9: +graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.11, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9: version "4.2.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== @@ -4165,6 +4418,11 @@ has-tostringtag@^1.0.0, has-tostringtag@^1.0.2: dependencies: has-symbols "^1.0.3" +has-unicode@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + integrity sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ== + hasown@^2.0.0, hasown@^2.0.1, hasown@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" @@ -4179,6 +4437,20 @@ hoist-non-react-statics@^3.3.0, hoist-non-react-statics@^3.3.1, hoist-non-react- dependencies: react-is "^16.7.0" +http-cache-semantics@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz#abe02fcb2985460bf0323be664436ec3476a6d5a" + integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ== + +http-proxy-agent@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a" + integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg== + dependencies: + "@tootallnate/once" "1" + agent-base "6" + debug "4" + http-signature@~1.3.6: version "1.3.6" resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.3.6.tgz#cb6fbfdf86d1c974f343be94e87f7fc128662cf9" @@ -4188,11 +4460,33 @@ http-signature@~1.3.6: jsprim "^2.0.2" sshpk "^1.14.1" +https-proxy-agent@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" + integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== + dependencies: + agent-base "6" + debug "4" + human-signals@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== +humanize-ms@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed" + integrity sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ== + dependencies: + ms "^2.0.0" + +iconv-lite@^0.6.2: + version "0.6.3" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" + integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + ieee754@^1.1.12, ieee754@^1.1.13, ieee754@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" @@ -4226,6 +4520,11 @@ indent-string@^4.0.0: resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== +infer-owner@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" + integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A== + inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" @@ -4234,7 +4533,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2: +inherits@2, inherits@^2.0.3, inherits@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -4244,6 +4543,11 @@ ini@2.0.0: resolved "https://registry.yarnpkg.com/ini/-/ini-2.0.0.tgz#e5fd556ecdd5726be978fa1001862eacb0a94bc5" integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA== +ini@~1.3.0: + version "1.3.8" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" + integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== + internal-slot@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.7.tgz#c06dcca3ed874249881007b0a5523b172a190802" @@ -4268,6 +4572,14 @@ intl-messageformat@10.5.12, intl-messageformat@^10.5.11: "@formatjs/icu-messageformat-parser" "2.7.6" tslib "^2.4.0" +ip-address@^9.0.5: + version "9.0.5" + resolved "https://registry.yarnpkg.com/ip-address/-/ip-address-9.0.5.tgz#117a960819b08780c3bd1f14ef3c1cc1d3f3ea5a" + integrity sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g== + dependencies: + jsbn "1.1.0" + sprintf-js "^1.1.3" + is-array-buffer@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.4.tgz#7a1f92b3d61edd2bc65d24f130530ea93d7fae98" @@ -4387,6 +4699,11 @@ is-installed-globally@~0.4.0: global-dirs "^3.0.0" is-path-inside "^3.0.2" +is-lambda@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-lambda/-/is-lambda-1.0.1.tgz#3d9877899e6a53efc0160504cde15f82e6f061d5" + integrity sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ== + is-map@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.3.tgz#ede96b7fe1e270b3c4465e3a465658764926d62e" @@ -4602,6 +4919,11 @@ js-yaml@^4.1.0: dependencies: argparse "^2.0.1" +jsbn@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-1.1.0.tgz#b01307cb29b618a1ed26ec79e911f803c4da0040" + integrity sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A== + jsbn@~0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" @@ -4844,6 +5166,28 @@ magic-string@^0.30.0: dependencies: "@jridgewell/sourcemap-codec" "^1.4.15" +make-fetch-happen@^9.1.0: + version "9.1.0" + resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz#53085a09e7971433e6765f7971bf63f4e05cb968" + integrity sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg== + dependencies: + agentkeepalive "^4.1.3" + cacache "^15.2.0" + http-cache-semantics "^4.1.0" + http-proxy-agent "^4.0.1" + https-proxy-agent "^5.0.0" + is-lambda "^1.0.1" + lru-cache "^6.0.0" + minipass "^3.1.3" + minipass-collect "^1.0.2" + minipass-fetch "^1.3.2" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.4" + negotiator "^0.6.2" + promise-retry "^2.0.1" + socks-proxy-agent "^6.0.0" + ssri "^8.0.0" + md5@^2.1.0: version "2.3.0" resolved "https://registry.yarnpkg.com/md5/-/md5-2.3.0.tgz#c3da9a6aae3a30b46b7b0c349b87b110dc3bda4f" @@ -4898,6 +5242,11 @@ mimic-fn@^2.1.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== +mimic-response@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9" + integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== + minimatch@9.0.3: version "9.0.3" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.3.tgz#a6e00c3de44c3a542bfaae70abfc22420a6da825" @@ -4919,16 +5268,85 @@ minimatch@^9.0.1, minimatch@^9.0.4: dependencies: brace-expansion "^2.0.1" -minimist@^1.2.0, minimist@^1.2.6, minimist@^1.2.8: +minimist@^1.2.0, minimist@^1.2.3, minimist@^1.2.6, minimist@^1.2.8: version "1.2.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== +minipass-collect@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/minipass-collect/-/minipass-collect-1.0.2.tgz#22b813bf745dc6edba2576b940022ad6edc8c617" + integrity sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA== + dependencies: + minipass "^3.0.0" + +minipass-fetch@^1.3.2: + version "1.4.1" + resolved "https://registry.yarnpkg.com/minipass-fetch/-/minipass-fetch-1.4.1.tgz#d75e0091daac1b0ffd7e9d41629faff7d0c1f1b6" + integrity sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw== + dependencies: + minipass "^3.1.0" + minipass-sized "^1.0.3" + minizlib "^2.0.0" + optionalDependencies: + encoding "^0.1.12" + +minipass-flush@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/minipass-flush/-/minipass-flush-1.0.5.tgz#82e7135d7e89a50ffe64610a787953c4c4cbb373" + integrity sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw== + dependencies: + minipass "^3.0.0" + +minipass-pipeline@^1.2.2, minipass-pipeline@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz#68472f79711c084657c067c5c6ad93cddea8214c" + integrity sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A== + dependencies: + minipass "^3.0.0" + +minipass-sized@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/minipass-sized/-/minipass-sized-1.0.3.tgz#70ee5a7c5052070afacfbc22977ea79def353b70" + integrity sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g== + dependencies: + minipass "^3.0.0" + +minipass@^3.0.0, minipass@^3.1.0, minipass@^3.1.1, minipass@^3.1.3: + version "3.3.6" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.3.6.tgz#7bba384db3a1520d18c9c0e5251c3444e95dd94a" + integrity sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw== + dependencies: + yallist "^4.0.0" + +minipass@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-5.0.0.tgz#3e9788ffb90b694a5d0ec94479a45b5d8738133d" + integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ== + "minipass@^5.0.0 || ^6.0.2 || ^7.0.0": version "7.1.1" resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.1.tgz#f7f85aff59aa22f110b20e27692465cf3bf89481" integrity sha512-UZ7eQ+h8ywIRAW1hIEl2AqdwzJucU/Kp59+8kkZeSvafXhZjul247BvIJjEVFVeON6d7lM46XX1HXCduKAS8VA== +minizlib@^2.0.0, minizlib@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" + integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== + dependencies: + minipass "^3.0.0" + yallist "^4.0.0" + +mkdirp-classic@^0.5.2, mkdirp-classic@^0.5.3: + version "0.5.3" + resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113" + integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== + +mkdirp@^1.0.3, mkdirp@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + mkdirp@~0.5.1: version "0.5.6" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" @@ -4951,7 +5369,7 @@ ms@2.1.2: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== -ms@^2.1.1: +ms@^2.0.0, 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== @@ -4961,12 +5379,17 @@ nanoid@^3.3.6: resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== +napi-build-utils@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/napi-build-utils/-/napi-build-utils-1.0.2.tgz#b1fddc0b2c46e380a0b7a76f984dd47c41a13806" + integrity sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg== + natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== -negotiator@^0.6.3: +negotiator@^0.6.2, negotiator@^0.6.3: version "0.6.3" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== @@ -5026,6 +5449,18 @@ no-case@^3.0.4: lower-case "^2.0.2" tslib "^2.0.3" +node-abi@^3.3.0: + version "3.67.0" + resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.67.0.tgz#1d159907f18d18e18809dbbb5df47ed2426a08df" + integrity sha512-bLn/fU/ALVBE9wj+p4Y21ZJWYFjUXLXPi/IewyLZkx3ApxKDNBWCKdReeKOtD8dWpOdDCeMyLh6ZewzcLsG2Nw== + dependencies: + semver "^7.3.5" + +node-addon-api@^7.0.0: + version "7.1.1" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-7.1.1.tgz#1aba6693b0f255258a049d621329329322aad558" + integrity sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ== + node-fetch@^2.6.1: version "2.7.0" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" @@ -5033,11 +5468,34 @@ node-fetch@^2.6.1: dependencies: whatwg-url "^5.0.0" +node-gyp@8.x: + version "8.4.1" + resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-8.4.1.tgz#3d49308fc31f768180957d6b5746845fbd429937" + integrity sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w== + dependencies: + env-paths "^2.2.0" + glob "^7.1.4" + graceful-fs "^4.2.6" + make-fetch-happen "^9.1.0" + nopt "^5.0.0" + npmlog "^6.0.0" + rimraf "^3.0.2" + semver "^7.3.5" + tar "^6.1.2" + which "^2.0.2" + node-releases@^2.0.14: version "2.0.14" resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.14.tgz#2ffb053bceb8b2be8495ece1ab6ce600c4461b0b" integrity sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw== +nopt@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-5.0.0.tgz#530942bb58a512fccafe53fe210f13a25355dc88" + integrity sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ== + dependencies: + abbrev "1" + 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" @@ -5050,6 +5508,16 @@ npm-run-path@^4.0.0: dependencies: path-key "^3.0.0" +npmlog@^6.0.0: + version "6.0.2" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-6.0.2.tgz#c8166017a42f2dea92d6453168dd865186a70830" + integrity sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg== + dependencies: + are-we-there-yet "^3.0.0" + console-control-strings "^1.1.0" + gauge "^4.0.3" + set-blocking "^2.0.0" + nth-check@^2.0.1: version "2.1.1" resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.1.1.tgz#c9eab428effce36cd6b92c924bdb000ef1f1ed1d" @@ -5336,6 +5804,24 @@ preact@^10.6.3: resolved "https://registry.yarnpkg.com/preact/-/preact-10.23.1.tgz#d400107289bc979881c5212cb5f5cd22cd1dc38c" integrity sha512-O5UdRsNh4vdZaTieWe3XOgSpdMAmkIYBCT3VhQDlKrzyCm8lUYsk0fmVEvoQQifoOjFRTaHZO69ylrzTW2BH+A== +prebuild-install@^7.1.1: + version "7.1.2" + resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-7.1.2.tgz#a5fd9986f5a6251fbc47e1e5c65de71e68c0a056" + integrity sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ== + dependencies: + detect-libc "^2.0.0" + expand-template "^2.0.3" + github-from-package "0.0.0" + minimist "^1.2.3" + mkdirp-classic "^0.5.3" + napi-build-utils "^1.0.1" + node-abi "^3.3.0" + pump "^3.0.0" + rc "^1.2.7" + simple-get "^4.0.0" + tar-fs "^2.0.0" + tunnel-agent "^0.6.0" + prelude-ls@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" @@ -5365,11 +5851,31 @@ pretty-format@^3.8.0: resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-3.8.0.tgz#bfbed56d5e9a776645f4b1ff7aa1a3ac4fa3c385" integrity sha512-WuxUnVtlWL1OfZFQFuqvnvs6MiAGk9UNsBostyBOB0Is9wb5uRESevA6rnl/rkksXaGX3GzZhPup5d6Vp1nFew== +prisma@^5.18.0: + version "5.18.0" + resolved "https://registry.yarnpkg.com/prisma/-/prisma-5.18.0.tgz#5ef69c802a075b7596231ea57003496873610b9e" + integrity sha512-+TrSIxZsh64OPOmaSgVPH7ALL9dfU0jceYaMJXsNrTkFHO7/3RANi5K2ZiPB1De9+KDxCWn7jvRq8y8pvk+o9g== + dependencies: + "@prisma/engines" "5.18.0" + process@^0.11.10: version "0.11.10" resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== +promise-inflight@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" + integrity sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g== + +promise-retry@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/promise-retry/-/promise-retry-2.0.1.tgz#ff747a13620ab57ba688f5fc67855410c370da22" + integrity sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g== + dependencies: + err-code "^2.0.2" + retry "^0.12.0" + prop-types@^15.6.2, prop-types@^15.8.1: version "15.8.1" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" @@ -5453,6 +5959,16 @@ rbush@^3.0.1: dependencies: quickselect "^2.0.0" +rc@^1.2.7: + version "1.2.8" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" + integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== + dependencies: + deep-extend "^0.6.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + react-dom@^18.2.0: version "18.3.1" resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.3.1.tgz#c2265d79511b57d479b3dd3fdfa51536494c5cb4" @@ -5518,6 +6034,15 @@ react@^18.2.0: dependencies: loose-envify "^1.1.0" +readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0: + version "3.6.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + readdirp@~3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" @@ -5667,6 +6192,11 @@ restore-cursor@^3.1.0: onetime "^5.1.0" signal-exit "^3.0.2" +retry@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" + integrity sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow== + reusify@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" @@ -5708,7 +6238,7 @@ safe-array-concat@^1.1.2: has-symbols "^1.0.3" isarray "^2.0.5" -safe-buffer@^5.0.1, safe-buffer@^5.1.2: +safe-buffer@^5.0.1, safe-buffer@^5.1.2, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== @@ -5722,7 +6252,7 @@ safe-regex-test@^1.0.3: es-errors "^1.3.0" is-regex "^1.1.4" -safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: +"safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== @@ -5748,11 +6278,21 @@ semver@^6.3.1: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== +semver@^7.3.5: + version "7.6.3" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" + integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== + semver@^7.5.3, semver@^7.5.4, semver@^7.6.0: version "7.6.2" resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.2.tgz#1e3b34759f896e8f14d6134732ce798aeb0c6e13" integrity sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w== +set-blocking@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== + set-function-length@^1.2.1: version "1.2.2" resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" @@ -5797,7 +6337,7 @@ side-channel@^1.0.4, side-channel@^1.0.6: get-intrinsic "^1.2.4" object-inspect "^1.13.1" -signal-exit@^3.0.2: +signal-exit@^3.0.2, signal-exit@^3.0.7: version "3.0.7" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== @@ -5807,6 +6347,20 @@ signal-exit@^4.0.1: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== +simple-concat@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f" + integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q== + +simple-get@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-4.0.1.tgz#4a39db549287c979d352112fa03fd99fd6bc3543" + integrity sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA== + dependencies: + decompress-response "^6.0.0" + once "^1.3.1" + simple-concat "^1.0.0" + slash@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" @@ -5830,6 +6384,11 @@ slice-ansi@^4.0.0: astral-regex "^2.0.0" is-fullwidth-code-point "^3.0.0" +smart-buffer@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae" + integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg== + snake-case@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/snake-case/-/snake-case-3.0.4.tgz#4f2bbd568e9935abdfd593f34c691dadb49c452c" @@ -5838,6 +6397,23 @@ snake-case@^3.0.4: dot-case "^3.0.4" tslib "^2.0.3" +socks-proxy-agent@^6.0.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-6.2.1.tgz#2687a31f9d7185e38d530bef1944fe1f1496d6ce" + integrity sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ== + dependencies: + agent-base "^6.0.2" + debug "^4.3.3" + socks "^2.6.2" + +socks@^2.6.2: + version "2.8.3" + resolved "https://registry.yarnpkg.com/socks/-/socks-2.8.3.tgz#1ebd0f09c52ba95a09750afe3f3f9f724a800cb5" + integrity sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw== + dependencies: + ip-address "^9.0.5" + smart-buffer "^4.2.0" + "source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.0.1, source-map-js@^1.0.2: version "1.2.0" resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.0.tgz#16b809c162517b5b8c3e7dcd315a2a5c2612b2af" @@ -5848,6 +6424,23 @@ source-map@^0.5.7: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== +sprintf-js@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.3.tgz#4914b903a2f8b685d17fdf78a70e917e872e444a" + integrity sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA== + +sqlite3@^5.1.7: + version "5.1.7" + resolved "https://registry.yarnpkg.com/sqlite3/-/sqlite3-5.1.7.tgz#59ca1053c1ab38647396586edad019b1551041b7" + integrity sha512-GGIyOiFaG+TUra3JIfkI/zGP8yZYLPQ0pl1bH+ODjiX57sPhrLU5sQJn1y9bDKZUFYkX1crlrPfSYt0BKKdkog== + dependencies: + bindings "^1.5.0" + node-addon-api "^7.0.0" + prebuild-install "^7.1.1" + tar "^6.1.11" + optionalDependencies: + node-gyp "8.x" + sshpk@^1.14.1: version "1.18.0" resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.18.0.tgz#1663e55cddf4d688b86a46b77f0d5fe363aba028" @@ -5863,6 +6456,13 @@ sshpk@^1.14.1: safer-buffer "^2.0.2" tweetnacl "~0.14.0" +ssri@^8.0.0, ssri@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-8.0.1.tgz#638e4e439e2ffbd2cd289776d5ca457c4f51a2af" + integrity sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ== + dependencies: + minipass "^3.1.1" + stack-utils@^2.0.3: version "2.0.6" resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.6.tgz#aaf0748169c02fc33c8232abccf933f54a1cc34f" @@ -5875,7 +6475,16 @@ streamsearch@^1.1.0: resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-1.1.0.tgz#404dd1e2247ca94af554e841a8ef0eaa238da764" integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg== -"string-width-cjs@npm:string-width@^4.2.0", string-width@4.2.3, string-width@^4.1.0, string-width@^4.2.0, string-width@^5.0.1, string-width@^5.1.2: +"string-width-cjs@npm:string-width@^4.2.0": + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string-width@4.2.3, "string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3, string-width@^5.0.1, string-width@^5.1.2: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -5930,7 +6539,14 @@ string.prototype.trimstart@^1.0.8: define-properties "^1.2.1" es-object-atoms "^1.0.0" -"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +"strip-ansi-cjs@npm:strip-ansi@^6.0.1": version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -5944,6 +6560,13 @@ strip-ansi@^4.0.0: dependencies: ansi-regex "^3.0.0" +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + strip-ansi@^7.0.1: version "7.1.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" @@ -5966,6 +6589,11 @@ strip-json-comments@^3.1.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== +strip-json-comments@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== + styled-jsx@5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/styled-jsx/-/styled-jsx-5.1.1.tgz#839a1c3aaacc4e735fed0781b8619ea5d0009d1f" @@ -6027,6 +6655,39 @@ tapable@^2.2.0: resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== +tar-fs@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.1.tgz#489a15ab85f1f0befabb370b7de4f9eb5cbe8784" + integrity sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng== + dependencies: + chownr "^1.1.1" + mkdirp-classic "^0.5.2" + pump "^3.0.0" + tar-stream "^2.1.4" + +tar-stream@^2.1.4: + version "2.2.0" + resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287" + integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ== + dependencies: + bl "^4.0.3" + end-of-stream "^1.4.1" + fs-constants "^1.0.0" + inherits "^2.0.3" + readable-stream "^3.1.1" + +tar@^6.0.2, tar@^6.1.11, tar@^6.1.2: + version "6.2.1" + resolved "https://registry.yarnpkg.com/tar/-/tar-6.2.1.tgz#717549c541bc3c2af15751bea94b1dd068d4b03a" + integrity sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A== + dependencies: + chownr "^2.0.0" + fs-minipass "^2.0.0" + minipass "^5.0.0" + minizlib "^2.1.1" + mkdirp "^1.0.3" + yallist "^4.0.0" + text-table@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" @@ -6201,6 +6862,11 @@ undici-types@~5.26.4: resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== +undici-types@~6.19.2: + version "6.19.8" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.19.8.tgz#35111c9d1437ab83a7cdc0abae2f26d88eda0a02" + integrity sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw== + unicode-canonical-property-names-ecmascript@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc" @@ -6231,6 +6897,20 @@ unicode-property-aliases-ecmascript@^2.0.0: resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz#43d41e3be698bd493ef911077c9b131f827e8ccd" integrity sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w== +unique-filename@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" + integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ== + dependencies: + unique-slug "^2.0.0" + +unique-slug@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.2.tgz#baabce91083fc64e945b0f3ad613e264f7cd4e6c" + integrity sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w== + dependencies: + imurmurhash "^0.1.4" + universalify@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.2.0.tgz#6451760566fa857534745ab1dde952d1b1761be0" @@ -6285,6 +6965,11 @@ use-intl@^3.14.0: "@formatjs/ecma402-abstract" "^1.11.4" intl-messageformat "^10.5.11" +util-deprecate@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== + uuid@^8.3.2: version "8.3.2" resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" @@ -6397,20 +7082,26 @@ which-typed-array@^1.1.14, which-typed-array@^1.1.15, which-typed-array@^1.1.9: gopd "^1.0.1" has-tostringtag "^1.0.2" -which@^2.0.1: +which@^2.0.1, which@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== dependencies: isexe "^2.0.0" +wide-align@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.5.tgz#df1d4c206854369ecf3c9a4898f1b23fbd9d15d3" + integrity sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg== + dependencies: + string-width "^1.0.2 || 2 || 3 || 4" + word-wrap@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: - name wrap-ansi-cjs +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== @@ -6428,6 +7119,15 @@ wrap-ansi@^6.2.0: string-width "^4.1.0" strip-ansi "^6.0.0" +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + wrap-ansi@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" From 8314c3d1af56892f92abdc018164508fbabbc99f Mon Sep 17 00:00:00 2001 From: Melanie Gail Date: Thu, 29 Aug 2024 09:17:50 +0200 Subject: [PATCH 04/55] Mnes 1187 repositories form (#74) # Description Added form for editing the repository list ## Type of change Please delete options that are not relevant. - [ ] New feature (non-breaking change which adds functionality) # Checklist: - [ ] I have performed a self-review of my code - [ ] I have commented my code, particularly in hard-to-understand areas - [ ] I have made corresponding changes to the documentation - [ ] My changes generate no new warnings - [ ] I have added tests that prove my fix or my feature works - [ ] New and existing tests pass locally with my changes - [ ] My changes contain no console logs --------- Co-authored-by: Milo Franke --- .../id-settings/IdSettingsCard.tsx | 2 +- .../MnestixConnectionServerActions.tsx | 35 + .../MnestixConnectionsCard.tsx | 201 ++++- src/app/[locale]/settings/page.tsx | 4 +- src/lib/i18n/de.mnestix.ts | 16 +- src/lib/i18n/en.mnestix.ts | 16 +- yarn.lock | 714 +++++++++++++++++- 7 files changed, 946 insertions(+), 42 deletions(-) create mode 100644 src/app/[locale]/settings/_components/mnestix-connections/MnestixConnectionServerActions.tsx diff --git a/src/app/[locale]/settings/_components/id-settings/IdSettingsCard.tsx b/src/app/[locale]/settings/_components/id-settings/IdSettingsCard.tsx index e005d17..3ad811f 100644 --- a/src/app/[locale]/settings/_components/id-settings/IdSettingsCard.tsx +++ b/src/app/[locale]/settings/_components/id-settings/IdSettingsCard.tsx @@ -1,5 +1,5 @@ import { InfoOutlined } from '@mui/icons-material'; -import { alpha, Box, Paper, Skeleton, Divider, Typography, styled } from '@mui/material'; +import { alpha, Box, Skeleton, Divider, Typography, styled } from '@mui/material'; import { CardHeading } from 'components/basics/CardHeading'; import { messages } from 'lib/i18n/localization'; import { Fragment, useState } from 'react'; diff --git a/src/app/[locale]/settings/_components/mnestix-connections/MnestixConnectionServerActions.tsx b/src/app/[locale]/settings/_components/mnestix-connections/MnestixConnectionServerActions.tsx new file mode 100644 index 0000000..31341a2 --- /dev/null +++ b/src/app/[locale]/settings/_components/mnestix-connections/MnestixConnectionServerActions.tsx @@ -0,0 +1,35 @@ +'use server'; + +import { prisma } from 'lib/database/prisma'; +import { ConnectionFormData } from 'app/[locale]/settings/_components/mnestix-connections/MnestixConnectionsCard'; + +export async function getConnectionDataAction() { + return prisma?.mnestixConnection.findMany({ include: { type: true } }); +} + +export async function upsertConnectionDataAction(formData: ConnectionFormData) { + const data = formData.repositories; + const existingData = await prisma?.mnestixConnection.findMany({ include: { type: true } }); + for (const existing of existingData) { + const formData = data.find((value) => value.id === existing.id); + // If an entry exists in the db and the updated data, update the existing db entry + if (formData) { + await prisma.mnestixConnection.update({ where: { id: existing.id }, data: { url: formData.url } }); + // If an entry exists in the db but NOT in the updated data, delete it from the db + } else { + await prisma.mnestixConnection.delete({ where: { id: existing.id } }); + } + } + // If an entry doesn't exist in the db but in the updated data, create it in the db + for (const updated of data) { + const formData = existingData.find((value) => value.id === updated.id); + const type = await prisma.connectionType.findFirst({ where: { typeName: updated.type } }); + if (!formData && type) { + await prisma.mnestixConnection.create({ data: { url: updated.url, typeId: type.id } }); + } + } +} + +export async function resetConnectionTable() { + await prisma.mnestixConnection.deleteMany({}); +} diff --git a/src/app/[locale]/settings/_components/mnestix-connections/MnestixConnectionsCard.tsx b/src/app/[locale]/settings/_components/mnestix-connections/MnestixConnectionsCard.tsx index d1bd78e..e548561 100644 --- a/src/app/[locale]/settings/_components/mnestix-connections/MnestixConnectionsCard.tsx +++ b/src/app/[locale]/settings/_components/mnestix-connections/MnestixConnectionsCard.tsx @@ -1,18 +1,199 @@ import { CardHeading } from 'components/basics/CardHeading'; -import { FormattedMessage } from 'react-intl'; +import { FormattedMessage, useIntl } from 'react-intl'; import { messages } from 'lib/i18n/localization'; -import { Box } from '@mui/material'; +import { Box, Button, FormControl, IconButton, TextField, Typography } from '@mui/material'; +import { useState } from 'react'; +import { useNotificationSpawner } from 'lib/hooks/UseNotificationSpawner'; +import { + getConnectionDataAction, + resetConnectionTable, + upsertConnectionDataAction, +} from 'app/[locale]/settings/_components/mnestix-connections/MnestixConnectionServerActions'; +import ControlPointIcon from '@mui/icons-material/ControlPoint'; +import { Controller, FieldArrayWithId, useFieldArray, useForm } from 'react-hook-form'; +import EditIcon from '@mui/icons-material/Edit'; +import RemoveCircleOutlineIcon from '@mui/icons-material/RemoveCircleOutline'; +import CheckIcon from '@mui/icons-material/Check'; +import CloseIcon from '@mui/icons-material/Close'; +import RefreshIcon from '@mui/icons-material/Refresh'; +import { useEnv } from 'app/env/provider'; + +export type ConnectionFormData = { + repositories: { + id: string; + url: string; + type: string; + }[]; +}; export function MnestixConnectionsCard() { + const notificationSpawner = useNotificationSpawner(); + const [isEditMode, setIsEditMode] = useState(false); + const intl = useIntl(); + const env = useEnv(); + + async function getConnectionData() { + try { + return await getConnectionDataAction(); + } catch (error) { + notificationSpawner.spawn(error); + } + return; + } + + async function mapFormData() { + const rawConnectionData = await getConnectionData(); + if (rawConnectionData) { + const defaultFormData: ConnectionFormData = { + repositories: rawConnectionData?.map((data) => ({ + id: data.id, + url: data.url, + type: data.type.typeName, + })), + }; + return defaultFormData; + } else { + return { repositories: [] }; + } + } + + const { + control, + handleSubmit, + getValues, + reset, + } = useForm({ defaultValues: async () => await mapFormData() }); + + const { fields, append, remove } = useFieldArray({ + control, + name: 'repositories', + }); + + async function saveConnectionData(data: ConnectionFormData) { + try { + await upsertConnectionDataAction(data); + notificationSpawner.spawn({ + severity: 'success', + message: intl.formatMessage(messages.mnestix.changesSavedSuccessfully), + }); + setIsEditMode(false); + } catch (error) { + notificationSpawner.spawn(error); + } + } + + const cancelEdit = () => { + reset(); + setIsEditMode(false); + }; + + async function resetToDefault() { + try { + await resetConnectionTable(); + reset(await mapFormData()); + notificationSpawner.spawn({ + severity: 'success', + message: intl.formatMessage(messages.mnestix.connections.resetSuccessfull), + }); + } catch (error) { + notificationSpawner.spawn(error); + } + } + + function getFormControl(field: FieldArrayWithId, index: number) { + return ( + + + + + + {isEditMode ? ( + + ( + } + sx={{ flexGrow: 1, mr: 1 }} + fullWidth={true} + error={!!error} + helperText={error ? error.message : ''} + /> + )} + /> + + remove(index)} /> + + + ) : ( + {getValues(`repositories.${index}.url`)} + )} + + + ); + } + return ( - - } - subtitle={} - /> - - todo: content will follow + + + } + subtitle={} + /> + + {isEditMode ? ( + <> + + + + ) : ( + <> + + + + )} + + + + + + + + + + + {env.AAS_REPO_API_URL} + + {fields.map((field, index) => getFormControl(field, index))} + + + ); -} \ No newline at end of file +} diff --git a/src/app/[locale]/settings/page.tsx b/src/app/[locale]/settings/page.tsx index 8053757..b1a0b90 100644 --- a/src/app/[locale]/settings/page.tsx +++ b/src/app/[locale]/settings/page.tsx @@ -43,7 +43,7 @@ export default function Page() { }, { id: settingsPageTypes[settingsPageTypes.MNESTIX_CONNECTIONS], - label: intl.formatMessage(messages.mnestix.mnestixConnections) + label: intl.formatMessage(messages.mnestix.connections.title) }] const [selectedTab, setSelectedTab] = useState(settingsTabItems[0]); @@ -147,7 +147,7 @@ export default function Page() { }/> - + diff --git a/src/lib/i18n/de.mnestix.ts b/src/lib/i18n/de.mnestix.ts index 1bb6cb7..6d59bb6 100644 --- a/src/lib/i18n/de.mnestix.ts +++ b/src/lib/i18n/de.mnestix.ts @@ -21,8 +21,20 @@ export const deMnestix = { idStructure: 'ID Struktur', idStructureExplanation: 'Definieren Sie, wie Ihre IDs aussehen sollen. Dies ist eine Basis-Einstellung, die für individuelle Importe angepasst werden kann.', - mnestixConnections: 'Mnestix Quellen', - mnestixConnectionsExplanation: 'Definieren Sie, welche Daten Quellen verwendet werden sollen.', + connections: { + title: 'Mnestix Quellen', + subtitle: 'Definieren Sie, welche Datenquellen verwendet werden sollen.', + repositories: 'AAS Repositorys', + repositoryLabel: 'AAS Repository', + repositoryUrlLabel: 'AAS Repository Url', + repositoryDefaultLabel: 'Default AAS Repository', + addButton: 'Hinzufügen', + editButton: 'Alle bearbeiten', + saveButton: 'Alle speichern', + resetButton: 'Auf Default zurücksetzen', + resetSuccessfull: 'Quellen wurden zurückgesetzt.', + urlFieldRequired: 'URL wird benötigt', + }, submodels: 'Submodelle', unknownModelType: 'Unbekannter ModelType: {type}', nameplateAddressTypes: { diff --git a/src/lib/i18n/en.mnestix.ts b/src/lib/i18n/en.mnestix.ts index 5a99bda..a2ab820 100644 --- a/src/lib/i18n/en.mnestix.ts +++ b/src/lib/i18n/en.mnestix.ts @@ -21,8 +21,20 @@ export const enMnestix = { idStructure: 'ID structure', idStructureExplanation: 'Define, how your IDs are represented. This is a standard setting that can be adjusted for individual imports.', - mnestixConnections: 'Mnestix Connections', - mnestixConnectionsExplanation: 'Define which data connections should be used.', + connections: { + title: 'Mnestix Connections', + subtitle: 'Define which data connections should be used.', + repositories: 'AAS Repositories', + repositoryLabel: 'AAS Repository', + repositoryUrlLabel: 'AAS Repository Url', + repositoryDefaultLabel: 'Default AAS Repository', + addButton: 'Add more', + editButton: 'Edit all', + saveButton: 'Save all', + resetButton: 'Reset to default', + resetSuccessfull: 'Connections were reset.', + urlFieldRequired: 'URL field is required', + }, submodels: 'Submodels', unknownModelType: 'Unknown ModelType: {type}', nameplateAddressTypes: { diff --git a/yarn.lock b/yarn.lock index bd42079..20292a5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1713,6 +1713,22 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" +"@npmcli/fs@^1.0.0": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-1.1.1.tgz#72f719fe935e687c56a4faecf3c03d06ba593257" + integrity sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ== + dependencies: + "@gar/promisify" "^1.0.1" + semver "^7.3.5" + +"@npmcli/move-file@^1.0.1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@npmcli/move-file/-/move-file-1.1.2.tgz#1a82c3e372f7cae9253eb66d72543d6b8685c674" + integrity sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg== + dependencies: + mkdirp "^1.0.4" + rimraf "^3.0.2" + "@panva/hkdf@^1.0.2": version "1.2.1" resolved "https://registry.yarnpkg.com/@panva/hkdf/-/hkdf-1.2.1.tgz#cb0d111ef700136f4580349ff0226bf25c853f23" @@ -1733,6 +1749,47 @@ resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.8.tgz#6b79032e760a0899cd4204710beede972a3a185f" integrity sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A== +"@prisma/client@^5.18.0": + version "5.18.0" + resolved "https://registry.yarnpkg.com/@prisma/client/-/client-5.18.0.tgz#526e4281a448f214c0ff81d65c39243608c98294" + integrity sha512-BWivkLh+af1kqC89zCJYkHsRcyWsM8/JHpsDMM76DjP3ZdEquJhXa4IeX+HkWPnwJ5FanxEJFZZDTWiDs/Kvyw== + +"@prisma/debug@5.18.0": + version "5.18.0" + resolved "https://registry.yarnpkg.com/@prisma/debug/-/debug-5.18.0.tgz#527799e044d2903a35945e61ac2d8916e4b61ead" + integrity sha512-f+ZvpTLidSo3LMJxQPVgAxdAjzv5OpzAo/eF8qZqbwvgi2F5cTOI9XCpdRzJYA0iGfajjwjOKKrVq64vkxEfUw== + +"@prisma/engines-version@5.18.0-25.4c784e32044a8a016d99474bd02a3b6123742169": + version "5.18.0-25.4c784e32044a8a016d99474bd02a3b6123742169" + resolved "https://registry.yarnpkg.com/@prisma/engines-version/-/engines-version-5.18.0-25.4c784e32044a8a016d99474bd02a3b6123742169.tgz#203426ebf4ec4e1acce7da4a59ec8f0df92b29e7" + integrity sha512-a/+LpJj8vYU3nmtkg+N3X51ddbt35yYrRe8wqHTJtYQt7l1f8kjIBcCs6sHJvodW/EK5XGvboOiwm47fmNrbgg== + +"@prisma/engines@5.18.0": + version "5.18.0" + resolved "https://registry.yarnpkg.com/@prisma/engines/-/engines-5.18.0.tgz#26ea46e26498be622407cf95663d7fb4c39c895b" + integrity sha512-ofmpGLeJ2q2P0wa/XaEgTnX/IsLnvSp/gZts0zjgLNdBhfuj2lowOOPmDcfKljLQUXMvAek3lw5T01kHmCG8rg== + dependencies: + "@prisma/debug" "5.18.0" + "@prisma/engines-version" "5.18.0-25.4c784e32044a8a016d99474bd02a3b6123742169" + "@prisma/fetch-engine" "5.18.0" + "@prisma/get-platform" "5.18.0" + +"@prisma/fetch-engine@5.18.0": + version "5.18.0" + resolved "https://registry.yarnpkg.com/@prisma/fetch-engine/-/fetch-engine-5.18.0.tgz#5b343e2b36b27e2713901ddd032ddd6932b3d55f" + integrity sha512-I/3u0x2n31rGaAuBRx2YK4eB7R/1zCuayo2DGwSpGyrJWsZesrV7QVw7ND0/Suxeo/vLkJ5OwuBqHoCxvTHpOg== + dependencies: + "@prisma/debug" "5.18.0" + "@prisma/engines-version" "5.18.0-25.4c784e32044a8a016d99474bd02a3b6123742169" + "@prisma/get-platform" "5.18.0" + +"@prisma/get-platform@5.18.0": + version "5.18.0" + resolved "https://registry.yarnpkg.com/@prisma/get-platform/-/get-platform-5.18.0.tgz#0dc4c82fe9a4971f4519a57cb2dd69d8e0df4b71" + integrity sha512-Tk+m7+uhqcKDgnMnFN0lRiH7Ewea0OEsZZs9pqXa7i3+7svS3FSCqDBCaM9x5fmhhkufiG0BtunJVDka+46DlA== + dependencies: + "@prisma/debug" "5.18.0" + "@rushstack/eslint-patch@^1.3.3": version "1.10.2" resolved "https://registry.yarnpkg.com/@rushstack/eslint-patch/-/eslint-patch-1.10.2.tgz#053f1540703faa81dea2966b768ee5581c66aeda" @@ -1996,7 +2053,7 @@ resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.17.1.tgz#0fabfcf2f2127ef73b119d98452bd317c4a17eb8" integrity sha512-X+2qazGS3jxLAIz5JDXDzglAF3KpijdhFxlf/V1+hEsOUc+HnWi81L/uv/EvGuV90WY+7mPGFCUDGfQC3Gj95Q== -"@types/node@*", "@types/node@^20.12.7": +"@types/node@*": version "20.12.12" resolved "https://registry.yarnpkg.com/@types/node/-/node-20.12.12.tgz#7cbecdf902085cec634fdb362172dfe12b8f2050" integrity sha512-eWLDGF/FOSPtAvEqeRAQ4C8LSA7M1I7i0ky1I8U7kD1J5ITyW3AsRhQrKVoWf5pFKZ2kILsEGJhsI9r93PYnOw== @@ -2276,6 +2333,11 @@ resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== +abbrev@1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== + acorn-jsx@^5.3.2: version "5.3.2" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" @@ -2286,6 +2348,20 @@ acorn@^8.9.0: resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a" integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== +agent-base@6, agent-base@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" + integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== + dependencies: + debug "4" + +agentkeepalive@^4.1.3: + version "4.5.0" + resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.5.0.tgz#2673ad1389b3c418c5a20c5d7364f93ca04be923" + integrity sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew== + dependencies: + humanize-ms "^1.2.1" + aggregate-error@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" @@ -2363,11 +2439,24 @@ anymatch@~3.1.2: normalize-path "^3.0.0" picomatch "^2.0.4" +"aproba@^1.0.3 || ^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-2.0.0.tgz#52520b8ae5b569215b354efc0caa3fe1e45a8adc" + integrity sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ== + arch@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/arch/-/arch-2.2.0.tgz#1bc47818f305764f23ab3306b0bfc086c5a29d11" integrity sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ== +are-we-there-yet@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz#679df222b278c64f2cdba1175cdc00b0d96164bd" + integrity sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg== + dependencies: + delegates "^1.0.0" + readable-stream "^3.6.0" + argparse@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" @@ -2605,6 +2694,22 @@ binary-extensions@^2.0.0: resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== +bindings@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" + integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== + dependencies: + file-uri-to-path "1.0.0" + +bl@^4.0.3: + version "4.1.0" + resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" + integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== + dependencies: + buffer "^5.5.0" + inherits "^2.0.4" + readable-stream "^3.4.0" + blob-util@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/blob-util/-/blob-util-2.0.2.tgz#3b4e3c281111bb7f11128518006cdc60b403a1eb" @@ -2657,7 +2762,7 @@ buffer-crc32@~0.2.3: resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" integrity sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ== -buffer@^5.7.1: +buffer@^5.5.0, buffer@^5.7.1: version "5.7.1" resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== @@ -2680,6 +2785,30 @@ busboy@1.6.0: dependencies: streamsearch "^1.1.0" +cacache@^15.2.0: + version "15.3.0" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-15.3.0.tgz#dc85380fb2f556fe3dda4c719bfa0ec875a7f1eb" + integrity sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ== + dependencies: + "@npmcli/fs" "^1.0.0" + "@npmcli/move-file" "^1.0.1" + chownr "^2.0.0" + fs-minipass "^2.0.0" + glob "^7.1.4" + infer-owner "^1.0.4" + lru-cache "^6.0.0" + minipass "^3.1.1" + minipass-collect "^1.0.2" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.2" + mkdirp "^1.0.3" + p-map "^4.0.0" + promise-inflight "^1.0.1" + rimraf "^3.0.2" + ssri "^8.0.1" + tar "^6.0.2" + unique-filename "^1.1.1" + cachedir@^2.3.0: version "2.4.0" resolved "https://registry.yarnpkg.com/cachedir/-/cachedir-2.4.0.tgz#7fef9cf7367233d7c88068fe6e34ed0d355a610d" @@ -2758,6 +2887,16 @@ check-more-types@^2.24.0: optionalDependencies: fsevents "~2.3.2" +chownr@^1.1.1: + version "1.1.4" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" + integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== + +chownr@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" + integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== + ci-info@^3.2.0: version "3.9.0" resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" @@ -2851,6 +2990,11 @@ color-space@^2.0.0, color-space@^2.0.1: resolved "https://registry.yarnpkg.com/color-space/-/color-space-2.0.1.tgz#da39871175baf4a5785ba519397df04b8d67e0fa" integrity sha512-nKqUYlo0vZATVOFHY810BSYjmCARrG7e5R3UE3CQlyjJTvv5kSSmPG1kzm/oDyyqjehM+lW1RnEt9It9GNa5JA== +color-support@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" + integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== + colorette@^2.0.16: version "2.0.20" resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" @@ -2883,6 +3027,11 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== +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" + integrity sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ== + convert-source-map@^1.5.0: version "1.9.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" @@ -3175,6 +3324,13 @@ dayjs@^1.10.4: resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.11.tgz#dfe0e9d54c5f8b68ccf8ca5f72ac603e7e5ed59e" integrity sha512-okzr3f11N6WuqYtZSvm+F776mB41wRZMhKP+hc34YdW+KmtYYK9iqvHSwo2k9FEH3fhGXvOPV6yz2IcSrfRUDg== +debug@4, debug@^4.3.3: + version "4.3.6" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.6.tgz#2ab2c38fbaffebf8aa95fdfe6d88438c7a13c52b" + integrity sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg== + dependencies: + ms "2.1.2" + debug@^2.2.0: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" @@ -3201,6 +3357,18 @@ decimal.js-light@^2.4.1: resolved "https://registry.yarnpkg.com/decimal.js-light/-/decimal.js-light-2.5.1.tgz#134fd32508f19e208f4fb2f8dac0d2626a867934" integrity sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg== +decompress-response@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc" + integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ== + dependencies: + mimic-response "^3.1.0" + +deep-extend@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== + deep-is@^0.1.3: version "0.1.4" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" @@ -3234,11 +3402,21 @@ delayed-stream@~1.0.0: resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + integrity sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ== + dequal@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be" integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== +detect-libc@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.3.tgz#f0cd503b40f9939b894697d19ad50895e30cf700" + integrity sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw== + diff-sequences@^29.6.3: version "29.6.3" resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.6.3.tgz#4deaf894d11407c51efc8418012f9e70b84ea921" @@ -3344,7 +3522,14 @@ emoji-regex@^9.2.2: resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== -end-of-stream@^1.1.0: +encoding@^0.1.12: + version "0.1.13" + resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" + integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== + dependencies: + iconv-lite "^0.6.2" + +end-of-stream@^1.1.0, end-of-stream@^1.4.1: version "1.4.4" resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== @@ -3372,6 +3557,16 @@ entities@^4.2.0, entities@^4.4.0: resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== +env-paths@^2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" + integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== + +err-code@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/err-code/-/err-code-2.0.3.tgz#23c2f3b756ffdfc608d30e27c9a941024807e7f9" + integrity sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA== + error-ex@^1.3.1: version "1.3.2" resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" @@ -3779,6 +3974,11 @@ executable@^4.1.1: dependencies: pify "^2.2.0" +expand-template@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-2.0.3.tgz#6e14b3fcee0f3a6340ecb57d2e8918692052a47c" + integrity sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg== + expect@^29.0.0: version "29.7.0" resolved "https://registry.yarnpkg.com/expect/-/expect-29.7.0.tgz#578874590dcb3214514084c08115d8aee61e11bc" @@ -3875,6 +4075,11 @@ file-entry-cache@^6.0.1: dependencies: flat-cache "^3.0.4" +file-uri-to-path@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" + integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== + fill-range@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" @@ -3943,6 +4148,11 @@ form-data@~2.3.2: combined-stream "^1.0.6" mime-types "^2.1.12" +fs-constants@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" + integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== + fs-extra@^9.1.0: version "9.1.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" @@ -3953,6 +4163,13 @@ fs-extra@^9.1.0: jsonfile "^6.0.1" universalify "^2.0.0" +fs-minipass@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" + integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== + dependencies: + minipass "^3.0.0" + fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" @@ -3983,6 +4200,20 @@ functions-have-names@^1.2.3: resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== +gauge@^4.0.3: + version "4.0.4" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-4.0.4.tgz#52ff0652f2bbf607a989793d53b751bef2328dce" + integrity sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg== + dependencies: + aproba "^1.0.3 || ^2.0.0" + color-support "^1.1.3" + console-control-strings "^1.1.0" + has-unicode "^2.0.1" + signal-exit "^3.0.7" + string-width "^4.2.3" + strip-ansi "^6.0.1" + wide-align "^1.1.5" + 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" @@ -4050,6 +4281,11 @@ getpass@^0.1.1: dependencies: assert-plus "^1.0.0" +github-from-package@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce" + integrity sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw== + glob-parent@^5.1.2, glob-parent@~5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" @@ -4075,7 +4311,7 @@ glob@10.3.10: minipass "^5.0.0 || ^6.0.2 || ^7.0.0" path-scurry "^1.10.1" -glob@^7.1.3: +glob@^7.1.3, glob@^7.1.4: version "7.2.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== @@ -4138,7 +4374,7 @@ gopd@^1.0.1: dependencies: get-intrinsic "^1.1.3" -graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.11, graceful-fs@^4.2.4, graceful-fs@^4.2.9: +graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.11, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9: version "4.2.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== @@ -4187,6 +4423,11 @@ has-tostringtag@^1.0.0, has-tostringtag@^1.0.2: dependencies: has-symbols "^1.0.3" +has-unicode@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + integrity sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ== + hasown@^2.0.0, hasown@^2.0.1, hasown@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" @@ -4201,6 +4442,20 @@ hoist-non-react-statics@^3.3.0, hoist-non-react-statics@^3.3.1, hoist-non-react- dependencies: react-is "^16.7.0" +http-cache-semantics@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz#abe02fcb2985460bf0323be664436ec3476a6d5a" + integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ== + +http-proxy-agent@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a" + integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg== + dependencies: + "@tootallnate/once" "1" + agent-base "6" + debug "4" + http-signature@~1.3.6: version "1.3.6" resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.3.6.tgz#cb6fbfdf86d1c974f343be94e87f7fc128662cf9" @@ -4210,11 +4465,33 @@ http-signature@~1.3.6: jsprim "^2.0.2" sshpk "^1.14.1" +https-proxy-agent@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" + integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== + dependencies: + agent-base "6" + debug "4" + human-signals@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== +humanize-ms@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed" + integrity sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ== + dependencies: + ms "^2.0.0" + +iconv-lite@^0.6.2: + version "0.6.3" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" + integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + ieee754@^1.1.12, ieee754@^1.1.13, ieee754@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" @@ -4248,6 +4525,11 @@ indent-string@^4.0.0: resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== +infer-owner@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" + integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A== + inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" @@ -4256,7 +4538,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2: +inherits@2, inherits@^2.0.3, inherits@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -4266,6 +4548,11 @@ ini@2.0.0: resolved "https://registry.yarnpkg.com/ini/-/ini-2.0.0.tgz#e5fd556ecdd5726be978fa1001862eacb0a94bc5" integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA== +ini@~1.3.0: + version "1.3.8" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" + integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== + internal-slot@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.7.tgz#c06dcca3ed874249881007b0a5523b172a190802" @@ -4290,6 +4577,14 @@ intl-messageformat@10.5.12, intl-messageformat@^10.5.11: "@formatjs/icu-messageformat-parser" "2.7.6" tslib "^2.4.0" +ip-address@^9.0.5: + version "9.0.5" + resolved "https://registry.yarnpkg.com/ip-address/-/ip-address-9.0.5.tgz#117a960819b08780c3bd1f14ef3c1cc1d3f3ea5a" + integrity sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g== + dependencies: + jsbn "1.1.0" + sprintf-js "^1.1.3" + is-array-buffer@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.4.tgz#7a1f92b3d61edd2bc65d24f130530ea93d7fae98" @@ -4409,6 +4704,11 @@ is-installed-globally@~0.4.0: global-dirs "^3.0.0" is-path-inside "^3.0.2" +is-lambda@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-lambda/-/is-lambda-1.0.1.tgz#3d9877899e6a53efc0160504cde15f82e6f061d5" + integrity sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ== + is-map@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.3.tgz#ede96b7fe1e270b3c4465e3a465658764926d62e" @@ -4624,6 +4924,11 @@ js-yaml@^4.1.0: dependencies: argparse "^2.0.1" +jsbn@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-1.1.0.tgz#b01307cb29b618a1ed26ec79e911f803c4da0040" + integrity sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A== + jsbn@~0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" @@ -4866,6 +5171,28 @@ magic-string@^0.30.0: dependencies: "@jridgewell/sourcemap-codec" "^1.4.15" +make-fetch-happen@^9.1.0: + version "9.1.0" + resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz#53085a09e7971433e6765f7971bf63f4e05cb968" + integrity sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg== + dependencies: + agentkeepalive "^4.1.3" + cacache "^15.2.0" + http-cache-semantics "^4.1.0" + http-proxy-agent "^4.0.1" + https-proxy-agent "^5.0.0" + is-lambda "^1.0.1" + lru-cache "^6.0.0" + minipass "^3.1.3" + minipass-collect "^1.0.2" + minipass-fetch "^1.3.2" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.4" + negotiator "^0.6.2" + promise-retry "^2.0.1" + socks-proxy-agent "^6.0.0" + ssri "^8.0.0" + md5@^2.1.0: version "2.3.0" resolved "https://registry.yarnpkg.com/md5/-/md5-2.3.0.tgz#c3da9a6aae3a30b46b7b0c349b87b110dc3bda4f" @@ -4920,6 +5247,11 @@ mimic-fn@^2.1.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== +mimic-response@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9" + integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== + minimatch@9.0.3: version "9.0.3" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.3.tgz#a6e00c3de44c3a542bfaae70abfc22420a6da825" @@ -4941,16 +5273,85 @@ minimatch@^9.0.1, minimatch@^9.0.4: dependencies: brace-expansion "^2.0.1" -minimist@^1.2.0, minimist@^1.2.6, minimist@^1.2.8: +minimist@^1.2.0, minimist@^1.2.3, minimist@^1.2.6, minimist@^1.2.8: version "1.2.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== +minipass-collect@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/minipass-collect/-/minipass-collect-1.0.2.tgz#22b813bf745dc6edba2576b940022ad6edc8c617" + integrity sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA== + dependencies: + minipass "^3.0.0" + +minipass-fetch@^1.3.2: + version "1.4.1" + resolved "https://registry.yarnpkg.com/minipass-fetch/-/minipass-fetch-1.4.1.tgz#d75e0091daac1b0ffd7e9d41629faff7d0c1f1b6" + integrity sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw== + dependencies: + minipass "^3.1.0" + minipass-sized "^1.0.3" + minizlib "^2.0.0" + optionalDependencies: + encoding "^0.1.12" + +minipass-flush@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/minipass-flush/-/minipass-flush-1.0.5.tgz#82e7135d7e89a50ffe64610a787953c4c4cbb373" + integrity sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw== + dependencies: + minipass "^3.0.0" + +minipass-pipeline@^1.2.2, minipass-pipeline@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz#68472f79711c084657c067c5c6ad93cddea8214c" + integrity sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A== + dependencies: + minipass "^3.0.0" + +minipass-sized@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/minipass-sized/-/minipass-sized-1.0.3.tgz#70ee5a7c5052070afacfbc22977ea79def353b70" + integrity sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g== + dependencies: + minipass "^3.0.0" + +minipass@^3.0.0, minipass@^3.1.0, minipass@^3.1.1, minipass@^3.1.3: + version "3.3.6" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.3.6.tgz#7bba384db3a1520d18c9c0e5251c3444e95dd94a" + integrity sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw== + dependencies: + yallist "^4.0.0" + +minipass@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-5.0.0.tgz#3e9788ffb90b694a5d0ec94479a45b5d8738133d" + integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ== + "minipass@^5.0.0 || ^6.0.2 || ^7.0.0": version "7.1.1" resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.1.tgz#f7f85aff59aa22f110b20e27692465cf3bf89481" integrity sha512-UZ7eQ+h8ywIRAW1hIEl2AqdwzJucU/Kp59+8kkZeSvafXhZjul247BvIJjEVFVeON6d7lM46XX1HXCduKAS8VA== +minizlib@^2.0.0, minizlib@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" + integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== + dependencies: + minipass "^3.0.0" + yallist "^4.0.0" + +mkdirp-classic@^0.5.2, mkdirp-classic@^0.5.3: + version "0.5.3" + resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113" + integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== + +mkdirp@^1.0.3, mkdirp@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + mkdirp@~0.5.1: version "0.5.6" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" @@ -4973,7 +5374,7 @@ ms@2.1.2: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== -ms@^2.1.1: +ms@^2.0.0, 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== @@ -4983,12 +5384,17 @@ nanoid@^3.3.6: resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== +napi-build-utils@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/napi-build-utils/-/napi-build-utils-1.0.2.tgz#b1fddc0b2c46e380a0b7a76f984dd47c41a13806" + integrity sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg== + natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== -negotiator@^0.6.3: +negotiator@^0.6.2, negotiator@^0.6.3: version "0.6.3" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== @@ -5048,6 +5454,18 @@ no-case@^3.0.4: lower-case "^2.0.2" tslib "^2.0.3" +node-abi@^3.3.0: + version "3.67.0" + resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.67.0.tgz#1d159907f18d18e18809dbbb5df47ed2426a08df" + integrity sha512-bLn/fU/ALVBE9wj+p4Y21ZJWYFjUXLXPi/IewyLZkx3ApxKDNBWCKdReeKOtD8dWpOdDCeMyLh6ZewzcLsG2Nw== + dependencies: + semver "^7.3.5" + +node-addon-api@^7.0.0: + version "7.1.1" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-7.1.1.tgz#1aba6693b0f255258a049d621329329322aad558" + integrity sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ== + node-fetch@^2.6.1: version "2.7.0" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" @@ -5055,11 +5473,34 @@ node-fetch@^2.6.1: dependencies: whatwg-url "^5.0.0" +node-gyp@8.x: + version "8.4.1" + resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-8.4.1.tgz#3d49308fc31f768180957d6b5746845fbd429937" + integrity sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w== + dependencies: + env-paths "^2.2.0" + glob "^7.1.4" + graceful-fs "^4.2.6" + make-fetch-happen "^9.1.0" + nopt "^5.0.0" + npmlog "^6.0.0" + rimraf "^3.0.2" + semver "^7.3.5" + tar "^6.1.2" + which "^2.0.2" + node-releases@^2.0.14: version "2.0.14" resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.14.tgz#2ffb053bceb8b2be8495ece1ab6ce600c4461b0b" integrity sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw== +nopt@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-5.0.0.tgz#530942bb58a512fccafe53fe210f13a25355dc88" + integrity sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ== + dependencies: + abbrev "1" + 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" @@ -5072,6 +5513,16 @@ npm-run-path@^4.0.0: dependencies: path-key "^3.0.0" +npmlog@^6.0.0: + version "6.0.2" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-6.0.2.tgz#c8166017a42f2dea92d6453168dd865186a70830" + integrity sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg== + dependencies: + are-we-there-yet "^3.0.0" + console-control-strings "^1.1.0" + gauge "^4.0.3" + set-blocking "^2.0.0" + nth-check@^2.0.1: version "2.1.1" resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.1.1.tgz#c9eab428effce36cd6b92c924bdb000ef1f1ed1d" @@ -5358,6 +5809,24 @@ preact@^10.6.3: resolved "https://registry.yarnpkg.com/preact/-/preact-10.23.1.tgz#d400107289bc979881c5212cb5f5cd22cd1dc38c" integrity sha512-O5UdRsNh4vdZaTieWe3XOgSpdMAmkIYBCT3VhQDlKrzyCm8lUYsk0fmVEvoQQifoOjFRTaHZO69ylrzTW2BH+A== +prebuild-install@^7.1.1: + version "7.1.2" + resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-7.1.2.tgz#a5fd9986f5a6251fbc47e1e5c65de71e68c0a056" + integrity sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ== + dependencies: + detect-libc "^2.0.0" + expand-template "^2.0.3" + github-from-package "0.0.0" + minimist "^1.2.3" + mkdirp-classic "^0.5.3" + napi-build-utils "^1.0.1" + node-abi "^3.3.0" + pump "^3.0.0" + rc "^1.2.7" + simple-get "^4.0.0" + tar-fs "^2.0.0" + tunnel-agent "^0.6.0" + prelude-ls@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" @@ -5387,11 +5856,31 @@ pretty-format@^3.8.0: resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-3.8.0.tgz#bfbed56d5e9a776645f4b1ff7aa1a3ac4fa3c385" integrity sha512-WuxUnVtlWL1OfZFQFuqvnvs6MiAGk9UNsBostyBOB0Is9wb5uRESevA6rnl/rkksXaGX3GzZhPup5d6Vp1nFew== +prisma@^5.18.0: + version "5.18.0" + resolved "https://registry.yarnpkg.com/prisma/-/prisma-5.18.0.tgz#5ef69c802a075b7596231ea57003496873610b9e" + integrity sha512-+TrSIxZsh64OPOmaSgVPH7ALL9dfU0jceYaMJXsNrTkFHO7/3RANi5K2ZiPB1De9+KDxCWn7jvRq8y8pvk+o9g== + dependencies: + "@prisma/engines" "5.18.0" + process@^0.11.10: version "0.11.10" resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== +promise-inflight@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" + integrity sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g== + +promise-retry@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/promise-retry/-/promise-retry-2.0.1.tgz#ff747a13620ab57ba688f5fc67855410c370da22" + integrity sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g== + dependencies: + err-code "^2.0.2" + retry "^0.12.0" + prop-types@^15.6.2, prop-types@^15.8.1: version "15.8.1" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" @@ -5434,6 +5923,13 @@ punycode@^2.1.0, punycode@^2.1.1: resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== +qr-scanner@^1.4.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/qr-scanner/-/qr-scanner-1.4.2.tgz#bc4fb88022a8c9be95c49527a1c8fb8724b47dc4" + integrity sha512-kV1yQUe2FENvn59tMZW6mOVfpq9mGxGf8l6+EGaXUOd4RBOLg7tRC83OrirM5AtDvZRpdjdlXURsHreAOSPOUw== + dependencies: + "@types/offscreencanvas" "^2019.6.4" + qs@6.10.4: version "6.10.4" resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.4.tgz#6a3003755add91c0ec9eacdc5f878b034e73f9e7" @@ -5475,6 +5971,16 @@ rbush@^3.0.1: dependencies: quickselect "^2.0.0" +rc@^1.2.7: + version "1.2.8" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" + integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== + dependencies: + deep-extend "^0.6.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + react-dom@^18.2.0: version "18.3.1" resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.3.1.tgz#c2265d79511b57d479b3dd3fdfa51536494c5cb4" @@ -5540,6 +6046,15 @@ react@^18.2.0: dependencies: loose-envify "^1.1.0" +readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0: + version "3.6.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + readdirp@~3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" @@ -5689,6 +6204,11 @@ restore-cursor@^3.1.0: onetime "^5.1.0" signal-exit "^3.0.2" +retry@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" + integrity sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow== + reusify@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" @@ -5730,7 +6250,7 @@ safe-array-concat@^1.1.2: has-symbols "^1.0.3" isarray "^2.0.5" -safe-buffer@^5.0.1, safe-buffer@^5.1.2: +safe-buffer@^5.0.1, safe-buffer@^5.1.2, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== @@ -5744,7 +6264,7 @@ safe-regex-test@^1.0.3: es-errors "^1.3.0" is-regex "^1.1.4" -safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: +"safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== @@ -5770,11 +6290,21 @@ semver@^6.3.1: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== +semver@^7.3.5: + version "7.6.3" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" + integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== + semver@^7.5.3, semver@^7.5.4, semver@^7.6.0: version "7.6.2" resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.2.tgz#1e3b34759f896e8f14d6134732ce798aeb0c6e13" integrity sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w== +set-blocking@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== + set-function-length@^1.2.1: version "1.2.2" resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" @@ -5819,7 +6349,7 @@ side-channel@^1.0.4, side-channel@^1.0.6: get-intrinsic "^1.2.4" object-inspect "^1.13.1" -signal-exit@^3.0.2: +signal-exit@^3.0.2, signal-exit@^3.0.7: version "3.0.7" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== @@ -5829,6 +6359,20 @@ signal-exit@^4.0.1: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== +simple-concat@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f" + integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q== + +simple-get@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-4.0.1.tgz#4a39db549287c979d352112fa03fd99fd6bc3543" + integrity sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA== + dependencies: + decompress-response "^6.0.0" + once "^1.3.1" + simple-concat "^1.0.0" + slash@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" @@ -5852,6 +6396,11 @@ slice-ansi@^4.0.0: astral-regex "^2.0.0" is-fullwidth-code-point "^3.0.0" +smart-buffer@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae" + integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg== + snake-case@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/snake-case/-/snake-case-3.0.4.tgz#4f2bbd568e9935abdfd593f34c691dadb49c452c" @@ -5860,6 +6409,23 @@ snake-case@^3.0.4: dot-case "^3.0.4" tslib "^2.0.3" +socks-proxy-agent@^6.0.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-6.2.1.tgz#2687a31f9d7185e38d530bef1944fe1f1496d6ce" + integrity sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ== + dependencies: + agent-base "^6.0.2" + debug "^4.3.3" + socks "^2.6.2" + +socks@^2.6.2: + version "2.8.3" + resolved "https://registry.yarnpkg.com/socks/-/socks-2.8.3.tgz#1ebd0f09c52ba95a09750afe3f3f9f724a800cb5" + integrity sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw== + dependencies: + ip-address "^9.0.5" + smart-buffer "^4.2.0" + "source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.0.1, source-map-js@^1.0.2: version "1.2.0" resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.0.tgz#16b809c162517b5b8c3e7dcd315a2a5c2612b2af" @@ -5870,6 +6436,23 @@ source-map@^0.5.7: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== +sprintf-js@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.3.tgz#4914b903a2f8b685d17fdf78a70e917e872e444a" + integrity sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA== + +sqlite3@^5.1.7: + version "5.1.7" + resolved "https://registry.yarnpkg.com/sqlite3/-/sqlite3-5.1.7.tgz#59ca1053c1ab38647396586edad019b1551041b7" + integrity sha512-GGIyOiFaG+TUra3JIfkI/zGP8yZYLPQ0pl1bH+ODjiX57sPhrLU5sQJn1y9bDKZUFYkX1crlrPfSYt0BKKdkog== + dependencies: + bindings "^1.5.0" + node-addon-api "^7.0.0" + prebuild-install "^7.1.1" + tar "^6.1.11" + optionalDependencies: + node-gyp "8.x" + sshpk@^1.14.1: version "1.18.0" resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.18.0.tgz#1663e55cddf4d688b86a46b77f0d5fe363aba028" @@ -5885,6 +6468,13 @@ sshpk@^1.14.1: safer-buffer "^2.0.2" tweetnacl "~0.14.0" +ssri@^8.0.0, ssri@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-8.0.1.tgz#638e4e439e2ffbd2cd289776d5ca457c4f51a2af" + integrity sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ== + dependencies: + minipass "^3.1.1" + stack-utils@^2.0.3: version "2.0.6" resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.6.tgz#aaf0748169c02fc33c8232abccf933f54a1cc34f" @@ -5907,16 +6497,6 @@ streamsearch@^1.1.0: strip-ansi "^6.0.1" string-width@4.2.3, "string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3, string-width@^5.0.1, string-width@^5.1.2: -"string-width-cjs@npm:string-width@^4.2.0": - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string-width@4.2.3, string-width@^4.1.0, string-width@^4.2.0, string-width@^5.0.1, string-width@^5.1.2: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -5992,6 +6572,13 @@ strip-ansi@^4.0.0: dependencies: ansi-regex "^3.0.0" +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + strip-ansi@^7.0.1: version "7.1.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" @@ -6014,6 +6601,11 @@ strip-json-comments@^3.1.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== +strip-json-comments@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== + styled-jsx@5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/styled-jsx/-/styled-jsx-5.1.1.tgz#839a1c3aaacc4e735fed0781b8619ea5d0009d1f" @@ -6075,6 +6667,39 @@ tapable@^2.2.0: resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== +tar-fs@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.1.tgz#489a15ab85f1f0befabb370b7de4f9eb5cbe8784" + integrity sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng== + dependencies: + chownr "^1.1.1" + mkdirp-classic "^0.5.2" + pump "^3.0.0" + tar-stream "^2.1.4" + +tar-stream@^2.1.4: + version "2.2.0" + resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287" + integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ== + dependencies: + bl "^4.0.3" + end-of-stream "^1.4.1" + fs-constants "^1.0.0" + inherits "^2.0.3" + readable-stream "^3.1.1" + +tar@^6.0.2, tar@^6.1.11, tar@^6.1.2: + version "6.2.1" + resolved "https://registry.yarnpkg.com/tar/-/tar-6.2.1.tgz#717549c541bc3c2af15751bea94b1dd068d4b03a" + integrity sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A== + dependencies: + chownr "^2.0.0" + fs-minipass "^2.0.0" + minipass "^5.0.0" + minizlib "^2.1.1" + mkdirp "^1.0.3" + yallist "^4.0.0" + text-table@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" @@ -6249,6 +6874,11 @@ undici-types@~5.26.4: resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== +undici-types@~6.19.2: + version "6.19.8" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.19.8.tgz#35111c9d1437ab83a7cdc0abae2f26d88eda0a02" + integrity sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw== + unicode-canonical-property-names-ecmascript@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc" @@ -6279,6 +6909,20 @@ unicode-property-aliases-ecmascript@^2.0.0: resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz#43d41e3be698bd493ef911077c9b131f827e8ccd" integrity sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w== +unique-filename@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" + integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ== + dependencies: + unique-slug "^2.0.0" + +unique-slug@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.2.tgz#baabce91083fc64e945b0f3ad613e264f7cd4e6c" + integrity sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w== + dependencies: + imurmurhash "^0.1.4" + universalify@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.2.0.tgz#6451760566fa857534745ab1dde952d1b1761be0" @@ -6333,6 +6977,11 @@ use-intl@^3.14.0: "@formatjs/ecma402-abstract" "^1.11.4" intl-messageformat "^10.5.11" +util-deprecate@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== + uuid@^8.3.2: version "8.3.2" resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" @@ -6445,20 +7094,26 @@ which-typed-array@^1.1.14, which-typed-array@^1.1.15, which-typed-array@^1.1.9: gopd "^1.0.1" has-tostringtag "^1.0.2" -which@^2.0.1: +which@^2.0.1, which@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== dependencies: isexe "^2.0.0" +wide-align@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.5.tgz#df1d4c206854369ecf3c9a4898f1b23fbd9d15d3" + integrity sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg== + dependencies: + string-width "^1.0.2 || 2 || 3 || 4" + word-wrap@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: - name wrap-ansi-cjs +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== @@ -6476,6 +7131,15 @@ wrap-ansi@^6.2.0: string-width "^4.1.0" strip-ansi "^6.0.0" +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + wrap-ansi@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" From 1edd24ba96c6d7856fb6bd32e9732626b7f584ab Mon Sep 17 00:00:00 2001 From: NilsXitaso Date: Mon, 2 Sep 2024 12:37:51 +0200 Subject: [PATCH 05/55] feat(mutiple repositories): Add search logic for multiple repositories (#73) # Description Please include a summary of the changes and link the related github issue. Please include relevant motivation and context. Fixes # (Issue) ## Type of change Please delete options that are not relevant. - [ ] Minor change (non-breaking change, e.g. documentation adaption) - [ ] Bug fix (non-breaking change which fixes an issue) - [x] New feature (non-breaking change which adds functionality) - [ ] Breaking change (fix or feature that causes existing functionality to not work as expected) # Checklist: - [x] I have performed a self-review of my code - [x] I have commented my code, particularly in hard-to-understand areas - [ ] I have made corresponding changes to the documentation - [ ] My changes generate no new warnings - [ ] I have added tests that prove my fix or my feature works - [ ] New and existing tests pass locally with my changes - [x] My changes contain no console logs --------- Co-authored-by: melanie.gail Co-authored-by: milo.franke --- cypress/e2e/viewerVisitTest.spec.js | 2 +- docker-compose/compose.test.yml | 1 + .../MnestixConnectionServerActions.tsx | 11 +++ .../[locale]/viewer/[base64AasId]/page.tsx | 77 ++++++++++--------- .../viewer/_components/AASOverviewCard.tsx | 43 +++++++---- .../_components/SubmodelsOverviewCard.tsx | 57 +++++++++----- src/app/api/mnestixConnections/route.ts | 2 +- src/lib/api/basyx-v3/api.ts | 15 ++-- .../SearchRepositoryHelper.ts | 42 ++++++++++ src/lib/searchUtilActions/searchClient.ts | 19 +++-- 10 files changed, 186 insertions(+), 83 deletions(-) create mode 100644 src/lib/searchUtilActions/SearchRepositoryHelper.ts diff --git a/cypress/e2e/viewerVisitTest.spec.js b/cypress/e2e/viewerVisitTest.spec.js index cfbffc2..5bda446 100644 --- a/cypress/e2e/viewerVisitTest.spec.js +++ b/cypress/e2e/viewerVisitTest.spec.js @@ -23,7 +23,7 @@ describe('Visit the Viewer page', function () { }, ); it( - 'should put an Asset Id into the input field, click the arrow and be redicted to the right viewer page (Resolution: ' + + 'should put an Asset Id into the input field, click the arrow and be redirected to the right viewer page (Resolution: ' + el + ')', function () { diff --git a/docker-compose/compose.test.yml b/docker-compose/compose.test.yml index f0fb24a..4242b07 100644 --- a/docker-compose/compose.test.yml +++ b/docker-compose/compose.test.yml @@ -13,6 +13,7 @@ services: volumes: - ./cypress-artifacts/screenshots:/cypress_Tests/cypress/screenshots - ./cypress-artifacts/videos:/cypress_Tests/cypress/videos + - ./cypress:/cypress depends_on: - mnestix-browser - mnestix-api diff --git a/src/app/[locale]/settings/_components/mnestix-connections/MnestixConnectionServerActions.tsx b/src/app/[locale]/settings/_components/mnestix-connections/MnestixConnectionServerActions.tsx index 31341a2..36eb41d 100644 --- a/src/app/[locale]/settings/_components/mnestix-connections/MnestixConnectionServerActions.tsx +++ b/src/app/[locale]/settings/_components/mnestix-connections/MnestixConnectionServerActions.tsx @@ -2,6 +2,7 @@ import { prisma } from 'lib/database/prisma'; import { ConnectionFormData } from 'app/[locale]/settings/_components/mnestix-connections/MnestixConnectionsCard'; +import { ConnectionType } from '@prisma/client'; export async function getConnectionDataAction() { return prisma?.mnestixConnection.findMany({ include: { type: true } }); @@ -33,3 +34,13 @@ export async function upsertConnectionDataAction(formData: ConnectionFormData) { export async function resetConnectionTable() { await prisma.mnestixConnection.deleteMany({}); } + +export async function getConnectionDataByTypeAction(type: ConnectionType) { + const basePath = await prisma?.mnestixConnection.findMany({ + where: { + type: type, + }, + }); + + return basePath.map((item) => item.url); +} \ No newline at end of file diff --git a/src/app/[locale]/viewer/[base64AasId]/page.tsx b/src/app/[locale]/viewer/[base64AasId]/page.tsx index 6a8bae2..accaa13 100644 --- a/src/app/[locale]/viewer/[base64AasId]/page.tsx +++ b/src/app/[locale]/viewer/[base64AasId]/page.tsx @@ -1,7 +1,6 @@ 'use client'; -/* eslint-disable @typescript-eslint/no-unused-vars */ -import { useEffect, useState } from 'react'; +import { useState } from 'react'; import { Box, Button, Skeleton, Typography } from '@mui/material'; import { useAasState, useRegistryAasState } from 'components/contexts/CurrentAasContext'; import { useNotificationSpawner } from 'lib/hooks/UseNotificationSpawner'; @@ -19,15 +18,17 @@ import { AASOverviewCard } from 'app/[locale]/viewer/_components/AASOverviewCard import { useApis } from 'components/azureAuthentication/ApiProvider'; import { useEnv } from 'app/env/provider'; import { handleAasRegistrySearch } from 'lib/searchUtilActions/searchServer'; +import { getAasFromAllRepos } from 'lib/searchUtilActions/SearchRepositoryHelper'; +import { useAsyncEffect } from 'lib/hooks/UseAsyncEffect'; export default function Page() { const navigate = useRouter(); const searchParams = useParams<{ base64AasId: string }>(); const base64AasId = searchParams.base64AasId; - const [submodels, setSubmodels] = useState(); + const [submodelReferences, setSubmodelReferences] = useState(); const [productImage, setProductImage] = useState(); const [isLoadingAas, setIsLoadingAas] = useState(false); - const [isLoadingSubmodels, setIsLoadingSubmodels] = useState(false); + const [isLoadingSubmodels] = useState(false); const [hasImage, setHasImage] = useState(true); const notificationSpawner = useNotificationSpawner(); const isMobile = useIsMobile(); @@ -37,38 +38,44 @@ export default function Page() { const [aas, setAas] = useAasState(); const [, setRegistryAasData] = useRegistryAasState(); - useEffect(() => { - async function _fetchAas() { - try { - setIsLoadingAas(true); - if (aas === null) { - const aasIdDecoded = safeBase64Decode(base64AasId); - const registrySearchResult = await handleAasRegistrySearch(aasIdDecoded); - if (registrySearchResult != null) { - setAas(registrySearchResult.registryAas as AssetAdministrationShell); - setRegistryAasData({ - submodelDescriptors: registrySearchResult?.registryAasData?.submodelDescriptors, - aasRegistryRepositoryOrigin: - registrySearchResult?.registryAasData?.aasRegistryRepositoryOrigin, - }); - setAasData(registrySearchResult.registryAas as AssetAdministrationShell); - } else { - const shell = await repositoryClient.getAssetAdministrationShellById(base64AasId as string); - setAas(shell); - setAasData(shell); - } + useAsyncEffect(async () => { + await fetchAas(); + }, [base64AasId, env]); + + async function fetchAas() { + try { + setIsLoadingAas(true); + if (aas === null) { + const aasIdDecoded = safeBase64Decode(base64AasId); + const registrySearchResult = await handleAasRegistrySearch(aasIdDecoded); + if (registrySearchResult != null) { + setAas(registrySearchResult.registryAas as AssetAdministrationShell); + setRegistryAasData({ + submodelDescriptors: registrySearchResult?.registryAasData?.submodelDescriptors, + aasRegistryRepositoryOrigin: + registrySearchResult?.registryAasData?.aasRegistryRepositoryOrigin, + }); + setAasData(registrySearchResult.registryAas as AssetAdministrationShell); } else { - setAasData(aas); + let fetchedAas; + try { + fetchedAas = await repositoryClient.getAssetAdministrationShellById(base64AasId); + } catch (e) { + fetchedAas = await getAasFromAllRepos(base64AasId, repositoryClient); + } + + setAas(fetchedAas); + setAasData(fetchedAas); } - } catch (e) { - showError(e, notificationSpawner); - } finally { - setIsLoadingAas(false); + } else { + setAasData(aas); } + } catch (e) { + showError(e, notificationSpawner); + } finally { + setIsLoadingAas(false); } - - _fetchAas(); - }, [base64AasId, env]); + } const setAasData = (shell: AssetAdministrationShell) => { const productImageString = shell.assetInformation?.defaultThumbnail?.path ?? ''; @@ -77,7 +84,7 @@ export default function Page() { } else { setHasImage(false); } - setSubmodels(shell.submodels ?? undefined); + setSubmodelReferences(shell.submodels ?? undefined); }; const startComparison = () => { @@ -141,7 +148,7 @@ export default function Page() { hasImage={hasImage} isAccordion={isMobile} /> - + ) : ( <> @@ -162,7 +169,7 @@ export default function Page() { + + + ) : ( + + )} + + + ); +} diff --git a/src/app/[locale]/settings/_components/id-settings/IdSettingEntry.tsx b/src/app/[locale]/settings/_components/id-settings/IdSettingEntry.tsx index 5e22864..09ae569 100644 --- a/src/app/[locale]/settings/_components/id-settings/IdSettingEntry.tsx +++ b/src/app/[locale]/settings/_components/id-settings/IdSettingEntry.tsx @@ -1,8 +1,6 @@ -import { Check, Close } from '@mui/icons-material'; import { Box, CircularProgress, - Divider, FormControl, InputLabel, MenuItem, @@ -14,25 +12,26 @@ import { import { LockedTextField } from 'components/basics/LockedTextField'; import { messages } from 'lib/i18n/localization'; import { useEffect, useState } from 'react'; -import { Controller, ControllerRenderProps, SubmitHandler, useForm } from 'react-hook-form'; -import { FormattedMessage } from 'react-intl'; -import { IdGenerationSettingFrontend } from 'lib/types/IdGenerationSettingFrontend'; +import { + Control, + Controller, + ControllerRenderProps, + FieldArrayWithId, FieldErrors, + UseFormRegister +} from 'react-hook-form'; +import { FormattedMessage, useIntl } from 'react-intl'; import { isValidIdPrefix, isValidShortIdPrefix } from 'lib/util/IdValidationUtil'; import { DynamicPartText } from './DynamicPartText'; -import { SquaredIconButton } from 'components/basics/Buttons'; +import { IdSettingsFormData } from 'app/[locale]/settings/_components/id-settings/IdSettingsCard'; type IdSettingEntryProps = { - readonly idSetting: IdGenerationSettingFrontend; - readonly hasDivider?: boolean; + readonly index: number; readonly editMode: boolean; readonly isLoading?: boolean; - readonly handleChange: (idShort: string, values: { prefix: string; dynamicPart: string }) => void; - readonly setEditMode: (name: string, value: boolean) => void; -}; - -type FormInputs = { - prefix: string; - dynamicPart: string; + readonly control: Control + readonly field: FieldArrayWithId + readonly register: UseFormRegister + readonly errors: FieldErrors | undefined }; const StyledWrapper = styled(Box)(({ theme }) => ({ @@ -41,13 +40,6 @@ const StyledWrapper = styled(Box)(({ theme }) => ({ position: 'relative', padding: theme.spacing(2), - '&.has-hover': { - cursor: 'pointer', - '&:hover': { - backgroundColor: theme.palette.action.hover, - }, - }, - '&.is-loading': { opacity: '0.5', pointerEvents: 'none', @@ -68,49 +60,21 @@ const StyledCircularProgressWrapper = styled(Box)(() => ({ })); export function IdSettingEntry(props: IdSettingEntryProps) { - const setting = props.idSetting; - let prefixValidation = undefined; - let errorMessage = <>; const [hasTriggeredChange, setHasTriggeredChange] = useState(true); + const intl = useIntl(); - switch (setting.idType) { - case 'IRI': - prefixValidation = isValidIdPrefix; - errorMessage = ; - break; - case 'string': - // For idShorts we want to ensure that it can be part of an IRI - prefixValidation = isValidShortIdPrefix; - errorMessage = ; - break; - } - const { - register, - control, - handleSubmit, - reset, - formState: { errors }, - } = useForm(); - - const onSubmit: SubmitHandler = (data) => { - props.setEditMode(setting.name, false); - if (data.prefix !== setting.prefix.value || data.dynamicPart !== setting.dynamicPart.value) { - setHasTriggeredChange(true); - props.handleChange(setting.name, data); + const validateInput = (value: string | null | undefined) => { + if (!value) return + switch (props.field.idType) { + case 'IRI': + return isValidIdPrefix(value) || intl.formatMessage({ ...messages.mnestix.errorMessages.invalidIri }); + case 'string': + // For idShorts we want to ensure that it can be part of an IRI + return isValidShortIdPrefix(value) || intl.formatMessage({ ...messages.mnestix.errorMessages.invalidIriPart }); } - }; - - function handleCancelClick() { - props.setEditMode(setting.name, false); + return } - // reset form when user clicks on other entry and this entry leaves edit mode - useEffect(() => { - if (!props.editMode) { - reset(); - } - }, [props.editMode, reset]); - // reset loading state if loading is complete useEffect(() => { if (!props.isLoading) { @@ -120,8 +84,8 @@ export function IdSettingEntry(props: IdSettingEntryProps) { // When there is only one allowed value, we show a locked Textfield instead of a dropdown. // The whole thing is wrapped in a during render to make it work with react-hook-form - const dropdownOrLocked = (field: ControllerRenderProps) => - setting.dynamicPart.allowedValues.length > 1 ? ( + const dropdownOrLocked = (field: ControllerRenderProps) => + props.field.dynamicPart.allowedValues.length > 1 ? ( @@ -132,8 +96,8 @@ export function IdSettingEntry(props: IdSettingEntryProps) { label={} {...field} > - {setting.dynamicPart.allowedValues && - setting.dynamicPart.allowedValues.map((el, index) => { + {props.field.dynamicPart.allowedValues && + props.field.dynamicPart.allowedValues.map((el, index) => { return ( {el} @@ -153,56 +117,51 @@ export function IdSettingEntry(props: IdSettingEntryProps) { return ( - {!props.hasDivider && } !props.editMode && props.setEditMode(setting.name, true)} + className={`${hasTriggeredChange ? 'is-loading' : ''}`} > - {setting.name} + {props.field.name} {!props.editMode && ( <> - {setting.prefix.value} + {props.field.prefix.value} {hasTriggeredChange && ( - + )} )} {props.editMode && ( - - } - sx={{ flexGrow: 1, mr: 1 }} - fullWidth={true} - {...register('prefix', { - validate: prefixValidation, - })} - defaultValue={setting.prefix.value} - error={!!errors.prefix} - helperText={!!errors.prefix && errorMessage} + + validateInput(value) + }} + name={`idSettings.${props.index}.prefix.value`} + render={() => + } + sx={{ flexGrow: 1, mr: 1 }} + fullWidth={true} + defaultValue={props.field.prefix.value} + error={!!(props.errors?.idSettings?.[props.index]?.prefix)} + helperText={props.errors?.idSettings?.[props.index]?.prefix?.value?.message} + {...props.register(`idSettings.${props.index}.prefix.value`)} + />} /> dropdownOrLocked(field)} /> - } sx={{ ml: 1 }} type="submit" /> - } - onClick={() => handleCancelClick()} - /> )} diff --git a/src/app/[locale]/settings/_components/id-settings/IdSettingsCard.tsx b/src/app/[locale]/settings/_components/id-settings/IdSettingsCard.tsx index 3ad811f..896f7e9 100644 --- a/src/app/[locale]/settings/_components/id-settings/IdSettingsCard.tsx +++ b/src/app/[locale]/settings/_components/id-settings/IdSettingsCard.tsx @@ -1,12 +1,24 @@ import { InfoOutlined } from '@mui/icons-material'; import { alpha, Box, Skeleton, Divider, Typography, styled } from '@mui/material'; -import { CardHeading } from 'components/basics/CardHeading'; import { messages } from 'lib/i18n/localization'; import { Fragment, useState } from 'react'; -import { FormattedMessage } from 'react-intl'; +import { FormattedMessage, useIntl } from 'react-intl'; import { IdGenerationSettingFrontend } from 'lib/types/IdGenerationSettingFrontend'; import { IdSettingEntry } from './IdSettingEntry'; import { AssetIdRedirectDocumentationDialog } from './AssetIdRedirectDocumentationDialog'; +import { useFieldArray, useForm } from 'react-hook-form'; +import { useAsyncEffect } from 'lib/hooks/UseAsyncEffect'; +import { showError } from 'lib/util/ErrorHandlerUtil'; +import { + ISubmodelElement, Property, + Qualifier, + SubmodelElementCollection +} from '@aas-core-works/aas-core3.0-typescript/dist/types/types'; +import { getArrayFromString } from 'lib/util/SubmodelResolverUtil'; +import { useAuth } from 'lib/hooks/UseAuth'; +import { useApis } from 'components/azureAuthentication/ApiProvider'; +import { useNotificationSpawner } from 'lib/hooks/UseNotificationSpawner'; +import { SettingsCardHeader } from 'app/[locale]/settings/_components/SettingsCardHeader'; const StyledDocumentationButton = styled(Box)(({ theme }) => ({ display: 'flex', @@ -25,58 +37,160 @@ const StyledDocumentationButton = styled(Box)(({ theme }) => ({ }, })); -type IdSettingsCardProps = { - readonly idSettings: IdGenerationSettingFrontend[] | undefined; - readonly isLoading?: boolean; - readonly handleChange: (idShort: string, values: { prefix: string; dynamicPart: string }) => void; -}; -export function IdSettingsCard(props: IdSettingsCardProps) { - const settings = props.idSettings || []; - const [currentSettingInEditMode, setCurrentSettingInEditMode] = useState(''); +export type IdSettingsFormData = { + idSettings: IdGenerationSettingFrontend[]; +} + +export function IdSettingsCard() { + const [isEditMode, setIsEditMode] = useState(false); const [documentationModalOpen, setDocumentationModalOpen] = useState(false); + const auth = useAuth(); + const bearerToken = auth.getBearerToken(); + const { configurationClient } = useApis(); + const notificationSpawner = useNotificationSpawner(); + const intl = useIntl(); + const [isLoading, setIsLoading] = useState(false); + const [settings, setSettings] = useState([]); + + const { + register, + control, + handleSubmit, + reset, + formState: { errors }, + } = useForm({ defaultValues: { idSettings: settings } }); + + const { fields } = useFieldArray({ + control, + name: 'idSettings', + }); + + // Fetch id settings initially + useAsyncEffect(async () => { + await fetchIdSettings(); + }, [bearerToken]); + + const fetchIdSettings = async () => { + try { + setIsLoading(true); + const res = await configurationClient.getIdGenerationSettings(); + const _settings: IdGenerationSettingFrontend[] = []; + // set settings from api response + res.submodelElements?.forEach((el) => { + const element = el as ISubmodelElement; + const collection = el as SubmodelElementCollection; + const _settingsList = collection.value; + const name = el.idShort; + + // IdType (to apply correct validation) + const idTypeQualifier = element.qualifiers?.find((q: Qualifier) => { + return q.type === 'SMT/IdType'; + }); + const idType = idTypeQualifier?.value; + + const prefix = _settingsList?.find((e) => e.idShort === 'Prefix') as Property; + const dynamicPart = _settingsList?.find((e) => e.idShort === 'DynamicPart') as Property; - // only allow one setting to be in edit mode - function setEditMode(name: string, value: boolean) { - if (value) { - setCurrentSettingInEditMode(name); - } else { - setCurrentSettingInEditMode(''); + const dynamicPartAllowedQualifier = dynamicPart?.qualifiers?.find((q: Qualifier) => { + return q.type === 'SMT/AllowedValue'; + }); + const allowedDynamicPartValues = getArrayFromString(dynamicPartAllowedQualifier?.value || ''); + + const prefixExampleValueQualifier = prefix?.qualifiers?.find((q: Qualifier) => { + return q.type === 'ExampleValue'; + }); + const prefixExampleValue = prefixExampleValueQualifier?.value; + + _settings.push({ + name: name || '', + idType, + prefix: { + value: prefix?.value, + exampleValue: prefixExampleValue, + }, + dynamicPart: { + value: dynamicPart?.value, + allowedValues: allowedDynamicPartValues, + // (we do not fill example value from api currently) + }, + }); + }); + setSettings(_settings); + // set form state + reset({ idSettings: _settings }) + + } catch (e) { + showError(e, notificationSpawner); + } finally { + setIsLoading(false); + } + }; + + async function saveIdSettings(data: IdSettingsFormData) { + try { + setIsLoading(true); + for (const setting of data.idSettings) { + if (setting.prefix.value && setting.dynamicPart.value) { + await configurationClient.putSingleIdGenerationSetting(setting.name, bearerToken, { + prefix: setting.prefix.value, + dynamicPart: setting.dynamicPart.value + }) + } + } + await fetchIdSettings(); + notificationSpawner.spawn({ + message: intl.formatMessage(messages.mnestix.successfullyUpdated), + severity: 'success', + }); + setIsEditMode(false); + } catch (e) { + showError(e, notificationSpawner); + } finally { + setIsLoading(false); } } + + const cancelEdit = () => { + reset(); + setIsEditMode(false); + }; + return ( - } - subtitle={} - /> + } + subtitle={} + onCancel={() => cancelEdit()} onEdit={() => setIsEditMode(true)} + onSubmit={handleSubmit((data) => saveIdSettings(data))} + isEditMode={isEditMode}/> - {props.isLoading && + + {isLoading && !settings.length && [0, 1, 2, 3, 4].map((i) => { return ( - - {i < 4 && } + ); })} - {settings.map((setting, index) => { + {fields.map((field, index) => { return ( ); })} setDocumentationModalOpen(true)}> - + diff --git a/src/app/[locale]/settings/_components/mnestix-connections/MnestixConnectionServerActions.tsx b/src/app/[locale]/settings/_components/mnestix-connections/MnestixConnectionServerActions.tsx index 36eb41d..ce2712b 100644 --- a/src/app/[locale]/settings/_components/mnestix-connections/MnestixConnectionServerActions.tsx +++ b/src/app/[locale]/settings/_components/mnestix-connections/MnestixConnectionServerActions.tsx @@ -31,10 +31,6 @@ export async function upsertConnectionDataAction(formData: ConnectionFormData) { } } -export async function resetConnectionTable() { - await prisma.mnestixConnection.deleteMany({}); -} - export async function getConnectionDataByTypeAction(type: ConnectionType) { const basePath = await prisma?.mnestixConnection.findMany({ where: { diff --git a/src/app/[locale]/settings/_components/mnestix-connections/MnestixConnectionsCard.tsx b/src/app/[locale]/settings/_components/mnestix-connections/MnestixConnectionsCard.tsx index e548561..755116e 100644 --- a/src/app/[locale]/settings/_components/mnestix-connections/MnestixConnectionsCard.tsx +++ b/src/app/[locale]/settings/_components/mnestix-connections/MnestixConnectionsCard.tsx @@ -1,22 +1,17 @@ -import { CardHeading } from 'components/basics/CardHeading'; import { FormattedMessage, useIntl } from 'react-intl'; import { messages } from 'lib/i18n/localization'; -import { Box, Button, FormControl, IconButton, TextField, Typography } from '@mui/material'; -import { useState } from 'react'; +import { Box, Button, Divider, FormControl, IconButton, Skeleton, TextField, Typography } from '@mui/material'; +import { Fragment, useState } from 'react'; import { useNotificationSpawner } from 'lib/hooks/UseNotificationSpawner'; import { getConnectionDataAction, - resetConnectionTable, upsertConnectionDataAction, } from 'app/[locale]/settings/_components/mnestix-connections/MnestixConnectionServerActions'; import ControlPointIcon from '@mui/icons-material/ControlPoint'; import { Controller, FieldArrayWithId, useFieldArray, useForm } from 'react-hook-form'; -import EditIcon from '@mui/icons-material/Edit'; import RemoveCircleOutlineIcon from '@mui/icons-material/RemoveCircleOutline'; -import CheckIcon from '@mui/icons-material/Check'; -import CloseIcon from '@mui/icons-material/Close'; -import RefreshIcon from '@mui/icons-material/Refresh'; import { useEnv } from 'app/env/provider'; +import { SettingsCardHeader } from 'app/[locale]/settings/_components/SettingsCardHeader'; export type ConnectionFormData = { repositories: { @@ -29,14 +24,18 @@ export type ConnectionFormData = { export function MnestixConnectionsCard() { const notificationSpawner = useNotificationSpawner(); const [isEditMode, setIsEditMode] = useState(false); + const [isLoading, setIsLoading] = useState(false); const intl = useIntl(); const env = useEnv(); async function getConnectionData() { try { + setIsLoading(true); return await getConnectionDataAction(); } catch (error) { notificationSpawner.spawn(error); + } finally { + setIsLoading(false); } return; } @@ -87,19 +86,6 @@ export function MnestixConnectionsCard() { setIsEditMode(false); }; - async function resetToDefault() { - try { - await resetConnectionTable(); - reset(await mapFormData()); - notificationSpawner.spawn({ - severity: 'success', - message: intl.formatMessage(messages.mnestix.connections.resetSuccessfull), - }); - } catch (error) { - notificationSpawner.spawn(error); - } - } - function getFormControl(field: FieldArrayWithId, index: number) { return ( @@ -117,7 +103,8 @@ export function MnestixConnectionsCard() { render={({ field, fieldState: { error } }) => ( } + label={ + } sx={{ flexGrow: 1, mr: 1 }} fullWidth={true} error={!!error} @@ -126,7 +113,7 @@ export function MnestixConnectionsCard() { )} /> - remove(index)} /> + remove(index)}/> ) : ( @@ -139,39 +126,14 @@ export function MnestixConnectionsCard() { return ( - - } - subtitle={} - /> - - {isEditMode ? ( - <> - - - - ) : ( - <> - - - - )} - - - - + } + subtitle={} + onCancel={() => cancelEdit()} onEdit={() => setIsEditMode(true)} + onSubmit={handleSubmit((data) => saveConnectionData(data))} + isEditMode={isEditMode}/> + + + @@ -180,11 +142,20 @@ export function MnestixConnectionsCard() { {env.AAS_REPO_API_URL} - {fields.map((field, index) => getFormControl(field, index))} + {isLoading && + !fields.length && + [0, 1, 2].map((i) => { + return ( + + + + ); + })} + {!isLoading && fields.map((field, index) => getFormControl(field, index))} + + + ); +} diff --git a/src/app/[locale]/settings/_components/mnestix-connections/MnestixConnectionServerActions.tsx b/src/app/[locale]/settings/_components/mnestix-connections/MnestixConnectionServerActions.tsx index ce2712b..e7df145 100644 --- a/src/app/[locale]/settings/_components/mnestix-connections/MnestixConnectionServerActions.tsx +++ b/src/app/[locale]/settings/_components/mnestix-connections/MnestixConnectionServerActions.tsx @@ -1,18 +1,22 @@ 'use server'; import { prisma } from 'lib/database/prisma'; -import { ConnectionFormData } from 'app/[locale]/settings/_components/mnestix-connections/MnestixConnectionsCard'; import { ConnectionType } from '@prisma/client'; +type DataSourceFormData = { + id: string; + url: string; + type: string; +}; + export async function getConnectionDataAction() { return prisma?.mnestixConnection.findMany({ include: { type: true } }); } -export async function upsertConnectionDataAction(formData: ConnectionFormData) { - const data = formData.repositories; +export async function upsertConnectionDataAction(formDataInput: DataSourceFormData[]) { const existingData = await prisma?.mnestixConnection.findMany({ include: { type: true } }); for (const existing of existingData) { - const formData = data.find((value) => value.id === existing.id); + const formData = formDataInput.find((value) => value.id === existing.id); // If an entry exists in the db and the updated data, update the existing db entry if (formData) { await prisma.mnestixConnection.update({ where: { id: existing.id }, data: { url: formData.url } }); @@ -22,7 +26,7 @@ export async function upsertConnectionDataAction(formData: ConnectionFormData) { } } // If an entry doesn't exist in the db but in the updated data, create it in the db - for (const updated of data) { + for (const updated of formDataInput) { const formData = existingData.find((value) => value.id === updated.id); const type = await prisma.connectionType.findFirst({ where: { typeName: updated.type } }); if (!formData && type) { @@ -39,4 +43,4 @@ export async function getConnectionDataByTypeAction(type: ConnectionType) { }); return basePath.map((item) => item.url); -} \ No newline at end of file +} diff --git a/src/app/[locale]/settings/_components/mnestix-connections/MnestixConnectionsCard.tsx b/src/app/[locale]/settings/_components/mnestix-connections/MnestixConnectionsCard.tsx index 3a89600..0e6a214 100644 --- a/src/app/[locale]/settings/_components/mnestix-connections/MnestixConnectionsCard.tsx +++ b/src/app/[locale]/settings/_components/mnestix-connections/MnestixConnectionsCard.tsx @@ -1,24 +1,33 @@ import { FormattedMessage, useIntl } from 'react-intl'; import { messages } from 'lib/i18n/localization'; -import { Box, Button, Divider, FormControl, IconButton, Skeleton, TextField, Typography } from '@mui/material'; -import { Fragment, useState } from 'react'; +import { Box } from '@mui/material'; +import { useState } from 'react'; import { useNotificationSpawner } from 'lib/hooks/UseNotificationSpawner'; import { getConnectionDataAction, upsertConnectionDataAction, } from 'app/[locale]/settings/_components/mnestix-connections/MnestixConnectionServerActions'; -import ControlPointIcon from '@mui/icons-material/ControlPoint'; -import { Controller, FieldArrayWithId, useFieldArray, useForm } from 'react-hook-form'; -import RemoveCircleOutlineIcon from '@mui/icons-material/RemoveCircleOutline'; +import { useForm } from 'react-hook-form'; import { useEnv } from 'app/env/provider'; import { SettingsCardHeader } from 'app/[locale]/settings/_components/SettingsCardHeader'; +import { MnestixConnectionsForm } from 'app/[locale]/settings/_components/mnestix-connections/MnestixConnectionForm'; export type ConnectionFormData = { - repositories: { + aasRepository: { id: string; url: string; type: string; }[]; + submodelRepository: { + id: string; + url: string; + type: string; + }[]; +}; + +type DataSource = { + name: string; + url: string | undefined; }; export function MnestixConnectionsCard() { @@ -28,6 +37,11 @@ export function MnestixConnectionsCard() { const intl = useIntl(); const env = useEnv(); + const dataSources: DataSource[] = [ + { name: 'aasRepository', url: env.AAS_REPO_API_URL }, + { name: 'submodelRepository', url: env.AAS_REPO_API_URL }, //TODO: Update env to SUBMODEL_REPO_API_URL after merge with "dev" branch + ]; + async function getConnectionData() { try { setIsLoading(true); @@ -47,33 +61,34 @@ export function MnestixConnectionsCard() { const rawConnectionData = await getConnectionData(); if (rawConnectionData) { const defaultFormData: ConnectionFormData = { - repositories: rawConnectionData?.map((data) => ({ - id: data.id, - url: data.url, - type: data.type.typeName, - })), + aasRepository: rawConnectionData + ?.filter((data) => data.type.typeName === 'AAS_REPOSITORY') + .map((data) => ({ + id: data.id, + url: data.url, + type: data.type.typeName, + })), + submodelRepository: rawConnectionData + ?.filter((data) => data.type.typeName === 'SUBMODEL_REPOSITORY') + .map((data) => ({ + id: data.id, + url: data.url, + type: data.type.typeName, + })), }; return defaultFormData; } else { - return { repositories: [] }; + return { aasRepository: [], submodelRepository: [] }; } } - const { - control, - handleSubmit, - getValues, - reset, - } = useForm({ defaultValues: async () => await mapFormData() }); - - const { fields, append, remove } = useFieldArray({ - control, - name: 'repositories', + const { control, handleSubmit, getValues, reset } = useForm({ + defaultValues: async () => await mapFormData(), }); async function saveConnectionData(data: ConnectionFormData) { try { - await upsertConnectionDataAction(data); + await upsertConnectionDataAction([...data.aasRepository, ...data.submodelRepository]); notificationSpawner.spawn({ message: intl.formatMessage(messages.mnestix.changesSavedSuccessfully), severity: 'success', @@ -92,85 +107,28 @@ export function MnestixConnectionsCard() { setIsEditMode(false); }; - function getFormControl(field: FieldArrayWithId, index: number) { - return ( - - - - - - {isEditMode ? ( - - ( - } - sx={{ flexGrow: 1, mr: 1 }} - fullWidth={true} - error={!!error} - helperText={error ? error.message : ''} - /> - )} - /> - - remove(index)}/> - - - ) : ( - {getValues(`repositories.${index}.url`)} - )} - - - ); - } - return ( - } - subtitle={} - onCancel={() => cancelEdit()} onEdit={() => setIsEditMode(true)} - onSubmit={handleSubmit((data) => saveConnectionData(data))} - isEditMode={isEditMode}/> - - - - - - - - - - {env.AAS_REPO_API_URL} - - {isLoading && - !fields.length && - [0, 1, 2].map((i) => { - return ( - - - - ); - })} - {!isLoading && fields.map((field, index) => getFormControl(field, index))} - - - - + } + subtitle={} + onCancel={() => cancelEdit()} + onEdit={() => setIsEditMode(true)} + onSubmit={handleSubmit((data) => saveConnectionData(data))} + isEditMode={isEditMode} + /> + {dataSources.map((dataSource, index) => ( + + ))} ); } diff --git a/src/lib/i18n/de.mnestix.ts b/src/lib/i18n/de.mnestix.ts index b92f0d7..7c22d80 100644 --- a/src/lib/i18n/de.mnestix.ts +++ b/src/lib/i18n/de.mnestix.ts @@ -24,16 +24,26 @@ export const deMnestix = { connections: { title: 'Datenquellen', subtitle: 'Definieren Sie, welche Datenquellen verwendet werden sollen.', - repositories: 'AAS Repositorys', - repositoryLabel: 'AAS Repository', - repositoryUrlLabel: 'AAS Repository Url', - repositoryDefaultLabel: 'Default AAS Repository', + resetSuccessfull: 'Quellen wurden zurückgesetzt.', + urlFieldRequired: 'URL wird benötigt', addButton: 'Hinzufügen', editButton: 'Alle bearbeiten', saveButton: 'Alle speichern', resetButton: 'Auf Default zurücksetzen', - resetSuccessfull: 'Quellen wurden zurückgesetzt.', - urlFieldRequired: 'URL wird benötigt', + aasRepository: { + repositories: 'AAS Repositorys', + repositoryLabel: 'AAS Repository', + repositoryUrlLabel: 'AAS Repository URL', + repositoryDefaultLabel: 'Default AAS Repository', + connectionType: 'AAS_REPOSITORY', + }, + submodelRepository: { + repositories: 'Submodel Repositorys', + repositoryLabel: 'Submodel Repository', + repositoryUrlLabel: 'Submodel Repository URL', + repositoryDefaultLabel: 'Default Submodel Repository', + connectionType: 'SUBMODEL_REPOSITORY', + }, }, submodels: 'Teilmodelle', unknownModelType: 'Unbekannter ModelType: {type}', diff --git a/src/lib/i18n/en.mnestix.ts b/src/lib/i18n/en.mnestix.ts index ea48a4b..c8390ec 100644 --- a/src/lib/i18n/en.mnestix.ts +++ b/src/lib/i18n/en.mnestix.ts @@ -24,16 +24,24 @@ export const enMnestix = { connections: { title: 'Data sources', subtitle: 'Define which data connections should be used.', - repositories: 'AAS Repositories', - repositoryLabel: 'AAS Repository', - repositoryUrlLabel: 'AAS Repository Url', - repositoryDefaultLabel: 'Default AAS Repository', addButton: 'Add more', editButton: 'Edit all', saveButton: 'Save all', resetButton: 'Reset to default', resetSuccessfull: 'Connections were reset.', urlFieldRequired: 'URL field is required', + aasRepository: { + repositories: 'AAS Repositories', + repositoryLabel: 'AAS Repository', + repositoryUrlLabel: 'AAS Repository URL', + repositoryDefaultLabel: 'Default AAS Repository', + }, + submodelRepository: { + repositories: 'Submodel Repositories', + repositoryLabel: 'Submodel Repository', + repositoryUrlLabel: 'Submodel Repository URL', + repositoryDefaultLabel: 'Default Submodel Repository', + }, }, submodels: 'Submodels', unknownModelType: 'Unknown ModelType: {type}', From 4d48958a7ba62858b13c77f36c5d11a91f1a10bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Frederik=20Schl=C3=BCter?= Date: Wed, 11 Sep 2024 12:05:08 +0200 Subject: [PATCH 25/55] test strategy: searchServer advances on testing the edge cases --- src/lib/searchUtilActions/search.spec.ts | 105 ++++++++++++++--- src/lib/searchUtilActions/searchServer.ts | 18 ++- src/lib/util/Log.ts | 132 ++++++++++++++++++++++ src/lib/util/tracker.ts | 43 +++++++ 4 files changed, 276 insertions(+), 22 deletions(-) create mode 100644 src/lib/util/Log.ts create mode 100644 src/lib/util/tracker.ts diff --git a/src/lib/searchUtilActions/search.spec.ts b/src/lib/searchUtilActions/search.spec.ts index aeadf23..3f1d541 100644 --- a/src/lib/searchUtilActions/search.spec.ts +++ b/src/lib/searchUtilActions/search.spec.ts @@ -4,78 +4,136 @@ import { AssetAdministrationShellDescriptor } from 'lib/types/registryServiceTyp import { AssetAdministrationShell } from '@aas-core-works/aas-core3.0-typescript/types'; import { instance, mock } from 'ts-mockito'; import { encodeBase64 } from 'lib/util/Base64Util'; +import { Log, LogEntry } from 'lib/util/Log'; interface DummyAasParameters { id?: string; } +const AAS_ENDPOINT = 'https://www.origin.com/route/for/aas/'; + + describe('Full Aas Search happy paths', () => { it('navigates to the discovery list when more than one aasId for a given assetId', async () => { const searchString = 'irrelevant assetId'; + const log = Log.createNull(); + const tracker = log.getTracker(); const searcher = AasSearcher.createNull({ discoveryEntries: [{ assetId: searchString, aasIds: ['first found aasId 0', 'second found aasId 1'] }], + log: log, }); const result = await searcher.fullSearch(searchString); expect(result.redirectUrl).toBe('/viewer/discovery?assetId=' + searchString); + expect(tracker.getData()).toHaveLength(0); }); it('returns details of aas when exactly one aasId for a given assetId and it is registered in the registry', async () => { const aasId = 'dummy aasId'; - const aasEndpoint = 'https://www.origin.com/route/for/aas/'; - const userInputString = 'irrelevant assetId'; + const searchString = 'irrelevant assetId'; const searcher = AasSearcher.createNull({ - discoveryEntries: [{ assetId: userInputString, aasIds: [aasId] }], - registryShellDescriptorEntries: [createDummyShellDescriptor(aasEndpoint, aasId)], - shellsByRegistryEndpoint: [{ path: aasEndpoint, aas: createDummyAas({ id: aasId }) }], + discoveryEntries: [{ assetId: searchString, aasIds: [aasId] }], + registryShellDescriptorEntries: [createDummyShellDescriptor(AAS_ENDPOINT, aasId)], + shellsByRegistryEndpoint: [{ path: AAS_ENDPOINT, aas: createDummyAas({ id: aasId }) }], }); - const result = await searcher.fullSearch(userInputString); + const result = await searcher.fullSearch(searchString); expect(result.redirectUrl).toBe('/viewer/' + encodeBase64(aasId)); }); it('returns details of aas when exactly one aasId for a given assetId and it is not registered in the registry but saved in default repository', async () => { const aasId = 'dummy aasId'; - const userInputString = 'irrelevant assetId'; + const searchString = 'irrelevant assetId'; const searcher = AasSearcher.createNull({ - discoveryEntries: [{ assetId: userInputString, aasIds: [aasId] }], + discoveryEntries: [{ assetId: searchString, aasIds: [aasId] }], shellsSavedInTheRepository: [createDummyAas({ id: aasId })], }); - const result = await searcher.fullSearch(userInputString); + const result = await searcher.fullSearch(searchString); expect(result.redirectUrl).toBe('/viewer/' + encodeBase64(aasId)); }); it('returns details of aas when exactly when discovery returns nothing and the aas is registered in the registry', async () => { const aasId = 'dummy aasId'; - const userInputString = aasId; - const aasEndpoint = 'https://www.origin.com/route/for/aas/'; + const searchString = aasId; const searcher = AasSearcher.createNull({ - registryShellDescriptorEntries: [createDummyShellDescriptor(aasEndpoint, aasId)], - shellsByRegistryEndpoint: [{ path: aasEndpoint, aas: createDummyAas({ id: aasId }) }], + registryShellDescriptorEntries: [createDummyShellDescriptor(AAS_ENDPOINT, aasId)], + shellsByRegistryEndpoint: [{ path: AAS_ENDPOINT, aas: createDummyAas({ id: aasId }) }], }); - const result = await searcher.fullSearch(userInputString); + const result = await searcher.fullSearch(searchString); expect(result.redirectUrl).toBe('/viewer/' + encodeBase64(aasId)); }); it('returns aas for given aasId from default repository', async () => { const aasId = 'dummy aasId'; - const userInputString = aasId; + const searchString = aasId; const searcher = AasSearcher.createNull({ shellsSavedInTheRepository: [createDummyAas({ id: aasId })], }); - const result = await searcher.fullSearch(userInputString); + const result = await searcher.fullSearch(searchString); expect(result.redirectUrl).toBe('/viewer/' + encodeBase64(aasId)); }); }); +describe('Full Aas Search edge cases', () => { + it('logs to the console when finding nothing', async () => { + const searchString = 'irrelevant assetId'; + const log = Log.createNull(); + const tracker = log.getTracker(); + const searcher = AasSearcher.createNull({ + discoveryEntries: [], + registryShellDescriptorEntries: [], + shellsByRegistryEndpoint: [], + shellsSavedInTheRepository: [], + log: log, + }); + + await assertThatFunctionThrows(searcher, searchString, 'no aas found in the default repository for aasId'); + + const trackedData: LogEntry[] = tracker.getData() as LogEntry[]; + expect(trackedData).toHaveLength(2); + const messageFound = trackedData.some((track) => + track.message.includes('Could not be found in the registry service'), + ); + if (!messageFound) fail('Failed to log the right error message'); + }); + + it('throws when registry search failed', async () => { + const searchString = 'irrelevant assetId'; + const aasId = 'irrelevantAasId'; + const log = Log.createNull(); + const searcher = AasSearcher.createNull({ + discoveryEntries: [{ assetId: searchString, aasIds: [aasId] }], + registryShellDescriptorEntries: [createDummyShellDescriptor(AAS_ENDPOINT, aasId)], + shellsByRegistryEndpoint: [{ path: AAS_ENDPOINT + 'wrong path', aas: createDummyAas({ id: aasId }) }], + log: log, + }); + + await assertThatFunctionThrows(searcher, searchString); + }); + + it('throws when discovery search failed', async () => { + const searchString = 'irrelevant assetId'; + const aasId = 'irrelevantAasId'; + const log = Log.createNull(); + const searcher = AasSearcher.createNull({ + discoveryEntries: [{ assetId: 'wrong asset Id', aasIds: [aasId] }], + registryShellDescriptorEntries: [createDummyShellDescriptor(AAS_ENDPOINT, aasId)], + shellsByRegistryEndpoint: [{ path: AAS_ENDPOINT + 'wrong path', aas: createDummyAas({ id: aasId }) }], + log: log, + }); + + await assertThatFunctionThrows(searcher, searchString); + }); +}); + // would prefer to do without mocks but the objects are too complicated to instantiate function createDummyAas({ id = 'irrelevant AasId' }: DummyAasParameters = {}) { const aas = mock(AssetAdministrationShell); @@ -97,3 +155,18 @@ function createDummyShellDescriptor(href: string, id: string): AssetAdministrati id: id, }; } + +// Todo: Are you good at typescript? There must be a better way to it! +// await expect(searcher.fullSearch(searchString)).rejects.toThrow(); does not work for some reason... +async function assertThatFunctionThrows( + searcher: AasSearcher, + searchString: string, + partOfExpectedErrorMessage: string | null = null, +) { + try { + await searcher.fullSearch(searchString); + fail('Your method was expected to throw but did not throw at all.'); + } catch (e) { + partOfExpectedErrorMessage && expect(e).toContain(partOfExpectedErrorMessage); + } +} diff --git a/src/lib/searchUtilActions/searchServer.ts b/src/lib/searchUtilActions/searchServer.ts index a84c38a..a864aec 100644 --- a/src/lib/searchUtilActions/searchServer.ts +++ b/src/lib/searchUtilActions/searchServer.ts @@ -17,6 +17,7 @@ import { AasSearchResult } from 'lib/searchUtilActions/searchClient'; import { IDiscoveryServiceApi } from 'lib/api/discovery-service-api/discoveryServiceApiInterface'; import { IRegistryServiceApi } from 'lib/api/registry-service-api/registryServiceApiInterface'; import { IAssetAdministrationShellRepositoryApi } from 'lib/api/basyx-v3/apiInterface'; +import { Log } from 'lib/util/Log'; export interface RegistrySearchResult { registryAas: AssetAdministrationShell; @@ -43,6 +44,7 @@ interface NullableSearchSetupParameters { registryShellDescriptorEntries?: AssetAdministrationShellDescriptor[] | null; shellsByRegistryEndpoint?: { path: string; aas: AssetAdministrationShell }[] | null; shellsSavedInTheRepository?: AssetAdministrationShell[] | null; + log ?: Log | null; } export class AasSearcher { @@ -51,6 +53,7 @@ export class AasSearcher { protected readonly registryService: IRegistryServiceApi, protected readonly repositoryClient: IAssetAdministrationShellRepositoryApi, protected readonly fetch: (input: RequestInfo | URL, init?: RequestInit | undefined) => Promise, + protected readonly log: Log, ) {} static create(): AasSearcher { @@ -60,14 +63,16 @@ export class AasSearcher { }); const registryServiceClient = RegistryServiceApi.create(process.env.REGISTRY_API_URL); const discoveryServiceClient = DiscoveryServiceApi.create(process.env.DISCOVERY_API_URL); - return new AasSearcher(discoveryServiceClient, registryServiceClient, repositoryClient, fetch); + const log = Log.create(); + return new AasSearcher(discoveryServiceClient, registryServiceClient, repositoryClient, fetch, log); } static createNull({ discoveryEntries = [], - registryShellDescriptorEntries = null, - shellsByRegistryEndpoint = null, - shellsSavedInTheRepository = null, + registryShellDescriptorEntries = [], + shellsByRegistryEndpoint = [], + shellsSavedInTheRepository = [], + log = null, }: NullableSearchSetupParameters = {}): AasSearcher { const stubbedFetch = async (input: RequestInfo | URL): Promise => { if (!shellsByRegistryEndpoint) return Promise.reject(new Error('no registry configuration')); @@ -81,6 +86,7 @@ export class AasSearcher { RegistryServiceApi.createNull({ registryShellDescriptorEntries }), AssetAdministrationShellRepositoryApi.createNull({ shellsSavedInTheRepository }), stubbedFetch, + log ?? Log.createNull() ); } @@ -144,7 +150,7 @@ export class AasSearcher { return aasIds; } catch (e) { - console.warn('Could not be found in the discovery service, will continue to look in the AAS repository.'); + this.log.warn('Could not be found in the discovery service, will continue to look in the AAS repository.'); return null; } } @@ -189,7 +195,7 @@ export class AasSearcher { }, }; } catch (e) { - console.warn('Could not be found in the registry service, will continue to look in the AAS registry.'); + this.log.warn('Could not be found in the registry service, will continue to look in the AAS registry.'); return null; } } diff --git a/src/lib/util/Log.ts b/src/lib/util/Log.ts new file mode 100644 index 0000000..afa78cd --- /dev/null +++ b/src/lib/util/Log.ts @@ -0,0 +1,132 @@ +import { TrackerEmitter, TrackerListener } from 'lib/util/tracker'; + +export class Log { + private tracker: TrackerEmitter; + + private constructor(private console: Console) { + this.tracker = new TrackerEmitter(); + } + + static create() { + return new Log(console); + } + + static createNull() { + return new Log(new NulledLog()); + } + + public log(message?: unknown, ...optionalParams: unknown[]): void { + this.console.log(message, ...optionalParams); + this.tracker.emit({ level: 'normal', message: message }); + } + + public warn(message?: unknown, ...optionalParams: unknown[]): void { + this.console.log(message, ...optionalParams); + this.tracker.emit({ level: 'warning', message: message }); + } + + public getTracker(): TrackerListener { + return this.tracker.getTracker(); + } +} + +export interface LogEntry { + level: string; + message: string; +} + +class NulledLog implements Console { + private logs: LogEntry[] = []; + + constructor() {} + + assert(value?: unknown, message?: unknown, ...optionalParams: unknown[]): void { + throw new Error('Method not implemented.'); + } + + clear(): void { + throw new Error('Method not implemented.'); + } + + count(label?: unknown): void { + throw new Error('Method not implemented.'); + } + + countReset(label?: unknown): void { + throw new Error('Method not implemented.'); + } + + debug(message?: unknown, ...optionalParams: unknown[]): void { + throw new Error('Method not implemented.'); + } + + dir(obj?: unknown, options?: unknown): void { + throw new Error('Method not implemented.'); + } + + dirxml(...data: unknown[]): void { + throw new Error('Method not implemented.'); + } + + error(message?: unknown, ...optionalParams: unknown[]): void { + throw new Error('Method not implemented.'); + } + + group(...label: unknown[]): void { + throw new Error('Method not implemented.'); + } + + groupCollapsed(...label: unknown[]): void { + throw new Error('Method not implemented.'); + } + + groupEnd(): void { + throw new Error('Method not implemented.'); + } + + info(message?: unknown, ...optionalParams: unknown[]): void { + throw new Error('Method not implemented.'); + } + + log(message?: unknown, ...optionalParams: unknown[]): void { + this.logs.push({ level: 'normal', message: JSON.stringify(message) }); + } + + table(tabularData?: unknown, properties?: unknown): void { + throw new Error('Method not implemented.'); + } + + time(label?: unknown): void { + throw new Error('Method not implemented.'); + } + + timeEnd(label?: unknown): void { + throw new Error('Method not implemented.'); + } + + timeLog(label?: unknown, ...data: unknown[]): void { + throw new Error('Method not implemented.'); + } + + timeStamp(label?: unknown): void { + throw new Error('Method not implemented.'); + } + + trace(message?: unknown, ...optionalParams: unknown[]): void { + throw new Error('Method not implemented.'); + } + + warn(message?: unknown, ...optionalParams: unknown[]): void { + this.logs.push({ level: 'warning', message: JSON.stringify(message) }); + } + + Console: console.ConsoleConstructor; + + profile(label?: string | undefined): void { + throw new Error('Method not implemented.'); + } + + profileEnd(label?: string | undefined): void { + throw new Error('Method not implemented.'); + } +} diff --git a/src/lib/util/tracker.ts b/src/lib/util/tracker.ts new file mode 100644 index 0000000..fe417e6 --- /dev/null +++ b/src/lib/util/tracker.ts @@ -0,0 +1,43 @@ +import { EventEmitter } from 'node:events'; + +export class TrackerEmitter { + private readonly emitter: EventEmitter; + private eventName: string; + + constructor(eventName: string = 'TrackerEmitterEmitter') { + this.emitter = new EventEmitter(); + this.eventName = eventName; + } + + public getTracker(): TrackerListener { + return new TrackerListener(this.emitter, this.eventName); + } + + public emit(data: T): void { + this.emitter.emit(this.eventName, data); + } +} + +export class TrackerListener { + public readonly stopListening: () => void; + private readonly data: T[] = []; + private readonly trackerFn: (data: T) => void; + + constructor(emitter: EventEmitter, eventName: string) { + this.trackerFn = (data) => { + this.data.push(data); + }; + this.stopListening = () => emitter.off(eventName, this.trackerFn); + emitter.on(eventName, this.trackerFn); + } + + public getData(): readonly T[] { + return this.data; + } + + public clear(): readonly T[] { + const result = [...this.data]; + this.data.length = 0; + return result; + } +} \ No newline at end of file From 46615bc9147a11a2b17741f11d21d006950cbd3e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Frederik=20Schl=C3=BCter?= Date: Wed, 11 Sep 2024 14:28:31 +0200 Subject: [PATCH 26/55] test strategy: WIP --- src/lib/api/basyx-v3/api.ts | 42 ++++++--- src/lib/api/basyx-v3/apiInMemory.ts | 47 ++++++++-- src/lib/api/basyx-v3/apiInterface.ts | 37 +++++++- .../SearchRepositoryHelper.ts | 2 + src/lib/searchUtilActions/search.spec.ts | 8 -- src/lib/searchUtilActions/searchServer.ts | 88 +++++++++++++++++-- 6 files changed, 189 insertions(+), 35 deletions(-) diff --git a/src/lib/api/basyx-v3/api.ts b/src/lib/api/basyx-v3/api.ts index 8aa602a..26551f9 100644 --- a/src/lib/api/basyx-v3/api.ts +++ b/src/lib/api/basyx-v3/api.ts @@ -4,8 +4,11 @@ import url from 'url'; import { Configuration } from './configuration'; import { AssetAdministrationShell, Reference, Submodel } from '@aas-core-works/aas-core3.0-typescript/types'; import { encodeBase64 } from 'lib/util/Base64Util'; -import { IAssetAdministrationShellRepositoryApi } from 'lib/api/basyx-v3/apiInterface'; -import { AssetAdministrationShellRepositoryApiInMemory } from 'lib/api/basyx-v3/apiInMemory'; +import { IAssetAdministrationShellRepositoryApi, ISubmodelRepositoryApi } from 'lib/api/basyx-v3/apiInterface'; +import { + AssetAdministrationShellRepositoryApiInMemory, + SubmodelRepositoryApiInMemory, +} from 'lib/api/basyx-v3/apiInMemory'; const BASE_PATH = '/'.replace(/\/+$/, ''); @@ -72,12 +75,15 @@ export class RequiredError extends Error { * @extends {BaseAPI} */ export class AssetAdministrationShellRepositoryApi extends BaseAPI implements IAssetAdministrationShellRepositoryApi { - constructor(configuration?: Configuration | undefined, basePath?: string, fetch?: FetchAPI) { super(configuration, basePath, fetch); } - static create(configuration?: Configuration | undefined, basePath?: string, fetch?: FetchAPI): AssetAdministrationShellRepositoryApi { + static create( + configuration?: Configuration | undefined, + basePath?: string, + fetch?: FetchAPI, + ): AssetAdministrationShellRepositoryApi { return new AssetAdministrationShellRepositoryApi(configuration, basePath, fetch); } @@ -329,7 +335,23 @@ export const AssetAdministrationShellRepositoryApiFetchParamCreator = function ( * @class SubmodelRepositoryApi * @extends {BaseAPI} */ -export class SubmodelRepositoryApi extends BaseAPI { +export class SubmodelRepositoryApi extends BaseAPI implements ISubmodelRepositoryApi { + private constructor(configuration?: Configuration | undefined, basePath?: string, fetch?: FetchAPI) { + super(configuration, basePath, fetch); + } + + static create( + configuration?: Configuration | undefined, + basePath?: string, + fetch?: FetchAPI, + ): SubmodelRepositoryApi { + return new SubmodelRepositoryApi(configuration, basePath, fetch); + } + + static createNull(options: { submodelsSavedInTheRepository: Submodel[] | null }): SubmodelRepositoryApiInMemory { + return new SubmodelRepositoryApiInMemory(options); + } + /** * @summary Retrieves the meta data of a submodel * @param {string} submodelId The Asset Administration Shell's unique id @@ -337,7 +359,7 @@ export class SubmodelRepositoryApi extends BaseAPI { * @throws {RequiredError} * @memberof SubmodelRepositoryApi */ - public getSubmodelMetaDataById(submodelId: string, options?: any): Promise { + getSubmodelMetaDataById(submodelId: string, options?: any): Promise { return SubmodelRepositoryApiFp(this.configuration).getSubmodelMetaDataById(submodelId, options)( this.fetch, this.basePath, @@ -352,7 +374,7 @@ export class SubmodelRepositoryApi extends BaseAPI { * @throws {RequiredError} * @memberof SubmodelRepositoryApi */ - public getSubmodelById(submodelId: string, options?: any, basePath?: string): Promise { + getSubmodelById(submodelId: string, options?: any, basePath?: string): Promise { return SubmodelRepositoryApiFp(this.configuration).getSubmodelById(submodelId, options)( this.fetch, basePath ?? this.basePath, @@ -366,11 +388,7 @@ export class SubmodelRepositoryApi extends BaseAPI { * @param {*} [options] Override http request option * @memberof SubmodelRepositoryApi */ - public getAttachmentFromSubmodelElement( - submodelId: string, - submodelElementPath: string, - options?: any, - ): Promise { + getAttachmentFromSubmodelElement(submodelId: string, submodelElementPath: string, options?: any): Promise { return SubmodelRepositoryApiFp(this.configuration).getAttachmentFromSubmodelElement( submodelId, submodelElementPath, diff --git a/src/lib/api/basyx-v3/apiInMemory.ts b/src/lib/api/basyx-v3/apiInMemory.ts index f21d62b..51da9e5 100644 --- a/src/lib/api/basyx-v3/apiInMemory.ts +++ b/src/lib/api/basyx-v3/apiInMemory.ts @@ -1,5 +1,5 @@ -import { IAssetAdministrationShellRepositoryApi } from 'lib/api/basyx-v3/apiInterface'; -import { AssetAdministrationShell, Reference } from '@aas-core-works/aas-core3.0-typescript/dist/types/types'; +import { IAssetAdministrationShellRepositoryApi, ISubmodelRepositoryApi } from 'lib/api/basyx-v3/apiInterface'; +import { AssetAdministrationShell, Reference, Submodel } from '@aas-core-works/aas-core3.0-typescript/dist/types/types'; import { decodeBase64, encodeBase64 } from 'lib/util/Base64Util'; export class AssetAdministrationShellRepositoryApiInMemory implements IAssetAdministrationShellRepositoryApi { @@ -12,7 +12,7 @@ export class AssetAdministrationShellRepositoryApiInMemory implements IAssetAdmi getAssetAdministrationShellById( aasId: string, options?: object | undefined, - basePath?: string | undefined + basePath?: string | undefined, ): Promise { if (!this.shellsSavedInTheRepository) return Promise.reject('no repository configuration'); for (const aas of this.shellsSavedInTheRepository) { @@ -20,10 +20,10 @@ export class AssetAdministrationShellRepositoryApiInMemory implements IAssetAdmi } return Promise.reject( 'no aas found in the default repository for aasId: ' + - aasId + - ', which is :' + - decodeBase64(aasId) + - ' encoded in base64' + aasId + + ', which is :' + + decodeBase64(aasId) + + ' encoded in base64', ); } @@ -34,4 +34,35 @@ export class AssetAdministrationShellRepositoryApiInMemory implements IAssetAdmi getThumbnailFromShell(aasId: string, options?: object | undefined, basePath?: string | undefined): Promise { throw new Error('Method not implemented.'); } -} \ No newline at end of file +} + +export class SubmodelRepositoryApiInMemory implements ISubmodelRepositoryApi { + private submodelsSavedInTheRepository: Submodel[] | null | undefined; + + constructor(options: { submodelsSavedInTheRepository: Submodel[] | null }) { + this.submodelsSavedInTheRepository = options.submodelsSavedInTheRepository; + } + + getSubmodelMetaDataById(submodelId: string, options?: object | undefined): Promise { + throw new Error('Method not implemented.'); + } + + getSubmodelById( + submodelId: string, + options?: object | undefined, + basePath?: string | undefined, + ): Promise { + if (!this.submodelsSavedInTheRepository) return Promise.reject('no repository configuration'); + for (const submodel of this.submodelsSavedInTheRepository) { + if (encodeBase64(submodel.id) === submodelId) return Promise.resolve(submodel); + } + } + + getAttachmentFromSubmodelElement( + submodelId: string, + submodelElementPath: string, + options?: object | undefined, + ): Promise { + throw new Error('Method not implemented.'); + } +} diff --git a/src/lib/api/basyx-v3/apiInterface.ts b/src/lib/api/basyx-v3/apiInterface.ts index ab11b23..0333893 100644 --- a/src/lib/api/basyx-v3/apiInterface.ts +++ b/src/lib/api/basyx-v3/apiInterface.ts @@ -1,4 +1,5 @@ import { AssetAdministrationShell, Reference } from '@aas-core-works/aas-core3.0-typescript/types'; +import { Submodel } from '@aas-core-works/aas-core3.0-typescript/dist/types/types'; export interface IAssetAdministrationShellRepositoryApi { /** @@ -9,7 +10,11 @@ export interface IAssetAdministrationShellRepositoryApi { * @throws {RequiredError} * @memberof AssetAdministrationShellRepositoryApi */ - getAssetAdministrationShellById(aasId: string, options?: object, basePath?: string): Promise; + getAssetAdministrationShellById( + aasId: string, + options?: object, + basePath?: string, + ): Promise; /** * @@ -29,4 +34,34 @@ export interface IAssetAdministrationShellRepositoryApi { * @returns The thumbnail retrieved from the Asset Administration Shell. */ getThumbnailFromShell(aasId: string, options?: object, basePath?: string): Promise; +} + +export interface ISubmodelRepositoryApi { + /** + * @summary Retrieves the meta data of a submodel + * @param {string} submodelId The Asset Administration Shell's unique id + * @param {*} [options] Override http request option + * @throws {RequiredError} + * @memberof SubmodelRepositoryApi + */ + getSubmodelMetaDataById(submodelId: string, options?: object): Promise; + + /** + * @summary Retrieves the submodel + * @param {string} submodelId The Submodels unique id + * @param {*} [options] Override http request option + * @param {string} [basePath] The URL for the current repository endpoint. + * @throws {RequiredError} + * @memberof SubmodelRepositoryApi + */ + getSubmodelById(submodelId: string, options?: object, basePath?: string): Promise; + + /** + * @summary Retrieves the attachment from a submodel element + * @param submodelId The id of the submodel the submodel element is part of + * @param submodelElementPath The path to the submodel element + * @param {*} [options] Override http request option + * @memberof SubmodelRepositoryApi + */ + getAttachmentFromSubmodelElement(submodelId: string, submodelElementPath: string, options?: object): Promise; } \ No newline at end of file diff --git a/src/lib/searchUtilActions/SearchRepositoryHelper.ts b/src/lib/searchUtilActions/SearchRepositoryHelper.ts index 39c5361..538eefa 100644 --- a/src/lib/searchUtilActions/SearchRepositoryHelper.ts +++ b/src/lib/searchUtilActions/SearchRepositoryHelper.ts @@ -65,3 +65,5 @@ export async function getAasThumbnailFromAllRepos( throw new Error('Image not found'); } } + +delete those function after refactor of searchServer \ No newline at end of file diff --git a/src/lib/searchUtilActions/search.spec.ts b/src/lib/searchUtilActions/search.spec.ts index 3f1d541..13bf161 100644 --- a/src/lib/searchUtilActions/search.spec.ts +++ b/src/lib/searchUtilActions/search.spec.ts @@ -86,7 +86,6 @@ describe('Full Aas Search edge cases', () => { it('logs to the console when finding nothing', async () => { const searchString = 'irrelevant assetId'; const log = Log.createNull(); - const tracker = log.getTracker(); const searcher = AasSearcher.createNull({ discoveryEntries: [], registryShellDescriptorEntries: [], @@ -96,13 +95,6 @@ describe('Full Aas Search edge cases', () => { }); await assertThatFunctionThrows(searcher, searchString, 'no aas found in the default repository for aasId'); - - const trackedData: LogEntry[] = tracker.getData() as LogEntry[]; - expect(trackedData).toHaveLength(2); - const messageFound = trackedData.some((track) => - track.message.includes('Could not be found in the registry service'), - ); - if (!messageFound) fail('Failed to log the right error message'); }); it('throws when registry search failed', async () => { diff --git a/src/lib/searchUtilActions/searchServer.ts b/src/lib/searchUtilActions/searchServer.ts index a864aec..40b2fbf 100644 --- a/src/lib/searchUtilActions/searchServer.ts +++ b/src/lib/searchUtilActions/searchServer.ts @@ -9,15 +9,17 @@ import { } from 'lib/types/registryServiceTypes'; import { RegistryServiceApi } from 'lib/api/registry-service-api/registryServiceApi'; import { DiscoveryServiceApi } from 'lib/api/discovery-service-api/discoveryServiceApi'; -import { AssetAdministrationShell } from '@aas-core-works/aas-core3.0-typescript/types'; -import { AssetAdministrationShellRepositoryApi } from 'lib/api/basyx-v3/api'; +import { AssetAdministrationShell, Submodel } from '@aas-core-works/aas-core3.0-typescript/types'; +import { AssetAdministrationShellRepositoryApi, SubmodelRepositoryApi } from 'lib/api/basyx-v3/api'; import { encodeBase64 } from 'lib/util/Base64Util'; import { mnestixFetch } from 'lib/api/infrastructure'; import { AasSearchResult } from 'lib/searchUtilActions/searchClient'; import { IDiscoveryServiceApi } from 'lib/api/discovery-service-api/discoveryServiceApiInterface'; import { IRegistryServiceApi } from 'lib/api/registry-service-api/registryServiceApiInterface'; -import { IAssetAdministrationShellRepositoryApi } from 'lib/api/basyx-v3/apiInterface'; +import { IAssetAdministrationShellRepositoryApi, ISubmodelRepositoryApi } from 'lib/api/basyx-v3/apiInterface'; import { Log } from 'lib/util/Log'; +import { getConnectionDataByTypeAction } from 'app/[locale]/settings/_components/mnestix-connections/MnestixConnectionServerActions'; +import * as process from 'node:process'; export interface RegistrySearchResult { registryAas: AssetAdministrationShell; @@ -44,7 +46,8 @@ interface NullableSearchSetupParameters { registryShellDescriptorEntries?: AssetAdministrationShellDescriptor[] | null; shellsByRegistryEndpoint?: { path: string; aas: AssetAdministrationShell }[] | null; shellsSavedInTheRepository?: AssetAdministrationShell[] | null; - log ?: Log | null; + submodelsSavedInTheRepository?: Submodel[] | null; + log?: Log | null; } export class AasSearcher { @@ -52,6 +55,7 @@ export class AasSearcher { protected readonly discoveryServiceClient: IDiscoveryServiceApi, protected readonly registryService: IRegistryServiceApi, protected readonly repositoryClient: IAssetAdministrationShellRepositoryApi, + protected readonly submodelRepositoryClient: ISubmodelRepositoryApi, protected readonly fetch: (input: RequestInfo | URL, init?: RequestInit | undefined) => Promise, protected readonly log: Log, ) {} @@ -61,10 +65,21 @@ export class AasSearcher { basePath: process.env.AAS_REPO_API_URL, fetch: mnestixFetch(), }); + const submodelRepositoryClient = SubmodelRepositoryApi.create({ + basePath: process.env.SUBMODEL_REPO_API_URL, + fetch: mnestixFetch(), + }); const registryServiceClient = RegistryServiceApi.create(process.env.REGISTRY_API_URL); const discoveryServiceClient = DiscoveryServiceApi.create(process.env.DISCOVERY_API_URL); const log = Log.create(); - return new AasSearcher(discoveryServiceClient, registryServiceClient, repositoryClient, fetch, log); + return new AasSearcher( + discoveryServiceClient, + registryServiceClient, + repositoryClient, + submodelRepositoryClient, + fetch, + log, + ); } static createNull({ @@ -72,6 +87,7 @@ export class AasSearcher { registryShellDescriptorEntries = [], shellsByRegistryEndpoint = [], shellsSavedInTheRepository = [], + submodelsSavedInTheRepository = [], log = null, }: NullableSearchSetupParameters = {}): AasSearcher { const stubbedFetch = async (input: RequestInfo | URL): Promise => { @@ -85,8 +101,9 @@ export class AasSearcher { DiscoveryServiceApi.createNull({ discoveryEntries: discoveryEntries }), RegistryServiceApi.createNull({ registryShellDescriptorEntries }), AssetAdministrationShellRepositoryApi.createNull({ shellsSavedInTheRepository }), + SubmodelRepositoryApi.createNull({ submodelsSavedInTheRepository }), stubbedFetch, - log ?? Log.createNull() + log ?? Log.createNull(), ); } @@ -199,6 +216,60 @@ export class AasSearcher { return null; } } + + async getAasFromAllRepos(aasId: string): Promise { + const basePathUrls = await getConnectionDataByTypeAction({ id: '0', typeName: 'AAS_REPOSITORY' }); + + const promises = basePathUrls.map( + (url) => + this.repositoryClient + .getAssetAdministrationShellById(aasId, undefined, url) + .then((aas) => ({ aas: aas, location: url })), // add the URL to the resolved value + ); + + const results = await Promise.allSettled(promises); + const fulfilledResults = results.filter((result) => result.status === 'fulfilled'); + + if (fulfilledResults.length > 0) { + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-expect-error + return fulfilledResults.map((result) => (result as unknown).value); + } else { + throw new Error('AAS not found'); + } + } + + async getSubmodelFromAllRepos(submodelId: string) { + const basePathUrls = await getConnectionDataByTypeAction({ id: '0', typeName: 'AAS_REPOSITORY' }); + const promises = basePathUrls.map((url) => + this.submodelRepositoryClient.getSubmodelById(submodelId, undefined, url), + ); + + try { + return await Promise.any(promises); + } catch (error) { + throw new Error('Submodel not found'); + } + } + + async getAasThumbnailFromAllRepos(aasId: string) { + const basePathUrls = await getConnectionDataByTypeAction({ id: '0', typeName: 'AAS_REPOSITORY' }); + + const promises = basePathUrls.map((url) => + this.repositoryClient.getThumbnailFromShell(aasId, undefined, url).then((image) => { + if (image.size === 0) { + throw new Error('Empty image'); + } + return image; + }), + ); + + try { + return await Promise.any(promises); + } catch { + throw new Error('Image not found'); + } + } } export async function getSubmodelFromSubmodelDescriptor(url: string) { @@ -212,3 +283,8 @@ function getAasRepositoryOrigin(url: string) { const urlObject = new URL(url); return urlObject.origin; } + +export type RepoSearchResult = { + aas: AssetAdministrationShell; + location: string; +}; From 049d6df80b5c1b71ee37b00f5734f7cc0599b98b Mon Sep 17 00:00:00 2001 From: "XITASO\\pawel.baran" Date: Wed, 11 Sep 2024 15:59:51 +0200 Subject: [PATCH 27/55] MNES-468: refactored multiple data source actions --- .../[locale]/_components/DashboardInput.tsx | 2 +- .../compare/_components/CompareView.tsx | 2 +- .../[locale]/viewer/[base64AasId]/page.tsx | 8 +- .../viewer/_components/AASOverviewCard.tsx | 4 +- .../_components/SubmodelsOverviewCard.tsx | 18 +- .../_components/DiscoveryListView.tsx | 16 +- src/components/contexts/CompareAasContext.tsx | 5 +- src/lib/api/basyx-v3/apiInMemory.ts | 3 +- .../SearchRepositoryHelper.ts | 69 - .../multipleDataSourceActions.ts | 131 ++ .../searchUtilActions/search.spec.ts | 5 +- .../searchUtilActions/searchClient.ts | 8 +- .../searchUtilActions/searchServer.ts | 57 +- yarn.lock | 1952 ++++++++++++++++- 14 files changed, 2070 insertions(+), 210 deletions(-) delete mode 100644 src/lib/searchUtilActions/SearchRepositoryHelper.ts create mode 100644 src/lib/services/multipleDataSourceActions/multipleDataSourceActions.ts rename src/lib/{ => services}/searchUtilActions/search.spec.ts (98%) rename src/lib/{ => services}/searchUtilActions/searchClient.ts (68%) rename src/lib/{ => services}/searchUtilActions/searchServer.ts (81%) diff --git a/src/app/[locale]/_components/DashboardInput.tsx b/src/app/[locale]/_components/DashboardInput.tsx index 2a6ce49..614e530 100644 --- a/src/app/[locale]/_components/DashboardInput.tsx +++ b/src/app/[locale]/_components/DashboardInput.tsx @@ -4,7 +4,7 @@ import { messages } from 'lib/i18n/localization'; import { FormattedMessage } from 'react-intl'; import { ManualAasInput } from 'app/[locale]/_components/ManualAasInput'; import { QrScanner } from 'app/[locale]/_components/QrScanner'; -import { handleSearchForAas } from 'lib/searchUtilActions/searchClient'; +import { handleSearchForAas } from 'lib/services/searchUtilActions/searchClient'; import { useRouter } from 'next/navigation'; import { useAasState, useRegistryAasState } from 'components/contexts/CurrentAasContext'; import { LocalizedError } from 'lib/util/LocalizedError'; diff --git a/src/app/[locale]/compare/_components/CompareView.tsx b/src/app/[locale]/compare/_components/CompareView.tsx index 917f6a4..1e6c367 100644 --- a/src/app/[locale]/compare/_components/CompareView.tsx +++ b/src/app/[locale]/compare/_components/CompareView.tsx @@ -11,7 +11,7 @@ import { useEffect, useState } from 'react'; import { useNotificationSpawner } from 'lib/hooks/UseNotificationSpawner'; import { useSearchParams } from 'next/navigation'; import { showError } from 'lib/util/ErrorHandlerUtil'; -import { AasSearchResult, handleSearchForAas } from 'lib/searchUtilActions/searchClient'; +import { AasSearchResult, handleSearchForAas } from 'lib/services/searchUtilActions/searchClient'; import { LocalizedError } from 'lib/util/LocalizedError'; import { useApis } from 'components/azureAuthentication/ApiProvider'; diff --git a/src/app/[locale]/viewer/[base64AasId]/page.tsx b/src/app/[locale]/viewer/[base64AasId]/page.tsx index ad57360..0858640 100644 --- a/src/app/[locale]/viewer/[base64AasId]/page.tsx +++ b/src/app/[locale]/viewer/[base64AasId]/page.tsx @@ -17,9 +17,9 @@ import { SubmodelsOverviewCard } from '../_components/SubmodelsOverviewCard'; import { AASOverviewCard } from 'app/[locale]/viewer/_components/AASOverviewCard'; import { useApis } from 'components/azureAuthentication/ApiProvider'; import { useEnv } from 'app/env/provider'; -import { getAasFromAllRepos } from 'lib/searchUtilActions/SearchRepositoryHelper'; import { useAsyncEffect } from 'lib/hooks/UseAsyncEffect'; -import { performRegistryAasSearch } from 'lib/searchUtilActions/searchServer'; +import { performRegistryAasSearch } from 'lib/services/searchUtilActions/searchServer'; +import { performSearchAasFromAllRepositories } from 'lib/services/multipleDataSourceActions/multipleDataSourceActions'; export default function Page() { const navigate = useRouter(); @@ -73,11 +73,11 @@ export default function Page() { repoUrl, ); } catch (e) { - const repoSearchResults = await getAasFromAllRepos(base64AasId, repositoryClient); + const repoSearchResults = await performSearchAasFromAllRepositories(base64AasId); if (repoSearchResults.length > 1) { navigate.push(`/viewer/discovery?aasId=${encodeURI(decodeBase64(base64AasId))}`); } - fetchedAas = repoSearchResults[0].aas + fetchedAas = repoSearchResults[0].aas; } setAas(fetchedAas); diff --git a/src/app/[locale]/viewer/_components/AASOverviewCard.tsx b/src/app/[locale]/viewer/_components/AASOverviewCard.tsx index 93c0850..a392123 100644 --- a/src/app/[locale]/viewer/_components/AASOverviewCard.tsx +++ b/src/app/[locale]/viewer/_components/AASOverviewCard.tsx @@ -25,7 +25,7 @@ import { useRouter } from 'next/navigation'; import { useApis } from 'components/azureAuthentication/ApiProvider'; import { useRegistryAasState } from 'components/contexts/CurrentAasContext'; import { AssetAdministrationShellRepositoryApi } from 'lib/api/basyx-v3/api'; -import { getAasThumbnailFromAllRepos } from 'lib/searchUtilActions/SearchRepositoryHelper'; +import { performgetAasThumbnailFromAllRepos } from 'lib/services/multipleDataSourceActions/multipleDataSourceActions'; type AASOverviewCardProps = { readonly aas: AssetAdministrationShell | null; @@ -87,7 +87,7 @@ export function AASOverviewCard(props: AASOverviewCardProps) { try { image = await repositoryClient.getThumbnailFromShell(props.aas.id); } catch (e) { - image = await getAasThumbnailFromAllRepos(props.aas.id, repositoryClient); + image = await performgetAasThumbnailFromAllRepos(props.aas.id); } setProductImageUrl(URL.createObjectURL(image)); diff --git a/src/app/[locale]/viewer/_components/SubmodelsOverviewCard.tsx b/src/app/[locale]/viewer/_components/SubmodelsOverviewCard.tsx index 892996c..1089b3b 100644 --- a/src/app/[locale]/viewer/_components/SubmodelsOverviewCard.tsx +++ b/src/app/[locale]/viewer/_components/SubmodelsOverviewCard.tsx @@ -11,11 +11,11 @@ import { TabSelectorItem, VerticalTabSelector } from 'components/basics/Vertical import { MobileModal } from 'components/basics/MobileModal'; import { useApis } from 'components/azureAuthentication/ApiProvider'; import { useRegistryAasState } from 'components/contexts/CurrentAasContext'; -import { getSubmodelFromSubmodelDescriptor } from 'lib/searchUtilActions/searchServer'; +import { getSubmodelFromSubmodelDescriptor } from 'lib/services/searchUtilActions/searchServer'; import { useEnv } from 'app/env/provider'; -import { getSubmodelFromAllRepos } from 'lib/searchUtilActions/SearchRepositoryHelper'; import { useNotificationSpawner } from 'lib/hooks/UseNotificationSpawner'; import { showError } from 'lib/util/ErrorHandlerUtil'; +import { performSearchSubmodelFromAllRepos } from 'lib/services/multipleDataSourceActions/multipleDataSourceActions'; export type SubmodelsOverviewCardProps = { readonly smReferences?: Reference[]; readonly isLoading?: boolean }; @@ -43,7 +43,7 @@ export function SubmodelsOverviewCard(props: SubmodelsOverviewCardProps) { try { fetchedSubmodelData = await submodelClient.getSubmodelById(id); } catch (e) { - fetchedSubmodelData = await getSubmodelFromAllRepos(id, submodelClient); + fetchedSubmodelData = await performSearchSubmodelFromAllRepos(id); } return fetchedSubmodelData; } catch (e) { @@ -66,7 +66,7 @@ export function SubmodelsOverviewCard(props: SubmodelsOverviewCardProps) { if (registryAasData && registryAasData.submodelDescriptors) { // Fetch submodel from provided endpoint - submodelsPromise = Promise.all( + submodelsPromise = Promise.all( registryAasData.submodelDescriptors.map(async (submodelDescriptor): Promise => { const endpoint = submodelDescriptor?.endpoints[0].protocolInformation.href; @@ -79,7 +79,7 @@ export function SubmodelsOverviewCard(props: SubmodelsOverviewCardProps) { }; } return null; - }) + }), ); } else { // Search in default registry @@ -97,7 +97,7 @@ export function SubmodelsOverviewCard(props: SubmodelsOverviewCardProps) { tabSelectorItem = { id: submodelDescriptor.id, label: submodelDescriptor.idShort ?? '', - submodelData: submodelData + submodelData: submodelData, }; } } catch (e) { @@ -120,12 +120,12 @@ export function SubmodelsOverviewCard(props: SubmodelsOverviewCardProps) { } return tabSelectorItem; - }) + }), ); } - const submodels = await submodelsPromise as TabSelectorItem[]; - setSubmodelSelectorItems(submodels.filter(item => !!item)); + const submodels = (await submodelsPromise) as TabSelectorItem[]; + setSubmodelSelectorItems(submodels.filter((item) => !!item)); } useAsyncEffect(async () => { diff --git a/src/app/[locale]/viewer/discovery/_components/DiscoveryListView.tsx b/src/app/[locale]/viewer/discovery/_components/DiscoveryListView.tsx index 48ad445..9852d3c 100644 --- a/src/app/[locale]/viewer/discovery/_components/DiscoveryListView.tsx +++ b/src/app/[locale]/viewer/discovery/_components/DiscoveryListView.tsx @@ -12,11 +12,13 @@ import { IDiscoveryListEntry } from 'lib/types/DiscoveryListEntry'; import AssetNotFound from 'components/basics/AssetNotFound'; import { isAasAvailableInRepo } from 'lib/util/checkAasAvailabilityUtil'; import { useEnv } from 'app/env/provider'; -import { getAasFromAllRepos, RepoSearchResult } from 'lib/searchUtilActions/SearchRepositoryHelper'; import { encodeBase64 } from 'lib/util/Base64Util'; -import { useApis } from 'components/azureAuthentication/ApiProvider'; import ListHeader from 'components/basics/ListHeader'; -import { performDiscoveryAasSearch, performRegistryAasSearch } from 'lib/searchUtilActions/searchServer'; +import { performDiscoveryAasSearch, performRegistryAasSearch } from 'lib/services/searchUtilActions/searchServer'; +import { + performSearchAasFromAllRepositories, + RepoSearchResult, +} from 'lib/services/multipleDataSourceActions/multipleDataSourceActions'; export const DiscoveryListView = () => { const [isLoadingList, setIsLoadingList] = useState(false); @@ -28,7 +30,6 @@ export const DiscoveryListView = () => { const assetId = encodedAssetId ? decodeURI(encodedAssetId) : undefined; const encodedAasId = searchParams.get('aasId'); const aasId = encodedAasId ? decodeURI(encodedAasId) : undefined; - const { repositoryClient } = useApis(); const env = useEnv(); useAsyncEffect(async () => { @@ -38,6 +39,11 @@ export const DiscoveryListView = () => { if (assetId) { const aasIds = await performDiscoveryAasSearch(assetId); + if (!aasIds || aasIds.length === 0) { + setIsLoadingList(false); + return; + } + await Promise.all( aasIds.map(async (aasId) => { try { @@ -66,7 +72,7 @@ export const DiscoveryListView = () => { } else if (aasId) { let searchResults: RepoSearchResult[] = []; try { - searchResults = await getAasFromAllRepos(encodeBase64(aasId), repositoryClient); + searchResults = await performSearchAasFromAllRepositories(encodeBase64(aasId)); } catch (e) { setIsError(true); } diff --git a/src/components/contexts/CompareAasContext.tsx b/src/components/contexts/CompareAasContext.tsx index 623132f..b98c77c 100644 --- a/src/components/contexts/CompareAasContext.tsx +++ b/src/components/contexts/CompareAasContext.tsx @@ -4,7 +4,10 @@ import { SubmodelCompareData } from 'lib/types/SubmodelCompareData'; import { generateSubmodelCompareData, isCompareData, isCompareDataRecord } from 'lib/util/CompareAasUtil'; import { encodeBase64 } from 'lib/util/Base64Util'; import { useApis } from 'components/azureAuthentication/ApiProvider'; -import { getSubmodelFromSubmodelDescriptor, performRegistryAasSearch } from 'lib/searchUtilActions/searchServer'; +import { + getSubmodelFromSubmodelDescriptor, + performRegistryAasSearch, +} from 'lib/services/searchUtilActions/searchServer'; import { SubmodelDescriptor } from 'lib/types/registryServiceTypes'; type CompareAasContextType = { diff --git a/src/lib/api/basyx-v3/apiInMemory.ts b/src/lib/api/basyx-v3/apiInMemory.ts index 51da9e5..b48778d 100644 --- a/src/lib/api/basyx-v3/apiInMemory.ts +++ b/src/lib/api/basyx-v3/apiInMemory.ts @@ -42,7 +42,7 @@ export class SubmodelRepositoryApiInMemory implements ISubmodelRepositoryApi { constructor(options: { submodelsSavedInTheRepository: Submodel[] | null }) { this.submodelsSavedInTheRepository = options.submodelsSavedInTheRepository; } - + getSubmodelMetaDataById(submodelId: string, options?: object | undefined): Promise { throw new Error('Method not implemented.'); } @@ -56,6 +56,7 @@ export class SubmodelRepositoryApiInMemory implements ISubmodelRepositoryApi { for (const submodel of this.submodelsSavedInTheRepository) { if (encodeBase64(submodel.id) === submodelId) return Promise.resolve(submodel); } + return Promise.reject('no submodel found in the default repository for submodelId: ' + submodelId); } getAttachmentFromSubmodelElement( diff --git a/src/lib/searchUtilActions/SearchRepositoryHelper.ts b/src/lib/searchUtilActions/SearchRepositoryHelper.ts deleted file mode 100644 index 538eefa..0000000 --- a/src/lib/searchUtilActions/SearchRepositoryHelper.ts +++ /dev/null @@ -1,69 +0,0 @@ -import { getConnectionDataByTypeAction } from 'app/[locale]/settings/_components/mnestix-connections/MnestixConnectionServerActions'; -import { AssetAdministrationShellRepositoryApi, SubmodelRepositoryApi } from 'lib/api/basyx-v3/api'; -import { AssetAdministrationShell } from '@aas-core-works/aas-core3.0-typescript/types'; - -export type RepoSearchResult = { - aas: AssetAdministrationShell; - location: string; -}; - -export async function getAasFromAllRepos( - aasId: string, - repositoryClient: AssetAdministrationShellRepositoryApi, -): Promise { - const basePathUrls = await getConnectionDataByTypeAction({ id: '0', typeName: 'AAS_REPOSITORY' }); - - const promises = basePathUrls.map( - (url) => - repositoryClient - .getAssetAdministrationShellById(aasId, undefined, url) - .then((aas) => ({ aas: aas, location: url })), // add the URL to the resolved value - ); - - const results = await Promise.allSettled(promises); - const fulfilledResults = results.filter(result => result.status === 'fulfilled'); - - if (fulfilledResults.length > 0) { - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-expect-error - return fulfilledResults.map(result => (result as unknown).value); - } else { - throw new Error('AAS not found'); - } -} - -export async function getSubmodelFromAllRepos(submodelId: string, repositoryClient: SubmodelRepositoryApi) { - const basePathUrls = await getConnectionDataByTypeAction({ id: '0', typeName: 'AAS_REPOSITORY' }); - - const promises = basePathUrls.map((url) => repositoryClient.getSubmodelById(submodelId, undefined, url)); - - try { - return await Promise.any(promises); - } catch (error) { - throw new Error('Submodel not found'); - } -} - -export async function getAasThumbnailFromAllRepos( - aasId: string, - repositoryClient: AssetAdministrationShellRepositoryApi, -) { - const basePathUrls = await getConnectionDataByTypeAction({ id: '0', typeName: 'AAS_REPOSITORY' }); - - const promises = basePathUrls.map((url) => - repositoryClient.getThumbnailFromShell(aasId, undefined, url).then((image) => { - if (image.size === 0) { - throw new Error('Empty image'); - } - return image; - }), - ); - - try { - return await Promise.any(promises); - } catch { - throw new Error('Image not found'); - } -} - -delete those function after refactor of searchServer \ No newline at end of file diff --git a/src/lib/services/multipleDataSourceActions/multipleDataSourceActions.ts b/src/lib/services/multipleDataSourceActions/multipleDataSourceActions.ts new file mode 100644 index 0000000..30ac295 --- /dev/null +++ b/src/lib/services/multipleDataSourceActions/multipleDataSourceActions.ts @@ -0,0 +1,131 @@ +import { IAssetAdministrationShellRepositoryApi, ISubmodelRepositoryApi } from 'lib/api/basyx-v3/apiInterface'; +import { Log } from 'lib/util/Log'; +import { AssetAdministrationShellRepositoryApi, SubmodelRepositoryApi } from 'lib/api/basyx-v3/api'; +import process from 'node:process'; +import { mnestixFetch } from 'lib/api/infrastructure'; +import { getConnectionDataByTypeAction } from 'app/[locale]/settings/_components/mnestix-connections/MnestixConnectionServerActions'; +import { AssetAdministrationShell, Submodel } from '@aas-core-works/aas-core3.0-typescript/dist/types/types'; + +export type RepoSearchResult = { + aas: AssetAdministrationShell; + location: string; +}; + +interface NullableSearchSetupParameters { + shellsByRegistryEndpoint?: { path: string; aas: AssetAdministrationShell }[] | null; + shellsSavedInTheRepository?: AssetAdministrationShell[] | null; + submodelsSavedInTheRepository?: Submodel[] | null; + log?: Log | null; +} + +export async function performSearchAasFromAllRepositories(searchInput: string): Promise { + const searcher = MultipleDataSourceActions.create(); + return searcher.getAasFromAllRepos(searchInput); +} + +export async function performSearchSubmodelFromAllRepos(searchInput: string): Promise { + const searcher = MultipleDataSourceActions.create(); + return searcher.getSubmodelFromAllRepos(searchInput); +} + +export async function performgetAasThumbnailFromAllRepos(searchInput: string): Promise { + const searcher = MultipleDataSourceActions.create(); + return searcher.getAasThumbnailFromAllRepos(searchInput); +} + +export class MultipleDataSourceActions { + private constructor( + protected readonly repositoryClient: IAssetAdministrationShellRepositoryApi, + protected readonly submodelRepositoryClient: ISubmodelRepositoryApi, + protected readonly fetch: (input: RequestInfo | URL, init?: RequestInit | undefined) => Promise, + protected readonly log: Log, + ) {} + + static create(): MultipleDataSourceActions { + const repositoryClient = AssetAdministrationShellRepositoryApi.create({ + basePath: process.env.AAS_REPO_API_URL, + fetch: mnestixFetch(), + }); + const submodelRepositoryClient = SubmodelRepositoryApi.create({ + basePath: process.env.SUBMODEL_REPO_API_URL, + fetch: mnestixFetch(), + }); + const log = Log.create(); + return new MultipleDataSourceActions(repositoryClient, submodelRepositoryClient, fetch, log); + } + + static createNull({ + shellsByRegistryEndpoint = [], + shellsSavedInTheRepository = [], + submodelsSavedInTheRepository = [], + log = null, + }: NullableSearchSetupParameters = {}): MultipleDataSourceActions { + const stubbedFetch = async (input: RequestInfo | URL): Promise => { + if (!shellsByRegistryEndpoint) return Promise.reject(new Error('no registry configuration')); + for (const aasEntry of shellsByRegistryEndpoint) { + if (aasEntry.path === input) return new Response(JSON.stringify(aasEntry.aas)); + } + return Promise.reject(new Error('no aas for on href:' + input)); + }; + return new MultipleDataSourceActions( + AssetAdministrationShellRepositoryApi.createNull({ shellsSavedInTheRepository }), + SubmodelRepositoryApi.createNull({ submodelsSavedInTheRepository }), + stubbedFetch, + log ?? Log.createNull(), + ); + } + + async getAasFromAllRepos(aasId: string): Promise { + const basePathUrls = await getConnectionDataByTypeAction({ id: '0', typeName: 'AAS_REPOSITORY' }); + + const promises = basePathUrls.map( + (url) => + this.repositoryClient + .getAssetAdministrationShellById(aasId, undefined, url) + .then((aas) => ({ aas: aas, location: url })), // add the URL to the resolved value + ); + + const results = await Promise.allSettled(promises); + const fulfilledResults = results.filter((result) => result.status === 'fulfilled'); + + if (fulfilledResults.length > 0) { + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-expect-error + return fulfilledResults.map((result) => (result as unknown).value); + } else { + throw new Error('AAS not found'); + } + } + + async getSubmodelFromAllRepos(submodelId: string) { + const basePathUrls = await getConnectionDataByTypeAction({ id: '0', typeName: 'AAS_REPOSITORY' }); + const promises = basePathUrls.map((url) => + this.submodelRepositoryClient.getSubmodelById(submodelId, undefined, url), + ); + + try { + return await Promise.any(promises); + } catch (error) { + throw new Error('Submodel not found'); + } + } + + async getAasThumbnailFromAllRepos(aasId: string) { + const basePathUrls = await getConnectionDataByTypeAction({ id: '0', typeName: 'AAS_REPOSITORY' }); + + const promises = basePathUrls.map((url) => + this.repositoryClient.getThumbnailFromShell(aasId, undefined, url).then((image) => { + if (image.size === 0) { + throw new Error('Empty image'); + } + return image; + }), + ); + + try { + return await Promise.any(promises); + } catch { + throw new Error('Image not found'); + } + } +} diff --git a/src/lib/searchUtilActions/search.spec.ts b/src/lib/services/searchUtilActions/search.spec.ts similarity index 98% rename from src/lib/searchUtilActions/search.spec.ts rename to src/lib/services/searchUtilActions/search.spec.ts index 13bf161..6f9ba4b 100644 --- a/src/lib/searchUtilActions/search.spec.ts +++ b/src/lib/services/searchUtilActions/search.spec.ts @@ -1,10 +1,10 @@ import { expect } from '@jest/globals'; -import { AasSearcher } from 'lib/searchUtilActions/searchServer'; +import { AasSearcher } from 'lib/services/searchUtilActions/searchServer'; import { AssetAdministrationShellDescriptor } from 'lib/types/registryServiceTypes'; import { AssetAdministrationShell } from '@aas-core-works/aas-core3.0-typescript/types'; import { instance, mock } from 'ts-mockito'; import { encodeBase64 } from 'lib/util/Base64Util'; -import { Log, LogEntry } from 'lib/util/Log'; +import { Log } from 'lib/util/Log'; interface DummyAasParameters { id?: string; @@ -12,7 +12,6 @@ interface DummyAasParameters { const AAS_ENDPOINT = 'https://www.origin.com/route/for/aas/'; - describe('Full Aas Search happy paths', () => { it('navigates to the discovery list when more than one aasId for a given assetId', async () => { const searchString = 'irrelevant assetId'; diff --git a/src/lib/searchUtilActions/searchClient.ts b/src/lib/services/searchUtilActions/searchClient.ts similarity index 68% rename from src/lib/searchUtilActions/searchClient.ts rename to src/lib/services/searchUtilActions/searchClient.ts index 848a9af..f39b276 100644 --- a/src/lib/searchUtilActions/searchClient.ts +++ b/src/lib/services/searchUtilActions/searchClient.ts @@ -2,7 +2,7 @@ import { SubmodelDescriptor } from 'lib/types/registryServiceTypes'; import { AssetAdministrationShell } from '@aas-core-works/aas-core3.0-typescript/types'; -import { performFullAasSearch } from 'lib/searchUtilActions/searchServer'; +import { performFullAasSearch } from 'lib/services/searchUtilActions/searchServer'; export type AasData = { submodelDescriptors: SubmodelDescriptor[] | undefined; @@ -15,8 +15,6 @@ export type AasSearchResult = { aasData: AasData | null; }; -export async function handleSearchForAas( - val: string, -): Promise { - return await performFullAasSearch(val) +export async function handleSearchForAas(val: string): Promise { + return await performFullAasSearch(val); } diff --git a/src/lib/searchUtilActions/searchServer.ts b/src/lib/services/searchUtilActions/searchServer.ts similarity index 81% rename from src/lib/searchUtilActions/searchServer.ts rename to src/lib/services/searchUtilActions/searchServer.ts index 40b2fbf..6b6ea1c 100644 --- a/src/lib/searchUtilActions/searchServer.ts +++ b/src/lib/services/searchUtilActions/searchServer.ts @@ -13,12 +13,11 @@ import { AssetAdministrationShell, Submodel } from '@aas-core-works/aas-core3.0- import { AssetAdministrationShellRepositoryApi, SubmodelRepositoryApi } from 'lib/api/basyx-v3/api'; import { encodeBase64 } from 'lib/util/Base64Util'; import { mnestixFetch } from 'lib/api/infrastructure'; -import { AasSearchResult } from 'lib/searchUtilActions/searchClient'; +import { AasSearchResult } from 'lib/services/searchUtilActions/searchClient'; import { IDiscoveryServiceApi } from 'lib/api/discovery-service-api/discoveryServiceApiInterface'; import { IRegistryServiceApi } from 'lib/api/registry-service-api/registryServiceApiInterface'; import { IAssetAdministrationShellRepositoryApi, ISubmodelRepositoryApi } from 'lib/api/basyx-v3/apiInterface'; import { Log } from 'lib/util/Log'; -import { getConnectionDataByTypeAction } from 'app/[locale]/settings/_components/mnestix-connections/MnestixConnectionServerActions'; import * as process from 'node:process'; export interface RegistrySearchResult { @@ -216,60 +215,6 @@ export class AasSearcher { return null; } } - - async getAasFromAllRepos(aasId: string): Promise { - const basePathUrls = await getConnectionDataByTypeAction({ id: '0', typeName: 'AAS_REPOSITORY' }); - - const promises = basePathUrls.map( - (url) => - this.repositoryClient - .getAssetAdministrationShellById(aasId, undefined, url) - .then((aas) => ({ aas: aas, location: url })), // add the URL to the resolved value - ); - - const results = await Promise.allSettled(promises); - const fulfilledResults = results.filter((result) => result.status === 'fulfilled'); - - if (fulfilledResults.length > 0) { - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-expect-error - return fulfilledResults.map((result) => (result as unknown).value); - } else { - throw new Error('AAS not found'); - } - } - - async getSubmodelFromAllRepos(submodelId: string) { - const basePathUrls = await getConnectionDataByTypeAction({ id: '0', typeName: 'AAS_REPOSITORY' }); - const promises = basePathUrls.map((url) => - this.submodelRepositoryClient.getSubmodelById(submodelId, undefined, url), - ); - - try { - return await Promise.any(promises); - } catch (error) { - throw new Error('Submodel not found'); - } - } - - async getAasThumbnailFromAllRepos(aasId: string) { - const basePathUrls = await getConnectionDataByTypeAction({ id: '0', typeName: 'AAS_REPOSITORY' }); - - const promises = basePathUrls.map((url) => - this.repositoryClient.getThumbnailFromShell(aasId, undefined, url).then((image) => { - if (image.size === 0) { - throw new Error('Empty image'); - } - return image; - }), - ); - - try { - return await Promise.any(promises); - } catch { - throw new Error('Image not found'); - } - } } export async function getSubmodelFromSubmodelDescriptor(url: string) { diff --git a/yarn.lock b/yarn.lock index 20292a5..a8e4bc7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7,6 +7,11 @@ resolved "https://registry.yarnpkg.com/@aas-core-works/aas-core3.0-typescript/-/aas-core3.0-typescript-1.0.3.tgz#abc18f59c1eca5d87226a190aa7d16c771d600b2" integrity sha512-ZS2Fijmy3SzVYngA/p5Uiv2hBPZRxm89G1Y3TPzs7uRi/cyf+A0LZppsNvcybL87EdjZscFoZLsCyGrg1uiDVA== +"@adobe/css-tools@^4.4.0": + version "4.4.0" + resolved "https://registry.yarnpkg.com/@adobe/css-tools/-/css-tools-4.4.0.tgz#728c484f4e10df03d5a3acd0d8adcbbebff8ad63" + integrity sha512-Ff9+ksdQQB3rMncgqDK78uLznstjyfIf2Arnh22pW8kBpLs6rpKDwgnZT46hin5Hl1WzazzK64DOrhSwYpS7bQ== + "@ampproject/remapping@^2.2.0": version "2.3.0" resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.3.0.tgz#ed441b6fa600072520ce18b43d2c8cc8caecc7f4" @@ -40,11 +45,45 @@ "@babel/highlight" "^7.24.2" picocolors "^1.0.0" +"@babel/code-frame@^7.10.4", "@babel/code-frame@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.24.7.tgz#882fd9e09e8ee324e496bd040401c6f046ef4465" + integrity sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA== + dependencies: + "@babel/highlight" "^7.24.7" + picocolors "^1.0.0" + "@babel/compat-data@^7.22.6", "@babel/compat-data@^7.23.5", "@babel/compat-data@^7.24.4": version "7.24.4" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.24.4.tgz#6f102372e9094f25d908ca0d34fc74c74606059a" integrity sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ== +"@babel/compat-data@^7.25.2": + version "7.25.4" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.25.4.tgz#7d2a80ce229890edcf4cc259d4d696cb4dae2fcb" + integrity sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ== + +"@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.23.9": + version "7.25.2" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.25.2.tgz#ed8eec275118d7613e77a352894cd12ded8eba77" + integrity sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.24.7" + "@babel/generator" "^7.25.0" + "@babel/helper-compilation-targets" "^7.25.2" + "@babel/helper-module-transforms" "^7.25.2" + "@babel/helpers" "^7.25.0" + "@babel/parser" "^7.25.0" + "@babel/template" "^7.25.0" + "@babel/traverse" "^7.25.2" + "@babel/types" "^7.25.2" + convert-source-map "^2.0.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.3" + semver "^6.3.1" + "@babel/core@^7.21.3": version "7.24.5" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.24.5.tgz#15ab5b98e101972d171aeef92ac70d8d6718f06a" @@ -76,6 +115,16 @@ "@jridgewell/trace-mapping" "^0.3.25" jsesc "^2.5.1" +"@babel/generator@^7.25.0", "@babel/generator@^7.25.6", "@babel/generator@^7.7.2": + version "7.25.6" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.25.6.tgz#0df1ad8cb32fe4d2b01d8bf437f153d19342a87c" + integrity sha512-VPC82gr1seXOpkjAAKoLhP50vx4vGNlF4msF64dSFq1P8RfB+QAuJWGHPXXPc8QyfVWwwB/TNNU4+ayZmHNbZw== + dependencies: + "@babel/types" "^7.25.6" + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.25" + jsesc "^2.5.1" + "@babel/helper-annotate-as-pure@^7.18.6", "@babel/helper-annotate-as-pure@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz#e7f06737b197d580a01edf75d97e2c8be99d3882" @@ -101,6 +150,17 @@ lru-cache "^5.1.1" semver "^6.3.1" +"@babel/helper-compilation-targets@^7.25.2": + version "7.25.2" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.2.tgz#e1d9410a90974a3a5a66e84ff55ef62e3c02d06c" + integrity sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw== + dependencies: + "@babel/compat-data" "^7.25.2" + "@babel/helper-validator-option" "^7.24.8" + browserslist "^4.23.1" + lru-cache "^5.1.1" + semver "^6.3.1" + "@babel/helper-create-class-features-plugin@^7.21.0", "@babel/helper-create-class-features-plugin@^7.24.1", "@babel/helper-create-class-features-plugin@^7.24.4", "@babel/helper-create-class-features-plugin@^7.24.5": version "7.24.5" resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.5.tgz#7d19da92c7e0cd8d11c09af2ce1b8e7512a6e723" @@ -170,6 +230,14 @@ dependencies: "@babel/types" "^7.24.0" +"@babel/helper-module-imports@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz#f2f980392de5b84c3328fc71d38bd81bbb83042b" + integrity sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA== + dependencies: + "@babel/traverse" "^7.24.7" + "@babel/types" "^7.24.7" + "@babel/helper-module-transforms@^7.23.3", "@babel/helper-module-transforms@^7.24.5": version "7.24.5" resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.24.5.tgz#ea6c5e33f7b262a0ae762fd5986355c45f54a545" @@ -181,6 +249,16 @@ "@babel/helper-split-export-declaration" "^7.24.5" "@babel/helper-validator-identifier" "^7.24.5" +"@babel/helper-module-transforms@^7.25.2": + version "7.25.2" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.25.2.tgz#ee713c29768100f2776edf04d4eb23b8d27a66e6" + integrity sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ== + dependencies: + "@babel/helper-module-imports" "^7.24.7" + "@babel/helper-simple-access" "^7.24.7" + "@babel/helper-validator-identifier" "^7.24.7" + "@babel/traverse" "^7.25.2" + "@babel/helper-optimise-call-expression@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz#f21531a9ccbff644fdd156b4077c16ff0c3f609e" @@ -193,6 +271,11 @@ resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.5.tgz#a924607dd254a65695e5bd209b98b902b3b2f11a" integrity sha512-xjNLDopRzW2o6ba0gKbkZq5YWEBaK3PCyTOY1K2P/O07LGMhMqlMXPxwN4S5/RhWuCobT8z0jrlKGlYmeR1OhQ== +"@babel/helper-plugin-utils@^7.24.7", "@babel/helper-plugin-utils@^7.24.8": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz#94ee67e8ec0e5d44ea7baeb51e571bd26af07878" + integrity sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg== + "@babel/helper-remap-async-to-generator@^7.22.20": version "7.22.20" resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz#7b68e1cb4fa964d2996fd063723fb48eca8498e0" @@ -218,6 +301,14 @@ dependencies: "@babel/types" "^7.24.5" +"@babel/helper-simple-access@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz#bcade8da3aec8ed16b9c4953b74e506b51b5edb3" + integrity sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg== + dependencies: + "@babel/traverse" "^7.24.7" + "@babel/types" "^7.24.7" + "@babel/helper-skip-transparent-expression-wrappers@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz#007f15240b5751c537c40e77abb4e89eeaaa8847" @@ -237,16 +328,31 @@ resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz#f99c36d3593db9540705d0739a1f10b5e20c696e" integrity sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ== +"@babel/helper-string-parser@^7.24.8": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz#5b3329c9a58803d5df425e5785865881a81ca48d" + integrity sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ== + "@babel/helper-validator-identifier@^7.22.20", "@babel/helper-validator-identifier@^7.24.5": version "7.24.5" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.5.tgz#918b1a7fa23056603506370089bd990d8720db62" integrity sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA== +"@babel/helper-validator-identifier@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz#75b889cfaf9e35c2aaf42cf0d72c8e91719251db" + integrity sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w== + "@babel/helper-validator-option@^7.23.5": version "7.23.5" resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz#907a3fbd4523426285365d1206c423c4c5520307" integrity sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw== +"@babel/helper-validator-option@^7.24.8": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz#3725cdeea8b480e86d34df15304806a06975e33d" + integrity sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q== + "@babel/helper-wrap-function@^7.22.20": version "7.24.5" resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.24.5.tgz#335f934c0962e2c1ed1fb9d79e06a56115067c09" @@ -265,6 +371,14 @@ "@babel/traverse" "^7.24.5" "@babel/types" "^7.24.5" +"@babel/helpers@^7.25.0": + version "7.25.6" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.25.6.tgz#57ee60141829ba2e102f30711ffe3afab357cc60" + integrity sha512-Xg0tn4HcfTijTwfDwYlvVCl43V6h4KyVVX2aEm4qdO/PC6L2YvzLHFdmxhoeSA3eslcE6+ZVXHgWwopXYLNq4Q== + dependencies: + "@babel/template" "^7.25.0" + "@babel/types" "^7.25.6" + "@babel/highlight@^7.24.2": version "7.24.5" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.5.tgz#bc0613f98e1dd0720e99b2a9ee3760194a704b6e" @@ -275,6 +389,23 @@ js-tokens "^4.0.0" picocolors "^1.0.0" +"@babel/highlight@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.7.tgz#a05ab1df134b286558aae0ed41e6c5f731bf409d" + integrity sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw== + dependencies: + "@babel/helper-validator-identifier" "^7.24.7" + chalk "^2.4.2" + js-tokens "^4.0.0" + picocolors "^1.0.0" + +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.23.9", "@babel/parser@^7.25.0", "@babel/parser@^7.25.6": + version "7.25.6" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.25.6.tgz#85660c5ef388cbbf6e3d2a694ee97a38f18afe2f" + integrity sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q== + dependencies: + "@babel/types" "^7.25.6" + "@babel/parser@^7.24.0", "@babel/parser@^7.24.5": version "7.24.5" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.5.tgz#4a4d5ab4315579e5398a82dcf636ca80c3392790" @@ -334,6 +465,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" +"@babel/plugin-syntax-bigint@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz#4c9a6f669f5d0cdf1b90a1671e9a146be5300cea" + integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + "@babel/plugin-syntax-class-properties@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" @@ -376,6 +514,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.24.0" +"@babel/plugin-syntax-import-attributes@^7.24.7": + version "7.25.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.25.6.tgz#6d4c78f042db0e82fd6436cd65fec5dc78ad2bde" + integrity sha512-sXaDXaJN9SNLymBdlWFA+bjzBhFD617ZaFiY13dGt7TVslVvVgA6fkZOP7Ki3IGElC45lwHdOTrCtKZGVAWeLQ== + dependencies: + "@babel/helper-plugin-utils" "^7.24.8" + "@babel/plugin-syntax-import-meta@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" @@ -397,6 +542,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.24.0" +"@babel/plugin-syntax-jsx@^7.7.2": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.7.tgz#39a1fa4a7e3d3d7f34e2acc6be585b718d30e02d" + integrity sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ== + dependencies: + "@babel/helper-plugin-utils" "^7.24.7" + "@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" @@ -460,6 +612,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.24.0" +"@babel/plugin-syntax-typescript@^7.7.2": + version "7.25.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.4.tgz#04db9ce5a9043d9c635e75ae7969a2cd50ca97ff" + integrity sha512-uMOCoHVU52BsSWxPOMVv5qKRdeSlPuImUCB2dlPuBSU+W2/ROE7/Zg8F2Kepbk+8yBa68LlRKxO+xgEVWorsDg== + dependencies: + "@babel/helper-plugin-utils" "^7.24.8" + "@babel/plugin-syntax-unicode-sets-regex@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz#d49a3b3e6b52e5be6740022317580234a6a47357" @@ -1052,6 +1211,15 @@ "@babel/parser" "^7.24.0" "@babel/types" "^7.24.0" +"@babel/template@^7.25.0", "@babel/template@^7.3.3": + version "7.25.0" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.25.0.tgz#e733dc3134b4fede528c15bc95e89cb98c52592a" + integrity sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q== + dependencies: + "@babel/code-frame" "^7.24.7" + "@babel/parser" "^7.25.0" + "@babel/types" "^7.25.0" + "@babel/traverse@^7.24.5": version "7.24.5" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.24.5.tgz#972aa0bc45f16983bf64aa1f877b2dd0eea7e6f8" @@ -1068,6 +1236,28 @@ debug "^4.3.1" globals "^11.1.0" +"@babel/traverse@^7.24.7", "@babel/traverse@^7.25.2": + version "7.25.6" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.25.6.tgz#04fad980e444f182ecf1520504941940a90fea41" + integrity sha512-9Vrcx5ZW6UwK5tvqsj0nGpp/XzqthkT0dqIc9g1AdtygFToNtTF67XzYS//dm+SAK9cp3B9R4ZO/46p63SCjlQ== + dependencies: + "@babel/code-frame" "^7.24.7" + "@babel/generator" "^7.25.6" + "@babel/parser" "^7.25.6" + "@babel/template" "^7.25.0" + "@babel/types" "^7.25.6" + debug "^4.3.1" + globals "^11.1.0" + +"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.24.7", "@babel/types@^7.25.0", "@babel/types@^7.25.2", "@babel/types@^7.25.6", "@babel/types@^7.3.3": + version "7.25.6" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.25.6.tgz#893942ddb858f32ae7a004ec9d3a76b3463ef8e6" + integrity sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw== + dependencies: + "@babel/helper-string-parser" "^7.24.8" + "@babel/helper-validator-identifier" "^7.24.7" + to-fast-properties "^2.0.0" + "@babel/types@^7.21.3", "@babel/types@^7.22.15", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.23.4", "@babel/types@^7.24.0", "@babel/types@^7.24.5", "@babel/types@^7.4.4": version "7.24.5" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.24.5.tgz#7661930afc638a5383eb0c4aee59b74f38db84d7" @@ -1077,11 +1267,23 @@ "@babel/helper-validator-identifier" "^7.24.5" to-fast-properties "^2.0.0" +"@bcoe/v8-coverage@^0.2.3": + version "0.2.3" + resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" + integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== + "@colors/colors@1.5.0": version "1.5.0" resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9" integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== +"@cspotcode/source-map-support@^0.8.0": + version "0.8.1" + resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" + integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== + dependencies: + "@jridgewell/trace-mapping" "0.3.9" + "@cypress/request@^3.0.0": version "3.0.1" resolved "https://registry.yarnpkg.com/@cypress/request/-/request-3.0.1.tgz#72d7d5425236a2413bd3d8bb66d02d9dc3168960" @@ -1438,6 +1640,85 @@ wrap-ansi "^8.1.0" wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" +"@istanbuljs/load-nyc-config@^1.0.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" + integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== + dependencies: + camelcase "^5.3.1" + find-up "^4.1.0" + get-package-type "^0.1.0" + js-yaml "^3.13.1" + resolve-from "^5.0.0" + +"@istanbuljs/schema@^0.1.2", "@istanbuljs/schema@^0.1.3": + version "0.1.3" + resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" + integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== + +"@jest/console@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-29.7.0.tgz#cd4822dbdb84529265c5a2bdb529a3c9cc950ffc" + integrity sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg== + dependencies: + "@jest/types" "^29.6.3" + "@types/node" "*" + chalk "^4.0.0" + jest-message-util "^29.7.0" + jest-util "^29.7.0" + slash "^3.0.0" + +"@jest/core@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/core/-/core-29.7.0.tgz#b6cccc239f30ff36609658c5a5e2291757ce448f" + integrity sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg== + dependencies: + "@jest/console" "^29.7.0" + "@jest/reporters" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + ci-info "^3.2.0" + exit "^0.1.2" + graceful-fs "^4.2.9" + jest-changed-files "^29.7.0" + jest-config "^29.7.0" + jest-haste-map "^29.7.0" + jest-message-util "^29.7.0" + jest-regex-util "^29.6.3" + jest-resolve "^29.7.0" + jest-resolve-dependencies "^29.7.0" + jest-runner "^29.7.0" + jest-runtime "^29.7.0" + jest-snapshot "^29.7.0" + jest-util "^29.7.0" + jest-validate "^29.7.0" + jest-watcher "^29.7.0" + micromatch "^4.0.4" + pretty-format "^29.7.0" + slash "^3.0.0" + strip-ansi "^6.0.0" + +"@jest/create-cache-key-function@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/create-cache-key-function/-/create-cache-key-function-29.7.0.tgz#793be38148fab78e65f40ae30c36785f4ad859f0" + integrity sha512-4QqS3LY5PBmTRHj9sAg1HLoPzqAI0uOX6wI/TRqHIcOxlFidy6YEmCQJk6FSZjNLGCeubDMfmkWL+qaLKhSGQA== + dependencies: + "@jest/types" "^29.6.3" + +"@jest/environment@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-29.7.0.tgz#24d61f54ff1f786f3cd4073b4b94416383baf2a7" + integrity sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw== + dependencies: + "@jest/fake-timers" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + jest-mock "^29.7.0" + "@jest/expect-utils@^29.7.0": version "29.7.0" resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.7.0.tgz#023efe5d26a8a70f21677d0a1afc0f0a44e3a1c6" @@ -1445,6 +1726,66 @@ dependencies: jest-get-type "^29.6.3" +"@jest/expect@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-29.7.0.tgz#76a3edb0cb753b70dfbfe23283510d3d45432bf2" + integrity sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ== + dependencies: + expect "^29.7.0" + jest-snapshot "^29.7.0" + +"@jest/fake-timers@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-29.7.0.tgz#fd91bf1fffb16d7d0d24a426ab1a47a49881a565" + integrity sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ== + dependencies: + "@jest/types" "^29.6.3" + "@sinonjs/fake-timers" "^10.0.2" + "@types/node" "*" + jest-message-util "^29.7.0" + jest-mock "^29.7.0" + jest-util "^29.7.0" + +"@jest/globals@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-29.7.0.tgz#8d9290f9ec47ff772607fa864ca1d5a2efae1d4d" + integrity sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ== + dependencies: + "@jest/environment" "^29.7.0" + "@jest/expect" "^29.7.0" + "@jest/types" "^29.6.3" + jest-mock "^29.7.0" + +"@jest/reporters@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-29.7.0.tgz#04b262ecb3b8faa83b0b3d321623972393e8f4c7" + integrity sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg== + dependencies: + "@bcoe/v8-coverage" "^0.2.3" + "@jest/console" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" + "@jridgewell/trace-mapping" "^0.3.18" + "@types/node" "*" + chalk "^4.0.0" + collect-v8-coverage "^1.0.0" + exit "^0.1.2" + glob "^7.1.3" + graceful-fs "^4.2.9" + istanbul-lib-coverage "^3.0.0" + istanbul-lib-instrument "^6.0.0" + istanbul-lib-report "^3.0.0" + istanbul-lib-source-maps "^4.0.0" + istanbul-reports "^3.1.3" + jest-message-util "^29.7.0" + jest-util "^29.7.0" + jest-worker "^29.7.0" + slash "^3.0.0" + string-length "^4.0.1" + strip-ansi "^6.0.0" + v8-to-istanbul "^9.0.1" + "@jest/schemas@^29.6.3": version "29.6.3" resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.6.3.tgz#430b5ce8a4e0044a7e3819663305a7b3091c8e03" @@ -1452,6 +1793,56 @@ dependencies: "@sinclair/typebox" "^0.27.8" +"@jest/source-map@^29.6.3": + version "29.6.3" + resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-29.6.3.tgz#d90ba772095cf37a34a5eb9413f1b562a08554c4" + integrity sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw== + dependencies: + "@jridgewell/trace-mapping" "^0.3.18" + callsites "^3.0.0" + graceful-fs "^4.2.9" + +"@jest/test-result@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-29.7.0.tgz#8db9a80aa1a097bb2262572686734baed9b1657c" + integrity sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA== + dependencies: + "@jest/console" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/istanbul-lib-coverage" "^2.0.0" + collect-v8-coverage "^1.0.0" + +"@jest/test-sequencer@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz#6cef977ce1d39834a3aea887a1726628a6f072ce" + integrity sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw== + dependencies: + "@jest/test-result" "^29.7.0" + graceful-fs "^4.2.9" + jest-haste-map "^29.7.0" + slash "^3.0.0" + +"@jest/transform@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-29.7.0.tgz#df2dd9c346c7d7768b8a06639994640c642e284c" + integrity sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw== + dependencies: + "@babel/core" "^7.11.6" + "@jest/types" "^29.6.3" + "@jridgewell/trace-mapping" "^0.3.18" + babel-plugin-istanbul "^6.1.1" + chalk "^4.0.0" + convert-source-map "^2.0.0" + fast-json-stable-stringify "^2.1.0" + graceful-fs "^4.2.9" + jest-haste-map "^29.7.0" + jest-regex-util "^29.6.3" + jest-util "^29.7.0" + micromatch "^4.0.4" + pirates "^4.0.4" + slash "^3.0.0" + write-file-atomic "^4.0.2" + "@jest/types@^29.6.3": version "29.6.3" resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.6.3.tgz#1131f8cf634e7e84c5e77bab12f052af585fba59" @@ -1473,7 +1864,7 @@ "@jridgewell/sourcemap-codec" "^1.4.10" "@jridgewell/trace-mapping" "^0.3.24" -"@jridgewell/resolve-uri@^3.1.0": +"@jridgewell/resolve-uri@^3.0.3", "@jridgewell/resolve-uri@^3.1.0": version "3.1.2" resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== @@ -1488,7 +1879,15 @@ resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== -"@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": +"@jridgewell/trace-mapping@0.3.9": + version "0.3.9" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" + integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== + dependencies: + "@jridgewell/resolve-uri" "^3.0.3" + "@jridgewell/sourcemap-codec" "^1.4.10" + +"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.18", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": version "0.3.25" resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== @@ -1800,6 +2199,20 @@ resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.27.8.tgz#6667fac16c436b5434a387a34dedb013198f6e6e" integrity sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA== +"@sinonjs/commons@^3.0.0": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-3.0.1.tgz#1029357e44ca901a615585f6d27738dbc89084cd" + integrity sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ== + dependencies: + type-detect "4.0.8" + +"@sinonjs/fake-timers@^10.0.2": + version "10.3.0" + resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz#55fdff1ecab9f354019129daf4df0dd4d923ea66" + integrity sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA== + dependencies: + "@sinonjs/commons" "^3.0.0" + "@svgr/babel-plugin-add-jsx-attribute@8.0.0": version "8.0.0" resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-8.0.0.tgz#4001f5d5dd87fa13303e36ee106e3ff3a7eb8b22" @@ -1906,6 +2319,75 @@ "@svgr/plugin-jsx" "8.1.0" "@svgr/plugin-svgo" "8.1.0" +"@swc/core-darwin-arm64@1.7.26": + version "1.7.26" + resolved "https://registry.yarnpkg.com/@swc/core-darwin-arm64/-/core-darwin-arm64-1.7.26.tgz#5f4096c00e71771ca1b18c824f0c92a052c70760" + integrity sha512-FF3CRYTg6a7ZVW4yT9mesxoVVZTrcSWtmZhxKCYJX9brH4CS/7PRPjAKNk6kzWgWuRoglP7hkjQcd6EpMcZEAw== + +"@swc/core-darwin-x64@1.7.26": + version "1.7.26" + resolved "https://registry.yarnpkg.com/@swc/core-darwin-x64/-/core-darwin-x64-1.7.26.tgz#867b7a4f094e6b64201090ca5fcbf3da7d0f3e22" + integrity sha512-az3cibZdsay2HNKmc4bjf62QVukuiMRh5sfM5kHR/JMTrLyS6vSw7Ihs3UTkZjUxkLTT8ro54LI6sV6sUQUbLQ== + +"@swc/core-linux-arm-gnueabihf@1.7.26": + version "1.7.26" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.7.26.tgz#35bb43894def296d92aaa2cc9372d48042f37777" + integrity sha512-VYPFVJDO5zT5U3RpCdHE5v1gz4mmR8BfHecUZTmD2v1JeFY6fv9KArJUpjrHEEsjK/ucXkQFmJ0jaiWXmpOV9Q== + +"@swc/core-linux-arm64-gnu@1.7.26": + version "1.7.26" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.7.26.tgz#8e2321cc4ec84cbfed8f8e16ff1ed7b854450443" + integrity sha512-YKevOV7abpjcAzXrhsl+W48Z9mZvgoVs2eP5nY+uoMAdP2b3GxC0Df1Co0I90o2lkzO4jYBpTMcZlmUXLdXn+Q== + +"@swc/core-linux-arm64-musl@1.7.26": + version "1.7.26" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.7.26.tgz#b1c16e4b23ffa9ff19973eda6ffee35d2a7de7b0" + integrity sha512-3w8iZICMkQQON0uIcvz7+Q1MPOW6hJ4O5ETjA0LSP/tuKqx30hIniCGOgPDnv3UTMruLUnQbtBwVCZTBKR3Rkg== + +"@swc/core-linux-x64-gnu@1.7.26": + version "1.7.26" + resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.7.26.tgz#388e2cc13a010cd28787aead2cecf31eb491836d" + integrity sha512-c+pp9Zkk2lqb06bNGkR2Looxrs7FtGDMA4/aHjZcCqATgp348hOKH5WPvNLBl+yPrISuWjbKDVn3NgAvfvpH4w== + +"@swc/core-linux-x64-musl@1.7.26": + version "1.7.26" + resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.7.26.tgz#51e0ff30981f26d7a5b97a7a7b5b291bad050d1a" + integrity sha512-PgtyfHBF6xG87dUSSdTJHwZ3/8vWZfNIXQV2GlwEpslrOkGqy+WaiiyE7Of7z9AvDILfBBBcJvJ/r8u980wAfQ== + +"@swc/core-win32-arm64-msvc@1.7.26": + version "1.7.26" + resolved "https://registry.yarnpkg.com/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.7.26.tgz#a7fdcc4074c34ee6a026506b594d00323383c11f" + integrity sha512-9TNXPIJqFynlAOrRD6tUQjMq7KApSklK3R/tXgIxc7Qx+lWu8hlDQ/kVPLpU7PWvMMwC/3hKBW+p5f+Tms1hmA== + +"@swc/core-win32-ia32-msvc@1.7.26": + version "1.7.26" + resolved "https://registry.yarnpkg.com/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.7.26.tgz#ae7be6dde798eebee2000b8fd84e01a439b5bd6a" + integrity sha512-9YngxNcG3177GYdsTum4V98Re+TlCeJEP4kEwEg9EagT5s3YejYdKwVAkAsJszzkXuyRDdnHUpYbTrPG6FiXrQ== + +"@swc/core-win32-x64-msvc@1.7.26": + version "1.7.26" + resolved "https://registry.yarnpkg.com/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.7.26.tgz#310d607004d7319085a4dec20c0c38c3405cc05b" + integrity sha512-VR+hzg9XqucgLjXxA13MtV5O3C0bK0ywtLIBw/+a+O+Oc6mxFWHtdUeXDbIi5AiPbn0fjgVJMqYnyjGyyX8u0w== + +"@swc/core@^1.7.23": + version "1.7.26" + resolved "https://registry.yarnpkg.com/@swc/core/-/core-1.7.26.tgz#beda9b82063fcec7b56c958804a4d175aecf9a9d" + integrity sha512-f5uYFf+TmMQyYIoxkn/evWhNGuUzC730dFwAKGwBVHHVoPyak1/GvJUm6i1SKl+2Hrj9oN0i3WSoWWZ4pgI8lw== + dependencies: + "@swc/counter" "^0.1.3" + "@swc/types" "^0.1.12" + optionalDependencies: + "@swc/core-darwin-arm64" "1.7.26" + "@swc/core-darwin-x64" "1.7.26" + "@swc/core-linux-arm-gnueabihf" "1.7.26" + "@swc/core-linux-arm64-gnu" "1.7.26" + "@swc/core-linux-arm64-musl" "1.7.26" + "@swc/core-linux-x64-gnu" "1.7.26" + "@swc/core-linux-x64-musl" "1.7.26" + "@swc/core-win32-arm64-msvc" "1.7.26" + "@swc/core-win32-ia32-msvc" "1.7.26" + "@swc/core-win32-x64-msvc" "1.7.26" + "@swc/counter@^0.1.3": version "0.1.3" resolved "https://registry.yarnpkg.com/@swc/counter/-/counter-0.1.3.tgz#cc7463bd02949611c6329596fccd2b0ec782b0e9" @@ -1919,16 +2401,134 @@ "@swc/counter" "^0.1.3" tslib "^2.4.0" +"@swc/jest@^0.2.36": + version "0.2.36" + resolved "https://registry.yarnpkg.com/@swc/jest/-/jest-0.2.36.tgz#2797450a30d28b471997a17e901ccad946fe693e" + integrity sha512-8X80dp81ugxs4a11z1ka43FPhP+/e+mJNXJSxiNYk8gIX/jPBtY4gQTrKu/KIoco8bzKuPI5lUxjfLiGsfvnlw== + dependencies: + "@jest/create-cache-key-function" "^29.7.0" + "@swc/counter" "^0.1.3" + jsonc-parser "^3.2.0" + +"@swc/types@^0.1.12": + version "0.1.12" + resolved "https://registry.yarnpkg.com/@swc/types/-/types-0.1.12.tgz#7f632c06ab4092ce0ebd046ed77ff7557442282f" + integrity sha512-wBJA+SdtkbFhHjTMYH+dEH1y4VpfGdAc2Kw/LK09i9bXd/K6j6PkDcFCEzb6iVfZMkPRrl/q0e3toqTAJdkIVA== + dependencies: + "@swc/counter" "^0.1.3" + +"@testing-library/dom@^10.4.0": + version "10.4.0" + resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-10.4.0.tgz#82a9d9462f11d240ecadbf406607c6ceeeff43a8" + integrity sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ== + dependencies: + "@babel/code-frame" "^7.10.4" + "@babel/runtime" "^7.12.5" + "@types/aria-query" "^5.0.1" + aria-query "5.3.0" + chalk "^4.1.0" + dom-accessibility-api "^0.5.9" + lz-string "^1.5.0" + pretty-format "^27.0.2" + +"@testing-library/jest-dom@^6.5.0": + version "6.5.0" + resolved "https://registry.yarnpkg.com/@testing-library/jest-dom/-/jest-dom-6.5.0.tgz#50484da3f80fb222a853479f618a9ce5c47bfe54" + integrity sha512-xGGHpBXYSHUUr6XsKBfs85TWlYKpTc37cSBBVrXcib2MkHLboWlkClhWF37JKlDb9KEq3dHs+f2xR7XJEWGBxA== + dependencies: + "@adobe/css-tools" "^4.4.0" + aria-query "^5.0.0" + chalk "^3.0.0" + css.escape "^1.5.1" + dom-accessibility-api "^0.6.3" + lodash "^4.17.21" + redent "^3.0.0" + +"@testing-library/react@^16.0.1": + version "16.0.1" + resolved "https://registry.yarnpkg.com/@testing-library/react/-/react-16.0.1.tgz#29c0ee878d672703f5e7579f239005e4e0faa875" + integrity sha512-dSmwJVtJXmku+iocRhWOUFbrERC76TX2Mnf0ATODz8brzAZrMBbzLwQixlBSanZxR6LddK3eiwpSFZgDET1URg== + dependencies: + "@babel/runtime" "^7.12.5" + +"@testing-library/user-event@^14.5.2": + version "14.5.2" + resolved "https://registry.yarnpkg.com/@testing-library/user-event/-/user-event-14.5.2.tgz#db7257d727c891905947bd1c1a99da20e03c2ebd" + integrity sha512-YAh82Wh4TIrxYLmfGcixwD18oIjyC1pFQC2Y01F2lzV2HTMiYrI0nze0FD0ocB//CKS/7jIUgae+adPqxK5yCQ== + "@tootallnate/once@1": version "1.1.2" resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== +"@tootallnate/once@2": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-2.0.0.tgz#f544a148d3ab35801c1f633a7441fd87c2e484bf" + integrity sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A== + "@trysound/sax@0.2.0": version "0.2.0" resolved "https://registry.yarnpkg.com/@trysound/sax/-/sax-0.2.0.tgz#cccaab758af56761eb7bf37af6f03f326dd798ad" integrity sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA== +"@tsconfig/node10@^1.0.7": + version "1.0.11" + resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.11.tgz#6ee46400685f130e278128c7b38b7e031ff5b2f2" + integrity sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw== + +"@tsconfig/node12@^1.0.7": + version "1.0.11" + resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" + integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== + +"@tsconfig/node14@^1.0.0": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" + integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== + +"@tsconfig/node16@^1.0.2": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.4.tgz#0b92dcc0cc1c81f6f306a381f28e31b1a56536e9" + integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== + +"@types/aria-query@^5.0.1": + version "5.0.4" + resolved "https://registry.yarnpkg.com/@types/aria-query/-/aria-query-5.0.4.tgz#1a31c3d378850d2778dabb6374d036dcba4ba708" + integrity sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw== + +"@types/babel__core@^7.1.14": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.5.tgz#3df15f27ba85319caa07ba08d0721889bb39c017" + integrity sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA== + dependencies: + "@babel/parser" "^7.20.7" + "@babel/types" "^7.20.7" + "@types/babel__generator" "*" + "@types/babel__template" "*" + "@types/babel__traverse" "*" + +"@types/babel__generator@*": + version "7.6.8" + resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.8.tgz#f836c61f48b1346e7d2b0d93c6dacc5b9535d3ab" + integrity sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw== + dependencies: + "@babel/types" "^7.0.0" + +"@types/babel__template@*": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.4.tgz#5672513701c1b2199bc6dad636a9d7491586766f" + integrity sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A== + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + +"@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": + version "7.20.6" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.6.tgz#8dc9f0ae0f202c08d8d4dab648912c8d6038e3f7" + integrity sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg== + dependencies: + "@babel/types" "^7.20.7" + "@types/d3-array@^3.0.3": version "3.2.1" resolved "https://registry.yarnpkg.com/@types/d3-array/-/d3-array-3.2.1.tgz#1f6658e3d2006c4fceac53fde464166859f8b8c5" @@ -1998,6 +2598,13 @@ resolved "https://registry.yarnpkg.com/@types/flat/-/flat-5.0.5.tgz#2304df0b2b1e6dde50d81f029593e0a1bc2474d3" integrity sha512-nPLljZQKSnac53KDUDzuzdRfGI0TDb5qPrb+SrQyN3MtdQrOnGsKniHN1iYZsJEBIVQve94Y6gNz22sgISZq+Q== +"@types/graceful-fs@^4.1.3": + version "4.1.9" + resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.9.tgz#2a06bc0f68a20ab37b3e36aa238be6abdf49e8b4" + integrity sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ== + dependencies: + "@types/node" "*" + "@types/hoist-non-react-statics@^3.3.1": version "3.3.5" resolved "https://registry.yarnpkg.com/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.5.tgz#dab7867ef789d87e2b4b0003c9d65c49cc44a494" @@ -2006,7 +2613,7 @@ "@types/react" "*" hoist-non-react-statics "^3.3.0" -"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0": +"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": version "2.0.6" resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz#7739c232a1fee9b4d3ce8985f314c0c6d33549d7" integrity sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w== @@ -2033,6 +2640,15 @@ expect "^29.0.0" pretty-format "^29.0.0" +"@types/jsdom@^20.0.0": + version "20.0.1" + resolved "https://registry.yarnpkg.com/@types/jsdom/-/jsdom-20.0.1.tgz#07c14bc19bd2f918c1929541cdaacae894744808" + integrity sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ== + dependencies: + "@types/node" "*" + "@types/tough-cookie" "*" + parse5 "^7.0.0" + "@types/json-schema@*", "@types/json-schema@^7.0.12": version "7.0.15" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" @@ -2134,6 +2750,11 @@ resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.3.tgz#6209321eb2c1712a7e7466422b8cb1fc0d9dd5d8" integrity sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw== +"@types/tough-cookie@*": + version "4.0.5" + resolved "https://registry.yarnpkg.com/@types/tough-cookie/-/tough-cookie-4.0.5.tgz#cb6e2a691b70cb177c6e3ae9c1d2e8b2ea8cd304" + integrity sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA== + "@types/yargs-parser@*": version "21.0.3" resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.3.tgz#815e30b786d2e8f0dcd85fd5bcf5e1a04d008f15" @@ -2333,16 +2954,41 @@ resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== +abab@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291" + integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== + abbrev@1: version "1.1.1" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== +acorn-globals@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-7.0.1.tgz#0dbf05c44fa7c94332914c02066d5beff62c40c3" + integrity sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q== + dependencies: + acorn "^8.1.0" + acorn-walk "^8.0.2" + acorn-jsx@^5.3.2: version "5.3.2" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== +acorn-walk@^8.0.2, acorn-walk@^8.1.1: + version "8.3.4" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.4.tgz#794dd169c3977edf4ba4ea47583587c5866236b7" + integrity sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g== + dependencies: + acorn "^8.11.0" + +acorn@^8.1.0, acorn@^8.11.0, acorn@^8.4.1, acorn@^8.8.1: + version "8.12.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.12.1.tgz#71616bdccbe25e27a54439e0046e89ca76df2248" + integrity sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg== + acorn@^8.9.0: version "8.11.3" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a" @@ -2385,7 +3031,7 @@ ansi-colors@^4.1.1: resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== -ansi-escapes@^4.3.0: +ansi-escapes@^4.2.1, ansi-escapes@^4.3.0: version "4.3.2" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== @@ -2431,7 +3077,7 @@ ansi-styles@^6.1.0: resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== -anymatch@~3.1.2: +anymatch@^3.0.3, anymatch@~3.1.2: version "3.1.3" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== @@ -2457,12 +3103,24 @@ are-we-there-yet@^3.0.0: delegates "^1.0.0" readable-stream "^3.6.0" +arg@^4.1.0: + version "4.1.3" + resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" + integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + argparse@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== -aria-query@^5.3.0: +aria-query@5.3.0, aria-query@^5.0.0, aria-query@^5.3.0: version "5.3.0" resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.3.0.tgz#650c569e41ad90b51b3d7df5e5eed1c7549c103e" integrity sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A== @@ -2600,6 +3258,11 @@ async@^3.2.0: resolved "https://registry.yarnpkg.com/async/-/async-3.2.5.tgz#ebd52a8fdaf7a2289a24df399f8d8485c8a46b66" integrity sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg== +async@^3.2.3: + version "3.2.6" + resolved "https://registry.yarnpkg.com/async/-/async-3.2.6.tgz#1b0728e14929d51b85b449b7f06e27c1145e38ce" + integrity sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA== + asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" @@ -2639,6 +3302,40 @@ axobject-query@^3.2.1: dependencies: dequal "^2.0.3" +babel-jest@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.7.0.tgz#f4369919225b684c56085998ac63dbd05be020d5" + integrity sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg== + dependencies: + "@jest/transform" "^29.7.0" + "@types/babel__core" "^7.1.14" + babel-plugin-istanbul "^6.1.1" + babel-preset-jest "^29.6.3" + chalk "^4.0.0" + graceful-fs "^4.2.9" + slash "^3.0.0" + +babel-plugin-istanbul@^6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73" + integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@istanbuljs/load-nyc-config" "^1.0.0" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-instrument "^5.0.4" + test-exclude "^6.0.0" + +babel-plugin-jest-hoist@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz#aadbe943464182a8922c3c927c3067ff40d24626" + integrity sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg== + dependencies: + "@babel/template" "^7.3.3" + "@babel/types" "^7.3.3" + "@types/babel__core" "^7.1.14" + "@types/babel__traverse" "^7.0.6" + babel-plugin-macros@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz#9ef6dc74deb934b4db344dc973ee851d148c50c1" @@ -2672,6 +3369,35 @@ babel-plugin-polyfill-regenerator@^0.6.1: dependencies: "@babel/helper-define-polyfill-provider" "^0.6.2" +babel-preset-current-node-syntax@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.1.0.tgz#9a929eafece419612ef4ae4f60b1862ebad8ef30" + integrity sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw== + dependencies: + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-syntax-bigint" "^7.8.3" + "@babel/plugin-syntax-class-properties" "^7.12.13" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + "@babel/plugin-syntax-import-attributes" "^7.24.7" + "@babel/plugin-syntax-import-meta" "^7.10.4" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + "@babel/plugin-syntax-top-level-await" "^7.14.5" + +babel-preset-jest@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz#fa05fa510e7d493896d7b0dd2033601c840f171c" + integrity sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA== + dependencies: + babel-plugin-jest-hoist "^29.6.3" + babel-preset-current-node-syntax "^1.0.0" + balanced-match@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" @@ -2757,11 +3483,40 @@ browserslist@^4.22.2, browserslist@^4.23.0: node-releases "^2.0.14" update-browserslist-db "^1.0.13" +browserslist@^4.23.1: + version "4.23.3" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.23.3.tgz#debb029d3c93ebc97ffbc8d9cbb03403e227c800" + integrity sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA== + dependencies: + caniuse-lite "^1.0.30001646" + electron-to-chromium "^1.5.4" + node-releases "^2.0.18" + update-browserslist-db "^1.1.0" + +bs-logger@^0.2.6: + version "0.2.6" + resolved "https://registry.yarnpkg.com/bs-logger/-/bs-logger-0.2.6.tgz#eb7d365307a72cf974cc6cda76b68354ad336bd8" + integrity sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog== + dependencies: + fast-json-stable-stringify "2.x" + +bser@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" + integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== + dependencies: + node-int64 "^0.4.0" + buffer-crc32@~0.2.3: version "0.2.13" resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" integrity sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ== +buffer-from@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + buffer@^5.5.0, buffer@^5.7.1: version "5.7.1" resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" @@ -2830,6 +3585,11 @@ callsites@^3.0.0: resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== +camelcase@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + camelcase@^6.2.0: version "6.3.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" @@ -2840,6 +3600,11 @@ caniuse-lite@^1.0.30001579, caniuse-lite@^1.0.30001587: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001618.tgz#fad74fa006aef0f01e8e5c0a5540c74d8d36ec6f" integrity sha512-p407+D1tIkDvsEAPS22lJxLQQaG8OTBEqo0KhzfABGk0TU4juBNDSfH0hyAp/HRyx+M8L17z/ltyhxh27FTfQg== +caniuse-lite@^1.0.30001646: + version "1.0.30001660" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001660.tgz#31218de3463fabb44d0b7607b652e56edf2e2355" + integrity sha512-GacvNTTuATm26qC74pt+ad1fW15mlQ/zuTzzY1ZoIzECTP8HURDfF43kNxPgf7H1jmelCBQTTbBNxdSXOA7Bqg== + caseless@~0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" @@ -2854,7 +3619,15 @@ chalk@^2.4.2: escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chalk@^4.0.0, chalk@^4.1.0: +chalk@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" + integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0: version "4.1.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== @@ -2862,6 +3635,11 @@ chalk@^4.0.0, chalk@^4.1.0: ansi-styles "^4.1.0" supports-color "^7.1.0" +char-regex@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" + integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== + charenc@0.0.2: version "0.0.2" resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667" @@ -2902,6 +3680,11 @@ ci-info@^3.2.0: resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== +cjs-module-lexer@^1.0.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.4.1.tgz#707413784dbb3a72aa11c2f2b042a0bef4004170" + integrity sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA== + clean-stack@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" @@ -2936,11 +3719,30 @@ client-only@0.0.1: resolved "https://registry.yarnpkg.com/client-only/-/client-only-0.0.1.tgz#38bba5d403c41ab150bff64a95c85013cf73bca1" integrity sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA== +cliui@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" + integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.1" + wrap-ansi "^7.0.0" + clsx@^2.0.0, clsx@^2.1.0, clsx@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/clsx/-/clsx-2.1.1.tgz#eed397c9fd8bd882bfb18deab7102049a2f32999" integrity sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA== +co@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + integrity sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ== + +collect-v8-coverage@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz#c0b29bcd33bcd0779a1344c2136051e6afd3d9e9" + integrity sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q== + color-convert@^1.9.0: version "1.9.3" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" @@ -3000,7 +3802,7 @@ colorette@^2.0.16: resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== -combined-stream@^1.0.6, combined-stream@~1.0.6: +combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6: version "1.0.8" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== @@ -3080,7 +3882,25 @@ cosmiconfig@^8.1.3: parse-json "^5.2.0" path-type "^4.0.0" -cross-spawn@^7.0.0, cross-spawn@^7.0.2: +create-jest@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/create-jest/-/create-jest-29.7.0.tgz#a355c5b3cb1e1af02ba177fe7afd7feee49a5320" + integrity sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q== + dependencies: + "@jest/types" "^29.6.3" + chalk "^4.0.0" + exit "^0.1.2" + graceful-fs "^4.2.9" + jest-config "^29.7.0" + jest-util "^29.7.0" + prompts "^2.0.1" + +create-require@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" + integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== + +cross-spawn@^7.0.0, 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" integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== @@ -3126,6 +3946,11 @@ css-what@^6.1.0: resolved "https://registry.yarnpkg.com/css-what/-/css-what-6.1.0.tgz#fb5effcf76f1ddea2c81bdfaa4de44e79bac70f4" integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== +css.escape@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/css.escape/-/css.escape-1.5.1.tgz#42e27d4fa04ae32f931a4b4d4191fa9cddee97cb" + integrity sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg== + csso@^5.0.5: version "5.0.5" resolved "https://registry.yarnpkg.com/csso/-/csso-5.0.5.tgz#f9b7fe6cc6ac0b7d90781bb16d5e9874303e2ca6" @@ -3133,6 +3958,23 @@ csso@^5.0.5: dependencies: css-tree "~2.2.0" +cssom@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.5.0.tgz#d254fa92cd8b6fbd83811b9fbaed34663cc17c36" + integrity sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw== + +cssom@~0.3.6: + version "0.3.8" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" + integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== + +cssstyle@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-2.3.0.tgz#ff665a0ddbdc31864b09647f34163443d90b0852" + integrity sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A== + dependencies: + cssom "~0.3.6" + csstype@^3.0.2, csstype@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81" @@ -3285,6 +4127,15 @@ dashdash@^1.12.0: dependencies: assert-plus "^1.0.0" +data-urls@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-3.0.2.tgz#9cf24a477ae22bcef5cd5f6f0bfbc1d2d3be9143" + integrity sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ== + dependencies: + abab "^2.0.6" + whatwg-mimetype "^3.0.0" + whatwg-url "^11.0.0" + data-view-buffer@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/data-view-buffer/-/data-view-buffer-1.0.1.tgz#8ea6326efec17a2e42620696e671d7d5a8bc66b2" @@ -3357,6 +4208,11 @@ decimal.js-light@^2.4.1: resolved "https://registry.yarnpkg.com/decimal.js-light/-/decimal.js-light-2.5.1.tgz#134fd32508f19e208f4fb2f8dac0d2626a867934" integrity sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg== +decimal.js@^10.4.2: + version "10.4.3" + resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.4.3.tgz#1044092884d245d1b7f65725fa4ad4c6f781cc23" + integrity sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA== + decompress-response@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc" @@ -3364,6 +4220,11 @@ decompress-response@^6.0.0: dependencies: mimic-response "^3.1.0" +dedent@^1.0.0: + version "1.5.3" + resolved "https://registry.yarnpkg.com/dedent/-/dedent-1.5.3.tgz#99aee19eb9bae55a67327717b6e848d0bf777e5a" + integrity sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ== + deep-extend@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" @@ -3374,7 +4235,7 @@ deep-is@^0.1.3: resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== -deepmerge@^4.3.1: +deepmerge@^4.2.2, deepmerge@^4.3.1: version "4.3.1" resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== @@ -3417,11 +4278,21 @@ detect-libc@^2.0.0: resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.3.tgz#f0cd503b40f9939b894697d19ad50895e30cf700" integrity sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw== +detect-newline@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" + integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== + diff-sequences@^29.6.3: version "29.6.3" resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.6.3.tgz#4deaf894d11407c51efc8418012f9e70b84ea921" integrity sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q== +diff@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" + integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== + dir-glob@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" @@ -3443,6 +4314,16 @@ doctrine@^3.0.0: dependencies: esutils "^2.0.2" +dom-accessibility-api@^0.5.9: + version "0.5.16" + resolved "https://registry.yarnpkg.com/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz#5a7429e6066eb3664d911e33fb0e45de8eb08453" + integrity sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg== + +dom-accessibility-api@^0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz#993e925cc1d73f2c662e7d75dd5a5445259a8fd8" + integrity sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w== + dom-helpers@^5.0.1: version "5.2.1" resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-5.2.1.tgz#d9400536b2bf8225ad98fe052e029451ac40e902" @@ -3465,6 +4346,13 @@ domelementtype@^2.3.0: resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== +domexception@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/domexception/-/domexception-4.0.0.tgz#4ad1be56ccadc86fc76d033353999a8037d03673" + integrity sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw== + dependencies: + webidl-conversions "^7.0.0" + domhandler@^5.0.2, domhandler@^5.0.3: version "5.0.3" resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-5.0.3.tgz#cc385f7f751f1d1fc650c21374804254538c7d31" @@ -3502,11 +4390,28 @@ ecc-jsbn@~0.1.1: jsbn "~0.1.0" safer-buffer "^2.1.0" +ejs@^3.1.10: + version "3.1.10" + resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.10.tgz#69ab8358b14e896f80cc39e62087b88500c3ac3b" + integrity sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA== + dependencies: + jake "^10.8.5" + electron-to-chromium@^1.4.668: version "1.4.767" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.767.tgz#b885cfefda5a2e7a7ee356c567602012294ed260" integrity sha512-nzzHfmQqBss7CE3apQHkHjXW77+8w3ubGCIoEijKCJebPufREaFETgGXWTkh32t259F3Kcq+R8MZdFdOJROgYw== +electron-to-chromium@^1.5.4: + version "1.5.19" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.19.tgz#aeaa0a076f3f0f0e8db2c57fd10158508f00725a" + integrity sha512-kpLJJi3zxTR1U828P+LIUDZ5ohixyo68/IcYOHLqnbTPr/wdgn4i1ECvmALN9E16JPA6cvCG5UG79gVwVdEK5w== + +emittery@^0.13.1: + version "0.13.1" + resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.13.1.tgz#c04b8c3457490e0847ae51fced3af52d338e3dad" + integrity sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ== + emoji-regex@10.3.0, emoji-regex@^10.2.1: version "10.3.0" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-10.3.0.tgz#76998b9268409eb3dae3de989254d456e70cfe23" @@ -3690,6 +4595,11 @@ es-to-primitive@^1.2.1: is-date-object "^1.0.1" is-symbol "^1.0.2" +escalade@^3.1.1: + version "3.2.0" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" + integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== + escalade@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.2.tgz#54076e9ab29ea5bf3d8f1ed62acffbb88272df27" @@ -3710,6 +4620,17 @@ escape-string-regexp@^4.0.0: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== +escodegen@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.1.0.tgz#ba93bbb7a43986d29d6041f99f5262da773e2e17" + integrity sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w== + dependencies: + esprima "^4.0.1" + estraverse "^5.2.0" + esutils "^2.0.2" + optionalDependencies: + source-map "~0.6.1" + eslint-config-next@14.2.3: version "14.2.3" resolved "https://registry.yarnpkg.com/eslint-config-next/-/eslint-config-next-14.2.3.tgz#2fb0f7c4eccda530a4b5054438162b2303786d4f" @@ -3918,6 +4839,11 @@ espree@^9.6.0, espree@^9.6.1: acorn-jsx "^5.3.2" eslint-visitor-keys "^3.4.1" +esprima@^4.0.0, esprima@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + esquery@^1.4.2: version "1.5.0" resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" @@ -3967,6 +4893,21 @@ execa@4.1.0: signal-exit "^3.0.2" strip-final-newline "^2.0.0" +execa@^5.0.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" + integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== + dependencies: + cross-spawn "^7.0.3" + get-stream "^6.0.0" + human-signals "^2.1.0" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.1" + onetime "^5.1.2" + signal-exit "^3.0.3" + strip-final-newline "^2.0.0" + executable@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/executable/-/executable-4.1.1.tgz#41532bff361d3e57af4d763b70582db18f5d133c" @@ -3974,12 +4915,17 @@ executable@^4.1.1: dependencies: pify "^2.2.0" +exit@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" + integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== + expand-template@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-2.0.3.tgz#6e14b3fcee0f3a6340ecb57d2e8918692052a47c" integrity sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg== -expect@^29.0.0: +expect@^29.0.0, expect@^29.7.0: version "29.7.0" resolved "https://registry.yarnpkg.com/expect/-/expect-29.7.0.tgz#578874590dcb3214514084c08115d8aee61e11bc" integrity sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw== @@ -4037,7 +4983,7 @@ fast-glob@^3.2.9, fast-glob@^3.3.1: merge2 "^1.3.0" micromatch "^4.0.4" -fast-json-stable-stringify@^2.0.0: +fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== @@ -4054,6 +5000,13 @@ fastq@^1.6.0: dependencies: reusify "^1.0.4" +fb-watchman@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.2.tgz#e9524ee6b5c77e9e5001af0f85f3adbb8623255c" + integrity sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA== + dependencies: + bser "2.1.1" + fd-slicer@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e" @@ -4080,6 +5033,13 @@ file-uri-to-path@1.0.0: resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== +filelist@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/filelist/-/filelist-1.0.4.tgz#f78978a1e944775ff9e62e744424f215e58352b5" + integrity sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q== + dependencies: + minimatch "^5.0.1" + fill-range@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" @@ -4092,6 +5052,14 @@ find-root@^1.1.0: resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4" integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng== +find-up@^4.0.0, find-up@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + find-up@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" @@ -4139,6 +5107,15 @@ forever-agent@~0.6.1: resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" integrity sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw== +form-data@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" + integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + form-data@~2.3.2: version "2.3.3" resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" @@ -4175,7 +5152,7 @@ fs.realpath@^1.0.0: resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== -fsevents@~2.3.2: +fsevents@^2.3.2, fsevents@~2.3.2: version "2.3.3" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== @@ -4233,6 +5210,11 @@ geotiff@^2.0.7: xml-utils "^1.0.2" zstddec "^0.1.0" +get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" @@ -4244,6 +5226,11 @@ get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.3, get-intrinsic@ has-symbols "^1.0.3" hasown "^2.0.0" +get-package-type@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" + integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== + get-stream@^5.0.0, get-stream@^5.1.0: version "5.2.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" @@ -4251,6 +5238,11 @@ get-stream@^5.0.0, get-stream@^5.1.0: dependencies: pump "^3.0.0" +get-stream@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== + get-symbol-description@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.2.tgz#533744d5aa20aca4e079c8e5daf7fd44202821f5" @@ -4442,6 +5434,18 @@ hoist-non-react-statics@^3.3.0, hoist-non-react-statics@^3.3.1, hoist-non-react- dependencies: react-is "^16.7.0" +html-encoding-sniffer@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz#2cb1a8cf0db52414776e5b2a7a04d5dd98158de9" + integrity sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA== + dependencies: + whatwg-encoding "^2.0.0" + +html-escaper@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" + integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== + http-cache-semantics@^4.1.0: version "4.1.1" resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz#abe02fcb2985460bf0323be664436ec3476a6d5a" @@ -4456,6 +5460,15 @@ http-proxy-agent@^4.0.1: agent-base "6" debug "4" +http-proxy-agent@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz#5129800203520d434f142bc78ff3c170800f2b43" + integrity sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w== + dependencies: + "@tootallnate/once" "2" + agent-base "6" + debug "4" + http-signature@~1.3.6: version "1.3.6" resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.3.6.tgz#cb6fbfdf86d1c974f343be94e87f7fc128662cf9" @@ -4465,7 +5478,7 @@ http-signature@~1.3.6: jsprim "^2.0.2" sshpk "^1.14.1" -https-proxy-agent@^5.0.0: +https-proxy-agent@^5.0.0, https-proxy-agent@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== @@ -4478,6 +5491,11 @@ human-signals@^1.1.1: resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== +human-signals@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" + integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== + humanize-ms@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed" @@ -4485,7 +5503,7 @@ humanize-ms@^1.2.1: dependencies: ms "^2.0.0" -iconv-lite@^0.6.2: +iconv-lite@0.6.3, iconv-lite@^0.6.2: version "0.6.3" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== @@ -4515,6 +5533,14 @@ import-fresh@^3.2.1, import-fresh@^3.3.0: parent-module "^1.0.0" resolve-from "^4.0.0" +import-local@^3.0.2: + version "3.2.0" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.2.0.tgz#c3d5c745798c02a6f8b897726aba5100186ee260" + integrity sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA== + dependencies: + pkg-dir "^4.2.0" + resolve-cwd "^3.0.0" + imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" @@ -4682,6 +5708,11 @@ is-fullwidth-code-point@^3.0.0: resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== +is-generator-fn@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" + integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== + is-generator-function@^1.0.10: version "1.0.10" resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" @@ -4736,6 +5767,11 @@ is-path-inside@^3.0.2, is-path-inside@^3.0.3: resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== +is-potential-custom-element-name@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" + integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== + is-regex@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" @@ -4835,6 +5871,59 @@ isstream@~0.1.2: resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" integrity sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g== +istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz#2d166c4b0644d43a39f04bf6c2edd1e585f31756" + integrity sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg== + +istanbul-lib-instrument@^5.0.4: + version "5.2.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz#d10c8885c2125574e1c231cacadf955675e1ce3d" + integrity sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg== + dependencies: + "@babel/core" "^7.12.3" + "@babel/parser" "^7.14.7" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-coverage "^3.2.0" + semver "^6.3.0" + +istanbul-lib-instrument@^6.0.0: + version "6.0.3" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz#fa15401df6c15874bcb2105f773325d78c666765" + integrity sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q== + dependencies: + "@babel/core" "^7.23.9" + "@babel/parser" "^7.23.9" + "@istanbuljs/schema" "^0.1.3" + istanbul-lib-coverage "^3.2.0" + semver "^7.5.4" + +istanbul-lib-report@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz#908305bac9a5bd175ac6a74489eafd0fc2445a7d" + integrity sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw== + dependencies: + istanbul-lib-coverage "^3.0.0" + make-dir "^4.0.0" + supports-color "^7.1.0" + +istanbul-lib-source-maps@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz#895f3a709fcfba34c6de5a42939022f3e4358551" + integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw== + dependencies: + debug "^4.1.1" + istanbul-lib-coverage "^3.0.0" + source-map "^0.6.1" + +istanbul-reports@^3.1.3: + version "3.1.7" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.7.tgz#daed12b9e1dca518e15c056e1e537e741280fa0b" + integrity sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g== + dependencies: + html-escaper "^2.0.0" + istanbul-lib-report "^3.0.0" + iterator.prototype@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/iterator.prototype/-/iterator.prototype-1.1.2.tgz#5e29c8924f01916cb9335f1ff80619dcff22b0c0" @@ -4855,6 +5944,96 @@ jackspeak@^2.3.5: optionalDependencies: "@pkgjs/parseargs" "^0.11.0" +jake@^10.8.5: + version "10.9.2" + resolved "https://registry.yarnpkg.com/jake/-/jake-10.9.2.tgz#6ae487e6a69afec3a5e167628996b59f35ae2b7f" + integrity sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA== + dependencies: + async "^3.2.3" + chalk "^4.0.2" + filelist "^1.0.4" + minimatch "^3.1.2" + +jest-changed-files@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-29.7.0.tgz#1c06d07e77c78e1585d020424dedc10d6e17ac3a" + integrity sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w== + dependencies: + execa "^5.0.0" + jest-util "^29.7.0" + p-limit "^3.1.0" + +jest-circus@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-29.7.0.tgz#b6817a45fcc835d8b16d5962d0c026473ee3668a" + integrity sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw== + dependencies: + "@jest/environment" "^29.7.0" + "@jest/expect" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + chalk "^4.0.0" + co "^4.6.0" + dedent "^1.0.0" + is-generator-fn "^2.0.0" + jest-each "^29.7.0" + jest-matcher-utils "^29.7.0" + jest-message-util "^29.7.0" + jest-runtime "^29.7.0" + jest-snapshot "^29.7.0" + jest-util "^29.7.0" + p-limit "^3.1.0" + pretty-format "^29.7.0" + pure-rand "^6.0.0" + slash "^3.0.0" + stack-utils "^2.0.3" + +jest-cli@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-29.7.0.tgz#5592c940798e0cae677eec169264f2d839a37995" + integrity sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg== + dependencies: + "@jest/core" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/types" "^29.6.3" + chalk "^4.0.0" + create-jest "^29.7.0" + exit "^0.1.2" + import-local "^3.0.2" + jest-config "^29.7.0" + jest-util "^29.7.0" + jest-validate "^29.7.0" + yargs "^17.3.1" + +jest-config@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-29.7.0.tgz#bcbda8806dbcc01b1e316a46bb74085a84b0245f" + integrity sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ== + dependencies: + "@babel/core" "^7.11.6" + "@jest/test-sequencer" "^29.7.0" + "@jest/types" "^29.6.3" + babel-jest "^29.7.0" + chalk "^4.0.0" + ci-info "^3.2.0" + deepmerge "^4.2.2" + glob "^7.1.3" + graceful-fs "^4.2.9" + jest-circus "^29.7.0" + jest-environment-node "^29.7.0" + jest-get-type "^29.6.3" + jest-regex-util "^29.6.3" + jest-resolve "^29.7.0" + jest-runner "^29.7.0" + jest-util "^29.7.0" + jest-validate "^29.7.0" + micromatch "^4.0.4" + parse-json "^5.2.0" + pretty-format "^29.7.0" + slash "^3.0.0" + strip-json-comments "^3.1.1" + jest-diff@^29.7.0: version "29.7.0" resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.7.0.tgz#017934a66ebb7ecf6f205e84699be10afd70458a" @@ -4865,11 +6044,82 @@ jest-diff@^29.7.0: jest-get-type "^29.6.3" pretty-format "^29.7.0" +jest-docblock@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-29.7.0.tgz#8fddb6adc3cdc955c93e2a87f61cfd350d5d119a" + integrity sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g== + dependencies: + detect-newline "^3.0.0" + +jest-each@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-29.7.0.tgz#162a9b3f2328bdd991beaabffbb74745e56577d1" + integrity sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ== + dependencies: + "@jest/types" "^29.6.3" + chalk "^4.0.0" + jest-get-type "^29.6.3" + jest-util "^29.7.0" + pretty-format "^29.7.0" + +jest-environment-jsdom@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-29.7.0.tgz#d206fa3551933c3fd519e5dfdb58a0f5139a837f" + integrity sha512-k9iQbsf9OyOfdzWH8HDmrRT0gSIcX+FLNW7IQq94tFX0gynPwqDTW0Ho6iMVNjGz/nb+l/vW3dWM2bbLLpkbXA== + dependencies: + "@jest/environment" "^29.7.0" + "@jest/fake-timers" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/jsdom" "^20.0.0" + "@types/node" "*" + jest-mock "^29.7.0" + jest-util "^29.7.0" + jsdom "^20.0.0" + +jest-environment-node@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-29.7.0.tgz#0b93e111dda8ec120bc8300e6d1fb9576e164376" + integrity sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw== + dependencies: + "@jest/environment" "^29.7.0" + "@jest/fake-timers" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + jest-mock "^29.7.0" + jest-util "^29.7.0" + jest-get-type@^29.6.3: version "29.6.3" resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.6.3.tgz#36f499fdcea197c1045a127319c0481723908fd1" integrity sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw== +jest-haste-map@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-29.7.0.tgz#3c2396524482f5a0506376e6c858c3bbcc17b104" + integrity sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA== + dependencies: + "@jest/types" "^29.6.3" + "@types/graceful-fs" "^4.1.3" + "@types/node" "*" + anymatch "^3.0.3" + fb-watchman "^2.0.0" + graceful-fs "^4.2.9" + jest-regex-util "^29.6.3" + jest-util "^29.7.0" + jest-worker "^29.7.0" + micromatch "^4.0.4" + walker "^1.0.8" + optionalDependencies: + fsevents "^2.3.2" + +jest-leak-detector@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz#5b7ec0dadfdfec0ca383dc9aa016d36b5ea4c728" + integrity sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw== + dependencies: + jest-get-type "^29.6.3" + pretty-format "^29.7.0" + jest-matcher-utils@^29.7.0: version "29.7.0" resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz#ae8fec79ff249fd592ce80e3ee474e83a6c44f12" @@ -4895,7 +6145,130 @@ jest-message-util@^29.7.0: slash "^3.0.0" stack-utils "^2.0.3" -jest-util@^29.7.0: +jest-mock@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-29.7.0.tgz#4e836cf60e99c6fcfabe9f99d017f3fdd50a6347" + integrity sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw== + dependencies: + "@jest/types" "^29.6.3" + "@types/node" "*" + jest-util "^29.7.0" + +jest-pnp-resolver@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz#930b1546164d4ad5937d5540e711d4d38d4cad2e" + integrity sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w== + +jest-regex-util@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-29.6.3.tgz#4a556d9c776af68e1c5f48194f4d0327d24e8a52" + integrity sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg== + +jest-resolve-dependencies@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz#1b04f2c095f37fc776ff40803dc92921b1e88428" + integrity sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA== + dependencies: + jest-regex-util "^29.6.3" + jest-snapshot "^29.7.0" + +jest-resolve@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-29.7.0.tgz#64d6a8992dd26f635ab0c01e5eef4399c6bcbc30" + integrity sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA== + dependencies: + chalk "^4.0.0" + graceful-fs "^4.2.9" + jest-haste-map "^29.7.0" + jest-pnp-resolver "^1.2.2" + jest-util "^29.7.0" + jest-validate "^29.7.0" + resolve "^1.20.0" + resolve.exports "^2.0.0" + slash "^3.0.0" + +jest-runner@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-29.7.0.tgz#809af072d408a53dcfd2e849a4c976d3132f718e" + integrity sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ== + dependencies: + "@jest/console" "^29.7.0" + "@jest/environment" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + chalk "^4.0.0" + emittery "^0.13.1" + graceful-fs "^4.2.9" + jest-docblock "^29.7.0" + jest-environment-node "^29.7.0" + jest-haste-map "^29.7.0" + jest-leak-detector "^29.7.0" + jest-message-util "^29.7.0" + jest-resolve "^29.7.0" + jest-runtime "^29.7.0" + jest-util "^29.7.0" + jest-watcher "^29.7.0" + jest-worker "^29.7.0" + p-limit "^3.1.0" + source-map-support "0.5.13" + +jest-runtime@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-29.7.0.tgz#efecb3141cf7d3767a3a0cc8f7c9990587d3d817" + integrity sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ== + dependencies: + "@jest/environment" "^29.7.0" + "@jest/fake-timers" "^29.7.0" + "@jest/globals" "^29.7.0" + "@jest/source-map" "^29.6.3" + "@jest/test-result" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + chalk "^4.0.0" + cjs-module-lexer "^1.0.0" + collect-v8-coverage "^1.0.0" + glob "^7.1.3" + graceful-fs "^4.2.9" + jest-haste-map "^29.7.0" + jest-message-util "^29.7.0" + jest-mock "^29.7.0" + jest-regex-util "^29.6.3" + jest-resolve "^29.7.0" + jest-snapshot "^29.7.0" + jest-util "^29.7.0" + slash "^3.0.0" + strip-bom "^4.0.0" + +jest-snapshot@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-29.7.0.tgz#c2c574c3f51865da1bb329036778a69bf88a6be5" + integrity sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw== + dependencies: + "@babel/core" "^7.11.6" + "@babel/generator" "^7.7.2" + "@babel/plugin-syntax-jsx" "^7.7.2" + "@babel/plugin-syntax-typescript" "^7.7.2" + "@babel/types" "^7.3.3" + "@jest/expect-utils" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" + babel-preset-current-node-syntax "^1.0.0" + chalk "^4.0.0" + expect "^29.7.0" + graceful-fs "^4.2.9" + jest-diff "^29.7.0" + jest-get-type "^29.6.3" + jest-matcher-utils "^29.7.0" + jest-message-util "^29.7.0" + jest-util "^29.7.0" + natural-compare "^1.4.0" + pretty-format "^29.7.0" + semver "^7.5.3" + +jest-util@^29.0.0, jest-util@^29.7.0: version "29.7.0" resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.7.0.tgz#23c2b62bfb22be82b44de98055802ff3710fc0bc" integrity sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA== @@ -4907,6 +6280,52 @@ jest-util@^29.7.0: graceful-fs "^4.2.9" picomatch "^2.2.3" +jest-validate@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-29.7.0.tgz#7bf705511c64da591d46b15fce41400d52147d9c" + integrity sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw== + dependencies: + "@jest/types" "^29.6.3" + camelcase "^6.2.0" + chalk "^4.0.0" + jest-get-type "^29.6.3" + leven "^3.1.0" + pretty-format "^29.7.0" + +jest-watcher@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-29.7.0.tgz#7810d30d619c3a62093223ce6bb359ca1b28a2f2" + integrity sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g== + dependencies: + "@jest/test-result" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + emittery "^0.13.1" + jest-util "^29.7.0" + string-length "^4.0.1" + +jest-worker@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.7.0.tgz#acad073acbbaeb7262bd5389e1bcf43e10058d4a" + integrity sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw== + dependencies: + "@types/node" "*" + jest-util "^29.7.0" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +jest@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest/-/jest-29.7.0.tgz#994676fc24177f088f1c5e3737f5697204ff2613" + integrity sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw== + dependencies: + "@jest/core" "^29.7.0" + "@jest/types" "^29.6.3" + import-local "^3.0.2" + jest-cli "^29.7.0" + jose@^4.15.5: version "4.15.9" resolved "https://registry.yarnpkg.com/jose/-/jose-4.15.9.tgz#9b68eda29e9a0614c042fa29387196c7dd800100" @@ -4917,6 +6336,14 @@ jose@^4.15.5: resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" 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" + integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + js-yaml@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" @@ -4934,6 +6361,38 @@ jsbn@~0.1.0: resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" integrity sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg== +jsdom@^20.0.0: + version "20.0.3" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-20.0.3.tgz#886a41ba1d4726f67a8858028c99489fed6ad4db" + integrity sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ== + dependencies: + abab "^2.0.6" + acorn "^8.8.1" + acorn-globals "^7.0.0" + cssom "^0.5.0" + cssstyle "^2.3.0" + data-urls "^3.0.2" + decimal.js "^10.4.2" + domexception "^4.0.0" + escodegen "^2.0.0" + form-data "^4.0.0" + html-encoding-sniffer "^3.0.0" + http-proxy-agent "^5.0.0" + https-proxy-agent "^5.0.1" + is-potential-custom-element-name "^1.0.1" + nwsapi "^2.2.2" + parse5 "^7.1.1" + saxes "^6.0.0" + symbol-tree "^3.2.4" + tough-cookie "^4.1.2" + w3c-xmlserializer "^4.0.0" + webidl-conversions "^7.0.0" + whatwg-encoding "^2.0.0" + whatwg-mimetype "^3.0.0" + whatwg-url "^11.0.0" + ws "^8.11.0" + xml-name-validator "^4.0.0" + jsesc@^2.5.1: version "2.5.2" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" @@ -4996,6 +6455,11 @@ json5@^2.2.3: resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== +jsonc-parser@^3.2.0: + version "3.3.1" + resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.3.1.tgz#f2a524b4f7fd11e3d791e559977ad60b98b798b4" + integrity sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ== + jsonfile@^6.0.1: version "6.1.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" @@ -5037,6 +6501,11 @@ keyv@^4.5.3: dependencies: json-buffer "3.0.1" +kleur@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" + integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== + language-subtag-registry@^0.3.20: version "0.3.22" resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz#2e1500861b2e457eba7e7ae86877cbd08fa1fd1d" @@ -5059,6 +6528,11 @@ lerc@^3.0.0: resolved "https://registry.yarnpkg.com/lerc/-/lerc-3.0.0.tgz#36f36fbd4ba46f0abf4833799fff2e7d6865f5cb" integrity sha512-Rm4J/WaHhRa93nCN2mwWDZFoRVF18G1f47C+kvQWyHGEZxFpTUi73p7lMVSAndyxGt6lJ2/CFbOcf9ra5p8aww== +leven@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" + integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== + levn@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" @@ -5086,6 +6560,13 @@ listr2@^3.8.3: through "^2.3.8" wrap-ansi "^7.0.0" +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + locate-path@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" @@ -5098,6 +6579,11 @@ lodash.debounce@^4.0.8: resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== +lodash.memoize@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" + integrity sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag== + lodash.merge@^4.6.2: version "4.6.2" resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" @@ -5108,7 +6594,7 @@ lodash.once@^4.1.1: resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac" integrity sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg== -lodash@^4.17.21: +lodash@^4.17.21, lodash@^4.17.5: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -5164,6 +6650,11 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" +lz-string@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/lz-string/-/lz-string-1.5.0.tgz#c1ab50f77887b712621201ba9fd4e3a6ed099941" + integrity sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ== + magic-string@^0.30.0: version "0.30.10" resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.10.tgz#123d9c41a0cb5640c892b041d4cfb3bd0aa4b39e" @@ -5171,6 +6662,18 @@ magic-string@^0.30.0: dependencies: "@jridgewell/sourcemap-codec" "^1.4.15" +make-dir@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-4.0.0.tgz#c3c2307a771277cd9638305f915c29ae741b614e" + integrity sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw== + dependencies: + semver "^7.5.3" + +make-error@^1.1.1, make-error@^1.3.6: + version "1.3.6" + resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" + integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== + make-fetch-happen@^9.1.0: version "9.1.0" resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz#53085a09e7971433e6765f7971bf63f4e05cb968" @@ -5193,6 +6696,13 @@ make-fetch-happen@^9.1.0: socks-proxy-agent "^6.0.0" ssri "^8.0.0" +makeerror@1.0.12: + version "1.0.12" + resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a" + integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg== + dependencies: + tmpl "1.0.5" + md5@^2.1.0: version "2.3.0" resolved "https://registry.yarnpkg.com/md5/-/md5-2.3.0.tgz#c3da9a6aae3a30b46b7b0c349b87b110dc3bda4f" @@ -5252,6 +6762,11 @@ mimic-response@^3.1.0: resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9" integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== +min-indent@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" + integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== + minimatch@9.0.3: version "9.0.3" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.3.tgz#a6e00c3de44c3a542bfaae70abfc22420a6da825" @@ -5259,13 +6774,20 @@ minimatch@9.0.3: dependencies: brace-expansion "^2.0.1" -minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: +minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== dependencies: brace-expansion "^1.1.7" +minimatch@^5.0.1: + version "5.1.6" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" + integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== + dependencies: + brace-expansion "^2.0.1" + minimatch@^9.0.1, minimatch@^9.0.4: version "9.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.4.tgz#8e49c731d1749cbec05050ee5145147b32496a51" @@ -5489,11 +7011,21 @@ node-gyp@8.x: tar "^6.1.2" which "^2.0.2" +node-int64@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" + integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== + node-releases@^2.0.14: version "2.0.14" resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.14.tgz#2ffb053bceb8b2be8495ece1ab6ce600c4461b0b" integrity sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw== +node-releases@^2.0.18: + version "2.0.18" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.18.tgz#f010e8d35e2fe8d6b2944f03f70213ecedc4ca3f" + integrity sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g== + nopt@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/nopt/-/nopt-5.0.0.tgz#530942bb58a512fccafe53fe210f13a25355dc88" @@ -5506,7 +7038,7 @@ normalize-path@^3.0.0, normalize-path@~3.0.0: resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== -npm-run-path@^4.0.0: +npm-run-path@^4.0.0, 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" integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== @@ -5530,6 +7062,11 @@ nth-check@^2.0.1: dependencies: boolbase "^1.0.0" +nwsapi@^2.2.2: + version "2.2.12" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.12.tgz#fb6af5c0ec35b27b4581eb3bbad34ec9e5c696f8" + integrity sha512-qXDmcVlZV4XRtKFzddidpfVP4oMSGhga+xdMc25mv8kaLUHtgzCDhUxkrN8exkGdTlLNaXj7CV3GtON7zuGZ+w== + oauth@^0.9.15: version "0.9.15" resolved "https://registry.yarnpkg.com/oauth/-/oauth-0.9.15.tgz#bd1fefaf686c96b75475aed5196412ff60cfb9c1" @@ -5635,7 +7172,7 @@ once@^1.3.0, once@^1.3.1, once@^1.4.0: dependencies: wrappy "1" -onetime@^5.1.0: +onetime@^5.1.0, onetime@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== @@ -5669,13 +7206,27 @@ ospath@^1.2.2: resolved "https://registry.yarnpkg.com/ospath/-/ospath-1.2.2.tgz#1276639774a3f8ef2572f7fe4280e0ea4550c07b" integrity sha512-o6E5qJV5zkAbIDNhGSIlyOhScKXgQrSRMilfph0clDfM0nEnBOlKlH4sWDmG95BW/CvwNz0vmm7dJVtU2KlMiA== -p-limit@^3.0.2: +p-limit@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-limit@^3.0.2, p-limit@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== dependencies: yocto-queue "^0.1.0" +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + p-locate@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" @@ -5690,6 +7241,11 @@ p-map@^4.0.0: dependencies: aggregate-error "^3.0.0" +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + pako@^2.0.4: version "2.1.0" resolved "https://registry.yarnpkg.com/pako/-/pako-2.1.0.tgz#266cc37f98c7d883545d11335c00fbd4062c9a86" @@ -5717,6 +7273,13 @@ parse-json@^5.0.0, parse-json@^5.2.0: json-parse-even-better-errors "^2.3.0" lines-and-columns "^1.1.6" +parse5@^7.0.0, parse5@^7.1.1: + version "7.1.2" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-7.1.2.tgz#0736bebbfd77793823240a23b7fc5e010b7f8e32" + integrity sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw== + dependencies: + entities "^4.4.0" + path-exists@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" @@ -5773,6 +7336,11 @@ picocolors@^1.0.0: resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.1.tgz#a8ad579b571952f0e5d25892de5445bcfe25aaa1" integrity sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew== +picocolors@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.0.tgz#5358b76a78cde483ba5cef6a9dc9671440b27d59" + integrity sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw== + picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3, picomatch@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" @@ -5783,6 +7351,18 @@ pify@^2.2.0: resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== +pirates@^4.0.4: + version "4.0.6" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.6.tgz#3018ae32ecfcff6c29ba2267cbf21166ac1f36b9" + integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== + +pkg-dir@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" + integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== + dependencies: + find-up "^4.0.0" + possible-typed-array-names@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz#89bb63c6fada2c3e90adc4a647beeeb39cc7bf8f" @@ -5842,6 +7422,15 @@ pretty-bytes@^5.6.0: resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.6.0.tgz#356256f643804773c82f64723fe78c92c62beaeb" integrity sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg== +pretty-format@^27.0.2: + version "27.5.1" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-27.5.1.tgz#2181879fdea51a7a5851fb39d920faa63f01d88e" + integrity sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ== + dependencies: + ansi-regex "^5.0.1" + ansi-styles "^5.0.0" + react-is "^17.0.1" + pretty-format@^29.0.0, pretty-format@^29.7.0: version "29.7.0" resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.7.0.tgz#ca42c758310f365bfa71a0bda0a807160b776812" @@ -5881,6 +7470,14 @@ promise-retry@^2.0.1: err-code "^2.0.2" retry "^0.12.0" +prompts@^2.0.1: + version "2.4.2" + resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" + integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== + dependencies: + kleur "^3.0.3" + sisteransi "^1.0.5" + prop-types@^15.6.2, prop-types@^15.8.1: version "15.8.1" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" @@ -5923,6 +7520,11 @@ punycode@^2.1.0, punycode@^2.1.1: resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== +pure-rand@^6.0.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/pure-rand/-/pure-rand-6.1.0.tgz#d173cf23258231976ccbdb05247c9787957604f2" + integrity sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA== + qr-scanner@^1.4.2: version "1.4.2" resolved "https://registry.yarnpkg.com/qr-scanner/-/qr-scanner-1.4.2.tgz#bc4fb88022a8c9be95c49527a1c8fb8724b47dc4" @@ -6015,6 +7617,11 @@ react-is@^16.10.2, react-is@^16.13.1, react-is@^16.7.0: resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== +react-is@^17.0.1: + version "17.0.2" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" + integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== + react-is@^18.0.0, react-is@^18.2.0: version "18.3.1" resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.3.1.tgz#e83557dc12eae63a99e003a46388b1dcbb44db7e" @@ -6083,6 +7690,14 @@ recharts@^2.12.6: tiny-invariant "^1.3.1" victory-vendor "^36.6.8" +redent@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f" + integrity sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg== + dependencies: + indent-string "^4.0.0" + strip-indent "^3.0.0" + reflect.getprototypeof@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz#3ab04c32a8390b770712b7a8633972702d278859" @@ -6156,16 +7771,33 @@ request-progress@^3.0.0: dependencies: throttleit "^1.0.0" +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== + requires-port@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== +resolve-cwd@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" + integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== + dependencies: + resolve-from "^5.0.0" + resolve-from@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== +resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + resolve-pkg-maps@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz#616b3dc2c57056b5588c31cdf4b3d64db133720f" @@ -6178,7 +7810,12 @@ resolve-protobuf-schema@^2.1.0: dependencies: protocol-buffers-schema "^3.3.1" -resolve@^1.14.2, resolve@^1.19.0, resolve@^1.22.4: +resolve.exports@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-2.0.2.tgz#f8c934b8e6a13f539e38b7098e2e36134f01e800" + integrity sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg== + +resolve@^1.14.2, resolve@^1.19.0, resolve@^1.20.0, resolve@^1.22.4: version "1.22.8" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== @@ -6278,6 +7915,13 @@ sass@^1.75.0: immutable "^4.0.0" source-map-js ">=0.6.2 <2.0.0" +saxes@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/saxes/-/saxes-6.0.0.tgz#fe5b4a4768df4f14a201b1ba6a65c1f3d9988cc5" + integrity sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA== + dependencies: + xmlchars "^2.2.0" + scheduler@^0.23.2: version "0.23.2" resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.2.tgz#414ba64a3b282892e944cf2108ecc078d115cdc3" @@ -6285,12 +7929,12 @@ scheduler@^0.23.2: dependencies: loose-envify "^1.1.0" -semver@^6.3.1: +semver@^6.3.0, semver@^6.3.1: version "6.3.1" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^7.3.5: +semver@^7.3.5, semver@^7.6.3: version "7.6.3" resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== @@ -6349,7 +7993,7 @@ side-channel@^1.0.4, side-channel@^1.0.6: get-intrinsic "^1.2.4" object-inspect "^1.13.1" -signal-exit@^3.0.2, signal-exit@^3.0.7: +signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: version "3.0.7" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== @@ -6373,6 +8017,11 @@ simple-get@^4.0.0: once "^1.3.1" simple-concat "^1.0.0" +sisteransi@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" + integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== + slash@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" @@ -6431,16 +8080,34 @@ socks@^2.6.2: resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.0.tgz#16b809c162517b5b8c3e7dcd315a2a5c2612b2af" integrity sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg== +source-map-support@0.5.13: + version "0.5.13" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.13.tgz#31b24a9c2e73c2de85066c0feb7d44767ed52932" + integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + source-map@^0.5.7: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== +source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + sprintf-js@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.3.tgz#4914b903a2f8b685d17fdf78a70e917e872e444a" integrity sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA== +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== + sqlite3@^5.1.7: version "5.1.7" resolved "https://registry.yarnpkg.com/sqlite3/-/sqlite3-5.1.7.tgz#59ca1053c1ab38647396586edad019b1551041b7" @@ -6487,16 +8154,15 @@ streamsearch@^1.1.0: resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-1.1.0.tgz#404dd1e2247ca94af554e841a8ef0eaa238da764" integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg== -"string-width-cjs@npm:string-width@^4.2.0": - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== +string-length@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a" + integrity sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ== dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" + char-regex "^1.0.2" + strip-ansi "^6.0.0" -string-width@4.2.3, "string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3, string-width@^5.0.1, string-width@^5.1.2: +"string-width-cjs@npm:string-width@^4.2.0", string-width@4.2.3, "string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3, string-width@^5.0.1, string-width@^5.1.2: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -6558,7 +8224,7 @@ string_decoder@^1.1.1: dependencies: safe-buffer "~5.2.0" -"strip-ansi-cjs@npm:strip-ansi@^6.0.1": +"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -6572,13 +8238,6 @@ strip-ansi@^4.0.0: dependencies: ansi-regex "^3.0.0" -strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - strip-ansi@^7.0.1: version "7.1.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" @@ -6591,11 +8250,23 @@ strip-bom@^3.0.0: resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== +strip-bom@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" + integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== + strip-final-newline@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== +strip-indent@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001" + integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ== + dependencies: + min-indent "^1.0.0" + strip-json-comments@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" @@ -6632,7 +8303,7 @@ supports-color@^7.1.0: dependencies: has-flag "^4.0.0" -supports-color@^8.1.1: +supports-color@^8.0.0, supports-color@^8.1.1: version "8.1.1" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== @@ -6662,6 +8333,11 @@ svgo@^3.0.2: csso "^5.0.5" picocolors "^1.0.0" +symbol-tree@^3.2.4: + version "3.2.4" + resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" + integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== + tapable@^2.2.0: version "2.2.1" resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" @@ -6700,6 +8376,15 @@ tar@^6.0.2, tar@^6.1.11, tar@^6.1.2: mkdirp "^1.0.3" yallist "^4.0.0" +test-exclude@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" + integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== + dependencies: + "@istanbuljs/schema" "^0.1.2" + glob "^7.1.4" + minimatch "^3.0.4" + text-table@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" @@ -6725,6 +8410,11 @@ tmp@~0.2.1: resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.3.tgz#eb783cc22bc1e8bebd0671476d46ea4eb32a79ae" integrity sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w== +tmpl@1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" + integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== + to-fast-properties@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" @@ -6737,7 +8427,7 @@ to-regex-range@^5.0.1: dependencies: is-number "^7.0.0" -tough-cookie@^4.1.3: +tough-cookie@^4.1.2, tough-cookie@^4.1.3: version "4.1.4" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.4.tgz#945f1461b45b5a8c76821c33ea49c3ac192c1b36" integrity sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag== @@ -6747,6 +8437,13 @@ tough-cookie@^4.1.3: universalify "^0.2.0" url-parse "^1.5.3" +tr46@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-3.0.0.tgz#555c4e297a950617e8eeddef633c87d4d9d6cbf9" + integrity sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA== + dependencies: + punycode "^2.1.1" + tr46@~0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" @@ -6757,6 +8454,47 @@ ts-api-utils@^1.0.1, ts-api-utils@^1.3.0: resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.3.0.tgz#4b490e27129f1e8e686b45cc4ab63714dc60eea1" integrity sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ== +ts-jest@^29.2.5: + version "29.2.5" + resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-29.2.5.tgz#591a3c108e1f5ebd013d3152142cb5472b399d63" + integrity sha512-KD8zB2aAZrcKIdGk4OwpJggeLcH1FgrICqDSROWqlnJXGCXK4Mn6FcdK2B6670Xr73lHMG1kHw8R87A0ecZ+vA== + dependencies: + bs-logger "^0.2.6" + ejs "^3.1.10" + fast-json-stable-stringify "^2.1.0" + jest-util "^29.0.0" + json5 "^2.2.3" + lodash.memoize "^4.1.2" + make-error "^1.3.6" + semver "^7.6.3" + yargs-parser "^21.1.1" + +ts-mockito@^2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/ts-mockito/-/ts-mockito-2.6.1.tgz#bc9ee2619033934e6fad1c4455aca5b5ace34e73" + integrity sha512-qU9m/oEBQrKq5hwfbJ7MgmVN5Gu6lFnIGWvpxSjrqq6YYEVv+RwVFWySbZMBgazsWqv6ctAyVBpo9TmAxnOEKw== + dependencies: + lodash "^4.17.5" + +ts-node@^10.9.2: + version "10.9.2" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.2.tgz#70f021c9e185bccdca820e26dc413805c101c71f" + integrity sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ== + dependencies: + "@cspotcode/source-map-support" "^0.8.0" + "@tsconfig/node10" "^1.0.7" + "@tsconfig/node12" "^1.0.7" + "@tsconfig/node14" "^1.0.0" + "@tsconfig/node16" "^1.0.2" + acorn "^8.4.1" + acorn-walk "^8.1.1" + arg "^4.1.0" + create-require "^1.1.0" + diff "^4.0.1" + make-error "^1.1.1" + v8-compile-cache-lib "^3.0.1" + yn "3.1.1" + tsconfig-paths@^3.15.0: version "3.15.0" resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz#5299ec605e55b1abb23ec939ef15edaf483070d4" @@ -6791,6 +8529,11 @@ type-check@^0.4.0, type-check@~0.4.0: dependencies: prelude-ls "^1.2.1" +type-detect@4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" + integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== + type-fest@^0.20.2: version "0.20.2" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" @@ -6946,6 +8689,14 @@ update-browserslist-db@^1.0.13: escalade "^3.1.2" picocolors "^1.0.0" +update-browserslist-db@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz#7ca61c0d8650766090728046e416a8cde682859e" + integrity sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ== + dependencies: + escalade "^3.1.2" + picocolors "^1.0.1" + uri-js@^4.2.2: version "4.4.1" resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" @@ -6987,6 +8738,20 @@ uuid@^8.3.2: resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== +v8-compile-cache-lib@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" + integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== + +v8-to-istanbul@^9.0.1: + version "9.3.0" + resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz#b9572abfa62bd556c16d75fdebc1a411d5ff3175" + integrity sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA== + dependencies: + "@jridgewell/trace-mapping" "^0.3.12" + "@types/istanbul-lib-coverage" "^2.0.1" + convert-source-map "^2.0.0" + verror@1.10.0: version "1.10.0" resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" @@ -7016,6 +8781,20 @@ victory-vendor@^36.6.8: d3-time "^3.0.0" d3-timer "^3.0.1" +w3c-xmlserializer@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz#aebdc84920d806222936e3cdce408e32488a3073" + integrity sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw== + dependencies: + xml-name-validator "^4.0.0" + +walker@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" + integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== + dependencies: + makeerror "1.0.12" + web-vitals@^3.5.2: version "3.5.2" resolved "https://registry.yarnpkg.com/web-vitals/-/web-vitals-3.5.2.tgz#5bb58461bbc173c3f00c2ddff8bfe6e680999ca9" @@ -7031,11 +8810,36 @@ webidl-conversions@^3.0.0: resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== +webidl-conversions@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-7.0.0.tgz#256b4e1882be7debbf01d05f0aa2039778ea080a" + integrity sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g== + +whatwg-encoding@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz#e7635f597fd87020858626805a2729fa7698ac53" + integrity sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg== + dependencies: + iconv-lite "0.6.3" + whatwg-fetch@^3.4.1: version "3.6.20" resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz#580ce6d791facec91d37c72890995a0b48d31c70" integrity sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg== +whatwg-mimetype@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz#5fa1a7623867ff1af6ca3dc72ad6b8a4208beba7" + integrity sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q== + +whatwg-url@^11.0.0: + version "11.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-11.0.0.tgz#0a849eebb5faf2119b901bb76fd795c2848d4018" + integrity sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ== + dependencies: + tr46 "^3.0.0" + webidl-conversions "^7.0.0" + whatwg-url@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" @@ -7113,7 +8917,7 @@ word-wrap@^1.2.5: resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== @@ -7131,15 +8935,6 @@ wrap-ansi@^6.2.0: string-width "^4.1.0" strip-ansi "^6.0.0" -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - wrap-ansi@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" @@ -7154,6 +8949,24 @@ wrappy@1: resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== +write-file-atomic@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-4.0.2.tgz#a9df01ae5b77858a027fd2e80768ee433555fcfd" + integrity sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg== + dependencies: + imurmurhash "^0.1.4" + signal-exit "^3.0.7" + +ws@^8.11.0: + version "8.18.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.18.0.tgz#0d7505a6eafe2b0e712d232b42279f53bc289bbc" + integrity sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw== + +xml-name-validator@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-4.0.0.tgz#79a006e2e63149a8600f15430f0a4725d1524835" + integrity sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw== + xml-utils@^1.0.2: version "1.8.0" resolved "https://registry.yarnpkg.com/xml-utils/-/xml-utils-1.8.0.tgz#dd9baa161012849b97703d8423d09d9d815a5910" @@ -7164,6 +8977,16 @@ xml@^1.0.0: resolved "https://registry.yarnpkg.com/xml/-/xml-1.0.1.tgz#78ba72020029c5bc87b8a81a3cfcd74b4a2fc1e5" integrity sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw== +xmlchars@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" + integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== + +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + yallist@^3.0.2: version "3.1.1" resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" @@ -7179,6 +9002,24 @@ yaml@^1.10.0: resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== +yargs-parser@^21.1.1: + version "21.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" + integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== + +yargs@^17.3.1: + version "17.7.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" + integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== + dependencies: + cliui "^8.0.1" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.1.1" + yauzl@^2.10.0: version "2.10.0" resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9" @@ -7187,6 +9028,11 @@ yauzl@^2.10.0: buffer-crc32 "~0.2.3" fd-slicer "~1.1.0" +yn@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" + integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== + yocto-queue@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" From a35aaf1b81feb48e5f0f181e380b0bd45a825ce4 Mon Sep 17 00:00:00 2001 From: "XITASO\\pawel.baran" Date: Wed, 11 Sep 2024 17:05:01 +0200 Subject: [PATCH 28/55] MNES-468: build fixed --- .eslintrc.js | 6 + package.json | 2 +- .../[locale]/_components/DashboardInput.tsx | 1 - .../compare/_components/CompareView.tsx | 5 +- .../_components/DiscoveryListView.tsx | 6 +- .../azureAuthentication/ApiProvider.tsx | 23 +- src/lib/api/basyx-v3/api.ts | 4 +- src/lib/api/basyx-v3/apiInMemory.ts | 24 +- .../discoveryServiceApiInMemory.ts | 2 +- .../registryServiceApiInMemory.ts | 10 +- .../template-shell-api/templateShellApi.ts | 1 + .../MultipleDataSource.ts | 115 ++++++++++ .../multipleDataSourceActions.ts | 124 +--------- .../services/searchUtilActions/AasSearcher.ts | 205 +++++++++++++++++ .../services/searchUtilActions/search.spec.ts | 2 +- .../searchUtilActions/searchServer.ts | 211 +----------------- src/lib/util/Log.ts | 40 ++-- src/lib/util/tracker.ts | 4 +- yarn.lock | 9 +- 19 files changed, 399 insertions(+), 395 deletions(-) create mode 100644 src/lib/services/multipleDataSourceActions/MultipleDataSource.ts create mode 100644 src/lib/services/searchUtilActions/AasSearcher.ts diff --git a/.eslintrc.js b/.eslintrc.js index e412de9..ff2df74 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -22,6 +22,12 @@ module.exports = { 'object-curly-spacing': [1, 'always'], 'formatjs/no-id': 1, 'react-hooks/exhaustive-deps': 'off', + '@typescript-eslint/no-unused-vars': [ + 'error', + { + argsIgnorePattern: '^_', + }, + ], }, settings: { react: { diff --git a/package.json b/package.json index 96a3210..517f6f6 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,7 @@ "@types/flat": "^5.0.5", "@types/jest": "^29.5.12", "@types/lodash": "^4.17.0", - "@types/node": "^22.4.2", + "@types/node": "^22.5.4", "@types/react": "^18.2.79", "@types/react-dom": "^18.2.25", "@typescript-eslint/eslint-plugin": "^7.7.1", diff --git a/src/app/[locale]/_components/DashboardInput.tsx b/src/app/[locale]/_components/DashboardInput.tsx index 614e530..a39d0ac 100644 --- a/src/app/[locale]/_components/DashboardInput.tsx +++ b/src/app/[locale]/_components/DashboardInput.tsx @@ -8,7 +8,6 @@ import { handleSearchForAas } from 'lib/services/searchUtilActions/searchClient' import { useRouter } from 'next/navigation'; import { useAasState, useRegistryAasState } from 'components/contexts/CurrentAasContext'; import { LocalizedError } from 'lib/util/LocalizedError'; -import { useApis } from 'components/azureAuthentication/ApiProvider'; export const DashboardInput = () => { const [, setAas] = useAasState(); diff --git a/src/app/[locale]/compare/_components/CompareView.tsx b/src/app/[locale]/compare/_components/CompareView.tsx index 1e6c367..a6f09f6 100644 --- a/src/app/[locale]/compare/_components/CompareView.tsx +++ b/src/app/[locale]/compare/_components/CompareView.tsx @@ -13,7 +13,6 @@ import { useSearchParams } from 'next/navigation'; import { showError } from 'lib/util/ErrorHandlerUtil'; import { AasSearchResult, handleSearchForAas } from 'lib/services/searchUtilActions/searchClient'; import { LocalizedError } from 'lib/util/LocalizedError'; -import { useApis } from 'components/azureAuthentication/ApiProvider'; export function CompareView() { const { compareAas, addSeveralAas, deleteAas, addAas } = useCompareAasContext(); @@ -25,8 +24,6 @@ export function CompareView() { }); const [addModalOpen, setAddModalOpen] = useState(false); - const { repositoryClient } = useApis(); - useEffect(() => { async function _fetchAas() { try { @@ -61,7 +58,7 @@ export function CompareView() { const handleAddAas = async (aasId: string) => { let aasSearch: AasSearchResult; try { - aasSearch = await handleSearchForAas(aasId, repositoryClient); + aasSearch = await handleSearchForAas(aasId); } catch (e) { throw new LocalizedError(messages.mnestix.aasUrlNotFound); } diff --git a/src/app/[locale]/viewer/discovery/_components/DiscoveryListView.tsx b/src/app/[locale]/viewer/discovery/_components/DiscoveryListView.tsx index 9852d3c..6a3eb4f 100644 --- a/src/app/[locale]/viewer/discovery/_components/DiscoveryListView.tsx +++ b/src/app/[locale]/viewer/discovery/_components/DiscoveryListView.tsx @@ -15,10 +15,8 @@ import { useEnv } from 'app/env/provider'; import { encodeBase64 } from 'lib/util/Base64Util'; import ListHeader from 'components/basics/ListHeader'; import { performDiscoveryAasSearch, performRegistryAasSearch } from 'lib/services/searchUtilActions/searchServer'; -import { - performSearchAasFromAllRepositories, - RepoSearchResult, -} from 'lib/services/multipleDataSourceActions/multipleDataSourceActions'; +import { performSearchAasFromAllRepositories } from 'lib/services/multipleDataSourceActions/multipleDataSourceActions'; +import { RepoSearchResult } from 'lib/services/multipleDataSourceActions/MultipleDataSource'; export const DiscoveryListView = () => { const [isLoadingList, setIsLoadingList] = useState(false); diff --git a/src/components/azureAuthentication/ApiProvider.tsx b/src/components/azureAuthentication/ApiProvider.tsx index b4f71eb..7aa9c0f 100644 --- a/src/components/azureAuthentication/ApiProvider.tsx +++ b/src/components/azureAuthentication/ApiProvider.tsx @@ -16,24 +16,25 @@ const ApiContext = React.createContext(null); export const ApiProvider = (props: PropsWithChildren) => { const env = useEnv(); const apis = { - templateClientWithAuth: new TemplateClient( - env.MNESTIX_BACKEND_API_URL, - mnestixFetch(), - ), - aasListClient: new AasListClient( + templateClientWithAuth: new TemplateClient(env.MNESTIX_BACKEND_API_URL, mnestixFetch()), + aasListClient: new AasListClient(env.MNESTIX_BACKEND_API_URL, mnestixFetch()), + configurationClient: new ConfigurationShellApi( env.MNESTIX_BACKEND_API_URL, + env.AUTHENTICATION_FEATURE_FLAG, mnestixFetch(), ), - configurationClient: new ConfigurationShellApi( - env.MNESTIX_BACKEND_API_URL, - env.AUTHENTICATION_FEATURE_FLAG, - mnestixFetch()), templatesClient: new TemplateShellApi( env.MNESTIX_BACKEND_API_URL ? env.MNESTIX_BACKEND_API_URL : '', env.AUTHENTICATION_FEATURE_FLAG, ), - repositoryClient: new AssetAdministrationShellRepositoryApi({ basePath: env.AAS_REPO_API_URL, fetch: mnestixFetch() }), - submodelClient: new SubmodelRepositoryApi({ basePath: env.SUBMODEL_REPO_API_URL ?? env.AAS_REPO_API_URL, fetch: mnestixFetch() }), + repositoryClient: AssetAdministrationShellRepositoryApi.create({ + basePath: env.AAS_REPO_API_URL, + fetch: mnestixFetch(), + }), + submodelClient: SubmodelRepositoryApi.create({ + basePath: env.SUBMODEL_REPO_API_URL ?? env.AAS_REPO_API_URL, + fetch: mnestixFetch(), + }), discoveryServiceClient: DiscoveryServiceApi.create(env.DISCOVERY_API_URL), registryServiceClient: RegistryServiceApi.create(env.REGISTRY_API_URL), submodelRegistryServiceClient: new SubmodelRegistryServiceApi(env.SUBMODEL_REGISTRY_API_URL), diff --git a/src/lib/api/basyx-v3/api.ts b/src/lib/api/basyx-v3/api.ts index 26551f9..f9772d8 100644 --- a/src/lib/api/basyx-v3/api.ts +++ b/src/lib/api/basyx-v3/api.ts @@ -7,7 +7,7 @@ import { encodeBase64 } from 'lib/util/Base64Util'; import { IAssetAdministrationShellRepositoryApi, ISubmodelRepositoryApi } from 'lib/api/basyx-v3/apiInterface'; import { AssetAdministrationShellRepositoryApiInMemory, - SubmodelRepositoryApiInMemory, + SubmodelRepositoryApiInMemory } from 'lib/api/basyx-v3/apiInMemory'; const BASE_PATH = '/'.replace(/\/+$/, ''); @@ -75,7 +75,7 @@ export class RequiredError extends Error { * @extends {BaseAPI} */ export class AssetAdministrationShellRepositoryApi extends BaseAPI implements IAssetAdministrationShellRepositoryApi { - constructor(configuration?: Configuration | undefined, basePath?: string, fetch?: FetchAPI) { + private constructor(configuration?: Configuration | undefined, basePath?: string, fetch?: FetchAPI) { super(configuration, basePath, fetch); } diff --git a/src/lib/api/basyx-v3/apiInMemory.ts b/src/lib/api/basyx-v3/apiInMemory.ts index b48778d..35442d9 100644 --- a/src/lib/api/basyx-v3/apiInMemory.ts +++ b/src/lib/api/basyx-v3/apiInMemory.ts @@ -11,8 +11,8 @@ export class AssetAdministrationShellRepositoryApiInMemory implements IAssetAdmi getAssetAdministrationShellById( aasId: string, - options?: object | undefined, - basePath?: string | undefined, + _options?: object | undefined, + _basePath?: string | undefined, ): Promise { if (!this.shellsSavedInTheRepository) return Promise.reject('no repository configuration'); for (const aas of this.shellsSavedInTheRepository) { @@ -27,11 +27,15 @@ export class AssetAdministrationShellRepositoryApiInMemory implements IAssetAdmi ); } - getSubmodelReferencesFromShell(aasId: string, options?: object | undefined): Promise { + getSubmodelReferencesFromShell(_aasId: string, _options?: object | undefined): Promise { throw new Error('Method not implemented.'); } - getThumbnailFromShell(aasId: string, options?: object | undefined, basePath?: string | undefined): Promise { + getThumbnailFromShell( + _aasId: string, + _options?: object | undefined, + _basePath?: string | undefined, + ): Promise { throw new Error('Method not implemented.'); } } @@ -43,14 +47,14 @@ export class SubmodelRepositoryApiInMemory implements ISubmodelRepositoryApi { this.submodelsSavedInTheRepository = options.submodelsSavedInTheRepository; } - getSubmodelMetaDataById(submodelId: string, options?: object | undefined): Promise { + getSubmodelMetaDataById(_submodelId: string, _options?: object | undefined): Promise { throw new Error('Method not implemented.'); } getSubmodelById( submodelId: string, - options?: object | undefined, - basePath?: string | undefined, + _options?: object | undefined, + _basePath?: string | undefined, ): Promise { if (!this.submodelsSavedInTheRepository) return Promise.reject('no repository configuration'); for (const submodel of this.submodelsSavedInTheRepository) { @@ -60,9 +64,9 @@ export class SubmodelRepositoryApiInMemory implements ISubmodelRepositoryApi { } getAttachmentFromSubmodelElement( - submodelId: string, - submodelElementPath: string, - options?: object | undefined, + _submodelId: string, + _submodelElementPath: string, + _options?: object | undefined, ): Promise { throw new Error('Method not implemented.'); } diff --git a/src/lib/api/discovery-service-api/discoveryServiceApiInMemory.ts b/src/lib/api/discovery-service-api/discoveryServiceApiInMemory.ts index 52c83e7..f9002a1 100644 --- a/src/lib/api/discovery-service-api/discoveryServiceApiInMemory.ts +++ b/src/lib/api/discovery-service-api/discoveryServiceApiInMemory.ts @@ -16,7 +16,7 @@ export class DiscoveryServiceApiInMemory implements IDiscoveryServiceApi { if (discoveryEntry.assetId === assetId) return Promise.resolve({ paging_metadata: '', - result: discoveryEntry.aasIds + result: discoveryEntry.aasIds, }); } return Promise.reject('not found'); diff --git a/src/lib/api/registry-service-api/registryServiceApiInMemory.ts b/src/lib/api/registry-service-api/registryServiceApiInMemory.ts index fce3050..5171b01 100644 --- a/src/lib/api/registry-service-api/registryServiceApiInMemory.ts +++ b/src/lib/api/registry-service-api/registryServiceApiInMemory.ts @@ -23,18 +23,18 @@ export class RegistryServiceApiInMemory implements IRegistryServiceApi { return Promise.reject(new Error('no shell descriptor for aasId:' + aasId)); } - postAssetAdministrationShellDescriptor(shellDescriptor: AssetAdministrationShellDescriptor): Promise { + postAssetAdministrationShellDescriptor(_shellDescriptor: AssetAdministrationShellDescriptor): Promise { throw new Error('Method not implemented.'); } putAssetAdministrationShellDescriptorById( - aasId: string, - shellDescriptor: AssetAdministrationShellDescriptor + _aasId: string, + _shellDescriptor: AssetAdministrationShellDescriptor, ): Promise { throw new Error('Method not implemented.'); } - deleteAssetAdministrationShellDescriptorById(aasId: string): Promise { + deleteAssetAdministrationShellDescriptorById(_aasId: string): Promise { throw new Error('Method not implemented.'); } -} \ No newline at end of file +} diff --git a/src/lib/api/template-shell-api/templateShellApi.ts b/src/lib/api/template-shell-api/templateShellApi.ts index b4960eb..dd95457 100644 --- a/src/lib/api/template-shell-api/templateShellApi.ts +++ b/src/lib/api/template-shell-api/templateShellApi.ts @@ -5,6 +5,7 @@ export class TemplateShellApi { basePathOwnApi: string; basePathCustoms: string; enable_authentication: boolean; + constructor(backendApiUrl: string, enable_authentication: boolean) { this.basePathOwnApi = `${backendApiUrl}/api/Template`; this.basePathCustoms = `${backendApiUrl}/templates/custom`; diff --git a/src/lib/services/multipleDataSourceActions/MultipleDataSource.ts b/src/lib/services/multipleDataSourceActions/MultipleDataSource.ts new file mode 100644 index 0000000..28933c3 --- /dev/null +++ b/src/lib/services/multipleDataSourceActions/MultipleDataSource.ts @@ -0,0 +1,115 @@ +import { IAssetAdministrationShellRepositoryApi, ISubmodelRepositoryApi } from 'lib/api/basyx-v3/apiInterface'; +import { Log } from 'lib/util/Log'; +import { AssetAdministrationShellRepositoryApi, SubmodelRepositoryApi } from 'lib/api/basyx-v3/api'; +import { mnestixFetch } from 'lib/api/infrastructure'; +import { getConnectionDataByTypeAction } from 'app/[locale]/settings/_components/mnestix-connections/MnestixConnectionServerActions'; +import { AssetAdministrationShell, Submodel } from '@aas-core-works/aas-core3.0-typescript/dist/types/types'; + +export type RepoSearchResult = { + aas: AssetAdministrationShell; + location: string; +}; + +interface NullableSearchSetupParameters { + shellsByRegistryEndpoint?: { path: string; aas: AssetAdministrationShell }[] | null; + shellsSavedInTheRepository?: AssetAdministrationShell[] | null; + submodelsSavedInTheRepository?: Submodel[] | null; + log?: Log | null; +} + +export class MultipleDataSource { + private constructor( + protected readonly repositoryClient: IAssetAdministrationShellRepositoryApi, + protected readonly submodelRepositoryClient: ISubmodelRepositoryApi, + protected readonly fetch: (input: RequestInfo | URL, init?: RequestInit | undefined) => Promise, + protected readonly log: Log, + ) {} + + static create(): MultipleDataSource { + const repositoryClient = AssetAdministrationShellRepositoryApi.create({ + basePath: process.env.AAS_REPO_API_URL, + fetch: mnestixFetch(), + }); + const submodelRepositoryClient = SubmodelRepositoryApi.create({ + basePath: process.env.SUBMODEL_REPO_API_URL, + fetch: mnestixFetch(), + }); + const log = Log.create(); + return new MultipleDataSource(repositoryClient, submodelRepositoryClient, fetch, log); + } + + static createNull({ + shellsByRegistryEndpoint = [], + shellsSavedInTheRepository = [], + submodelsSavedInTheRepository = [], + log = null, + }: NullableSearchSetupParameters = {}): MultipleDataSource { + const stubbedFetch = async (input: RequestInfo | URL): Promise => { + if (!shellsByRegistryEndpoint) return Promise.reject(new Error('no registry configuration')); + for (const aasEntry of shellsByRegistryEndpoint) { + if (aasEntry.path === input) return new Response(JSON.stringify(aasEntry.aas)); + } + return Promise.reject(new Error('no aas for on href:' + input)); + }; + return new MultipleDataSource( + AssetAdministrationShellRepositoryApi.createNull({ shellsSavedInTheRepository }), + SubmodelRepositoryApi.createNull({ submodelsSavedInTheRepository }), + stubbedFetch, + log ?? Log.createNull(), + ); + } + + async getAasFromAllRepos(aasId: string): Promise { + const basePathUrls = await getConnectionDataByTypeAction({ id: '0', typeName: 'AAS_REPOSITORY' }); + + const promises = basePathUrls.map( + (url) => + this.repositoryClient + .getAssetAdministrationShellById(aasId, undefined, url) + .then((aas) => ({ aas: aas, location: url })), // add the URL to the resolved value + ); + + const results = await Promise.allSettled(promises); + const fulfilledResults = results.filter((result) => result.status === 'fulfilled'); + + if (fulfilledResults.length > 0) { + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-expect-error + return fulfilledResults.map((result) => (result as unknown).value); + } else { + throw new Error('AAS not found'); + } + } + + async getSubmodelFromAllRepos(submodelId: string) { + const basePathUrls = await getConnectionDataByTypeAction({ id: '0', typeName: 'AAS_REPOSITORY' }); + const promises = basePathUrls.map((url) => + this.submodelRepositoryClient.getSubmodelById(submodelId, undefined, url), + ); + + try { + return await Promise.any(promises); + } catch (error) { + throw new Error('Submodel not found'); + } + } + + async getAasThumbnailFromAllRepos(aasId: string) { + const basePathUrls = await getConnectionDataByTypeAction({ id: '0', typeName: 'AAS_REPOSITORY' }); + + const promises = basePathUrls.map((url) => + this.repositoryClient.getThumbnailFromShell(aasId, undefined, url).then((image) => { + if (image.size === 0) { + throw new Error('Empty image'); + } + return image; + }), + ); + + try { + return await Promise.any(promises); + } catch { + throw new Error('Image not found'); + } + } +} diff --git a/src/lib/services/multipleDataSourceActions/multipleDataSourceActions.ts b/src/lib/services/multipleDataSourceActions/multipleDataSourceActions.ts index 30ac295..01bbdd1 100644 --- a/src/lib/services/multipleDataSourceActions/multipleDataSourceActions.ts +++ b/src/lib/services/multipleDataSourceActions/multipleDataSourceActions.ts @@ -1,131 +1,17 @@ -import { IAssetAdministrationShellRepositoryApi, ISubmodelRepositoryApi } from 'lib/api/basyx-v3/apiInterface'; -import { Log } from 'lib/util/Log'; -import { AssetAdministrationShellRepositoryApi, SubmodelRepositoryApi } from 'lib/api/basyx-v3/api'; -import process from 'node:process'; -import { mnestixFetch } from 'lib/api/infrastructure'; -import { getConnectionDataByTypeAction } from 'app/[locale]/settings/_components/mnestix-connections/MnestixConnectionServerActions'; -import { AssetAdministrationShell, Submodel } from '@aas-core-works/aas-core3.0-typescript/dist/types/types'; - -export type RepoSearchResult = { - aas: AssetAdministrationShell; - location: string; -}; - -interface NullableSearchSetupParameters { - shellsByRegistryEndpoint?: { path: string; aas: AssetAdministrationShell }[] | null; - shellsSavedInTheRepository?: AssetAdministrationShell[] | null; - submodelsSavedInTheRepository?: Submodel[] | null; - log?: Log | null; -} +import { Submodel } from '@aas-core-works/aas-core3.0-typescript/dist/types/types'; +import { MultipleDataSource, RepoSearchResult } from 'lib/services/multipleDataSourceActions/MultipleDataSource'; export async function performSearchAasFromAllRepositories(searchInput: string): Promise { - const searcher = MultipleDataSourceActions.create(); + const searcher = MultipleDataSource.create(); return searcher.getAasFromAllRepos(searchInput); } export async function performSearchSubmodelFromAllRepos(searchInput: string): Promise { - const searcher = MultipleDataSourceActions.create(); + const searcher = MultipleDataSource.create(); return searcher.getSubmodelFromAllRepos(searchInput); } export async function performgetAasThumbnailFromAllRepos(searchInput: string): Promise { - const searcher = MultipleDataSourceActions.create(); + const searcher = MultipleDataSource.create(); return searcher.getAasThumbnailFromAllRepos(searchInput); } - -export class MultipleDataSourceActions { - private constructor( - protected readonly repositoryClient: IAssetAdministrationShellRepositoryApi, - protected readonly submodelRepositoryClient: ISubmodelRepositoryApi, - protected readonly fetch: (input: RequestInfo | URL, init?: RequestInit | undefined) => Promise, - protected readonly log: Log, - ) {} - - static create(): MultipleDataSourceActions { - const repositoryClient = AssetAdministrationShellRepositoryApi.create({ - basePath: process.env.AAS_REPO_API_URL, - fetch: mnestixFetch(), - }); - const submodelRepositoryClient = SubmodelRepositoryApi.create({ - basePath: process.env.SUBMODEL_REPO_API_URL, - fetch: mnestixFetch(), - }); - const log = Log.create(); - return new MultipleDataSourceActions(repositoryClient, submodelRepositoryClient, fetch, log); - } - - static createNull({ - shellsByRegistryEndpoint = [], - shellsSavedInTheRepository = [], - submodelsSavedInTheRepository = [], - log = null, - }: NullableSearchSetupParameters = {}): MultipleDataSourceActions { - const stubbedFetch = async (input: RequestInfo | URL): Promise => { - if (!shellsByRegistryEndpoint) return Promise.reject(new Error('no registry configuration')); - for (const aasEntry of shellsByRegistryEndpoint) { - if (aasEntry.path === input) return new Response(JSON.stringify(aasEntry.aas)); - } - return Promise.reject(new Error('no aas for on href:' + input)); - }; - return new MultipleDataSourceActions( - AssetAdministrationShellRepositoryApi.createNull({ shellsSavedInTheRepository }), - SubmodelRepositoryApi.createNull({ submodelsSavedInTheRepository }), - stubbedFetch, - log ?? Log.createNull(), - ); - } - - async getAasFromAllRepos(aasId: string): Promise { - const basePathUrls = await getConnectionDataByTypeAction({ id: '0', typeName: 'AAS_REPOSITORY' }); - - const promises = basePathUrls.map( - (url) => - this.repositoryClient - .getAssetAdministrationShellById(aasId, undefined, url) - .then((aas) => ({ aas: aas, location: url })), // add the URL to the resolved value - ); - - const results = await Promise.allSettled(promises); - const fulfilledResults = results.filter((result) => result.status === 'fulfilled'); - - if (fulfilledResults.length > 0) { - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-expect-error - return fulfilledResults.map((result) => (result as unknown).value); - } else { - throw new Error('AAS not found'); - } - } - - async getSubmodelFromAllRepos(submodelId: string) { - const basePathUrls = await getConnectionDataByTypeAction({ id: '0', typeName: 'AAS_REPOSITORY' }); - const promises = basePathUrls.map((url) => - this.submodelRepositoryClient.getSubmodelById(submodelId, undefined, url), - ); - - try { - return await Promise.any(promises); - } catch (error) { - throw new Error('Submodel not found'); - } - } - - async getAasThumbnailFromAllRepos(aasId: string) { - const basePathUrls = await getConnectionDataByTypeAction({ id: '0', typeName: 'AAS_REPOSITORY' }); - - const promises = basePathUrls.map((url) => - this.repositoryClient.getThumbnailFromShell(aasId, undefined, url).then((image) => { - if (image.size === 0) { - throw new Error('Empty image'); - } - return image; - }), - ); - - try { - return await Promise.any(promises); - } catch { - throw new Error('Image not found'); - } - } -} diff --git a/src/lib/services/searchUtilActions/AasSearcher.ts b/src/lib/services/searchUtilActions/AasSearcher.ts new file mode 100644 index 0000000..8e20913 --- /dev/null +++ b/src/lib/services/searchUtilActions/AasSearcher.ts @@ -0,0 +1,205 @@ +import { + AssetAdministrationShellDescriptor, + Endpoint, + RegistryAasData, + SubmodelDescriptor, +} from 'lib/types/registryServiceTypes'; +import { AssetAdministrationShell, Submodel } from '@aas-core-works/aas-core3.0-typescript/dist/types/types'; +import { Log } from 'lib/util/Log'; +import { IDiscoveryServiceApi } from 'lib/api/discovery-service-api/discoveryServiceApiInterface'; +import { IRegistryServiceApi } from 'lib/api/registry-service-api/registryServiceApiInterface'; +import { IAssetAdministrationShellRepositoryApi, ISubmodelRepositoryApi } from 'lib/api/basyx-v3/apiInterface'; +import { AssetAdministrationShellRepositoryApi, SubmodelRepositoryApi } from 'lib/api/basyx-v3/api'; +import { mnestixFetch } from 'lib/api/infrastructure'; +import { RegistryServiceApi } from 'lib/api/registry-service-api/registryServiceApi'; +import { DiscoveryServiceApi } from 'lib/api/discovery-service-api/discoveryServiceApi'; +import { encodeBase64 } from 'lib/util/Base64Util'; +import { NotFoundError } from 'lib/errors/NotFoundError'; + +export interface RegistrySearchResult { + registryAas: AssetAdministrationShell; + registryAasData?: RegistryAasData; +} + +interface NullableSearchSetupParameters { + discoveryEntries?: { assetId: string; aasIds: string[] }[]; + registryShellDescriptorEntries?: AssetAdministrationShellDescriptor[] | null; + shellsByRegistryEndpoint?: { path: string; aas: AssetAdministrationShell }[] | null; + shellsSavedInTheRepository?: AssetAdministrationShell[] | null; + submodelsSavedInTheRepository?: Submodel[] | null; + log?: Log | null; +} + +export class AasSearcher { + private constructor( + protected readonly discoveryServiceClient: IDiscoveryServiceApi, + protected readonly registryService: IRegistryServiceApi, + protected readonly repositoryClient: IAssetAdministrationShellRepositoryApi, + protected readonly submodelRepositoryClient: ISubmodelRepositoryApi, + protected readonly fetch: (input: RequestInfo | URL, init?: RequestInit | undefined) => Promise, + protected readonly log: Log, + ) {} + + static create(): AasSearcher { + const repositoryClient = AssetAdministrationShellRepositoryApi.create({ + basePath: process.env.AAS_REPO_API_URL, + fetch: mnestixFetch(), + }); + const submodelRepositoryClient = SubmodelRepositoryApi.create({ + basePath: process.env.SUBMODEL_REPO_API_URL, + fetch: mnestixFetch(), + }); + const registryServiceClient = RegistryServiceApi.create(process.env.REGISTRY_API_URL); + const discoveryServiceClient = DiscoveryServiceApi.create(process.env.DISCOVERY_API_URL); + const log = Log.create(); + return new AasSearcher( + discoveryServiceClient, + registryServiceClient, + repositoryClient, + submodelRepositoryClient, + fetch, + log, + ); + } + + static createNull({ + discoveryEntries = [], + registryShellDescriptorEntries = [], + shellsByRegistryEndpoint = [], + shellsSavedInTheRepository = [], + submodelsSavedInTheRepository = [], + log = null, + }: NullableSearchSetupParameters = {}): AasSearcher { + const stubbedFetch = async (input: RequestInfo | URL): Promise => { + if (!shellsByRegistryEndpoint) return Promise.reject(new Error('no registry configuration')); + for (const aasEntry of shellsByRegistryEndpoint) { + if (aasEntry.path === input) return new Response(JSON.stringify(aasEntry.aas)); + } + return Promise.reject(new Error('no aas for on href:' + input)); + }; + return new AasSearcher( + DiscoveryServiceApi.createNull({ discoveryEntries: discoveryEntries }), + RegistryServiceApi.createNull({ registryShellDescriptorEntries }), + AssetAdministrationShellRepositoryApi.createNull({ shellsSavedInTheRepository }), + SubmodelRepositoryApi.createNull({ submodelsSavedInTheRepository }), + stubbedFetch, + log ?? Log.createNull(), + ); + } + + async fullSearch(val: string) { + const aasIds = await this.handleAasDiscoverySearch(val); + if (aasIds && aasIds.length > 1) { + return { + redirectUrl: `/viewer/discovery?assetId=${val}`, + aas: null, + aasData: null, + }; + } else { + // Check if an AAS ID is found in the Discovery service, or assign the input parameter for further search. + // If there is exactly one AAS ID in the aasIds array, use it; otherwise, use the input parameter 'val'. + const aasId = aasIds && aasIds.length === 1 ? aasIds[0] : val; + const registrySearchResult = await this.handleAasRegistrySearch(aasId); + + const aas = + registrySearchResult != null + ? registrySearchResult.registryAas + : await this.repositoryClient.getAssetAdministrationShellById(encodeBase64(aasId)); + + const aasData = + registrySearchResult?.registryAasData != null + ? { + submodelDescriptors: registrySearchResult.registryAasData.submodelDescriptors, + aasRegistryRepositoryOrigin: registrySearchResult.registryAasData.aasRegistryRepositoryOrigin, + } + : null; + + // If not found: Error: AAS could not be found + + return { + redirectUrl: `/viewer/${encodeBase64(aas.id)}`, + aas: aas, + aasData: aasData, + }; + } + } + + /** + * Resolves the given AAS ID using the discovery service. + * + * This function takes an AAS ID and attempts to resolve it using a discovery service. + * If the AAS ID is found, it returns the resolved AAS ID. + * If not found, it returns `null`. + * + * @param {string} searchAssetId - The AAS ID to resolve using the discovery service. + * @returns {Promise} A promise that resolves to the resolved AAS ID as a string, or `null` if the AAS ID is not found. + */ + async handleAasDiscoverySearch(searchAssetId: string): Promise { + try { + if (!searchAssetId) { + throw new NotFoundError(); + } + const aasIds = (await this.discoveryServiceClient.getAasIdsByAssetId(searchAssetId)).result; + + if (aasIds.length === 0) { + throw new NotFoundError(); + } + + return aasIds; + } catch (e) { + this.log.warn('Could not be found in the discovery service, will continue to look in the AAS repository.'); + return null; + } + } + + /** + * Searches for and retrieves the Asset Administration Shell (AAS) from the registry. + * + * This function takes an AAS ID and attempts to find the corresponding AAS in the registry. + * If the AAS is found, it returns an object containing the AAS and any related data. + * If not found, it returns `null`. + * + * @param {string} searchAasId - The AAS ID to search for in the registry. + * @returns {Promise} A promise that resolves to an object containing: + * - `registryAas`: The retrieved Asset Administration Shell object. + * - `registryAasData` (optional): Additional data related to the retrieved AAS. + * or `null` if the AAS is not found in the registry. + */ + async handleAasRegistrySearch(searchAasId: string): Promise { + try { + const shellDescription = await this.registryService.getAssetAdministrationShellDescriptorById(searchAasId); + const endpoints = shellDescription.endpoints as Endpoint[]; + const submodelDescriptors = shellDescription.submodelDescriptors as SubmodelDescriptor[]; + + if (!endpoints) { + throw new NotFoundError(); + } + + const aasEndpoint = endpoints[0].protocolInformation.href; + const urlObject = new URL(aasEndpoint); + const aasRepositoryOrigin = urlObject.origin; + + const aas = await this.fetch(aasEndpoint, { + method: 'GET', + }); + + const aasJson = await aas.json(); + + return { + registryAas: aasJson, + registryAasData: { + submodelDescriptors: submodelDescriptors, + aasRegistryRepositoryOrigin: aasRepositoryOrigin, + }, + }; + } catch (e) { + this.log.warn('Could not be found in the registry service, will continue to look in the AAS registry.'); + return null; + } + } +} + +export type RepoSearchResult = { + aas: AssetAdministrationShell; + location: string; +}; diff --git a/src/lib/services/searchUtilActions/search.spec.ts b/src/lib/services/searchUtilActions/search.spec.ts index 6f9ba4b..29713f8 100644 --- a/src/lib/services/searchUtilActions/search.spec.ts +++ b/src/lib/services/searchUtilActions/search.spec.ts @@ -1,10 +1,10 @@ import { expect } from '@jest/globals'; -import { AasSearcher } from 'lib/services/searchUtilActions/searchServer'; import { AssetAdministrationShellDescriptor } from 'lib/types/registryServiceTypes'; import { AssetAdministrationShell } from '@aas-core-works/aas-core3.0-typescript/types'; import { instance, mock } from 'ts-mockito'; import { encodeBase64 } from 'lib/util/Base64Util'; import { Log } from 'lib/util/Log'; +import { AasSearcher } from 'lib/services/searchUtilActions/AasSearcher'; interface DummyAasParameters { id?: string; diff --git a/src/lib/services/searchUtilActions/searchServer.ts b/src/lib/services/searchUtilActions/searchServer.ts index 6b6ea1c..79b1738 100644 --- a/src/lib/services/searchUtilActions/searchServer.ts +++ b/src/lib/services/searchUtilActions/searchServer.ts @@ -1,29 +1,7 @@ 'use server'; -import { NotFoundError } from 'lib/errors/NotFoundError'; -import { - AssetAdministrationShellDescriptor, - Endpoint, - RegistryAasData, - SubmodelDescriptor, -} from 'lib/types/registryServiceTypes'; -import { RegistryServiceApi } from 'lib/api/registry-service-api/registryServiceApi'; -import { DiscoveryServiceApi } from 'lib/api/discovery-service-api/discoveryServiceApi'; -import { AssetAdministrationShell, Submodel } from '@aas-core-works/aas-core3.0-typescript/types'; -import { AssetAdministrationShellRepositoryApi, SubmodelRepositoryApi } from 'lib/api/basyx-v3/api'; -import { encodeBase64 } from 'lib/util/Base64Util'; -import { mnestixFetch } from 'lib/api/infrastructure'; import { AasSearchResult } from 'lib/services/searchUtilActions/searchClient'; -import { IDiscoveryServiceApi } from 'lib/api/discovery-service-api/discoveryServiceApiInterface'; -import { IRegistryServiceApi } from 'lib/api/registry-service-api/registryServiceApiInterface'; -import { IAssetAdministrationShellRepositoryApi, ISubmodelRepositoryApi } from 'lib/api/basyx-v3/apiInterface'; -import { Log } from 'lib/util/Log'; -import * as process from 'node:process'; - -export interface RegistrySearchResult { - registryAas: AssetAdministrationShell; - registryAasData?: RegistryAasData; -} +import { AasSearcher, RegistrySearchResult } from 'lib/services/searchUtilActions/AasSearcher'; export async function performFullAasSearch(searchInput: string): Promise { const searcher = AasSearcher.create(); @@ -40,196 +18,9 @@ export async function performDiscoveryAasSearch(searchInput: string): Promise Promise, - protected readonly log: Log, - ) {} - - static create(): AasSearcher { - const repositoryClient = AssetAdministrationShellRepositoryApi.create({ - basePath: process.env.AAS_REPO_API_URL, - fetch: mnestixFetch(), - }); - const submodelRepositoryClient = SubmodelRepositoryApi.create({ - basePath: process.env.SUBMODEL_REPO_API_URL, - fetch: mnestixFetch(), - }); - const registryServiceClient = RegistryServiceApi.create(process.env.REGISTRY_API_URL); - const discoveryServiceClient = DiscoveryServiceApi.create(process.env.DISCOVERY_API_URL); - const log = Log.create(); - return new AasSearcher( - discoveryServiceClient, - registryServiceClient, - repositoryClient, - submodelRepositoryClient, - fetch, - log, - ); - } - - static createNull({ - discoveryEntries = [], - registryShellDescriptorEntries = [], - shellsByRegistryEndpoint = [], - shellsSavedInTheRepository = [], - submodelsSavedInTheRepository = [], - log = null, - }: NullableSearchSetupParameters = {}): AasSearcher { - const stubbedFetch = async (input: RequestInfo | URL): Promise => { - if (!shellsByRegistryEndpoint) return Promise.reject(new Error('no registry configuration')); - for (const aasEntry of shellsByRegistryEndpoint) { - if (aasEntry.path === input) return new Response(JSON.stringify(aasEntry.aas)); - } - return Promise.reject(new Error('no aas for on href:' + input)); - }; - return new AasSearcher( - DiscoveryServiceApi.createNull({ discoveryEntries: discoveryEntries }), - RegistryServiceApi.createNull({ registryShellDescriptorEntries }), - AssetAdministrationShellRepositoryApi.createNull({ shellsSavedInTheRepository }), - SubmodelRepositoryApi.createNull({ submodelsSavedInTheRepository }), - stubbedFetch, - log ?? Log.createNull(), - ); - } - - async fullSearch(val: string) { - const aasIds = await this.handleAasDiscoverySearch(val); - if (aasIds && aasIds.length > 1) { - return { - redirectUrl: `/viewer/discovery?assetId=${val}`, - aas: null, - aasData: null, - }; - } else { - // Check if an AAS ID is found in the Discovery service, or assign the input parameter for further search. - // If there is exactly one AAS ID in the aasIds array, use it; otherwise, use the input parameter 'val'. - const aasId = aasIds && aasIds.length === 1 ? aasIds[0] : val; - const registrySearchResult = await this.handleAasRegistrySearch(aasId); - - const aas = - registrySearchResult != null - ? registrySearchResult.registryAas - : await this.repositoryClient.getAssetAdministrationShellById(encodeBase64(aasId)); - - const aasData = - registrySearchResult?.registryAasData != null - ? { - submodelDescriptors: registrySearchResult.registryAasData.submodelDescriptors, - aasRegistryRepositoryOrigin: registrySearchResult.registryAasData.aasRegistryRepositoryOrigin, - } - : null; - - // If not found: Error: AAS could not be found - - return { - redirectUrl: `/viewer/${encodeBase64(aas.id)}`, - aas: aas, - aasData: aasData, - }; - } - } - - /** - * Resolves the given AAS ID using the discovery service. - * - * This function takes an AAS ID and attempts to resolve it using a discovery service. - * If the AAS ID is found, it returns the resolved AAS ID. - * If not found, it returns `null`. - * - * @param {string} searchAssetId - The AAS ID to resolve using the discovery service. - * @returns {Promise} A promise that resolves to the resolved AAS ID as a string, or `null` if the AAS ID is not found. - */ - async handleAasDiscoverySearch(searchAssetId: string): Promise { - try { - if (!searchAssetId) { - throw new NotFoundError(); - } - const aasIds = (await this.discoveryServiceClient.getAasIdsByAssetId(searchAssetId)).result; - - if (aasIds.length === 0) { - throw new NotFoundError(); - } - - return aasIds; - } catch (e) { - this.log.warn('Could not be found in the discovery service, will continue to look in the AAS repository.'); - return null; - } - } - - /** - * Searches for and retrieves the Asset Administration Shell (AAS) from the registry. - * - * This function takes an AAS ID and attempts to find the corresponding AAS in the registry. - * If the AAS is found, it returns an object containing the AAS and any related data. - * If not found, it returns `null`. - * - * @param {string} searchAasId - The AAS ID to search for in the registry. - * @returns {Promise} A promise that resolves to an object containing: - * - `registryAas`: The retrieved Asset Administration Shell object. - * - `registryAasData` (optional): Additional data related to the retrieved AAS. - * or `null` if the AAS is not found in the registry. - */ - async handleAasRegistrySearch(searchAasId: string): Promise { - try { - const shellDescription = await this.registryService.getAssetAdministrationShellDescriptorById(searchAasId); - const endpoints = shellDescription.endpoints as Endpoint[]; - const submodelDescriptors = shellDescription.submodelDescriptors as SubmodelDescriptor[]; - - if (!endpoints) { - throw new NotFoundError(); - } - - const aasEndpoint = endpoints[0].protocolInformation.href; - const aasRepositoryOrigin = getAasRepositoryOrigin(aasEndpoint); - - const aas = await this.fetch(aasEndpoint, { - method: 'GET', - }); - - const aasJson = await aas.json(); - - return { - registryAas: aasJson, - registryAasData: { - submodelDescriptors: submodelDescriptors, - aasRegistryRepositoryOrigin: aasRepositoryOrigin, - }, - }; - } catch (e) { - this.log.warn('Could not be found in the registry service, will continue to look in the AAS registry.'); - return null; - } - } -} - export async function getSubmodelFromSubmodelDescriptor(url: string) { const response = await fetch(url, { method: 'GET', }); return response.json(); } - -function getAasRepositoryOrigin(url: string) { - const urlObject = new URL(url); - return urlObject.origin; -} - -export type RepoSearchResult = { - aas: AssetAdministrationShell; - location: string; -}; diff --git a/src/lib/util/Log.ts b/src/lib/util/Log.ts index afa78cd..42ab036 100644 --- a/src/lib/util/Log.ts +++ b/src/lib/util/Log.ts @@ -40,7 +40,7 @@ class NulledLog implements Console { constructor() {} - assert(value?: unknown, message?: unknown, ...optionalParams: unknown[]): void { + assert(_value?: unknown, _message?: unknown, ..._optionalParams: unknown[]): void { throw new Error('Method not implemented.'); } @@ -48,35 +48,35 @@ class NulledLog implements Console { throw new Error('Method not implemented.'); } - count(label?: unknown): void { + count(_label?: unknown): void { throw new Error('Method not implemented.'); } - countReset(label?: unknown): void { + countReset(_label?: unknown): void { throw new Error('Method not implemented.'); } - debug(message?: unknown, ...optionalParams: unknown[]): void { + debug(_message?: unknown, ..._optionalParams: unknown[]): void { throw new Error('Method not implemented.'); } - dir(obj?: unknown, options?: unknown): void { + dir(_obj?: unknown, _options?: unknown): void { throw new Error('Method not implemented.'); } - dirxml(...data: unknown[]): void { + dirxml(..._data: unknown[]): void { throw new Error('Method not implemented.'); } - error(message?: unknown, ...optionalParams: unknown[]): void { + error(_message?: unknown, ..._optionalParams: unknown[]): void { throw new Error('Method not implemented.'); } - group(...label: unknown[]): void { + group(..._label: unknown[]): void { throw new Error('Method not implemented.'); } - groupCollapsed(...label: unknown[]): void { + groupCollapsed(..._label: unknown[]): void { throw new Error('Method not implemented.'); } @@ -84,49 +84,49 @@ class NulledLog implements Console { throw new Error('Method not implemented.'); } - info(message?: unknown, ...optionalParams: unknown[]): void { + info(_message?: unknown, ..._optionalParams: unknown[]): void { throw new Error('Method not implemented.'); } - log(message?: unknown, ...optionalParams: unknown[]): void { + log(message?: unknown, ..._optionalParams: unknown[]): void { this.logs.push({ level: 'normal', message: JSON.stringify(message) }); } - table(tabularData?: unknown, properties?: unknown): void { + table(_tabularData?: unknown, _properties?: unknown): void { throw new Error('Method not implemented.'); } - time(label?: unknown): void { + time(_label?: unknown): void { throw new Error('Method not implemented.'); } - timeEnd(label?: unknown): void { + timeEnd(_label?: unknown): void { throw new Error('Method not implemented.'); } - timeLog(label?: unknown, ...data: unknown[]): void { + timeLog(_label?: unknown, ..._data: unknown[]): void { throw new Error('Method not implemented.'); } - timeStamp(label?: unknown): void { + timeStamp(_label?: unknown): void { throw new Error('Method not implemented.'); } - trace(message?: unknown, ...optionalParams: unknown[]): void { + trace(_message?: unknown, ..._optionalParams: unknown[]): void { throw new Error('Method not implemented.'); } - warn(message?: unknown, ...optionalParams: unknown[]): void { + warn(message?: unknown, ..._optionalParams: unknown[]): void { this.logs.push({ level: 'warning', message: JSON.stringify(message) }); } Console: console.ConsoleConstructor; - profile(label?: string | undefined): void { + profile(_label?: string | undefined): void { throw new Error('Method not implemented.'); } - profileEnd(label?: string | undefined): void { + profileEnd(_label?: string | undefined): void { throw new Error('Method not implemented.'); } } diff --git a/src/lib/util/tracker.ts b/src/lib/util/tracker.ts index fe417e6..2baf53b 100644 --- a/src/lib/util/tracker.ts +++ b/src/lib/util/tracker.ts @@ -1,4 +1,4 @@ -import { EventEmitter } from 'node:events'; +import { EventEmitter } from 'events'; export class TrackerEmitter { private readonly emitter: EventEmitter; @@ -40,4 +40,4 @@ export class TrackerListener { this.data.length = 0; return result; } -} \ No newline at end of file +} diff --git a/yarn.lock b/yarn.lock index a8e4bc7..a6ef03c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2681,10 +2681,10 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.45.tgz#2c0fafd78705e7a18b7906b5201a522719dc5190" integrity sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw== -"@types/node@^22.4.2": - version "22.5.0" - resolved "https://registry.yarnpkg.com/@types/node/-/node-22.5.0.tgz#10f01fe9465166b4cab72e75f60d8b99d019f958" - integrity sha512-DkFrJOe+rfdHTqqMg0bSNlGlQ85hSoh2TPzZyhHsXnMtligRWpxUySiyw8FY14ITt24HVCiQPWxS3KO/QlGmWg== +"@types/node@^22.5.4": + version "22.5.4" + resolved "https://registry.yarnpkg.com/@types/node/-/node-22.5.4.tgz#83f7d1f65bc2ed223bdbf57c7884f1d5a4fa84e8" + integrity sha512-FDuKUJQm/ju9fT/SeX/6+gBzoPzlVCzfzmGkwKvRHQVxi4BntVbyIwf6a4Xn62mrvndLiml6z/UBXIdEVjQLXg== dependencies: undici-types "~6.19.2" @@ -8918,6 +8918,7 @@ word-wrap@^1.2.5: integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== "wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: + name wrap-ansi-cjs version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== From 34e4c5a7c77469ec8af0349bf35a5792cad29c3f Mon Sep 17 00:00:00 2001 From: "XITASO\\pawel.baran" Date: Wed, 11 Sep 2024 17:05:54 +0200 Subject: [PATCH 29/55] MNES-468: Changes by frederik --- src/app/[locale]/_components/DashboardInput.tsx | 3 +-- .../discoveryServiceApiInMemory.ts | 12 ++++++------ 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/src/app/[locale]/_components/DashboardInput.tsx b/src/app/[locale]/_components/DashboardInput.tsx index a39d0ac..b322636 100644 --- a/src/app/[locale]/_components/DashboardInput.tsx +++ b/src/app/[locale]/_components/DashboardInput.tsx @@ -13,11 +13,10 @@ export const DashboardInput = () => { const [, setAas] = useAasState(); const [, setRegistryAasData] = useRegistryAasState(); const navigate = useRouter(); - const { repositoryClient } = useApis(); const browseAasUrl = async (val: string) => { try { - const aasSearch = await handleSearchForAas(val, repositoryClient); + const aasSearch = await handleSearchForAas(val); if (aasSearch.aas) { setAas(aasSearch.aas); diff --git a/src/lib/api/discovery-service-api/discoveryServiceApiInMemory.ts b/src/lib/api/discovery-service-api/discoveryServiceApiInMemory.ts index f9002a1..19df5cb 100644 --- a/src/lib/api/discovery-service-api/discoveryServiceApiInMemory.ts +++ b/src/lib/api/discovery-service-api/discoveryServiceApiInMemory.ts @@ -7,7 +7,7 @@ export class DiscoveryServiceApiInMemory implements IDiscoveryServiceApi { this.discoveryEntries = options.discoveryEntries; } - linkAasIdAndAssetId(aasId: string, assetId: string): Promise { + linkAasIdAndAssetId(_aasId: string, _assetId: string): Promise { throw new Error('Method not implemented.'); } @@ -22,11 +22,11 @@ export class DiscoveryServiceApiInMemory implements IDiscoveryServiceApi { return Promise.reject('not found'); } - deleteAllAssetLinksById(aasId: string): Promise { + deleteAllAssetLinksById(_aasId: string): Promise { throw new Error('Method not implemented.'); } - getAllAssetAdministrationShellIdsByAssetLink(assetIds: { name: string; value: string }[]): Promise<{ + getAllAssetAdministrationShellIdsByAssetLink(_assetIds: { name: string; value: string }[]): Promise<{ // const registryService = new ; // const repositoryClient = new ; paging_metadata: string; @@ -35,11 +35,11 @@ export class DiscoveryServiceApiInMemory implements IDiscoveryServiceApi { throw new Error('Method not implemented.'); } - getAllAssetLinksById(aasId: string): Promise { + getAllAssetLinksById(_aasId: string): Promise { throw new Error('Method not implemented.'); } - postAllAssetLinksById(aasId: string, assetLinks: { name: string; value: string }[]): Promise { + postAllAssetLinksById(_aasId: string, _assetLinks: { name: string; value: string }[]): Promise { throw new Error('Method not implemented.'); } -} \ No newline at end of file +} From dd5e7e8d09d7f5d038180e80bab1dccb7b871094 Mon Sep 17 00:00:00 2001 From: "XITASO\\pawel.baran" Date: Wed, 11 Sep 2024 17:22:58 +0200 Subject: [PATCH 30/55] MNES-468: searchClient.ts removed --- compose.yml | 15 +++++++------- .../[locale]/_components/DashboardInput.tsx | 4 ++-- .../compare/_components/CompareView.tsx | 5 +++-- .../services/searchUtilActions/AasSearcher.ts | 12 ++++++++++- .../searchUtilActions/searchClient.ts | 20 ------------------- .../searchUtilActions/searchServer.ts | 3 +-- 6 files changed, 24 insertions(+), 35 deletions(-) delete mode 100644 src/lib/services/searchUtilActions/searchClient.ts diff --git a/compose.yml b/compose.yml index 30e892c..0dfd320 100644 --- a/compose.yml +++ b/compose.yml @@ -10,7 +10,7 @@ services: mnestix-browser: container_name: mnestix-browser image: mnestix/mnestix-browser:latest - profiles: ["", "frontend", "tests"] + profiles: [ "", "frontend", "tests" ] build: dockerfile: Dockerfile target: production @@ -22,7 +22,6 @@ services: DISCOVERY_API_URL: 'http://mnestix-api:5064/discovery' AAS_REPO_API_URL: 'http://mnestix-api:5064/repo' SUBMODEL_REPO_API_URL: 'http://mnestix-api:5064/repo' - SUBMODEL_REPO_API_URL: 'http://localhost:5064/repo' MNESTIX_BACKEND_API_URL: 'http://mnestix-api:5064' AAS_LIST_FEATURE_FLAG: "true" COMPARISON_FEATURE_FLAG: "true" @@ -40,7 +39,7 @@ services: mnestix-api: image: mnestix/mnestix-api:1.1.0 container_name: mnestix-api - profiles: ["", "backend", "tests"] + profiles: [ "", "backend", "tests" ] ports: - '5064:5064' environment: @@ -79,7 +78,7 @@ services: mongodb: image: mongo:5 container_name: mongodb - profiles: ["", "basyx", "tests"] + profiles: [ "", "basyx", "tests" ] environment: MONGO_INITDB_ROOT_USERNAME: mongoAdmin MONGO_INITDB_ROOT_PASSWORD: mongoPassword @@ -100,7 +99,7 @@ services: aas-environment: image: eclipsebasyx/aas-environment:2.0.0-milestone-03.1 container_name: aas-environment - profiles: ["", "basyx", "tests"] + profiles: [ "", "basyx", "tests" ] depends_on: - mongodb environment: @@ -132,7 +131,7 @@ services: aas-discovery: image: eclipsebasyx/aas-discovery:2.0.0-milestone-03.1 container_name: aas-discovery - profiles: ["", "basyx", "tests"] + profiles: [ "", "basyx", "tests" ] depends_on: - mongodb environment: @@ -160,7 +159,7 @@ services: aas-registry: image: eclipsebasyx/aas-registry-log-mongodb:2.0.0-milestone-03.1 container_name: aas-registry - profiles: ["", "basyx"] + profiles: [ "", "basyx" ] ports: - '8083:8080' depends_on: @@ -180,7 +179,7 @@ services: submodel-registry: image: eclipsebasyx/submodel-registry-log-mongodb:2.0.0-milestone-03.1 container_name: submodel-registry - profiles: ["", "basyx"] + profiles: [ "", "basyx" ] ports: - '8084:8080' depends_on: diff --git a/src/app/[locale]/_components/DashboardInput.tsx b/src/app/[locale]/_components/DashboardInput.tsx index b322636..bf9d698 100644 --- a/src/app/[locale]/_components/DashboardInput.tsx +++ b/src/app/[locale]/_components/DashboardInput.tsx @@ -4,10 +4,10 @@ import { messages } from 'lib/i18n/localization'; import { FormattedMessage } from 'react-intl'; import { ManualAasInput } from 'app/[locale]/_components/ManualAasInput'; import { QrScanner } from 'app/[locale]/_components/QrScanner'; -import { handleSearchForAas } from 'lib/services/searchUtilActions/searchClient'; import { useRouter } from 'next/navigation'; import { useAasState, useRegistryAasState } from 'components/contexts/CurrentAasContext'; import { LocalizedError } from 'lib/util/LocalizedError'; +import { performFullAasSearch } from 'lib/services/searchUtilActions/searchServer'; export const DashboardInput = () => { const [, setAas] = useAasState(); @@ -16,7 +16,7 @@ export const DashboardInput = () => { const browseAasUrl = async (val: string) => { try { - const aasSearch = await handleSearchForAas(val); + const aasSearch = await performFullAasSearch(val); if (aasSearch.aas) { setAas(aasSearch.aas); diff --git a/src/app/[locale]/compare/_components/CompareView.tsx b/src/app/[locale]/compare/_components/CompareView.tsx index a6f09f6..404c395 100644 --- a/src/app/[locale]/compare/_components/CompareView.tsx +++ b/src/app/[locale]/compare/_components/CompareView.tsx @@ -11,8 +11,9 @@ import { useEffect, useState } from 'react'; import { useNotificationSpawner } from 'lib/hooks/UseNotificationSpawner'; import { useSearchParams } from 'next/navigation'; import { showError } from 'lib/util/ErrorHandlerUtil'; -import { AasSearchResult, handleSearchForAas } from 'lib/services/searchUtilActions/searchClient'; import { LocalizedError } from 'lib/util/LocalizedError'; +import { performFullAasSearch } from 'lib/services/searchUtilActions/searchServer'; +import { AasSearchResult } from 'lib/services/searchUtilActions/AasSearcher'; export function CompareView() { const { compareAas, addSeveralAas, deleteAas, addAas } = useCompareAasContext(); @@ -58,7 +59,7 @@ export function CompareView() { const handleAddAas = async (aasId: string) => { let aasSearch: AasSearchResult; try { - aasSearch = await handleSearchForAas(aasId); + aasSearch = await performFullAasSearch(aasId); } catch (e) { throw new LocalizedError(messages.mnestix.aasUrlNotFound); } diff --git a/src/lib/services/searchUtilActions/AasSearcher.ts b/src/lib/services/searchUtilActions/AasSearcher.ts index 8e20913..6db53b8 100644 --- a/src/lib/services/searchUtilActions/AasSearcher.ts +++ b/src/lib/services/searchUtilActions/AasSearcher.ts @@ -30,6 +30,16 @@ interface NullableSearchSetupParameters { log?: Log | null; } +export type AasData = { + submodelDescriptors: SubmodelDescriptor[] | undefined; + aasRegistryRepositoryOrigin: string | undefined; +}; +export type AasSearchResult = { + redirectUrl: string; + aas: AssetAdministrationShell | null; + aasData: AasData | null; +}; + export class AasSearcher { private constructor( protected readonly discoveryServiceClient: IDiscoveryServiceApi, @@ -87,7 +97,7 @@ export class AasSearcher { ); } - async fullSearch(val: string) { + async fullSearch(val: string): Promise { const aasIds = await this.handleAasDiscoverySearch(val); if (aasIds && aasIds.length > 1) { return { diff --git a/src/lib/services/searchUtilActions/searchClient.ts b/src/lib/services/searchUtilActions/searchClient.ts deleted file mode 100644 index f39b276..0000000 --- a/src/lib/services/searchUtilActions/searchClient.ts +++ /dev/null @@ -1,20 +0,0 @@ -'use client'; - -import { SubmodelDescriptor } from 'lib/types/registryServiceTypes'; -import { AssetAdministrationShell } from '@aas-core-works/aas-core3.0-typescript/types'; -import { performFullAasSearch } from 'lib/services/searchUtilActions/searchServer'; - -export type AasData = { - submodelDescriptors: SubmodelDescriptor[] | undefined; - aasRegistryRepositoryOrigin: string | undefined; -}; - -export type AasSearchResult = { - redirectUrl: string; - aas: AssetAdministrationShell | null; - aasData: AasData | null; -}; - -export async function handleSearchForAas(val: string): Promise { - return await performFullAasSearch(val); -} diff --git a/src/lib/services/searchUtilActions/searchServer.ts b/src/lib/services/searchUtilActions/searchServer.ts index 79b1738..6726329 100644 --- a/src/lib/services/searchUtilActions/searchServer.ts +++ b/src/lib/services/searchUtilActions/searchServer.ts @@ -1,7 +1,6 @@ 'use server'; -import { AasSearchResult } from 'lib/services/searchUtilActions/searchClient'; -import { AasSearcher, RegistrySearchResult } from 'lib/services/searchUtilActions/AasSearcher'; +import { AasSearcher, AasSearchResult, RegistrySearchResult } from 'lib/services/searchUtilActions/AasSearcher'; export async function performFullAasSearch(searchInput: string): Promise { const searcher = AasSearcher.create(); From 75c4a1bbaf03700cab7d3bdf2ce06164fa195909 Mon Sep 17 00:00:00 2001 From: "milo.franke" Date: Wed, 11 Sep 2024 17:55:39 +0200 Subject: [PATCH 31/55] remove accidental comment from merge --- src/app/[locale]/_components/QrScanner.tsx | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/app/[locale]/_components/QrScanner.tsx b/src/app/[locale]/_components/QrScanner.tsx index 9477be8..578f1ba 100644 --- a/src/app/[locale]/_components/QrScanner.tsx +++ b/src/app/[locale]/_components/QrScanner.tsx @@ -21,8 +21,6 @@ enum State { } export function QrScanner(props: { onScan: (scanResult: string) => Promise; size?: number | undefined }) { - // Camera and QR on/off logic - const [state, setState] = useState(State.Stopped); const notificationSpawner = useNotificationSpawner(); From 020ec48b9346eccae36084e017511d7a3e611b62 Mon Sep 17 00:00:00 2001 From: "milo.franke" Date: Wed, 11 Sep 2024 18:04:41 +0200 Subject: [PATCH 32/55] remove duplicated qr scanner section in translation files --- src/lib/i18n/de.mnestix.ts | 9 +++------ src/lib/i18n/en.mnestix.ts | 4 ---- 2 files changed, 3 insertions(+), 10 deletions(-) diff --git a/src/lib/i18n/de.mnestix.ts b/src/lib/i18n/de.mnestix.ts index 43d47ff..599ad43 100644 --- a/src/lib/i18n/de.mnestix.ts +++ b/src/lib/i18n/de.mnestix.ts @@ -18,8 +18,9 @@ export const deMnestix = { scanAasId: 'AAS ID oder Asset ID scannen', unexpectedError: 'Unerwarteter Fehler', unauthorizedError: { - title: 'Unautorisierter Zugriff', - content: 'Sie haben keinen Zugriff auf diese AAS. Bitte loggen Sie sich ein oder fragen sie Ihren Administrator um Zugriff.', + title: 'Unautorisierter Zugriff', + content: + 'Sie haben keinen Zugriff auf diese AAS. Bitte loggen Sie sich ein oder fragen sie Ihren Administrator um Zugriff.', }, settings: 'Einstellungen', idStructure: 'ID Struktur', @@ -268,8 +269,4 @@ export const deMnestix = { defaultCallbackErrorMsg: 'QR Code konnte nicht geöffnet werden!', errorOnQrScannerOpen: 'QR Scanner konnte nicht geöffnet werden!', }, - qrScanner: { - defaultCallbackErrorMsg: 'QR Code konnte nicht geöffnet werden!', - errorOnQrScannerOpen: 'QR Scanner konnte nicht geöffnet werden!', - }, }; diff --git a/src/lib/i18n/en.mnestix.ts b/src/lib/i18n/en.mnestix.ts index 25b4467..79989c0 100644 --- a/src/lib/i18n/en.mnestix.ts +++ b/src/lib/i18n/en.mnestix.ts @@ -265,8 +265,4 @@ export const enMnestix = { defaultCallbackErrorMsg: 'Could not open the QR code!', errorOnQrScannerOpen: 'Could not open the QR scanner!', }, - qrScanner: { - defaultCallbackErrorMsg: 'Could not open the QR code!', - errorOnQrScannerOpen: 'Could not open the QR scanner!', - }, }; From 41e2fc0b3877cb5b2d2e902cf491cdf969f40906 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Frederik=20Schl=C3=BCter?= Date: Thu, 12 Sep 2024 14:05:14 +0200 Subject: [PATCH 33/55] test strategy: fully covered AasSearcher with multiple repositories --- .../MnestixConnectionServerActions.ts | 22 +++++++ .../MnestixConnectionServerActions.tsx | 46 -------------- .../mnestix-connections/PrismaConnector.ts | 58 +++++++++++++++++ .../PrismaConnectorInMemory.ts | 24 +++++++ .../PrismaConnectorInterface.ts | 10 +++ src/lib/api/basyx-v3/api.ts | 3 +- src/lib/api/basyx-v3/apiInMemory.ts | 33 +++++++--- .../MultipleDataSource.ts | 39 +++++++++--- .../services/searchUtilActions/AasSearcher.ts | 63 ++++++++++--------- .../services/searchUtilActions/search.spec.ts | 61 +++++++++++++++--- 10 files changed, 259 insertions(+), 100 deletions(-) create mode 100644 src/app/[locale]/settings/_components/mnestix-connections/MnestixConnectionServerActions.ts delete mode 100644 src/app/[locale]/settings/_components/mnestix-connections/MnestixConnectionServerActions.tsx create mode 100644 src/app/[locale]/settings/_components/mnestix-connections/PrismaConnector.ts create mode 100644 src/app/[locale]/settings/_components/mnestix-connections/PrismaConnectorInMemory.ts create mode 100644 src/app/[locale]/settings/_components/mnestix-connections/PrismaConnectorInterface.ts diff --git a/src/app/[locale]/settings/_components/mnestix-connections/MnestixConnectionServerActions.ts b/src/app/[locale]/settings/_components/mnestix-connections/MnestixConnectionServerActions.ts new file mode 100644 index 0000000..3ba2e79 --- /dev/null +++ b/src/app/[locale]/settings/_components/mnestix-connections/MnestixConnectionServerActions.ts @@ -0,0 +1,22 @@ +'use server'; + +import { ConnectionType } from '@prisma/client'; +import { + DataSourceFormData, + PrismaConnector, +} from 'app/[locale]/settings/_components/mnestix-connections/PrismaConnector'; + +export async function getConnectionDataAction() { + const prismaConnector = PrismaConnector.create(); + return prismaConnector.getConnectionData(); +} + +export async function upsertConnectionDataAction(formDataInput: DataSourceFormData[]) { + const prismaConnector = PrismaConnector.create(); + return prismaConnector.upsertConnectionDataAction(formDataInput); +} + +export async function getConnectionDataByTypeAction(type: ConnectionType) { + const prismaConnector = PrismaConnector.create(); + return prismaConnector.getConnectionDataByTypeAction(type); +} diff --git a/src/app/[locale]/settings/_components/mnestix-connections/MnestixConnectionServerActions.tsx b/src/app/[locale]/settings/_components/mnestix-connections/MnestixConnectionServerActions.tsx deleted file mode 100644 index e7df145..0000000 --- a/src/app/[locale]/settings/_components/mnestix-connections/MnestixConnectionServerActions.tsx +++ /dev/null @@ -1,46 +0,0 @@ -'use server'; - -import { prisma } from 'lib/database/prisma'; -import { ConnectionType } from '@prisma/client'; - -type DataSourceFormData = { - id: string; - url: string; - type: string; -}; - -export async function getConnectionDataAction() { - return prisma?.mnestixConnection.findMany({ include: { type: true } }); -} - -export async function upsertConnectionDataAction(formDataInput: DataSourceFormData[]) { - const existingData = await prisma?.mnestixConnection.findMany({ include: { type: true } }); - for (const existing of existingData) { - const formData = formDataInput.find((value) => value.id === existing.id); - // If an entry exists in the db and the updated data, update the existing db entry - if (formData) { - await prisma.mnestixConnection.update({ where: { id: existing.id }, data: { url: formData.url } }); - // If an entry exists in the db but NOT in the updated data, delete it from the db - } else { - await prisma.mnestixConnection.delete({ where: { id: existing.id } }); - } - } - // If an entry doesn't exist in the db but in the updated data, create it in the db - for (const updated of formDataInput) { - const formData = existingData.find((value) => value.id === updated.id); - const type = await prisma.connectionType.findFirst({ where: { typeName: updated.type } }); - if (!formData && type) { - await prisma.mnestixConnection.create({ data: { url: updated.url, typeId: type.id } }); - } - } -} - -export async function getConnectionDataByTypeAction(type: ConnectionType) { - const basePath = await prisma?.mnestixConnection.findMany({ - where: { - type: type, - }, - }); - - return basePath.map((item) => item.url); -} diff --git a/src/app/[locale]/settings/_components/mnestix-connections/PrismaConnector.ts b/src/app/[locale]/settings/_components/mnestix-connections/PrismaConnector.ts new file mode 100644 index 0000000..f3c9be8 --- /dev/null +++ b/src/app/[locale]/settings/_components/mnestix-connections/PrismaConnector.ts @@ -0,0 +1,58 @@ +import { prisma } from 'lib/database/prisma'; +import { ConnectionType } from '@prisma/client'; +import { IPrismaConnector } from 'app/[locale]/settings/_components/mnestix-connections/PrismaConnectorInterface'; +import { PrismaConnectorInMemory } from 'app/[locale]/settings/_components/mnestix-connections/PrismaConnectorInMemory'; + +export type DataSourceFormData = { + id: string; + url: string; + type: string; +}; + +export class PrismaConnector implements IPrismaConnector { + private constructor() {} + + async getConnectionData() { + return prisma?.mnestixConnection.findMany({ include: { type: true } }); + } + + async upsertConnectionDataAction(formDataInput: DataSourceFormData[]) { + const existingData = await prisma?.mnestixConnection.findMany({ include: { type: true } }); + for (const existing of existingData) { + const formData = formDataInput.find((value) => value.id === existing.id); + // If an entry exists in the db and the updated data, update the existing db entry + if (formData) { + await prisma.mnestixConnection.update({ where: { id: existing.id }, data: { url: formData.url } }); + // If an entry exists in the db but NOT in the updated data, delete it from the db + } else { + await prisma.mnestixConnection.delete({ where: { id: existing.id } }); + } + } + // If an entry doesn't exist in the db but in the updated data, create it in the db + for (const updated of formDataInput) { + const formData = existingData.find((value) => value.id === updated.id); + const type = await prisma.connectionType.findFirst({ where: { typeName: updated.type } }); + if (!formData && type) { + await prisma.mnestixConnection.create({ data: { url: updated.url, typeId: type.id } }); + } + } + } + + async getConnectionDataByTypeAction(type: ConnectionType) { + const basePath = await prisma?.mnestixConnection.findMany({ + where: { + type: type, + }, + }); + + return basePath.map((item) => item.url); + } + + static create() { + return new PrismaConnector(); + } + + static createNull(options: { aasUrls: string[] }) { + return new PrismaConnectorInMemory(options.aasUrls); + } +} diff --git a/src/app/[locale]/settings/_components/mnestix-connections/PrismaConnectorInMemory.ts b/src/app/[locale]/settings/_components/mnestix-connections/PrismaConnectorInMemory.ts new file mode 100644 index 0000000..ed3897a --- /dev/null +++ b/src/app/[locale]/settings/_components/mnestix-connections/PrismaConnectorInMemory.ts @@ -0,0 +1,24 @@ +import { IPrismaConnector } from 'app/[locale]/settings/_components/mnestix-connections/PrismaConnectorInterface'; +import { DataSourceFormData } from 'app/[locale]/settings/_components/mnestix-connections/PrismaConnector'; + +export class PrismaConnectorInMemory implements IPrismaConnector { + constructor(protected connectionData: string[]) {} + + getConnectionData(): Promise< + { type: { id: string; typeName: string } } & { + id: string; + url: string; + typeId: string; + } + > { + throw new Error('Method not implemented.'); + } + + upsertConnectionDataAction(_formDataInput: DataSourceFormData[]): Promise { + throw new Error('Method not implemented.'); + } + + getConnectionDataByTypeAction(_type: { id: string; typeName: string }): Promise { + return Promise.resolve(this.connectionData); + } +} diff --git a/src/app/[locale]/settings/_components/mnestix-connections/PrismaConnectorInterface.ts b/src/app/[locale]/settings/_components/mnestix-connections/PrismaConnectorInterface.ts new file mode 100644 index 0000000..0f10309 --- /dev/null +++ b/src/app/[locale]/settings/_components/mnestix-connections/PrismaConnectorInterface.ts @@ -0,0 +1,10 @@ +import { ConnectionType } from '@prisma/client'; +import { DataSourceFormData } from 'app/[locale]/settings/_components/mnestix-connections/PrismaConnector'; + +export interface IPrismaConnector { + getConnectionData(): unknown; + + upsertConnectionDataAction(formDataInput: DataSourceFormData[]): Promise; + + getConnectionDataByTypeAction(type: ConnectionType): Promise; +} diff --git a/src/lib/api/basyx-v3/api.ts b/src/lib/api/basyx-v3/api.ts index f9772d8..567561a 100644 --- a/src/lib/api/basyx-v3/api.ts +++ b/src/lib/api/basyx-v3/api.ts @@ -7,6 +7,7 @@ import { encodeBase64 } from 'lib/util/Base64Util'; import { IAssetAdministrationShellRepositoryApi, ISubmodelRepositoryApi } from 'lib/api/basyx-v3/apiInterface'; import { AssetAdministrationShellRepositoryApiInMemory, + INullableAasRepositoryEntries, SubmodelRepositoryApiInMemory } from 'lib/api/basyx-v3/apiInMemory'; @@ -88,7 +89,7 @@ export class AssetAdministrationShellRepositoryApi extends BaseAPI implements IA } static createNull(options: { - shellsSavedInTheRepository: AssetAdministrationShell[] | null; + shellsSavedInTheRepositories: INullableAasRepositoryEntries[] | null; }): AssetAdministrationShellRepositoryApiInMemory { return new AssetAdministrationShellRepositoryApiInMemory(options); } diff --git a/src/lib/api/basyx-v3/apiInMemory.ts b/src/lib/api/basyx-v3/apiInMemory.ts index 35442d9..b080d9d 100644 --- a/src/lib/api/basyx-v3/apiInMemory.ts +++ b/src/lib/api/basyx-v3/apiInMemory.ts @@ -2,11 +2,20 @@ import { IAssetAdministrationShellRepositoryApi, ISubmodelRepositoryApi } from ' import { AssetAdministrationShell, Reference, Submodel } from '@aas-core-works/aas-core3.0-typescript/dist/types/types'; import { decodeBase64, encodeBase64 } from 'lib/util/Base64Util'; +export interface INullableAasRepositoryEntries { + repositoryUrl: string; + aas: AssetAdministrationShell; +} + export class AssetAdministrationShellRepositoryApiInMemory implements IAssetAdministrationShellRepositoryApi { - private shellsSavedInTheRepository: AssetAdministrationShell[] | null | undefined; + private shellsSavedInTheRepositories: INullableAasRepositoryEntries[] | null | undefined; + + constructor(options: { shellsSavedInTheRepositories: INullableAasRepositoryEntries[] | null }) { + this.shellsSavedInTheRepositories = options.shellsSavedInTheRepositories; + } - constructor(options: { shellsSavedInTheRepository: AssetAdministrationShell[] | null }) { - this.shellsSavedInTheRepository = options.shellsSavedInTheRepository; + static getDefaultRepositoryUrl(): string { + return 'www.aas.default.com/repository'; } getAssetAdministrationShellById( @@ -14,12 +23,22 @@ export class AssetAdministrationShellRepositoryApiInMemory implements IAssetAdmi _options?: object | undefined, _basePath?: string | undefined, ): Promise { - if (!this.shellsSavedInTheRepository) return Promise.reject('no repository configuration'); - for (const aas of this.shellsSavedInTheRepository) { - if (encodeBase64(aas.id) === aasId) return Promise.resolve(aas); + if (!this.shellsSavedInTheRepositories) return Promise.reject('no repository configuration'); + const defaultRepositoryUrl = AssetAdministrationShellRepositoryApiInMemory.getDefaultRepositoryUrl(); + const isSearchingInDefaultRepository = _basePath === defaultRepositoryUrl || _basePath === undefined; + for (const entry of this.shellsSavedInTheRepositories) { + if (encodeBase64(entry.aas.id) === aasId) { + const isInDefaultRepository = entry.repositoryUrl === defaultRepositoryUrl; + if (isInDefaultRepository || !isSearchingInDefaultRepository) { + return Promise.resolve(entry.aas); + } + } } + const targetRepositoryKind = isSearchingInDefaultRepository ? 'default' : 'foreign'; return Promise.reject( - 'no aas found in the default repository for aasId: ' + + 'no aas found in the ' + + targetRepositoryKind + + ' repository for aasId: ' + aasId + ', which is :' + decodeBase64(aasId) + diff --git a/src/lib/services/multipleDataSourceActions/MultipleDataSource.ts b/src/lib/services/multipleDataSourceActions/MultipleDataSource.ts index 28933c3..d2b67a0 100644 --- a/src/lib/services/multipleDataSourceActions/MultipleDataSource.ts +++ b/src/lib/services/multipleDataSourceActions/MultipleDataSource.ts @@ -2,17 +2,19 @@ import { IAssetAdministrationShellRepositoryApi, ISubmodelRepositoryApi } from ' import { Log } from 'lib/util/Log'; import { AssetAdministrationShellRepositoryApi, SubmodelRepositoryApi } from 'lib/api/basyx-v3/api'; import { mnestixFetch } from 'lib/api/infrastructure'; -import { getConnectionDataByTypeAction } from 'app/[locale]/settings/_components/mnestix-connections/MnestixConnectionServerActions'; import { AssetAdministrationShell, Submodel } from '@aas-core-works/aas-core3.0-typescript/dist/types/types'; +import { INullableAasRepositoryEntries } from 'lib/api/basyx-v3/apiInMemory'; +import { PrismaConnector } from 'app/[locale]/settings/_components/mnestix-connections/PrismaConnector'; +import { IPrismaConnector } from 'app/[locale]/settings/_components/mnestix-connections/PrismaConnectorInterface'; export type RepoSearchResult = { aas: AssetAdministrationShell; location: string; }; -interface NullableSearchSetupParameters { +export interface NullableMultipleDataSourceSetupParameters { shellsByRegistryEndpoint?: { path: string; aas: AssetAdministrationShell }[] | null; - shellsSavedInTheRepository?: AssetAdministrationShell[] | null; + shellsSavedInTheRepositories?: INullableAasRepositoryEntries[] | null; submodelsSavedInTheRepository?: Submodel[] | null; log?: Log | null; } @@ -21,6 +23,7 @@ export class MultipleDataSource { private constructor( protected readonly repositoryClient: IAssetAdministrationShellRepositoryApi, protected readonly submodelRepositoryClient: ISubmodelRepositoryApi, + protected readonly prismaConnector: IPrismaConnector, protected readonly fetch: (input: RequestInfo | URL, init?: RequestInit | undefined) => Promise, protected readonly log: Log, ) {} @@ -35,15 +38,16 @@ export class MultipleDataSource { fetch: mnestixFetch(), }); const log = Log.create(); - return new MultipleDataSource(repositoryClient, submodelRepositoryClient, fetch, log); + const prismaConnector = PrismaConnector.create(); + return new MultipleDataSource(repositoryClient, submodelRepositoryClient, prismaConnector, fetch, log); } static createNull({ shellsByRegistryEndpoint = [], - shellsSavedInTheRepository = [], + shellsSavedInTheRepositories = [], submodelsSavedInTheRepository = [], log = null, - }: NullableSearchSetupParameters = {}): MultipleDataSource { + }: NullableMultipleDataSourceSetupParameters = {}): MultipleDataSource { const stubbedFetch = async (input: RequestInfo | URL): Promise => { if (!shellsByRegistryEndpoint) return Promise.reject(new Error('no registry configuration')); for (const aasEntry of shellsByRegistryEndpoint) { @@ -51,16 +55,21 @@ export class MultipleDataSource { } return Promise.reject(new Error('no aas for on href:' + input)); }; + const aasUrls = [...new Set(shellsSavedInTheRepositories?.map((entry) => entry.repositoryUrl))]; return new MultipleDataSource( - AssetAdministrationShellRepositoryApi.createNull({ shellsSavedInTheRepository }), + AssetAdministrationShellRepositoryApi.createNull({ shellsSavedInTheRepositories }), SubmodelRepositoryApi.createNull({ submodelsSavedInTheRepository }), + PrismaConnector.createNull({ aasUrls }), stubbedFetch, log ?? Log.createNull(), ); } async getAasFromAllRepos(aasId: string): Promise { - const basePathUrls = await getConnectionDataByTypeAction({ id: '0', typeName: 'AAS_REPOSITORY' }); + const basePathUrls = await this.prismaConnector.getConnectionDataByTypeAction({ + id: '0', + typeName: 'AAS_REPOSITORY', + }); const promises = basePathUrls.map( (url) => @@ -81,8 +90,15 @@ export class MultipleDataSource { } } + async getAasFromDefaultRepository(aasId: string): Promise { + return this.repositoryClient.getAssetAdministrationShellById(aasId); + } + async getSubmodelFromAllRepos(submodelId: string) { - const basePathUrls = await getConnectionDataByTypeAction({ id: '0', typeName: 'AAS_REPOSITORY' }); + const basePathUrls = await this.prismaConnector.getConnectionDataByTypeAction({ + id: '0', + typeName: 'AAS_REPOSITORY', + }); const promises = basePathUrls.map((url) => this.submodelRepositoryClient.getSubmodelById(submodelId, undefined, url), ); @@ -95,7 +111,10 @@ export class MultipleDataSource { } async getAasThumbnailFromAllRepos(aasId: string) { - const basePathUrls = await getConnectionDataByTypeAction({ id: '0', typeName: 'AAS_REPOSITORY' }); + const basePathUrls = await this.prismaConnector.getConnectionDataByTypeAction({ + id: '0', + typeName: 'AAS_REPOSITORY', + }); const promises = basePathUrls.map((url) => this.repositoryClient.getThumbnailFromShell(aasId, undefined, url).then((image) => { diff --git a/src/lib/services/searchUtilActions/AasSearcher.ts b/src/lib/services/searchUtilActions/AasSearcher.ts index 6db53b8..93e575e 100644 --- a/src/lib/services/searchUtilActions/AasSearcher.ts +++ b/src/lib/services/searchUtilActions/AasSearcher.ts @@ -8,13 +8,15 @@ import { AssetAdministrationShell, Submodel } from '@aas-core-works/aas-core3.0- import { Log } from 'lib/util/Log'; import { IDiscoveryServiceApi } from 'lib/api/discovery-service-api/discoveryServiceApiInterface'; import { IRegistryServiceApi } from 'lib/api/registry-service-api/registryServiceApiInterface'; -import { IAssetAdministrationShellRepositoryApi, ISubmodelRepositoryApi } from 'lib/api/basyx-v3/apiInterface'; -import { AssetAdministrationShellRepositoryApi, SubmodelRepositoryApi } from 'lib/api/basyx-v3/api'; -import { mnestixFetch } from 'lib/api/infrastructure'; import { RegistryServiceApi } from 'lib/api/registry-service-api/registryServiceApi'; import { DiscoveryServiceApi } from 'lib/api/discovery-service-api/discoveryServiceApi'; import { encodeBase64 } from 'lib/util/Base64Util'; import { NotFoundError } from 'lib/errors/NotFoundError'; +import { + MultipleDataSource, + NullableMultipleDataSourceSetupParameters, +} from 'lib/services/multipleDataSourceActions/MultipleDataSource'; +import { INullableAasRepositoryEntries } from 'lib/api/basyx-v3/apiInMemory'; export interface RegistrySearchResult { registryAas: AssetAdministrationShell; @@ -25,8 +27,9 @@ interface NullableSearchSetupParameters { discoveryEntries?: { assetId: string; aasIds: string[] }[]; registryShellDescriptorEntries?: AssetAdministrationShellDescriptor[] | null; shellsByRegistryEndpoint?: { path: string; aas: AssetAdministrationShell }[] | null; - shellsSavedInTheRepository?: AssetAdministrationShell[] | null; + shellsSavedInTheRepositories?: INullableAasRepositoryEntries[] | null; submodelsSavedInTheRepository?: Submodel[] | null; + entitiesInMultipleDataSources?: NullableMultipleDataSourceSetupParameters | null; log?: Log | null; } @@ -44,39 +47,24 @@ export class AasSearcher { private constructor( protected readonly discoveryServiceClient: IDiscoveryServiceApi, protected readonly registryService: IRegistryServiceApi, - protected readonly repositoryClient: IAssetAdministrationShellRepositoryApi, - protected readonly submodelRepositoryClient: ISubmodelRepositoryApi, + protected readonly multipleDataSource: MultipleDataSource, protected readonly fetch: (input: RequestInfo | URL, init?: RequestInit | undefined) => Promise, protected readonly log: Log, ) {} static create(): AasSearcher { - const repositoryClient = AssetAdministrationShellRepositoryApi.create({ - basePath: process.env.AAS_REPO_API_URL, - fetch: mnestixFetch(), - }); - const submodelRepositoryClient = SubmodelRepositoryApi.create({ - basePath: process.env.SUBMODEL_REPO_API_URL, - fetch: mnestixFetch(), - }); + const multipleDataSource = MultipleDataSource.create(); const registryServiceClient = RegistryServiceApi.create(process.env.REGISTRY_API_URL); const discoveryServiceClient = DiscoveryServiceApi.create(process.env.DISCOVERY_API_URL); const log = Log.create(); - return new AasSearcher( - discoveryServiceClient, - registryServiceClient, - repositoryClient, - submodelRepositoryClient, - fetch, - log, - ); + return new AasSearcher(discoveryServiceClient, registryServiceClient, multipleDataSource, fetch, log); } static createNull({ discoveryEntries = [], registryShellDescriptorEntries = [], shellsByRegistryEndpoint = [], - shellsSavedInTheRepository = [], + shellsSavedInTheRepositories = [], submodelsSavedInTheRepository = [], log = null, }: NullableSearchSetupParameters = {}): AasSearcher { @@ -90,8 +78,11 @@ export class AasSearcher { return new AasSearcher( DiscoveryServiceApi.createNull({ discoveryEntries: discoveryEntries }), RegistryServiceApi.createNull({ registryShellDescriptorEntries }), - AssetAdministrationShellRepositoryApi.createNull({ shellsSavedInTheRepository }), - SubmodelRepositoryApi.createNull({ submodelsSavedInTheRepository }), + MultipleDataSource.createNull({ + shellsByRegistryEndpoint, + shellsSavedInTheRepositories: shellsSavedInTheRepositories, + submodelsSavedInTheRepository, + }), stubbedFetch, log ?? Log.createNull(), ); @@ -111,10 +102,24 @@ export class AasSearcher { const aasId = aasIds && aasIds.length === 1 ? aasIds[0] : val; const registrySearchResult = await this.handleAasRegistrySearch(aasId); - const aas = - registrySearchResult != null - ? registrySearchResult.registryAas - : await this.repositoryClient.getAssetAdministrationShellById(encodeBase64(aasId)); + let aas: AssetAdministrationShell; + if (registrySearchResult != null) { + aas = registrySearchResult.registryAas; + } else { + const aasIdEncoded = encodeBase64(aasId); + try { + aas = await this.multipleDataSource.getAasFromDefaultRepository(aasIdEncoded); + } catch (e) { + const potentiallyMultipleAas = await this.multipleDataSource.getAasFromAllRepos(aasIdEncoded); + if (potentiallyMultipleAas.length > 1) + return { + redirectUrl: `/viewer/discovery?assetId=${val}`, + aas: null, + aasData: null, + }; + aas = potentiallyMultipleAas[0].aas; + } + } const aasData = registrySearchResult?.registryAasData != null diff --git a/src/lib/services/searchUtilActions/search.spec.ts b/src/lib/services/searchUtilActions/search.spec.ts index 29713f8..8581a36 100644 --- a/src/lib/services/searchUtilActions/search.spec.ts +++ b/src/lib/services/searchUtilActions/search.spec.ts @@ -5,6 +5,7 @@ import { instance, mock } from 'ts-mockito'; import { encodeBase64 } from 'lib/util/Base64Util'; import { Log } from 'lib/util/Log'; import { AasSearcher } from 'lib/services/searchUtilActions/AasSearcher'; +import { AssetAdministrationShellRepositoryApiInMemory } from 'lib/api/basyx-v3/apiInMemory'; interface DummyAasParameters { id?: string; @@ -47,7 +48,12 @@ describe('Full Aas Search happy paths', () => { const searchString = 'irrelevant assetId'; const searcher = AasSearcher.createNull({ discoveryEntries: [{ assetId: searchString, aasIds: [aasId] }], - shellsSavedInTheRepository: [createDummyAas({ id: aasId })], + shellsSavedInTheRepositories: [ + { + aas: createDummyAas({ id: aasId }), + repositoryUrl: AssetAdministrationShellRepositoryApiInMemory.getDefaultRepositoryUrl(), + }, + ], }); const result = await searcher.fullSearch(searchString); @@ -72,13 +78,58 @@ describe('Full Aas Search happy paths', () => { const aasId = 'dummy aasId'; const searchString = aasId; const searcher = AasSearcher.createNull({ - shellsSavedInTheRepository: [createDummyAas({ id: aasId })], + shellsSavedInTheRepositories: [ + { + aas: createDummyAas({ id: aasId }), + repositoryUrl: AssetAdministrationShellRepositoryApiInMemory.getDefaultRepositoryUrl(), + }, + ], + }); + + const result = await searcher.fullSearch(searchString); + + expect(result.redirectUrl).toBe('/viewer/' + encodeBase64(aasId)); + }); + + it('returns aas for given aasId from foreign repository if only one found', async () => { + const aasId = 'dummy aasId'; + const searchString = aasId; + const searcher = AasSearcher.createNull({ + shellsSavedInTheRepositories: [ + { + aas: createDummyAas({ id: aasId }), + repositoryUrl: 'www.aas.foreign.cz/repository', + }, + ], }); const result = await searcher.fullSearch(searchString); expect(result.redirectUrl).toBe('/viewer/' + encodeBase64(aasId)); }); + + it('returns aas for given aasId from foreign repository if two are found', async () => { + const aasId = 'dummy aasId'; + const searchString = aasId; + const firstEntryWithSameIdButComingFromRepositoryOne = { + aas: createDummyAas({ id: aasId }), + repositoryUrl: 'www.aas.foreign.cz/repository', + }; + const secondEntryWithSameIdButComingFromRepositoryTwo = { + aas: createDummyAas({ id: aasId }), + repositoryUrl: 'www.aas.another-foreign.uk/repository', + }; + const searcher = AasSearcher.createNull({ + shellsSavedInTheRepositories: [ + firstEntryWithSameIdButComingFromRepositoryOne, + secondEntryWithSameIdButComingFromRepositoryTwo, + ], + }); + + const result = await searcher.fullSearch(searchString); + + expect(result.redirectUrl).toBe('/viewer/discovery?assetId=' + searchString); + }); }); describe('Full Aas Search edge cases', () => { @@ -86,14 +137,10 @@ describe('Full Aas Search edge cases', () => { const searchString = 'irrelevant assetId'; const log = Log.createNull(); const searcher = AasSearcher.createNull({ - discoveryEntries: [], - registryShellDescriptorEntries: [], - shellsByRegistryEndpoint: [], - shellsSavedInTheRepository: [], log: log, }); - await assertThatFunctionThrows(searcher, searchString, 'no aas found in the default repository for aasId'); + await assertThatFunctionThrows(searcher, searchString); }); it('throws when registry search failed', async () => { From d9f11544cc36bbc6ab43bdc1a362266d17b9e1f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Frederik=20Schl=C3=BCter?= Date: Thu, 12 Sep 2024 16:02:52 +0200 Subject: [PATCH 34/55] test strategy: attempt to make calls from the server instead of the client, WIP --- src/lib/api/infrastructure.ts | 16 +++++++++++----- src/lib/api/serverFetch.ts | 8 ++++++++ 2 files changed, 19 insertions(+), 5 deletions(-) create mode 100644 src/lib/api/serverFetch.ts diff --git a/src/lib/api/infrastructure.ts b/src/lib/api/infrastructure.ts index 252fdf2..3fecc02 100644 --- a/src/lib/api/infrastructure.ts +++ b/src/lib/api/infrastructure.ts @@ -1,4 +1,5 @@ import { getSession } from 'next-auth/react'; +import { performServerFetch } from 'lib/api/serverFetch'; const initializeRequestOptions = async (bearerToken: string, init?: RequestInit) => { init = init || {}; @@ -19,12 +20,17 @@ const getBearerToken = async () => { } }; -export const mnestixFetch = (): { - fetch(url: RequestInfo, init?: (RequestInit | undefined)): Promise -} | undefined => { +export const mnestixFetch = (): + | { + fetch(url: RequestInfo, init?: RequestInit | undefined): Promise; + } + | undefined => { return { fetch: async (url: RequestInfo, init?: RequestInit) => { - const response = await fetch(url, await initializeRequestOptions(await getBearerToken(), init)); + const response = await performServerFetch( + url, + await initializeRequestOptions(await getBearerToken(), init), + ); if (response.status !== 401) { return response; @@ -41,4 +47,4 @@ export const sessionLogOut = async (keycloakEnabled: boolean) => { } catch (err) { console.error(err); } -} +}; diff --git a/src/lib/api/serverFetch.ts b/src/lib/api/serverFetch.ts new file mode 100644 index 0000000..57601b7 --- /dev/null +++ b/src/lib/api/serverFetch.ts @@ -0,0 +1,8 @@ +'use server'; + +export async function performServerFetch( + input: string | Request | URL, + init?: RequestInit | undefined, +): Promise { + return await fetch(input, init)!; +} From 137b83de506e0ce91a71ab703d8cee7cc3d848d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Frederik=20Schl=C3=BCter?= Date: Thu, 12 Sep 2024 17:09:29 +0200 Subject: [PATCH 35/55] test strategy: attempt to make calls from the server instead of the client --- src/lib/api/infrastructure.ts | 11 ++--------- src/lib/api/serverFetch.ts | 7 +++++-- 2 files changed, 7 insertions(+), 11 deletions(-) diff --git a/src/lib/api/infrastructure.ts b/src/lib/api/infrastructure.ts index 3fecc02..bee8c18 100644 --- a/src/lib/api/infrastructure.ts +++ b/src/lib/api/infrastructure.ts @@ -27,15 +27,8 @@ export const mnestixFetch = (): | undefined => { return { fetch: async (url: RequestInfo, init?: RequestInit) => { - const response = await performServerFetch( - url, - await initializeRequestOptions(await getBearerToken(), init), - ); - - if (response.status !== 401) { - return response; - } - return response; + const text = await performServerFetch(url, await initializeRequestOptions(await getBearerToken(), init)); + return new Response(text); }, }; }; diff --git a/src/lib/api/serverFetch.ts b/src/lib/api/serverFetch.ts index 57601b7..ab380eb 100644 --- a/src/lib/api/serverFetch.ts +++ b/src/lib/api/serverFetch.ts @@ -3,6 +3,9 @@ export async function performServerFetch( input: string | Request | URL, init?: RequestInit | undefined, -): Promise { - return await fetch(input, init)!; +): Promise { + const result = await fetch(input, init); + if (result.status >= 200 && result.status < 300) { + return Promise.resolve(await result.text()); + } else throw result; } From 0f95458c2802b618214db631d7b62141dae8d82f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Frederik=20Schl=C3=BCter?= Date: Thu, 12 Sep 2024 17:47:37 +0200 Subject: [PATCH 36/55] test strategy: attempt to make calls from the server instead of the client --- .../azureAuthentication/ApiProvider.tsx | 7 +++-- .../discoveryServiceApi.ts | 24 +++++++++++----- .../registryServiceApi.ts | 28 +++++++++++++------ .../submodelRegistryServiceApi.ts | 25 +++++++++++------ .../template-shell-api/templateShellApi.ts | 25 +++++++++++------ .../services/searchUtilActions/AasSearcher.ts | 7 +++-- 6 files changed, 79 insertions(+), 37 deletions(-) diff --git a/src/components/azureAuthentication/ApiProvider.tsx b/src/components/azureAuthentication/ApiProvider.tsx index 7aa9c0f..70084d2 100644 --- a/src/components/azureAuthentication/ApiProvider.tsx +++ b/src/components/azureAuthentication/ApiProvider.tsx @@ -26,6 +26,7 @@ export const ApiProvider = (props: PropsWithChildren) => { templatesClient: new TemplateShellApi( env.MNESTIX_BACKEND_API_URL ? env.MNESTIX_BACKEND_API_URL : '', env.AUTHENTICATION_FEATURE_FLAG, + mnestixFetch(), ), repositoryClient: AssetAdministrationShellRepositoryApi.create({ basePath: env.AAS_REPO_API_URL, @@ -35,9 +36,9 @@ export const ApiProvider = (props: PropsWithChildren) => { basePath: env.SUBMODEL_REPO_API_URL ?? env.AAS_REPO_API_URL, fetch: mnestixFetch(), }), - discoveryServiceClient: DiscoveryServiceApi.create(env.DISCOVERY_API_URL), - registryServiceClient: RegistryServiceApi.create(env.REGISTRY_API_URL), - submodelRegistryServiceClient: new SubmodelRegistryServiceApi(env.SUBMODEL_REGISTRY_API_URL), + discoveryServiceClient: DiscoveryServiceApi.create(env.DISCOVERY_API_URL, mnestixFetch()), + registryServiceClient: RegistryServiceApi.create(env.REGISTRY_API_URL, mnestixFetch()), + submodelRegistryServiceClient: new SubmodelRegistryServiceApi(env.SUBMODEL_REGISTRY_API_URL, mnestixFetch()), }; return {props.children}; diff --git a/src/lib/api/discovery-service-api/discoveryServiceApi.ts b/src/lib/api/discovery-service-api/discoveryServiceApi.ts index adbb4a5..9bde82a 100644 --- a/src/lib/api/discovery-service-api/discoveryServiceApi.ts +++ b/src/lib/api/discovery-service-api/discoveryServiceApi.ts @@ -5,12 +5,22 @@ import { DiscoveryServiceApiInMemory } from 'lib/api/discovery-service-api/disco export class DiscoveryServiceApi implements IDiscoveryServiceApi { baseUrl: string; - private constructor(protected _baseUrl: string = '') { + private constructor( + protected _baseUrl: string = '', + protected http: { + fetch(url: RequestInfo, init?: RequestInit): Promise; + }, + ) { this.baseUrl = _baseUrl; } - static create(_baseUrl: string = ''): DiscoveryServiceApi { - return new DiscoveryServiceApi(_baseUrl); + static create( + _baseUrl: string = '', + http?: { + fetch(url: RequestInfo, init?: RequestInit): Promise; + }, + ): DiscoveryServiceApi { + return new DiscoveryServiceApi(_baseUrl, http ?? window); } static createNull(options: { @@ -45,7 +55,7 @@ export class DiscoveryServiceApi implements IDiscoveryServiceApi { 'Content-Type': 'application/json', }; - const response = await fetch(`${this.baseUrl}/lookup/shells/${b64_aasId}`, { + const response = await this.http.fetch(`${this.baseUrl}/lookup/shells/${b64_aasId}`, { method: 'DELETE', headers, }); @@ -71,7 +81,7 @@ export class DiscoveryServiceApi implements IDiscoveryServiceApi { url.searchParams.append('assetIds', encodeBase64(JSON.stringify(obj))); }); - const response = await fetch(url, { + const response = await this.http.fetch(url.toString(), { method: 'GET', headers, }); @@ -91,7 +101,7 @@ export class DiscoveryServiceApi implements IDiscoveryServiceApi { 'Content-Type': 'application/json', }; - const response = await fetch(`${this.baseUrl}/lookup/shells/${b64_aasId}`, { + const response = await this.http.fetch(`${this.baseUrl}/lookup/shells/${b64_aasId}`, { method: 'GET', headers, }); @@ -111,7 +121,7 @@ export class DiscoveryServiceApi implements IDiscoveryServiceApi { 'Content-Type': 'application/json', }; - const response = await fetch(`${this.baseUrl}/lookup/shells/${b64_aasId}`, { + const response = await this.http.fetch(`${this.baseUrl}/lookup/shells/${b64_aasId}`, { method: 'POST', headers, body: JSON.stringify(assetLinks), diff --git a/src/lib/api/registry-service-api/registryServiceApi.ts b/src/lib/api/registry-service-api/registryServiceApi.ts index aa9299f..663788a 100644 --- a/src/lib/api/registry-service-api/registryServiceApi.ts +++ b/src/lib/api/registry-service-api/registryServiceApi.ts @@ -6,12 +6,24 @@ import { RegistryServiceApiInMemory } from 'lib/api/registry-service-api/registr export class RegistryServiceApi implements IRegistryServiceApi { baseUrl: string; - constructor(protected _baseUrl: string = '') { + constructor( + protected _baseUrl: string = '', + protected http: { + fetch(url: RequestInfo, init?: RequestInit): Promise; + }, + ) { this.baseUrl = _baseUrl; } - static create(_baseUrl: string = '') { - return new RegistryServiceApi(_baseUrl); + static create( + _baseUrl: string | undefined, + mnestixFetch: + | { + fetch(url: RequestInfo, init?: RequestInit | undefined): Promise; + } + | undefined, + ) { + return new RegistryServiceApi(_baseUrl, mnestixFetch ?? window); } static createNull(options: { registryShellDescriptorEntries: AssetAdministrationShellDescriptor[] | null }) { @@ -25,7 +37,7 @@ export class RegistryServiceApi implements IRegistryServiceApi { const url = new URL(`${this.baseUrl}/shell-descriptors`); - const response = await fetch(url, { + const response = await this.http.fetch(url.toString(), { method: 'GET', headers, }); @@ -47,7 +59,7 @@ export class RegistryServiceApi implements IRegistryServiceApi { const url = new URL(`${this.baseUrl}/shell-descriptors/${b64_aasId}`); - const response = await fetch(url, { + const response = await this.http.fetch(url.toString(), { method: 'GET', headers, }); @@ -67,7 +79,7 @@ export class RegistryServiceApi implements IRegistryServiceApi { const url = new URL(`${this.baseUrl}/shell-descriptors`); - const response = await fetch(url, { + const response = await this.http.fetch(url.toString(), { method: 'POST', headers, body: JSON.stringify(shellDescriptor), @@ -93,7 +105,7 @@ export class RegistryServiceApi implements IRegistryServiceApi { const url = new URL(`${this.baseUrl}/shell-descriptors/${b64_aasId}`); - const response = await fetch(url, { + const response = await this.http.fetch(url.toString(), { method: 'PUT', headers, body: JSON.stringify(shellDescriptor), @@ -111,7 +123,7 @@ export class RegistryServiceApi implements IRegistryServiceApi { const url = new URL(`${this.baseUrl}/shell-descriptors/${b64_aasId}`); - const response = await fetch(url, { + const response = await this.http.fetch(url.toString(), { method: 'DELETE', }); diff --git a/src/lib/api/submodel-registry-service/submodelRegistryServiceApi.ts b/src/lib/api/submodel-registry-service/submodelRegistryServiceApi.ts index d5a95fe..aaa41c4 100644 --- a/src/lib/api/submodel-registry-service/submodelRegistryServiceApi.ts +++ b/src/lib/api/submodel-registry-service/submodelRegistryServiceApi.ts @@ -3,9 +3,18 @@ import { encodeBase64 } from 'lib/util/Base64Util'; export class SubmodelRegistryServiceApi { baseUrl: string; - - constructor(protected _baseUrl: string = '') { + private http: { fetch(url: RequestInfo, init?: RequestInit | undefined): Promise }; + + constructor( + _baseUrl: string = '', + http: + | { + fetch(url: RequestInfo, init?: RequestInit | undefined): Promise; + } + | undefined, + ) { this.baseUrl = _baseUrl; + this.http = http ?? window; } public async getSubmodelDescriptorsById(submodelId: string) { @@ -17,7 +26,7 @@ export class SubmodelRegistryServiceApi { const url = new URL(`${this.baseUrl}/submodel-descriptors/${b64_submodelId}`); - const response = await fetch(url, { + const response = await this.http.fetch(url.toString(), { method: 'GET', headers, }); @@ -39,7 +48,7 @@ export class SubmodelRegistryServiceApi { const url = new URL(`${this.baseUrl}/submodel-descriptors/${b64_submodelId}`); - const response = await fetch(url, { + const response = await this.http.fetch(url.toString(), { method: 'PUT', headers, body: JSON.stringify(submodelDescriptor), @@ -57,7 +66,7 @@ export class SubmodelRegistryServiceApi { const url = new URL(`${this.baseUrl}/submodel-descriptors/${b64_submodelId}`); - const response = await fetch(url, { + const response = await this.http.fetch(url.toString(), { method: 'DELETE', }); @@ -75,7 +84,7 @@ export class SubmodelRegistryServiceApi { const url = new URL(`${this.baseUrl}/submodel-descriptors`); - const response = await fetch(url, { + const response = await this.http.fetch(url.toString(), { method: 'GET', headers, }); @@ -95,7 +104,7 @@ export class SubmodelRegistryServiceApi { const url = new URL(`${this.baseUrl}/submodel-descriptors`); - const response = await fetch(url, { + const response = await this.http.fetch(url.toString(), { method: 'POST', headers, body: JSON.stringify(submodelDescriptor), @@ -111,7 +120,7 @@ export class SubmodelRegistryServiceApi { public async deleteAllSubmodelDescriptors() { const url = new URL(`${this.baseUrl}/submodel-descriptors`); - const response = await fetch(url, { + const response = await this.http.fetch(url.toString(), { method: 'DELETE', }); diff --git a/src/lib/api/template-shell-api/templateShellApi.ts b/src/lib/api/template-shell-api/templateShellApi.ts index dd95457..9f0b244 100644 --- a/src/lib/api/template-shell-api/templateShellApi.ts +++ b/src/lib/api/template-shell-api/templateShellApi.ts @@ -5,17 +5,23 @@ export class TemplateShellApi { basePathOwnApi: string; basePathCustoms: string; enable_authentication: boolean; + private http: { fetch(url: RequestInfo, init?: RequestInit): Promise }; - constructor(backendApiUrl: string, enable_authentication: boolean) { + constructor( + backendApiUrl: string, + enable_authentication: boolean, + http?: { fetch(url: RequestInfo, init?: RequestInit): Promise }, + ) { this.basePathOwnApi = `${backendApiUrl}/api/Template`; this.basePathCustoms = `${backendApiUrl}/templates/custom`; this.enable_authentication = enable_authentication; + this.http = http ? http : window; } public async getDefaults(token: string): Promise { const headers = this.prepareHeader(token); - const response = await fetch(`${this.basePathOwnApi}/allDefaultSubmodels`, { + const response = await this.http.fetch(`${this.basePathOwnApi}/allDefaultSubmodels`, { method: 'GET', headers, }); @@ -30,7 +36,7 @@ export class TemplateShellApi { public async getCustoms(token: string): Promise { const headers = this.prepareHeader(token); - const response = await fetch(`${this.basePathOwnApi}/allCustomSubmodels`, { + const response = await this.http.fetch(`${this.basePathOwnApi}/allCustomSubmodels`, { method: 'GET', headers, }); @@ -45,10 +51,13 @@ export class TemplateShellApi { public async getCustom(token: string, submodelIdShort: string): Promise { const headers = this.prepareHeader(token); - const response = await fetch(`${this.basePathOwnApi}/CustomSubmodel/${encodeBase64(submodelIdShort)}`, { - method: 'GET', - headers, - }); + const response = await this.http.fetch( + `${this.basePathOwnApi}/CustomSubmodel/${encodeBase64(submodelIdShort)}`, + { + method: 'GET', + headers, + }, + ); if (response.status >= 200 && response.status < 300) { return response.json(); @@ -62,7 +71,7 @@ export class TemplateShellApi { // We use the regular delete endpoint, which expects an idShort, but because of our backend interception, we saved the actual id in the idShort field earlier. // That's why this works. - const response = await fetch(`${this.basePathCustoms}/${encodeBase64(id)}`, { + const response = await this.http.fetch(`${this.basePathCustoms}/${encodeBase64(id)}`, { method: 'DELETE', headers, }); diff --git a/src/lib/services/searchUtilActions/AasSearcher.ts b/src/lib/services/searchUtilActions/AasSearcher.ts index 93e575e..1e45ccf 100644 --- a/src/lib/services/searchUtilActions/AasSearcher.ts +++ b/src/lib/services/searchUtilActions/AasSearcher.ts @@ -17,6 +17,7 @@ import { NullableMultipleDataSourceSetupParameters, } from 'lib/services/multipleDataSourceActions/MultipleDataSource'; import { INullableAasRepositoryEntries } from 'lib/api/basyx-v3/apiInMemory'; +import { mnestixFetch } from 'lib/api/infrastructure'; export interface RegistrySearchResult { registryAas: AssetAdministrationShell; @@ -52,10 +53,10 @@ export class AasSearcher { protected readonly log: Log, ) {} - static create(): AasSearcher { + static create(_baseUrl: string = ''): AasSearcher { const multipleDataSource = MultipleDataSource.create(); - const registryServiceClient = RegistryServiceApi.create(process.env.REGISTRY_API_URL); - const discoveryServiceClient = DiscoveryServiceApi.create(process.env.DISCOVERY_API_URL); + const registryServiceClient = RegistryServiceApi.create(process.env.REGISTRY_API_URL, mnestixFetch()); + const discoveryServiceClient = DiscoveryServiceApi.create(process.env.DISCOVERY_API_URL, mnestixFetch()); const log = Log.create(); return new AasSearcher(discoveryServiceClient, registryServiceClient, multipleDataSource, fetch, log); } From c064602c5e98937832ceaec6e993d95356a45287 Mon Sep 17 00:00:00 2001 From: "XITASO\\pawel.baran" Date: Thu, 12 Sep 2024 18:19:33 +0200 Subject: [PATCH 37/55] MNES-468: e2e test update --- cypress/support/commands.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/cypress/support/commands.ts b/cypress/support/commands.ts index b516313..9560b7b 100644 --- a/cypress/support/commands.ts +++ b/cypress/support/commands.ts @@ -21,8 +21,6 @@ Cypress.Commands.add('setResolution', (res) => { Cypress.Commands.add('visitViewer', (aasId) => { cy.visit('/viewer/' + btoa(aasId).replace(/=+$/g, '')); - cy.intercept('GET', '**/submodels/*').as('getSubmodels'); - cy.wait('@getSubmodels'); }); Cypress.Commands.add('getByTestId', (dataTestId) => { From a1ed40153d3f54e9ae667dec94cade4bba4ed355 Mon Sep 17 00:00:00 2001 From: "XITASO\\pawel.baran" Date: Fri, 13 Sep 2024 11:31:36 +0200 Subject: [PATCH 38/55] MNES-468: e2e test update --- cypress.config.ts | 1 + cypress/e2e/dnsRedirectTest.spec.js | 5 ++--- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cypress.config.ts b/cypress.config.ts index 7e53f80..8af2abb 100644 --- a/cypress.config.ts +++ b/cypress.config.ts @@ -13,6 +13,7 @@ export default defineConfig({ baseUrl: 'http://localhost:3000/', excludeSpecPattern: '**/ignoredTestFiles/*.js', specPattern: 'cypress/e2e/**/*.spec.{js,jsx,ts,tsx}', + experimentalRunAllSpecs: true, }, env: { AAS_REPO_API_URL: 'http://localhost:5064/repo', diff --git a/cypress/e2e/dnsRedirectTest.spec.js b/cypress/e2e/dnsRedirectTest.spec.js index dd92e48..506504e 100644 --- a/cypress/e2e/dnsRedirectTest.spec.js +++ b/cypress/e2e/dnsRedirectTest.spec.js @@ -1,4 +1,5 @@ import testAas from '../fixtures/testAAS.json'; + const testAasId = testAas.aasId; const testAssetId = testAas.assetId; @@ -7,9 +8,7 @@ describe('Test the DNS Redirect', function () { cy.postTestAas(); }); it('Visits the "/asset/URLEncodedAssetID" page and gets redirected to the corresponding viewer page', function () { - cy.intercept({ method: 'GET', url: `${Cypress.env('AAS_DISCOVERY_API_URL')}/lookup/shells*` }).as( - 'redirectedViewer', - ); + cy.intercept({ method: 'POST', url: `/en/viewer/*` }).as('redirectedViewer'); let encodedUrl = encodeURIComponent(testAssetId); cy.visit('/asset?assetId=' + encodedUrl); From f1cd1e970214f668d46c1c848c637bcf7cd230a4 Mon Sep 17 00:00:00 2001 From: "XITASO\\pawel.baran" Date: Fri, 13 Sep 2024 15:48:42 +0200 Subject: [PATCH 39/55] MNES-468: e2e test update, increased timeout --- cypress/support/commands.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cypress/support/commands.ts b/cypress/support/commands.ts index 9560b7b..b6a9cd5 100644 --- a/cypress/support/commands.ts +++ b/cypress/support/commands.ts @@ -24,7 +24,7 @@ Cypress.Commands.add('visitViewer', (aasId) => { }); Cypress.Commands.add('getByTestId', (dataTestId) => { - cy.get('[data-testid=' + dataTestId + ']'); + cy.get('[data-testid=' + dataTestId + ']', { timeout: 20000 }); }); Cypress.Commands.add('findByTestId', { prevSubject: true }, (subject, dataTestId) => { From a287e9295d5c7845aef9d01eddd78f41214e0249 Mon Sep 17 00:00:00 2001 From: "XITASO\\pawel.baran" Date: Fri, 13 Sep 2024 16:18:24 +0200 Subject: [PATCH 40/55] MNES-468: e2e test update, increased global timeout --- cypress.config.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/cypress.config.ts b/cypress.config.ts index 8af2abb..3fdf1b5 100644 --- a/cypress.config.ts +++ b/cypress.config.ts @@ -1,6 +1,10 @@ import { defineConfig } from 'cypress'; export default defineConfig({ + defaultCommandTimeout: 15000, // 15 + pageLoadTimeout: 60000, // 60 + requestTimeout: 15000, // 15 + responseTimeout: 20000, // 20 video: true, videoCompression: true, retries: 2, From b04de78c8f94112bea0fea983b8e2df8d0428362 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Frederik=20Schl=C3=BCter?= Date: Fri, 13 Sep 2024 16:59:51 +0200 Subject: [PATCH 41/55] test strategy: are failing tests timeout problem? --- cypress.config.ts | 8 ++++---- cypress/e2e/compareViewTest.spec.js | 1 + 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/cypress.config.ts b/cypress.config.ts index 3fdf1b5..63e79e7 100644 --- a/cypress.config.ts +++ b/cypress.config.ts @@ -1,10 +1,10 @@ import { defineConfig } from 'cypress'; export default defineConfig({ - defaultCommandTimeout: 15000, // 15 - pageLoadTimeout: 60000, // 60 - requestTimeout: 15000, // 15 - responseTimeout: 20000, // 20 + defaultCommandTimeout: 150000, // 150 + pageLoadTimeout: 600000, // 600 + requestTimeout: 150000, // 150 + responseTimeout: 200000, // 200 video: true, videoCompression: true, retries: 2, diff --git a/cypress/e2e/compareViewTest.spec.js b/cypress/e2e/compareViewTest.spec.js index 0738683..454997b 100644 --- a/cypress/e2e/compareViewTest.spec.js +++ b/cypress/e2e/compareViewTest.spec.js @@ -32,6 +32,7 @@ describe('Test compare feature view', function () { cy.get('@IDInput').click().type(compareAAS[1].assetInformation.globalAssetId); cy.getByTestId('aasId-submit-button').click(); // assert if second aas is visible and contains correct values + // here it is cy.getByTestId('compare-aas-1').should('be.visible'); cy.getByTestId('compare-Data-0').click(); cy.getByTestId('compare-value-1').eq(1).contains('TEST_DATA2'); From b4b57341474077e565b1603565712968469396b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Frederik=20Schl=C3=BCter?= Date: Mon, 16 Sep 2024 10:58:24 +0200 Subject: [PATCH 42/55] test strategy: fixed pipeline --- cypress/e2e/compareViewTest.spec.js | 7 ++++++- cypress/e2e/listAasPageComparisonTest.spec.js | 5 +++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/cypress/e2e/compareViewTest.spec.js b/cypress/e2e/compareViewTest.spec.js index 454997b..5d3c64e 100644 --- a/cypress/e2e/compareViewTest.spec.js +++ b/cypress/e2e/compareViewTest.spec.js @@ -18,14 +18,15 @@ describe('Test compare feature view', function () { it('In the viewer detail page clicking Compare redirects to compare feature and loads first data to compare', function () { cy.getByTestId('detail-compare-button').click(); - cy.getByTestId('compare-Data-0').click(); cy.url().should('contain', '/compare'); cy.getByTestId('compare-aas-0').should('be.visible'); + cy.getByTestId('compare-Data-0').click(); cy.getByTestId('compare-Record').eq(0).should('be.visible'); }); it('In the compare view clicks on the add another AAS and adds correct data to compare', function () { cy.getByTestId('detail-compare-button').click(); + cy.getByTestId('compare-aas-0').should('be.visible'); // open popup dialog and insert second aas to compare cy.getByTestId('add-aas-to-compare-button').click(); cy.getByTestId('compare-aas-aad-dialog').should('be.visible'); @@ -50,6 +51,7 @@ describe('Test compare feature view', function () { it('In the compare view three aas are added with correct data and no possibility to add more aas', function () { cy.getByTestId('detail-compare-button').click(); + cy.getByTestId('compare-aas-0').should('be.visible'); // open popup dialog and insert second aas to compare cy.getByTestId('add-aas-to-compare-button').click(); cy.get('@IDInput').click().type(compareAAS[1].assetInformation.globalAssetId); @@ -75,6 +77,7 @@ describe('Test compare feature view', function () { it('In the compare view check if different values are being marked when different', function () { cy.getByTestId('detail-compare-button').click(); + cy.getByTestId('compare-aas-0').should('be.visible'); // open popup dialog and insert second aas to compare cy.getByTestId('add-aas-to-compare-button').click(); cy.get('@IDInput').click().type(compareAAS[1].assetInformation.globalAssetId); @@ -105,11 +108,13 @@ describe('Test compare feature view', function () { cy.get('@IDInput').click().type(compareAAS[0].id); cy.getByTestId('aasId-submit-button').click(); cy.getByTestId('detail-compare-button').click(); + cy.getByTestId('compare-aas-0').should('be.visible'); // //insert mock data for (let i = 1; i < 3; i++) { cy.getByTestId('add-aas-to-compare-button').click(); cy.get('@IDInput').click().type(compareAAS[i].assetInformation.globalAssetId); cy.getByTestId('aasId-submit-button').click(); + cy.getByTestId(`compare-aas-${i}`).should('be.visible'); } }); diff --git a/cypress/e2e/listAasPageComparisonTest.spec.js b/cypress/e2e/listAasPageComparisonTest.spec.js index d38d66f..190ac6f 100644 --- a/cypress/e2e/listAasPageComparisonTest.spec.js +++ b/cypress/e2e/listAasPageComparisonTest.spec.js @@ -15,12 +15,13 @@ describe('Test that the list works together with the comparison view (Resolution .findByTestId('list-checkbox') .click(); + cy.screenshot('list-selected.png'); cy.getByTestId('compare-button').click(); - cy.wait(100); cy.url().should('contain', '/compare'); + cy.getByTestId('compare-aas-0').should('be.visible'); + cy.getByTestId('compare-aas-1').should('be.visible'); // assert that second aas is displayed correctly - cy.getByTestId('compare-aas-1').should('be.visible'); cy.getByTestId('compare-Data-0').click(); cy.getByTestId('compare-value-1').eq(1).contains('TEST_DATA2'); cy.getByTestId('compare-value-0').eq(10).should('be.empty'); From 348dcb591d4ecbb99b2db23e546ec14cce253d09 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Frederik=20Schl=C3=BCter?= Date: Mon, 16 Sep 2024 14:09:38 +0200 Subject: [PATCH 43/55] test strategy: fixed pipeline finally really --- cypress/e2e/listAasPageComparisonTest.spec.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cypress/e2e/listAasPageComparisonTest.spec.js b/cypress/e2e/listAasPageComparisonTest.spec.js index 190ac6f..bf9a2b8 100644 --- a/cypress/e2e/listAasPageComparisonTest.spec.js +++ b/cypress/e2e/listAasPageComparisonTest.spec.js @@ -4,8 +4,8 @@ describe('Test that the list works together with the comparison view (Resolution before(function () { cy.postCompareMockData(); - cy.setResolution(resolutions[0]); cy.visit('/list'); + cy.setResolution(resolutions[0]); }); it('should redirect to the comparison page and display the submodel data correctly', function () { cy.get('[data-testid="list-row-https://i40.xitaso.com/aas/testElement_1"]') @@ -14,10 +14,10 @@ describe('Test that the list works together with the comparison view (Resolution cy.get('[data-testid="list-row-https://i40.xitaso.com/aas/testElement_2"]') .findByTestId('list-checkbox') .click(); - cy.screenshot('list-selected.png'); cy.getByTestId('compare-button').click(); cy.url().should('contain', '/compare'); + cy.wait(60000); cy.getByTestId('compare-aas-0').should('be.visible'); cy.getByTestId('compare-aas-1').should('be.visible'); From 593256b0951d918ded512ff96cfc9ea475643355 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Frederik=20Schl=C3=BCter?= Date: Mon, 16 Sep 2024 15:20:56 +0200 Subject: [PATCH 44/55] test strategy: updated lock file --- yarn.lock | 2333 ++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 1942 insertions(+), 391 deletions(-) diff --git a/yarn.lock b/yarn.lock index 9a1bcb5..c554a49 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7,6 +7,11 @@ resolved "https://registry.yarnpkg.com/@aas-core-works/aas-core3.0-typescript/-/aas-core3.0-typescript-1.0.3.tgz#abc18f59c1eca5d87226a190aa7d16c771d600b2" integrity sha512-ZS2Fijmy3SzVYngA/p5Uiv2hBPZRxm89G1Y3TPzs7uRi/cyf+A0LZppsNvcybL87EdjZscFoZLsCyGrg1uiDVA== +"@adobe/css-tools@^4.4.0": + version "4.4.0" + resolved "https://registry.yarnpkg.com/@adobe/css-tools/-/css-tools-4.4.0.tgz#728c484f4e10df03d5a3acd0d8adcbbebff8ad63" + integrity sha512-Ff9+ksdQQB3rMncgqDK78uLznstjyfIf2Arnh22pW8kBpLs6rpKDwgnZT46hin5Hl1WzazzK64DOrhSwYpS7bQ== + "@ampproject/remapping@^2.2.0": version "2.3.0" resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.3.0.tgz#ed441b6fa600072520ce18b43d2c8cc8caecc7f4" @@ -40,11 +45,45 @@ "@babel/highlight" "^7.24.2" picocolors "^1.0.0" +"@babel/code-frame@^7.10.4", "@babel/code-frame@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.24.7.tgz#882fd9e09e8ee324e496bd040401c6f046ef4465" + integrity sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA== + dependencies: + "@babel/highlight" "^7.24.7" + picocolors "^1.0.0" + "@babel/compat-data@^7.22.6", "@babel/compat-data@^7.23.5", "@babel/compat-data@^7.24.4": version "7.24.4" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.24.4.tgz#6f102372e9094f25d908ca0d34fc74c74606059a" integrity sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ== +"@babel/compat-data@^7.25.2": + version "7.25.4" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.25.4.tgz#7d2a80ce229890edcf4cc259d4d696cb4dae2fcb" + integrity sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ== + +"@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.23.9": + version "7.25.2" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.25.2.tgz#ed8eec275118d7613e77a352894cd12ded8eba77" + integrity sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.24.7" + "@babel/generator" "^7.25.0" + "@babel/helper-compilation-targets" "^7.25.2" + "@babel/helper-module-transforms" "^7.25.2" + "@babel/helpers" "^7.25.0" + "@babel/parser" "^7.25.0" + "@babel/template" "^7.25.0" + "@babel/traverse" "^7.25.2" + "@babel/types" "^7.25.2" + convert-source-map "^2.0.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.3" + semver "^6.3.1" + "@babel/core@^7.21.3": version "7.24.5" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.24.5.tgz#15ab5b98e101972d171aeef92ac70d8d6718f06a" @@ -76,6 +115,16 @@ "@jridgewell/trace-mapping" "^0.3.25" jsesc "^2.5.1" +"@babel/generator@^7.25.0", "@babel/generator@^7.25.6", "@babel/generator@^7.7.2": + version "7.25.6" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.25.6.tgz#0df1ad8cb32fe4d2b01d8bf437f153d19342a87c" + integrity sha512-VPC82gr1seXOpkjAAKoLhP50vx4vGNlF4msF64dSFq1P8RfB+QAuJWGHPXXPc8QyfVWwwB/TNNU4+ayZmHNbZw== + dependencies: + "@babel/types" "^7.25.6" + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.25" + jsesc "^2.5.1" + "@babel/helper-annotate-as-pure@^7.18.6", "@babel/helper-annotate-as-pure@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz#e7f06737b197d580a01edf75d97e2c8be99d3882" @@ -101,6 +150,17 @@ lru-cache "^5.1.1" semver "^6.3.1" +"@babel/helper-compilation-targets@^7.25.2": + version "7.25.2" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.2.tgz#e1d9410a90974a3a5a66e84ff55ef62e3c02d06c" + integrity sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw== + dependencies: + "@babel/compat-data" "^7.25.2" + "@babel/helper-validator-option" "^7.24.8" + browserslist "^4.23.1" + lru-cache "^5.1.1" + semver "^6.3.1" + "@babel/helper-create-class-features-plugin@^7.21.0", "@babel/helper-create-class-features-plugin@^7.24.1", "@babel/helper-create-class-features-plugin@^7.24.4", "@babel/helper-create-class-features-plugin@^7.24.5": version "7.24.5" resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.5.tgz#7d19da92c7e0cd8d11c09af2ce1b8e7512a6e723" @@ -170,6 +230,14 @@ dependencies: "@babel/types" "^7.24.0" +"@babel/helper-module-imports@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz#f2f980392de5b84c3328fc71d38bd81bbb83042b" + integrity sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA== + dependencies: + "@babel/traverse" "^7.24.7" + "@babel/types" "^7.24.7" + "@babel/helper-module-transforms@^7.23.3", "@babel/helper-module-transforms@^7.24.5": version "7.24.5" resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.24.5.tgz#ea6c5e33f7b262a0ae762fd5986355c45f54a545" @@ -181,6 +249,16 @@ "@babel/helper-split-export-declaration" "^7.24.5" "@babel/helper-validator-identifier" "^7.24.5" +"@babel/helper-module-transforms@^7.25.2": + version "7.25.2" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.25.2.tgz#ee713c29768100f2776edf04d4eb23b8d27a66e6" + integrity sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ== + dependencies: + "@babel/helper-module-imports" "^7.24.7" + "@babel/helper-simple-access" "^7.24.7" + "@babel/helper-validator-identifier" "^7.24.7" + "@babel/traverse" "^7.25.2" + "@babel/helper-optimise-call-expression@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz#f21531a9ccbff644fdd156b4077c16ff0c3f609e" @@ -193,6 +271,11 @@ resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.5.tgz#a924607dd254a65695e5bd209b98b902b3b2f11a" integrity sha512-xjNLDopRzW2o6ba0gKbkZq5YWEBaK3PCyTOY1K2P/O07LGMhMqlMXPxwN4S5/RhWuCobT8z0jrlKGlYmeR1OhQ== +"@babel/helper-plugin-utils@^7.24.7", "@babel/helper-plugin-utils@^7.24.8": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz#94ee67e8ec0e5d44ea7baeb51e571bd26af07878" + integrity sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg== + "@babel/helper-remap-async-to-generator@^7.22.20": version "7.22.20" resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz#7b68e1cb4fa964d2996fd063723fb48eca8498e0" @@ -218,6 +301,14 @@ dependencies: "@babel/types" "^7.24.5" +"@babel/helper-simple-access@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz#bcade8da3aec8ed16b9c4953b74e506b51b5edb3" + integrity sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg== + dependencies: + "@babel/traverse" "^7.24.7" + "@babel/types" "^7.24.7" + "@babel/helper-skip-transparent-expression-wrappers@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz#007f15240b5751c537c40e77abb4e89eeaaa8847" @@ -237,16 +328,31 @@ resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz#f99c36d3593db9540705d0739a1f10b5e20c696e" integrity sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ== +"@babel/helper-string-parser@^7.24.8": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz#5b3329c9a58803d5df425e5785865881a81ca48d" + integrity sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ== + "@babel/helper-validator-identifier@^7.22.20", "@babel/helper-validator-identifier@^7.24.5": version "7.24.5" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.5.tgz#918b1a7fa23056603506370089bd990d8720db62" integrity sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA== +"@babel/helper-validator-identifier@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz#75b889cfaf9e35c2aaf42cf0d72c8e91719251db" + integrity sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w== + "@babel/helper-validator-option@^7.23.5": version "7.23.5" resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz#907a3fbd4523426285365d1206c423c4c5520307" integrity sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw== +"@babel/helper-validator-option@^7.24.8": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz#3725cdeea8b480e86d34df15304806a06975e33d" + integrity sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q== + "@babel/helper-wrap-function@^7.22.20": version "7.24.5" resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.24.5.tgz#335f934c0962e2c1ed1fb9d79e06a56115067c09" @@ -265,6 +371,14 @@ "@babel/traverse" "^7.24.5" "@babel/types" "^7.24.5" +"@babel/helpers@^7.25.0": + version "7.25.6" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.25.6.tgz#57ee60141829ba2e102f30711ffe3afab357cc60" + integrity sha512-Xg0tn4HcfTijTwfDwYlvVCl43V6h4KyVVX2aEm4qdO/PC6L2YvzLHFdmxhoeSA3eslcE6+ZVXHgWwopXYLNq4Q== + dependencies: + "@babel/template" "^7.25.0" + "@babel/types" "^7.25.6" + "@babel/highlight@^7.24.2": version "7.24.5" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.5.tgz#bc0613f98e1dd0720e99b2a9ee3760194a704b6e" @@ -275,6 +389,23 @@ js-tokens "^4.0.0" picocolors "^1.0.0" +"@babel/highlight@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.7.tgz#a05ab1df134b286558aae0ed41e6c5f731bf409d" + integrity sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw== + dependencies: + "@babel/helper-validator-identifier" "^7.24.7" + chalk "^2.4.2" + js-tokens "^4.0.0" + picocolors "^1.0.0" + +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.23.9", "@babel/parser@^7.25.0", "@babel/parser@^7.25.6": + version "7.25.6" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.25.6.tgz#85660c5ef388cbbf6e3d2a694ee97a38f18afe2f" + integrity sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q== + dependencies: + "@babel/types" "^7.25.6" + "@babel/parser@^7.24.0", "@babel/parser@^7.24.5": version "7.24.5" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.5.tgz#4a4d5ab4315579e5398a82dcf636ca80c3392790" @@ -334,6 +465,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" +"@babel/plugin-syntax-bigint@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz#4c9a6f669f5d0cdf1b90a1671e9a146be5300cea" + integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + "@babel/plugin-syntax-class-properties@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" @@ -376,6 +514,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.24.0" +"@babel/plugin-syntax-import-attributes@^7.24.7": + version "7.25.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.25.6.tgz#6d4c78f042db0e82fd6436cd65fec5dc78ad2bde" + integrity sha512-sXaDXaJN9SNLymBdlWFA+bjzBhFD617ZaFiY13dGt7TVslVvVgA6fkZOP7Ki3IGElC45lwHdOTrCtKZGVAWeLQ== + dependencies: + "@babel/helper-plugin-utils" "^7.24.8" + "@babel/plugin-syntax-import-meta@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" @@ -397,6 +542,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.24.0" +"@babel/plugin-syntax-jsx@^7.7.2": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.7.tgz#39a1fa4a7e3d3d7f34e2acc6be585b718d30e02d" + integrity sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ== + dependencies: + "@babel/helper-plugin-utils" "^7.24.7" + "@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" @@ -460,6 +612,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.24.0" +"@babel/plugin-syntax-typescript@^7.7.2": + version "7.25.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.4.tgz#04db9ce5a9043d9c635e75ae7969a2cd50ca97ff" + integrity sha512-uMOCoHVU52BsSWxPOMVv5qKRdeSlPuImUCB2dlPuBSU+W2/ROE7/Zg8F2Kepbk+8yBa68LlRKxO+xgEVWorsDg== + dependencies: + "@babel/helper-plugin-utils" "^7.24.8" + "@babel/plugin-syntax-unicode-sets-regex@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz#d49a3b3e6b52e5be6740022317580234a6a47357" @@ -1052,6 +1211,15 @@ "@babel/parser" "^7.24.0" "@babel/types" "^7.24.0" +"@babel/template@^7.25.0", "@babel/template@^7.3.3": + version "7.25.0" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.25.0.tgz#e733dc3134b4fede528c15bc95e89cb98c52592a" + integrity sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q== + dependencies: + "@babel/code-frame" "^7.24.7" + "@babel/parser" "^7.25.0" + "@babel/types" "^7.25.0" + "@babel/traverse@^7.24.5": version "7.24.5" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.24.5.tgz#972aa0bc45f16983bf64aa1f877b2dd0eea7e6f8" @@ -1068,6 +1236,28 @@ debug "^4.3.1" globals "^11.1.0" +"@babel/traverse@^7.24.7", "@babel/traverse@^7.25.2": + version "7.25.6" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.25.6.tgz#04fad980e444f182ecf1520504941940a90fea41" + integrity sha512-9Vrcx5ZW6UwK5tvqsj0nGpp/XzqthkT0dqIc9g1AdtygFToNtTF67XzYS//dm+SAK9cp3B9R4ZO/46p63SCjlQ== + dependencies: + "@babel/code-frame" "^7.24.7" + "@babel/generator" "^7.25.6" + "@babel/parser" "^7.25.6" + "@babel/template" "^7.25.0" + "@babel/types" "^7.25.6" + debug "^4.3.1" + globals "^11.1.0" + +"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.24.7", "@babel/types@^7.25.0", "@babel/types@^7.25.2", "@babel/types@^7.25.6", "@babel/types@^7.3.3": + version "7.25.6" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.25.6.tgz#893942ddb858f32ae7a004ec9d3a76b3463ef8e6" + integrity sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw== + dependencies: + "@babel/helper-string-parser" "^7.24.8" + "@babel/helper-validator-identifier" "^7.24.7" + to-fast-properties "^2.0.0" + "@babel/types@^7.21.3", "@babel/types@^7.22.15", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.23.4", "@babel/types@^7.24.0", "@babel/types@^7.24.5", "@babel/types@^7.4.4": version "7.24.5" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.24.5.tgz#7661930afc638a5383eb0c4aee59b74f38db84d7" @@ -1077,11 +1267,23 @@ "@babel/helper-validator-identifier" "^7.24.5" to-fast-properties "^2.0.0" +"@bcoe/v8-coverage@^0.2.3": + version "0.2.3" + resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" + integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== + "@colors/colors@1.5.0": version "1.5.0" resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9" integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== +"@cspotcode/source-map-support@^0.8.0": + version "0.8.1" + resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" + integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== + dependencies: + "@jridgewell/trace-mapping" "0.3.9" + "@cypress/request@^3.0.0": version "3.0.1" resolved "https://registry.yarnpkg.com/@cypress/request/-/request-3.0.1.tgz#72d7d5425236a2413bd3d8bb66d02d9dc3168960" @@ -1438,6 +1640,85 @@ wrap-ansi "^8.1.0" wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" +"@istanbuljs/load-nyc-config@^1.0.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" + integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== + dependencies: + camelcase "^5.3.1" + find-up "^4.1.0" + get-package-type "^0.1.0" + js-yaml "^3.13.1" + resolve-from "^5.0.0" + +"@istanbuljs/schema@^0.1.2", "@istanbuljs/schema@^0.1.3": + version "0.1.3" + resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" + integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== + +"@jest/console@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-29.7.0.tgz#cd4822dbdb84529265c5a2bdb529a3c9cc950ffc" + integrity sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg== + dependencies: + "@jest/types" "^29.6.3" + "@types/node" "*" + chalk "^4.0.0" + jest-message-util "^29.7.0" + jest-util "^29.7.0" + slash "^3.0.0" + +"@jest/core@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/core/-/core-29.7.0.tgz#b6cccc239f30ff36609658c5a5e2291757ce448f" + integrity sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg== + dependencies: + "@jest/console" "^29.7.0" + "@jest/reporters" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + ci-info "^3.2.0" + exit "^0.1.2" + graceful-fs "^4.2.9" + jest-changed-files "^29.7.0" + jest-config "^29.7.0" + jest-haste-map "^29.7.0" + jest-message-util "^29.7.0" + jest-regex-util "^29.6.3" + jest-resolve "^29.7.0" + jest-resolve-dependencies "^29.7.0" + jest-runner "^29.7.0" + jest-runtime "^29.7.0" + jest-snapshot "^29.7.0" + jest-util "^29.7.0" + jest-validate "^29.7.0" + jest-watcher "^29.7.0" + micromatch "^4.0.4" + pretty-format "^29.7.0" + slash "^3.0.0" + strip-ansi "^6.0.0" + +"@jest/create-cache-key-function@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/create-cache-key-function/-/create-cache-key-function-29.7.0.tgz#793be38148fab78e65f40ae30c36785f4ad859f0" + integrity sha512-4QqS3LY5PBmTRHj9sAg1HLoPzqAI0uOX6wI/TRqHIcOxlFidy6YEmCQJk6FSZjNLGCeubDMfmkWL+qaLKhSGQA== + dependencies: + "@jest/types" "^29.6.3" + +"@jest/environment@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-29.7.0.tgz#24d61f54ff1f786f3cd4073b4b94416383baf2a7" + integrity sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw== + dependencies: + "@jest/fake-timers" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + jest-mock "^29.7.0" + "@jest/expect-utils@^29.7.0": version "29.7.0" resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.7.0.tgz#023efe5d26a8a70f21677d0a1afc0f0a44e3a1c6" @@ -1445,6 +1726,66 @@ dependencies: jest-get-type "^29.6.3" +"@jest/expect@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-29.7.0.tgz#76a3edb0cb753b70dfbfe23283510d3d45432bf2" + integrity sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ== + dependencies: + expect "^29.7.0" + jest-snapshot "^29.7.0" + +"@jest/fake-timers@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-29.7.0.tgz#fd91bf1fffb16d7d0d24a426ab1a47a49881a565" + integrity sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ== + dependencies: + "@jest/types" "^29.6.3" + "@sinonjs/fake-timers" "^10.0.2" + "@types/node" "*" + jest-message-util "^29.7.0" + jest-mock "^29.7.0" + jest-util "^29.7.0" + +"@jest/globals@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-29.7.0.tgz#8d9290f9ec47ff772607fa864ca1d5a2efae1d4d" + integrity sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ== + dependencies: + "@jest/environment" "^29.7.0" + "@jest/expect" "^29.7.0" + "@jest/types" "^29.6.3" + jest-mock "^29.7.0" + +"@jest/reporters@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-29.7.0.tgz#04b262ecb3b8faa83b0b3d321623972393e8f4c7" + integrity sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg== + dependencies: + "@bcoe/v8-coverage" "^0.2.3" + "@jest/console" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" + "@jridgewell/trace-mapping" "^0.3.18" + "@types/node" "*" + chalk "^4.0.0" + collect-v8-coverage "^1.0.0" + exit "^0.1.2" + glob "^7.1.3" + graceful-fs "^4.2.9" + istanbul-lib-coverage "^3.0.0" + istanbul-lib-instrument "^6.0.0" + istanbul-lib-report "^3.0.0" + istanbul-lib-source-maps "^4.0.0" + istanbul-reports "^3.1.3" + jest-message-util "^29.7.0" + jest-util "^29.7.0" + jest-worker "^29.7.0" + slash "^3.0.0" + string-length "^4.0.1" + strip-ansi "^6.0.0" + v8-to-istanbul "^9.0.1" + "@jest/schemas@^29.6.3": version "29.6.3" resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.6.3.tgz#430b5ce8a4e0044a7e3819663305a7b3091c8e03" @@ -1452,6 +1793,56 @@ dependencies: "@sinclair/typebox" "^0.27.8" +"@jest/source-map@^29.6.3": + version "29.6.3" + resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-29.6.3.tgz#d90ba772095cf37a34a5eb9413f1b562a08554c4" + integrity sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw== + dependencies: + "@jridgewell/trace-mapping" "^0.3.18" + callsites "^3.0.0" + graceful-fs "^4.2.9" + +"@jest/test-result@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-29.7.0.tgz#8db9a80aa1a097bb2262572686734baed9b1657c" + integrity sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA== + dependencies: + "@jest/console" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/istanbul-lib-coverage" "^2.0.0" + collect-v8-coverage "^1.0.0" + +"@jest/test-sequencer@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz#6cef977ce1d39834a3aea887a1726628a6f072ce" + integrity sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw== + dependencies: + "@jest/test-result" "^29.7.0" + graceful-fs "^4.2.9" + jest-haste-map "^29.7.0" + slash "^3.0.0" + +"@jest/transform@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-29.7.0.tgz#df2dd9c346c7d7768b8a06639994640c642e284c" + integrity sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw== + dependencies: + "@babel/core" "^7.11.6" + "@jest/types" "^29.6.3" + "@jridgewell/trace-mapping" "^0.3.18" + babel-plugin-istanbul "^6.1.1" + chalk "^4.0.0" + convert-source-map "^2.0.0" + fast-json-stable-stringify "^2.1.0" + graceful-fs "^4.2.9" + jest-haste-map "^29.7.0" + jest-regex-util "^29.6.3" + jest-util "^29.7.0" + micromatch "^4.0.4" + pirates "^4.0.4" + slash "^3.0.0" + write-file-atomic "^4.0.2" + "@jest/types@^29.6.3": version "29.6.3" resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.6.3.tgz#1131f8cf634e7e84c5e77bab12f052af585fba59" @@ -1473,7 +1864,7 @@ "@jridgewell/sourcemap-codec" "^1.4.10" "@jridgewell/trace-mapping" "^0.3.24" -"@jridgewell/resolve-uri@^3.1.0": +"@jridgewell/resolve-uri@^3.0.3", "@jridgewell/resolve-uri@^3.1.0": version "3.1.2" resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== @@ -1488,7 +1879,15 @@ resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== -"@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": +"@jridgewell/trace-mapping@0.3.9": + version "0.3.9" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" + integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== + dependencies: + "@jridgewell/resolve-uri" "^3.0.3" + "@jridgewell/sourcemap-codec" "^1.4.10" + +"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.18", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": version "0.3.25" resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== @@ -1800,6 +2199,20 @@ resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.27.8.tgz#6667fac16c436b5434a387a34dedb013198f6e6e" integrity sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA== +"@sinonjs/commons@^3.0.0": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-3.0.1.tgz#1029357e44ca901a615585f6d27738dbc89084cd" + integrity sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ== + dependencies: + type-detect "4.0.8" + +"@sinonjs/fake-timers@^10.0.2": + version "10.3.0" + resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz#55fdff1ecab9f354019129daf4df0dd4d923ea66" + integrity sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA== + dependencies: + "@sinonjs/commons" "^3.0.0" + "@svgr/babel-plugin-add-jsx-attribute@8.0.0": version "8.0.0" resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-8.0.0.tgz#4001f5d5dd87fa13303e36ee106e3ff3a7eb8b22" @@ -1906,6 +2319,75 @@ "@svgr/plugin-jsx" "8.1.0" "@svgr/plugin-svgo" "8.1.0" +"@swc/core-darwin-arm64@1.7.26": + version "1.7.26" + resolved "https://registry.yarnpkg.com/@swc/core-darwin-arm64/-/core-darwin-arm64-1.7.26.tgz#5f4096c00e71771ca1b18c824f0c92a052c70760" + integrity sha512-FF3CRYTg6a7ZVW4yT9mesxoVVZTrcSWtmZhxKCYJX9brH4CS/7PRPjAKNk6kzWgWuRoglP7hkjQcd6EpMcZEAw== + +"@swc/core-darwin-x64@1.7.26": + version "1.7.26" + resolved "https://registry.yarnpkg.com/@swc/core-darwin-x64/-/core-darwin-x64-1.7.26.tgz#867b7a4f094e6b64201090ca5fcbf3da7d0f3e22" + integrity sha512-az3cibZdsay2HNKmc4bjf62QVukuiMRh5sfM5kHR/JMTrLyS6vSw7Ihs3UTkZjUxkLTT8ro54LI6sV6sUQUbLQ== + +"@swc/core-linux-arm-gnueabihf@1.7.26": + version "1.7.26" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.7.26.tgz#35bb43894def296d92aaa2cc9372d48042f37777" + integrity sha512-VYPFVJDO5zT5U3RpCdHE5v1gz4mmR8BfHecUZTmD2v1JeFY6fv9KArJUpjrHEEsjK/ucXkQFmJ0jaiWXmpOV9Q== + +"@swc/core-linux-arm64-gnu@1.7.26": + version "1.7.26" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.7.26.tgz#8e2321cc4ec84cbfed8f8e16ff1ed7b854450443" + integrity sha512-YKevOV7abpjcAzXrhsl+W48Z9mZvgoVs2eP5nY+uoMAdP2b3GxC0Df1Co0I90o2lkzO4jYBpTMcZlmUXLdXn+Q== + +"@swc/core-linux-arm64-musl@1.7.26": + version "1.7.26" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.7.26.tgz#b1c16e4b23ffa9ff19973eda6ffee35d2a7de7b0" + integrity sha512-3w8iZICMkQQON0uIcvz7+Q1MPOW6hJ4O5ETjA0LSP/tuKqx30hIniCGOgPDnv3UTMruLUnQbtBwVCZTBKR3Rkg== + +"@swc/core-linux-x64-gnu@1.7.26": + version "1.7.26" + resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.7.26.tgz#388e2cc13a010cd28787aead2cecf31eb491836d" + integrity sha512-c+pp9Zkk2lqb06bNGkR2Looxrs7FtGDMA4/aHjZcCqATgp348hOKH5WPvNLBl+yPrISuWjbKDVn3NgAvfvpH4w== + +"@swc/core-linux-x64-musl@1.7.26": + version "1.7.26" + resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.7.26.tgz#51e0ff30981f26d7a5b97a7a7b5b291bad050d1a" + integrity sha512-PgtyfHBF6xG87dUSSdTJHwZ3/8vWZfNIXQV2GlwEpslrOkGqy+WaiiyE7Of7z9AvDILfBBBcJvJ/r8u980wAfQ== + +"@swc/core-win32-arm64-msvc@1.7.26": + version "1.7.26" + resolved "https://registry.yarnpkg.com/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.7.26.tgz#a7fdcc4074c34ee6a026506b594d00323383c11f" + integrity sha512-9TNXPIJqFynlAOrRD6tUQjMq7KApSklK3R/tXgIxc7Qx+lWu8hlDQ/kVPLpU7PWvMMwC/3hKBW+p5f+Tms1hmA== + +"@swc/core-win32-ia32-msvc@1.7.26": + version "1.7.26" + resolved "https://registry.yarnpkg.com/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.7.26.tgz#ae7be6dde798eebee2000b8fd84e01a439b5bd6a" + integrity sha512-9YngxNcG3177GYdsTum4V98Re+TlCeJEP4kEwEg9EagT5s3YejYdKwVAkAsJszzkXuyRDdnHUpYbTrPG6FiXrQ== + +"@swc/core-win32-x64-msvc@1.7.26": + version "1.7.26" + resolved "https://registry.yarnpkg.com/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.7.26.tgz#310d607004d7319085a4dec20c0c38c3405cc05b" + integrity sha512-VR+hzg9XqucgLjXxA13MtV5O3C0bK0ywtLIBw/+a+O+Oc6mxFWHtdUeXDbIi5AiPbn0fjgVJMqYnyjGyyX8u0w== + +"@swc/core@^1.7.23": + version "1.7.26" + resolved "https://registry.yarnpkg.com/@swc/core/-/core-1.7.26.tgz#beda9b82063fcec7b56c958804a4d175aecf9a9d" + integrity sha512-f5uYFf+TmMQyYIoxkn/evWhNGuUzC730dFwAKGwBVHHVoPyak1/GvJUm6i1SKl+2Hrj9oN0i3WSoWWZ4pgI8lw== + dependencies: + "@swc/counter" "^0.1.3" + "@swc/types" "^0.1.12" + optionalDependencies: + "@swc/core-darwin-arm64" "1.7.26" + "@swc/core-darwin-x64" "1.7.26" + "@swc/core-linux-arm-gnueabihf" "1.7.26" + "@swc/core-linux-arm64-gnu" "1.7.26" + "@swc/core-linux-arm64-musl" "1.7.26" + "@swc/core-linux-x64-gnu" "1.7.26" + "@swc/core-linux-x64-musl" "1.7.26" + "@swc/core-win32-arm64-msvc" "1.7.26" + "@swc/core-win32-ia32-msvc" "1.7.26" + "@swc/core-win32-x64-msvc" "1.7.26" + "@swc/counter@^0.1.3": version "0.1.3" resolved "https://registry.yarnpkg.com/@swc/counter/-/counter-0.1.3.tgz#cc7463bd02949611c6329596fccd2b0ec782b0e9" @@ -1919,16 +2401,134 @@ "@swc/counter" "^0.1.3" tslib "^2.4.0" +"@swc/jest@^0.2.36": + version "0.2.36" + resolved "https://registry.yarnpkg.com/@swc/jest/-/jest-0.2.36.tgz#2797450a30d28b471997a17e901ccad946fe693e" + integrity sha512-8X80dp81ugxs4a11z1ka43FPhP+/e+mJNXJSxiNYk8gIX/jPBtY4gQTrKu/KIoco8bzKuPI5lUxjfLiGsfvnlw== + dependencies: + "@jest/create-cache-key-function" "^29.7.0" + "@swc/counter" "^0.1.3" + jsonc-parser "^3.2.0" + +"@swc/types@^0.1.12": + version "0.1.12" + resolved "https://registry.yarnpkg.com/@swc/types/-/types-0.1.12.tgz#7f632c06ab4092ce0ebd046ed77ff7557442282f" + integrity sha512-wBJA+SdtkbFhHjTMYH+dEH1y4VpfGdAc2Kw/LK09i9bXd/K6j6PkDcFCEzb6iVfZMkPRrl/q0e3toqTAJdkIVA== + dependencies: + "@swc/counter" "^0.1.3" + +"@testing-library/dom@^10.4.0": + version "10.4.0" + resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-10.4.0.tgz#82a9d9462f11d240ecadbf406607c6ceeeff43a8" + integrity sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ== + dependencies: + "@babel/code-frame" "^7.10.4" + "@babel/runtime" "^7.12.5" + "@types/aria-query" "^5.0.1" + aria-query "5.3.0" + chalk "^4.1.0" + dom-accessibility-api "^0.5.9" + lz-string "^1.5.0" + pretty-format "^27.0.2" + +"@testing-library/jest-dom@^6.5.0": + version "6.5.0" + resolved "https://registry.yarnpkg.com/@testing-library/jest-dom/-/jest-dom-6.5.0.tgz#50484da3f80fb222a853479f618a9ce5c47bfe54" + integrity sha512-xGGHpBXYSHUUr6XsKBfs85TWlYKpTc37cSBBVrXcib2MkHLboWlkClhWF37JKlDb9KEq3dHs+f2xR7XJEWGBxA== + dependencies: + "@adobe/css-tools" "^4.4.0" + aria-query "^5.0.0" + chalk "^3.0.0" + css.escape "^1.5.1" + dom-accessibility-api "^0.6.3" + lodash "^4.17.21" + redent "^3.0.0" + +"@testing-library/react@^16.0.1": + version "16.0.1" + resolved "https://registry.yarnpkg.com/@testing-library/react/-/react-16.0.1.tgz#29c0ee878d672703f5e7579f239005e4e0faa875" + integrity sha512-dSmwJVtJXmku+iocRhWOUFbrERC76TX2Mnf0ATODz8brzAZrMBbzLwQixlBSanZxR6LddK3eiwpSFZgDET1URg== + dependencies: + "@babel/runtime" "^7.12.5" + +"@testing-library/user-event@^14.5.2": + version "14.5.2" + resolved "https://registry.yarnpkg.com/@testing-library/user-event/-/user-event-14.5.2.tgz#db7257d727c891905947bd1c1a99da20e03c2ebd" + integrity sha512-YAh82Wh4TIrxYLmfGcixwD18oIjyC1pFQC2Y01F2lzV2HTMiYrI0nze0FD0ocB//CKS/7jIUgae+adPqxK5yCQ== + "@tootallnate/once@1": version "1.1.2" resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== +"@tootallnate/once@2": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-2.0.0.tgz#f544a148d3ab35801c1f633a7441fd87c2e484bf" + integrity sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A== + "@trysound/sax@0.2.0": version "0.2.0" resolved "https://registry.yarnpkg.com/@trysound/sax/-/sax-0.2.0.tgz#cccaab758af56761eb7bf37af6f03f326dd798ad" integrity sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA== +"@tsconfig/node10@^1.0.7": + version "1.0.11" + resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.11.tgz#6ee46400685f130e278128c7b38b7e031ff5b2f2" + integrity sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw== + +"@tsconfig/node12@^1.0.7": + version "1.0.11" + resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" + integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== + +"@tsconfig/node14@^1.0.0": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" + integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== + +"@tsconfig/node16@^1.0.2": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.4.tgz#0b92dcc0cc1c81f6f306a381f28e31b1a56536e9" + integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== + +"@types/aria-query@^5.0.1": + version "5.0.4" + resolved "https://registry.yarnpkg.com/@types/aria-query/-/aria-query-5.0.4.tgz#1a31c3d378850d2778dabb6374d036dcba4ba708" + integrity sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw== + +"@types/babel__core@^7.1.14": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.5.tgz#3df15f27ba85319caa07ba08d0721889bb39c017" + integrity sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA== + dependencies: + "@babel/parser" "^7.20.7" + "@babel/types" "^7.20.7" + "@types/babel__generator" "*" + "@types/babel__template" "*" + "@types/babel__traverse" "*" + +"@types/babel__generator@*": + version "7.6.8" + resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.8.tgz#f836c61f48b1346e7d2b0d93c6dacc5b9535d3ab" + integrity sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw== + dependencies: + "@babel/types" "^7.0.0" + +"@types/babel__template@*": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.4.tgz#5672513701c1b2199bc6dad636a9d7491586766f" + integrity sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A== + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + +"@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": + version "7.20.6" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.6.tgz#8dc9f0ae0f202c08d8d4dab648912c8d6038e3f7" + integrity sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg== + dependencies: + "@babel/types" "^7.20.7" + "@types/d3-array@^3.0.3": version "3.2.1" resolved "https://registry.yarnpkg.com/@types/d3-array/-/d3-array-3.2.1.tgz#1f6658e3d2006c4fceac53fde464166859f8b8c5" @@ -1998,6 +2598,13 @@ resolved "https://registry.yarnpkg.com/@types/flat/-/flat-5.0.5.tgz#2304df0b2b1e6dde50d81f029593e0a1bc2474d3" integrity sha512-nPLljZQKSnac53KDUDzuzdRfGI0TDb5qPrb+SrQyN3MtdQrOnGsKniHN1iYZsJEBIVQve94Y6gNz22sgISZq+Q== +"@types/graceful-fs@^4.1.3": + version "4.1.9" + resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.9.tgz#2a06bc0f68a20ab37b3e36aa238be6abdf49e8b4" + integrity sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ== + dependencies: + "@types/node" "*" + "@types/hoist-non-react-statics@^3.3.1": version "3.3.5" resolved "https://registry.yarnpkg.com/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.5.tgz#dab7867ef789d87e2b4b0003c9d65c49cc44a494" @@ -2006,7 +2613,7 @@ "@types/react" "*" hoist-non-react-statics "^3.3.0" -"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0": +"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": version "2.0.6" resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz#7739c232a1fee9b4d3ce8985f314c0c6d33549d7" integrity sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w== @@ -2033,6 +2640,15 @@ expect "^29.0.0" pretty-format "^29.0.0" +"@types/jsdom@^20.0.0": + version "20.0.1" + resolved "https://registry.yarnpkg.com/@types/jsdom/-/jsdom-20.0.1.tgz#07c14bc19bd2f918c1929541cdaacae894744808" + integrity sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ== + dependencies: + "@types/node" "*" + "@types/tough-cookie" "*" + parse5 "^7.0.0" + "@types/json-schema@*", "@types/json-schema@^7.0.12": version "7.0.15" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" @@ -2065,10 +2681,10 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.45.tgz#2c0fafd78705e7a18b7906b5201a522719dc5190" integrity sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw== -"@types/node@^22.4.2": - version "22.5.0" - resolved "https://registry.yarnpkg.com/@types/node/-/node-22.5.0.tgz#10f01fe9465166b4cab72e75f60d8b99d019f958" - integrity sha512-DkFrJOe+rfdHTqqMg0bSNlGlQ85hSoh2TPzZyhHsXnMtligRWpxUySiyw8FY14ITt24HVCiQPWxS3KO/QlGmWg== +"@types/node@^22.5.4": + version "22.5.5" + resolved "https://registry.yarnpkg.com/@types/node/-/node-22.5.5.tgz#52f939dd0f65fc552a4ad0b392f3c466cc5d7a44" + integrity sha512-Xjs4y5UPO/CLdzpgR6GirZJx36yScjh73+2NlLlkFRSoQN8B0DpfXPdZGnvVmLRLOsqDpOfTNv7D9trgGhmOIA== dependencies: undici-types "~6.19.2" @@ -2134,6 +2750,11 @@ resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.3.tgz#6209321eb2c1712a7e7466422b8cb1fc0d9dd5d8" integrity sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw== +"@types/tough-cookie@*": + version "4.0.5" + resolved "https://registry.yarnpkg.com/@types/tough-cookie/-/tough-cookie-4.0.5.tgz#cb6e2a691b70cb177c6e3ae9c1d2e8b2ea8cd304" + integrity sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA== + "@types/yargs-parser@*": version "21.0.3" resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.3.tgz#815e30b786d2e8f0dcd85fd5bcf5e1a04d008f15" @@ -2333,16 +2954,41 @@ resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== +abab@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291" + integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== + abbrev@1: version "1.1.1" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== +acorn-globals@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-7.0.1.tgz#0dbf05c44fa7c94332914c02066d5beff62c40c3" + integrity sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q== + dependencies: + acorn "^8.1.0" + acorn-walk "^8.0.2" + acorn-jsx@^5.3.2: version "5.3.2" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== +acorn-walk@^8.0.2, acorn-walk@^8.1.1: + version "8.3.4" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.4.tgz#794dd169c3977edf4ba4ea47583587c5866236b7" + integrity sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g== + dependencies: + acorn "^8.11.0" + +acorn@^8.1.0, acorn@^8.11.0, acorn@^8.4.1, acorn@^8.8.1: + version "8.12.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.12.1.tgz#71616bdccbe25e27a54439e0046e89ca76df2248" + integrity sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg== + acorn@^8.9.0: version "8.11.3" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a" @@ -2385,7 +3031,7 @@ ansi-colors@^4.1.1: resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== -ansi-escapes@^4.3.0: +ansi-escapes@^4.2.1, ansi-escapes@^4.3.0: version "4.3.2" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== @@ -2431,7 +3077,7 @@ ansi-styles@^6.1.0: resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== -anymatch@~3.1.2: +anymatch@^3.0.3, anymatch@~3.1.2: version "3.1.3" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== @@ -2457,18 +3103,35 @@ are-we-there-yet@^3.0.0: delegates "^1.0.0" readable-stream "^3.6.0" +arg@^4.1.0: + version "4.1.3" + resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" + integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + argparse@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== -aria-query@^5.3.0: +aria-query@5.3.0, aria-query@^5.3.0: version "5.3.0" resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.3.0.tgz#650c569e41ad90b51b3d7df5e5eed1c7549c103e" integrity sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A== dependencies: dequal "^2.0.3" +aria-query@^5.0.0: + version "5.3.1" + resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.3.1.tgz#ebcb2c0d7fc43e68e4cb22f774d1209cb627ab42" + integrity sha512-Z/ZeOgVl7bcSYZ/u/rh0fOpvEpq//LZmdbkXyc7syVzjPAhfOa9ebsdTSjEBDU4vs5nC98Kfduj1uFo0qyET3g== + array-buffer-byte-length@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz#1e5583ec16763540a27ae52eed99ff899223568f" @@ -2600,6 +3263,11 @@ async@^3.2.0: resolved "https://registry.yarnpkg.com/async/-/async-3.2.5.tgz#ebd52a8fdaf7a2289a24df399f8d8485c8a46b66" integrity sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg== +async@^3.2.3: + version "3.2.6" + resolved "https://registry.yarnpkg.com/async/-/async-3.2.6.tgz#1b0728e14929d51b85b449b7f06e27c1145e38ce" + integrity sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA== + asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" @@ -2639,6 +3307,40 @@ axobject-query@^3.2.1: dependencies: dequal "^2.0.3" +babel-jest@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.7.0.tgz#f4369919225b684c56085998ac63dbd05be020d5" + integrity sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg== + dependencies: + "@jest/transform" "^29.7.0" + "@types/babel__core" "^7.1.14" + babel-plugin-istanbul "^6.1.1" + babel-preset-jest "^29.6.3" + chalk "^4.0.0" + graceful-fs "^4.2.9" + slash "^3.0.0" + +babel-plugin-istanbul@^6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73" + integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@istanbuljs/load-nyc-config" "^1.0.0" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-instrument "^5.0.4" + test-exclude "^6.0.0" + +babel-plugin-jest-hoist@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz#aadbe943464182a8922c3c927c3067ff40d24626" + integrity sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg== + dependencies: + "@babel/template" "^7.3.3" + "@babel/types" "^7.3.3" + "@types/babel__core" "^7.1.14" + "@types/babel__traverse" "^7.0.6" + babel-plugin-macros@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz#9ef6dc74deb934b4db344dc973ee851d148c50c1" @@ -2672,7 +3374,36 @@ babel-plugin-polyfill-regenerator@^0.6.1: dependencies: "@babel/helper-define-polyfill-provider" "^0.6.2" -balanced-match@^1.0.0: +babel-preset-current-node-syntax@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.1.0.tgz#9a929eafece419612ef4ae4f60b1862ebad8ef30" + integrity sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw== + dependencies: + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-syntax-bigint" "^7.8.3" + "@babel/plugin-syntax-class-properties" "^7.12.13" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + "@babel/plugin-syntax-import-attributes" "^7.24.7" + "@babel/plugin-syntax-import-meta" "^7.10.4" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + "@babel/plugin-syntax-top-level-await" "^7.14.5" + +babel-preset-jest@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz#fa05fa510e7d493896d7b0dd2033601c840f171c" + integrity sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA== + dependencies: + babel-plugin-jest-hoist "^29.6.3" + babel-preset-current-node-syntax "^1.0.0" + +balanced-match@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== @@ -2757,11 +3488,40 @@ browserslist@^4.22.2, browserslist@^4.23.0: node-releases "^2.0.14" update-browserslist-db "^1.0.13" +browserslist@^4.23.1: + version "4.23.3" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.23.3.tgz#debb029d3c93ebc97ffbc8d9cbb03403e227c800" + integrity sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA== + dependencies: + caniuse-lite "^1.0.30001646" + electron-to-chromium "^1.5.4" + node-releases "^2.0.18" + update-browserslist-db "^1.1.0" + +bs-logger@^0.2.6: + version "0.2.6" + resolved "https://registry.yarnpkg.com/bs-logger/-/bs-logger-0.2.6.tgz#eb7d365307a72cf974cc6cda76b68354ad336bd8" + integrity sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog== + dependencies: + fast-json-stable-stringify "2.x" + +bser@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" + integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== + dependencies: + node-int64 "^0.4.0" + buffer-crc32@~0.2.3: version "0.2.13" resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" integrity sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ== +buffer-from@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + buffer@^5.5.0, buffer@^5.7.1: version "5.7.1" resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" @@ -2830,6 +3590,11 @@ callsites@^3.0.0: resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== +camelcase@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + camelcase@^6.2.0: version "6.3.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" @@ -2840,6 +3605,11 @@ caniuse-lite@^1.0.30001579, caniuse-lite@^1.0.30001587: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001618.tgz#fad74fa006aef0f01e8e5c0a5540c74d8d36ec6f" integrity sha512-p407+D1tIkDvsEAPS22lJxLQQaG8OTBEqo0KhzfABGk0TU4juBNDSfH0hyAp/HRyx+M8L17z/ltyhxh27FTfQg== +caniuse-lite@^1.0.30001646: + version "1.0.30001660" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001660.tgz#31218de3463fabb44d0b7607b652e56edf2e2355" + integrity sha512-GacvNTTuATm26qC74pt+ad1fW15mlQ/zuTzzY1ZoIzECTP8HURDfF43kNxPgf7H1jmelCBQTTbBNxdSXOA7Bqg== + caseless@~0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" @@ -2854,7 +3624,15 @@ chalk@^2.4.2: escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chalk@^4.0.0, chalk@^4.1.0: +chalk@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" + integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0: version "4.1.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== @@ -2862,6 +3640,11 @@ chalk@^4.0.0, chalk@^4.1.0: ansi-styles "^4.1.0" supports-color "^7.1.0" +char-regex@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" + integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== + charenc@0.0.2: version "0.0.2" resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667" @@ -2902,6 +3685,11 @@ ci-info@^3.2.0: resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== +cjs-module-lexer@^1.0.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.4.1.tgz#707413784dbb3a72aa11c2f2b042a0bef4004170" + integrity sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA== + clean-stack@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" @@ -2936,11 +3724,30 @@ client-only@0.0.1: resolved "https://registry.yarnpkg.com/client-only/-/client-only-0.0.1.tgz#38bba5d403c41ab150bff64a95c85013cf73bca1" integrity sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA== +cliui@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" + integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.1" + wrap-ansi "^7.0.0" + clsx@^2.0.0, clsx@^2.1.0, clsx@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/clsx/-/clsx-2.1.1.tgz#eed397c9fd8bd882bfb18deab7102049a2f32999" integrity sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA== +co@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + integrity sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ== + +collect-v8-coverage@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz#c0b29bcd33bcd0779a1344c2136051e6afd3d9e9" + integrity sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q== + color-convert@^1.9.0: version "1.9.3" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" @@ -3000,7 +3807,7 @@ colorette@^2.0.16: resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== -combined-stream@^1.0.6, combined-stream@~1.0.6: +combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6: version "1.0.8" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== @@ -3080,7 +3887,25 @@ cosmiconfig@^8.1.3: parse-json "^5.2.0" path-type "^4.0.0" -cross-spawn@^7.0.0, cross-spawn@^7.0.2: +create-jest@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/create-jest/-/create-jest-29.7.0.tgz#a355c5b3cb1e1af02ba177fe7afd7feee49a5320" + integrity sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q== + dependencies: + "@jest/types" "^29.6.3" + chalk "^4.0.0" + exit "^0.1.2" + graceful-fs "^4.2.9" + jest-config "^29.7.0" + jest-util "^29.7.0" + prompts "^2.0.1" + +create-require@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" + integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== + +cross-spawn@^7.0.0, 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" integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== @@ -3126,6 +3951,11 @@ css-what@^6.1.0: resolved "https://registry.yarnpkg.com/css-what/-/css-what-6.1.0.tgz#fb5effcf76f1ddea2c81bdfaa4de44e79bac70f4" integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== +css.escape@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/css.escape/-/css.escape-1.5.1.tgz#42e27d4fa04ae32f931a4b4d4191fa9cddee97cb" + integrity sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg== + csso@^5.0.5: version "5.0.5" resolved "https://registry.yarnpkg.com/csso/-/csso-5.0.5.tgz#f9b7fe6cc6ac0b7d90781bb16d5e9874303e2ca6" @@ -3133,6 +3963,23 @@ csso@^5.0.5: dependencies: css-tree "~2.2.0" +cssom@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.5.0.tgz#d254fa92cd8b6fbd83811b9fbaed34663cc17c36" + integrity sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw== + +cssom@~0.3.6: + version "0.3.8" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" + integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== + +cssstyle@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-2.3.0.tgz#ff665a0ddbdc31864b09647f34163443d90b0852" + integrity sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A== + dependencies: + cssom "~0.3.6" + csstype@^3.0.2, csstype@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81" @@ -3285,6 +4132,15 @@ dashdash@^1.12.0: dependencies: assert-plus "^1.0.0" +data-urls@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-3.0.2.tgz#9cf24a477ae22bcef5cd5f6f0bfbc1d2d3be9143" + integrity sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ== + dependencies: + abab "^2.0.6" + whatwg-mimetype "^3.0.0" + whatwg-url "^11.0.0" + data-view-buffer@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/data-view-buffer/-/data-view-buffer-1.0.1.tgz#8ea6326efec17a2e42620696e671d7d5a8bc66b2" @@ -3357,6 +4213,11 @@ decimal.js-light@^2.4.1: resolved "https://registry.yarnpkg.com/decimal.js-light/-/decimal.js-light-2.5.1.tgz#134fd32508f19e208f4fb2f8dac0d2626a867934" integrity sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg== +decimal.js@^10.4.2: + version "10.4.3" + resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.4.3.tgz#1044092884d245d1b7f65725fa4ad4c6f781cc23" + integrity sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA== + decompress-response@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc" @@ -3364,6 +4225,11 @@ decompress-response@^6.0.0: dependencies: mimic-response "^3.1.0" +dedent@^1.0.0: + version "1.5.3" + resolved "https://registry.yarnpkg.com/dedent/-/dedent-1.5.3.tgz#99aee19eb9bae55a67327717b6e848d0bf777e5a" + integrity sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ== + deep-extend@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" @@ -3374,7 +4240,7 @@ deep-is@^0.1.3: resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== -deepmerge@^4.3.1: +deepmerge@^4.2.2, deepmerge@^4.3.1: version "4.3.1" resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== @@ -3417,11 +4283,21 @@ detect-libc@^2.0.0: resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.3.tgz#f0cd503b40f9939b894697d19ad50895e30cf700" integrity sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw== +detect-newline@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" + integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== + diff-sequences@^29.6.3: version "29.6.3" resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.6.3.tgz#4deaf894d11407c51efc8418012f9e70b84ea921" integrity sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q== +diff@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" + integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== + dir-glob@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" @@ -3443,6 +4319,16 @@ doctrine@^3.0.0: dependencies: esutils "^2.0.2" +dom-accessibility-api@^0.5.9: + version "0.5.16" + resolved "https://registry.yarnpkg.com/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz#5a7429e6066eb3664d911e33fb0e45de8eb08453" + integrity sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg== + +dom-accessibility-api@^0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz#993e925cc1d73f2c662e7d75dd5a5445259a8fd8" + integrity sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w== + dom-helpers@^5.0.1: version "5.2.1" resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-5.2.1.tgz#d9400536b2bf8225ad98fe052e029451ac40e902" @@ -3465,6 +4351,13 @@ domelementtype@^2.3.0: resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== +domexception@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/domexception/-/domexception-4.0.0.tgz#4ad1be56ccadc86fc76d033353999a8037d03673" + integrity sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw== + dependencies: + webidl-conversions "^7.0.0" + domhandler@^5.0.2, domhandler@^5.0.3: version "5.0.3" resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-5.0.3.tgz#cc385f7f751f1d1fc650c21374804254538c7d31" @@ -3502,11 +4395,28 @@ ecc-jsbn@~0.1.1: jsbn "~0.1.0" safer-buffer "^2.1.0" +ejs@^3.1.10: + version "3.1.10" + resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.10.tgz#69ab8358b14e896f80cc39e62087b88500c3ac3b" + integrity sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA== + dependencies: + jake "^10.8.5" + electron-to-chromium@^1.4.668: version "1.4.767" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.767.tgz#b885cfefda5a2e7a7ee356c567602012294ed260" integrity sha512-nzzHfmQqBss7CE3apQHkHjXW77+8w3ubGCIoEijKCJebPufREaFETgGXWTkh32t259F3Kcq+R8MZdFdOJROgYw== +electron-to-chromium@^1.5.4: + version "1.5.23" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.23.tgz#6dabd8f7fec5cbf618b732ff4c42950dcc7a3be5" + integrity sha512-mBhODedOXg4v5QWwl21DjM5amzjmI1zw9EPrPK/5Wx7C8jt33bpZNrC7OhHUG3pxRtbLpr3W2dXT+Ph1SsfRZA== + +emittery@^0.13.1: + version "0.13.1" + resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.13.1.tgz#c04b8c3457490e0847ae51fced3af52d338e3dad" + integrity sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ== + emoji-regex@10.3.0, emoji-regex@^10.2.1: version "10.3.0" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-10.3.0.tgz#76998b9268409eb3dae3de989254d456e70cfe23" @@ -3690,6 +4600,11 @@ es-to-primitive@^1.2.1: is-date-object "^1.0.1" is-symbol "^1.0.2" +escalade@^3.1.1: + version "3.2.0" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" + integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== + escalade@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.2.tgz#54076e9ab29ea5bf3d8f1ed62acffbb88272df27" @@ -3710,6 +4625,17 @@ escape-string-regexp@^4.0.0: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== +escodegen@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.1.0.tgz#ba93bbb7a43986d29d6041f99f5262da773e2e17" + integrity sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w== + dependencies: + esprima "^4.0.1" + estraverse "^5.2.0" + esutils "^2.0.2" + optionalDependencies: + source-map "~0.6.1" + eslint-config-next@14.2.3: version "14.2.3" resolved "https://registry.yarnpkg.com/eslint-config-next/-/eslint-config-next-14.2.3.tgz#2fb0f7c4eccda530a4b5054438162b2303786d4f" @@ -3918,6 +4844,11 @@ espree@^9.6.0, espree@^9.6.1: acorn-jsx "^5.3.2" eslint-visitor-keys "^3.4.1" +esprima@^4.0.0, esprima@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + esquery@^1.4.2: version "1.5.0" resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" @@ -3967,6 +4898,21 @@ execa@4.1.0: signal-exit "^3.0.2" strip-final-newline "^2.0.0" +execa@^5.0.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" + integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== + dependencies: + cross-spawn "^7.0.3" + get-stream "^6.0.0" + human-signals "^2.1.0" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.1" + onetime "^5.1.2" + signal-exit "^3.0.3" + strip-final-newline "^2.0.0" + executable@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/executable/-/executable-4.1.1.tgz#41532bff361d3e57af4d763b70582db18f5d133c" @@ -3974,12 +4920,17 @@ executable@^4.1.1: dependencies: pify "^2.2.0" +exit@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" + integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== + expand-template@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-2.0.3.tgz#6e14b3fcee0f3a6340ecb57d2e8918692052a47c" integrity sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg== -expect@^29.0.0: +expect@^29.0.0, expect@^29.7.0: version "29.7.0" resolved "https://registry.yarnpkg.com/expect/-/expect-29.7.0.tgz#578874590dcb3214514084c08115d8aee61e11bc" integrity sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw== @@ -4037,7 +4988,7 @@ fast-glob@^3.2.9, fast-glob@^3.3.1: merge2 "^1.3.0" micromatch "^4.0.4" -fast-json-stable-stringify@^2.0.0: +fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== @@ -4054,6 +5005,13 @@ fastq@^1.6.0: dependencies: reusify "^1.0.4" +fb-watchman@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.2.tgz#e9524ee6b5c77e9e5001af0f85f3adbb8623255c" + integrity sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA== + dependencies: + bser "2.1.1" + fd-slicer@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e" @@ -4080,6 +5038,13 @@ file-uri-to-path@1.0.0: resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== +filelist@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/filelist/-/filelist-1.0.4.tgz#f78978a1e944775ff9e62e744424f215e58352b5" + integrity sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q== + dependencies: + minimatch "^5.0.1" + fill-range@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" @@ -4092,6 +5057,14 @@ find-root@^1.1.0: resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4" integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng== +find-up@^4.0.0, find-up@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + find-up@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" @@ -4139,6 +5112,15 @@ forever-agent@~0.6.1: resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" integrity sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw== +form-data@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" + integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + form-data@~2.3.2: version "2.3.3" resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" @@ -4175,7 +5157,7 @@ fs.realpath@^1.0.0: resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== -fsevents@~2.3.2: +fsevents@^2.3.2, fsevents@~2.3.2: version "2.3.3" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== @@ -4233,6 +5215,11 @@ geotiff@^2.0.7: xml-utils "^1.0.2" zstddec "^0.1.0" +get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" @@ -4244,6 +5231,11 @@ get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.3, get-intrinsic@ has-symbols "^1.0.3" hasown "^2.0.0" +get-package-type@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" + integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== + get-stream@^5.0.0, get-stream@^5.1.0: version "5.2.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" @@ -4251,6 +5243,11 @@ get-stream@^5.0.0, get-stream@^5.1.0: dependencies: pump "^3.0.0" +get-stream@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== + get-symbol-description@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.2.tgz#533744d5aa20aca4e079c8e5daf7fd44202821f5" @@ -4442,6 +5439,18 @@ hoist-non-react-statics@^3.3.0, hoist-non-react-statics@^3.3.1, hoist-non-react- dependencies: react-is "^16.7.0" +html-encoding-sniffer@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz#2cb1a8cf0db52414776e5b2a7a04d5dd98158de9" + integrity sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA== + dependencies: + whatwg-encoding "^2.0.0" + +html-escaper@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" + integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== + http-cache-semantics@^4.1.0: version "4.1.1" resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz#abe02fcb2985460bf0323be664436ec3476a6d5a" @@ -4456,6 +5465,15 @@ http-proxy-agent@^4.0.1: agent-base "6" debug "4" +http-proxy-agent@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz#5129800203520d434f142bc78ff3c170800f2b43" + integrity sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w== + dependencies: + "@tootallnate/once" "2" + agent-base "6" + debug "4" + http-signature@~1.3.6: version "1.3.6" resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.3.6.tgz#cb6fbfdf86d1c974f343be94e87f7fc128662cf9" @@ -4465,7 +5483,7 @@ http-signature@~1.3.6: jsprim "^2.0.2" sshpk "^1.14.1" -https-proxy-agent@^5.0.0: +https-proxy-agent@^5.0.0, https-proxy-agent@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== @@ -4478,6 +5496,11 @@ human-signals@^1.1.1: resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== +human-signals@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" + integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== + humanize-ms@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed" @@ -4485,7 +5508,7 @@ humanize-ms@^1.2.1: dependencies: ms "^2.0.0" -iconv-lite@^0.6.2: +iconv-lite@0.6.3, iconv-lite@^0.6.2: version "0.6.3" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== @@ -4515,6 +5538,14 @@ import-fresh@^3.2.1, import-fresh@^3.3.0: parent-module "^1.0.0" resolve-from "^4.0.0" +import-local@^3.0.2: + version "3.2.0" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.2.0.tgz#c3d5c745798c02a6f8b897726aba5100186ee260" + integrity sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA== + dependencies: + pkg-dir "^4.2.0" + resolve-cwd "^3.0.0" + imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" @@ -4682,6 +5713,11 @@ is-fullwidth-code-point@^3.0.0: resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== +is-generator-fn@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" + integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== + is-generator-function@^1.0.10: version "1.0.10" resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" @@ -4736,6 +5772,11 @@ is-path-inside@^3.0.2, is-path-inside@^3.0.3: resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== +is-potential-custom-element-name@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" + integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== + is-regex@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" @@ -4835,6 +5876,59 @@ isstream@~0.1.2: resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" integrity sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g== +istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz#2d166c4b0644d43a39f04bf6c2edd1e585f31756" + integrity sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg== + +istanbul-lib-instrument@^5.0.4: + version "5.2.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz#d10c8885c2125574e1c231cacadf955675e1ce3d" + integrity sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg== + dependencies: + "@babel/core" "^7.12.3" + "@babel/parser" "^7.14.7" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-coverage "^3.2.0" + semver "^6.3.0" + +istanbul-lib-instrument@^6.0.0: + version "6.0.3" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz#fa15401df6c15874bcb2105f773325d78c666765" + integrity sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q== + dependencies: + "@babel/core" "^7.23.9" + "@babel/parser" "^7.23.9" + "@istanbuljs/schema" "^0.1.3" + istanbul-lib-coverage "^3.2.0" + semver "^7.5.4" + +istanbul-lib-report@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz#908305bac9a5bd175ac6a74489eafd0fc2445a7d" + integrity sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw== + dependencies: + istanbul-lib-coverage "^3.0.0" + make-dir "^4.0.0" + supports-color "^7.1.0" + +istanbul-lib-source-maps@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz#895f3a709fcfba34c6de5a42939022f3e4358551" + integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw== + dependencies: + debug "^4.1.1" + istanbul-lib-coverage "^3.0.0" + source-map "^0.6.1" + +istanbul-reports@^3.1.3: + version "3.1.7" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.7.tgz#daed12b9e1dca518e15c056e1e537e741280fa0b" + integrity sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g== + dependencies: + html-escaper "^2.0.0" + istanbul-lib-report "^3.0.0" + iterator.prototype@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/iterator.prototype/-/iterator.prototype-1.1.2.tgz#5e29c8924f01916cb9335f1ff80619dcff22b0c0" @@ -4855,68 +5949,406 @@ jackspeak@^2.3.5: optionalDependencies: "@pkgjs/parseargs" "^0.11.0" -jest-diff@^29.7.0: +jake@^10.8.5: + version "10.9.2" + resolved "https://registry.yarnpkg.com/jake/-/jake-10.9.2.tgz#6ae487e6a69afec3a5e167628996b59f35ae2b7f" + integrity sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA== + dependencies: + async "^3.2.3" + chalk "^4.0.2" + filelist "^1.0.4" + minimatch "^3.1.2" + +jest-changed-files@^29.7.0: version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.7.0.tgz#017934a66ebb7ecf6f205e84699be10afd70458a" - integrity sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw== + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-29.7.0.tgz#1c06d07e77c78e1585d020424dedc10d6e17ac3a" + integrity sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w== + dependencies: + execa "^5.0.0" + jest-util "^29.7.0" + p-limit "^3.1.0" + +jest-circus@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-29.7.0.tgz#b6817a45fcc835d8b16d5962d0c026473ee3668a" + integrity sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw== dependencies: + "@jest/environment" "^29.7.0" + "@jest/expect" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" chalk "^4.0.0" - diff-sequences "^29.6.3" - jest-get-type "^29.6.3" + co "^4.6.0" + dedent "^1.0.0" + is-generator-fn "^2.0.0" + jest-each "^29.7.0" + jest-matcher-utils "^29.7.0" + jest-message-util "^29.7.0" + jest-runtime "^29.7.0" + jest-snapshot "^29.7.0" + jest-util "^29.7.0" + p-limit "^3.1.0" pretty-format "^29.7.0" + pure-rand "^6.0.0" + slash "^3.0.0" + stack-utils "^2.0.3" -jest-get-type@^29.6.3: - version "29.6.3" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.6.3.tgz#36f499fdcea197c1045a127319c0481723908fd1" - integrity sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw== - -jest-matcher-utils@^29.7.0: +jest-cli@^29.7.0: version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz#ae8fec79ff249fd592ce80e3ee474e83a6c44f12" - integrity sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g== + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-29.7.0.tgz#5592c940798e0cae677eec169264f2d839a37995" + integrity sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg== dependencies: + "@jest/core" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/types" "^29.6.3" chalk "^4.0.0" - jest-diff "^29.7.0" - jest-get-type "^29.6.3" - pretty-format "^29.7.0" + create-jest "^29.7.0" + exit "^0.1.2" + import-local "^3.0.2" + jest-config "^29.7.0" + jest-util "^29.7.0" + jest-validate "^29.7.0" + yargs "^17.3.1" -jest-message-util@^29.7.0: +jest-config@^29.7.0: version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.7.0.tgz#8bc392e204e95dfe7564abbe72a404e28e51f7f3" - integrity sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w== + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-29.7.0.tgz#bcbda8806dbcc01b1e316a46bb74085a84b0245f" + integrity sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ== dependencies: - "@babel/code-frame" "^7.12.13" + "@babel/core" "^7.11.6" + "@jest/test-sequencer" "^29.7.0" "@jest/types" "^29.6.3" - "@types/stack-utils" "^2.0.0" + babel-jest "^29.7.0" chalk "^4.0.0" + ci-info "^3.2.0" + deepmerge "^4.2.2" + glob "^7.1.3" graceful-fs "^4.2.9" + jest-circus "^29.7.0" + jest-environment-node "^29.7.0" + jest-get-type "^29.6.3" + jest-regex-util "^29.6.3" + jest-resolve "^29.7.0" + jest-runner "^29.7.0" + jest-util "^29.7.0" + jest-validate "^29.7.0" micromatch "^4.0.4" + parse-json "^5.2.0" pretty-format "^29.7.0" slash "^3.0.0" - stack-utils "^2.0.3" + strip-json-comments "^3.1.1" -jest-util@^29.7.0: +jest-diff@^29.7.0: version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.7.0.tgz#23c2b62bfb22be82b44de98055802ff3710fc0bc" - integrity sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA== + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.7.0.tgz#017934a66ebb7ecf6f205e84699be10afd70458a" + integrity sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw== dependencies: - "@jest/types" "^29.6.3" - "@types/node" "*" chalk "^4.0.0" - ci-info "^3.2.0" - graceful-fs "^4.2.9" - picomatch "^2.2.3" + diff-sequences "^29.6.3" + jest-get-type "^29.6.3" + pretty-format "^29.7.0" -jose@^4.15.5: - version "4.15.9" - resolved "https://registry.yarnpkg.com/jose/-/jose-4.15.9.tgz#9b68eda29e9a0614c042fa29387196c7dd800100" - integrity sha512-1vUQX+IdDMVPj4k8kOxgUqlcK518yluMuGZwqlr44FS1ppZB/5GWh4rZG89erpOBOJjU/OBsnCVFfapsRz6nEA== +jest-docblock@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-29.7.0.tgz#8fddb6adc3cdc955c93e2a87f61cfd350d5d119a" + integrity sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g== + dependencies: + detect-newline "^3.0.0" -"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: - version "4.0.0" +jest-each@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-29.7.0.tgz#162a9b3f2328bdd991beaabffbb74745e56577d1" + integrity sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ== + dependencies: + "@jest/types" "^29.6.3" + chalk "^4.0.0" + jest-get-type "^29.6.3" + jest-util "^29.7.0" + pretty-format "^29.7.0" + +jest-environment-jsdom@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-29.7.0.tgz#d206fa3551933c3fd519e5dfdb58a0f5139a837f" + integrity sha512-k9iQbsf9OyOfdzWH8HDmrRT0gSIcX+FLNW7IQq94tFX0gynPwqDTW0Ho6iMVNjGz/nb+l/vW3dWM2bbLLpkbXA== + dependencies: + "@jest/environment" "^29.7.0" + "@jest/fake-timers" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/jsdom" "^20.0.0" + "@types/node" "*" + jest-mock "^29.7.0" + jest-util "^29.7.0" + jsdom "^20.0.0" + +jest-environment-node@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-29.7.0.tgz#0b93e111dda8ec120bc8300e6d1fb9576e164376" + integrity sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw== + dependencies: + "@jest/environment" "^29.7.0" + "@jest/fake-timers" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + jest-mock "^29.7.0" + jest-util "^29.7.0" + +jest-get-type@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.6.3.tgz#36f499fdcea197c1045a127319c0481723908fd1" + integrity sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw== + +jest-haste-map@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-29.7.0.tgz#3c2396524482f5a0506376e6c858c3bbcc17b104" + integrity sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA== + dependencies: + "@jest/types" "^29.6.3" + "@types/graceful-fs" "^4.1.3" + "@types/node" "*" + anymatch "^3.0.3" + fb-watchman "^2.0.0" + graceful-fs "^4.2.9" + jest-regex-util "^29.6.3" + jest-util "^29.7.0" + jest-worker "^29.7.0" + micromatch "^4.0.4" + walker "^1.0.8" + optionalDependencies: + fsevents "^2.3.2" + +jest-leak-detector@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz#5b7ec0dadfdfec0ca383dc9aa016d36b5ea4c728" + integrity sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw== + dependencies: + jest-get-type "^29.6.3" + pretty-format "^29.7.0" + +jest-matcher-utils@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz#ae8fec79ff249fd592ce80e3ee474e83a6c44f12" + integrity sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g== + dependencies: + chalk "^4.0.0" + jest-diff "^29.7.0" + jest-get-type "^29.6.3" + pretty-format "^29.7.0" + +jest-message-util@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.7.0.tgz#8bc392e204e95dfe7564abbe72a404e28e51f7f3" + integrity sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w== + dependencies: + "@babel/code-frame" "^7.12.13" + "@jest/types" "^29.6.3" + "@types/stack-utils" "^2.0.0" + chalk "^4.0.0" + graceful-fs "^4.2.9" + micromatch "^4.0.4" + pretty-format "^29.7.0" + slash "^3.0.0" + stack-utils "^2.0.3" + +jest-mock@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-29.7.0.tgz#4e836cf60e99c6fcfabe9f99d017f3fdd50a6347" + integrity sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw== + dependencies: + "@jest/types" "^29.6.3" + "@types/node" "*" + jest-util "^29.7.0" + +jest-pnp-resolver@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz#930b1546164d4ad5937d5540e711d4d38d4cad2e" + integrity sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w== + +jest-regex-util@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-29.6.3.tgz#4a556d9c776af68e1c5f48194f4d0327d24e8a52" + integrity sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg== + +jest-resolve-dependencies@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz#1b04f2c095f37fc776ff40803dc92921b1e88428" + integrity sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA== + dependencies: + jest-regex-util "^29.6.3" + jest-snapshot "^29.7.0" + +jest-resolve@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-29.7.0.tgz#64d6a8992dd26f635ab0c01e5eef4399c6bcbc30" + integrity sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA== + dependencies: + chalk "^4.0.0" + graceful-fs "^4.2.9" + jest-haste-map "^29.7.0" + jest-pnp-resolver "^1.2.2" + jest-util "^29.7.0" + jest-validate "^29.7.0" + resolve "^1.20.0" + resolve.exports "^2.0.0" + slash "^3.0.0" + +jest-runner@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-29.7.0.tgz#809af072d408a53dcfd2e849a4c976d3132f718e" + integrity sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ== + dependencies: + "@jest/console" "^29.7.0" + "@jest/environment" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + chalk "^4.0.0" + emittery "^0.13.1" + graceful-fs "^4.2.9" + jest-docblock "^29.7.0" + jest-environment-node "^29.7.0" + jest-haste-map "^29.7.0" + jest-leak-detector "^29.7.0" + jest-message-util "^29.7.0" + jest-resolve "^29.7.0" + jest-runtime "^29.7.0" + jest-util "^29.7.0" + jest-watcher "^29.7.0" + jest-worker "^29.7.0" + p-limit "^3.1.0" + source-map-support "0.5.13" + +jest-runtime@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-29.7.0.tgz#efecb3141cf7d3767a3a0cc8f7c9990587d3d817" + integrity sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ== + dependencies: + "@jest/environment" "^29.7.0" + "@jest/fake-timers" "^29.7.0" + "@jest/globals" "^29.7.0" + "@jest/source-map" "^29.6.3" + "@jest/test-result" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + chalk "^4.0.0" + cjs-module-lexer "^1.0.0" + collect-v8-coverage "^1.0.0" + glob "^7.1.3" + graceful-fs "^4.2.9" + jest-haste-map "^29.7.0" + jest-message-util "^29.7.0" + jest-mock "^29.7.0" + jest-regex-util "^29.6.3" + jest-resolve "^29.7.0" + jest-snapshot "^29.7.0" + jest-util "^29.7.0" + slash "^3.0.0" + strip-bom "^4.0.0" + +jest-snapshot@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-29.7.0.tgz#c2c574c3f51865da1bb329036778a69bf88a6be5" + integrity sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw== + dependencies: + "@babel/core" "^7.11.6" + "@babel/generator" "^7.7.2" + "@babel/plugin-syntax-jsx" "^7.7.2" + "@babel/plugin-syntax-typescript" "^7.7.2" + "@babel/types" "^7.3.3" + "@jest/expect-utils" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" + babel-preset-current-node-syntax "^1.0.0" + chalk "^4.0.0" + expect "^29.7.0" + graceful-fs "^4.2.9" + jest-diff "^29.7.0" + jest-get-type "^29.6.3" + jest-matcher-utils "^29.7.0" + jest-message-util "^29.7.0" + jest-util "^29.7.0" + natural-compare "^1.4.0" + pretty-format "^29.7.0" + semver "^7.5.3" + +jest-util@^29.0.0, jest-util@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.7.0.tgz#23c2b62bfb22be82b44de98055802ff3710fc0bc" + integrity sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA== + dependencies: + "@jest/types" "^29.6.3" + "@types/node" "*" + chalk "^4.0.0" + ci-info "^3.2.0" + graceful-fs "^4.2.9" + picomatch "^2.2.3" + +jest-validate@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-29.7.0.tgz#7bf705511c64da591d46b15fce41400d52147d9c" + integrity sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw== + dependencies: + "@jest/types" "^29.6.3" + camelcase "^6.2.0" + chalk "^4.0.0" + jest-get-type "^29.6.3" + leven "^3.1.0" + pretty-format "^29.7.0" + +jest-watcher@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-29.7.0.tgz#7810d30d619c3a62093223ce6bb359ca1b28a2f2" + integrity sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g== + dependencies: + "@jest/test-result" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + emittery "^0.13.1" + jest-util "^29.7.0" + string-length "^4.0.1" + +jest-worker@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.7.0.tgz#acad073acbbaeb7262bd5389e1bcf43e10058d4a" + integrity sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw== + dependencies: + "@types/node" "*" + jest-util "^29.7.0" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +jest@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest/-/jest-29.7.0.tgz#994676fc24177f088f1c5e3737f5697204ff2613" + integrity sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw== + dependencies: + "@jest/core" "^29.7.0" + "@jest/types" "^29.6.3" + import-local "^3.0.2" + jest-cli "^29.7.0" + +jose@^4.15.5: + version "4.15.9" + resolved "https://registry.yarnpkg.com/jose/-/jose-4.15.9.tgz#9b68eda29e9a0614c042fa29387196c7dd800100" + integrity sha512-1vUQX+IdDMVPj4k8kOxgUqlcK518yluMuGZwqlr44FS1ppZB/5GWh4rZG89erpOBOJjU/OBsnCVFfapsRz6nEA== + +"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" 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" + integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + js-yaml@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" @@ -4934,6 +6366,38 @@ jsbn@~0.1.0: resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" integrity sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg== +jsdom@^20.0.0: + version "20.0.3" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-20.0.3.tgz#886a41ba1d4726f67a8858028c99489fed6ad4db" + integrity sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ== + dependencies: + abab "^2.0.6" + acorn "^8.8.1" + acorn-globals "^7.0.0" + cssom "^0.5.0" + cssstyle "^2.3.0" + data-urls "^3.0.2" + decimal.js "^10.4.2" + domexception "^4.0.0" + escodegen "^2.0.0" + form-data "^4.0.0" + html-encoding-sniffer "^3.0.0" + http-proxy-agent "^5.0.0" + https-proxy-agent "^5.0.1" + is-potential-custom-element-name "^1.0.1" + nwsapi "^2.2.2" + parse5 "^7.1.1" + saxes "^6.0.0" + symbol-tree "^3.2.4" + tough-cookie "^4.1.2" + w3c-xmlserializer "^4.0.0" + webidl-conversions "^7.0.0" + whatwg-encoding "^2.0.0" + whatwg-mimetype "^3.0.0" + whatwg-url "^11.0.0" + ws "^8.11.0" + xml-name-validator "^4.0.0" + jsesc@^2.5.1: version "2.5.2" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" @@ -4996,6 +6460,11 @@ json5@^2.2.3: resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== +jsonc-parser@^3.2.0: + version "3.3.1" + resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.3.1.tgz#f2a524b4f7fd11e3d791e559977ad60b98b798b4" + integrity sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ== + jsonfile@^6.0.1: version "6.1.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" @@ -5037,6 +6506,11 @@ keyv@^4.5.3: dependencies: json-buffer "3.0.1" +kleur@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" + integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== + language-subtag-registry@^0.3.20: version "0.3.22" resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz#2e1500861b2e457eba7e7ae86877cbd08fa1fd1d" @@ -5059,6 +6533,11 @@ lerc@^3.0.0: resolved "https://registry.yarnpkg.com/lerc/-/lerc-3.0.0.tgz#36f36fbd4ba46f0abf4833799fff2e7d6865f5cb" integrity sha512-Rm4J/WaHhRa93nCN2mwWDZFoRVF18G1f47C+kvQWyHGEZxFpTUi73p7lMVSAndyxGt6lJ2/CFbOcf9ra5p8aww== +leven@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" + integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== + levn@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" @@ -5086,6 +6565,13 @@ listr2@^3.8.3: through "^2.3.8" wrap-ansi "^7.0.0" +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + locate-path@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" @@ -5098,6 +6584,11 @@ lodash.debounce@^4.0.8: resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== +lodash.memoize@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" + integrity sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag== + lodash.merge@^4.6.2: version "4.6.2" resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" @@ -5108,7 +6599,7 @@ lodash.once@^4.1.1: resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac" integrity sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg== -lodash@^4.17.21: +lodash@^4.17.21, lodash@^4.17.5: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -5164,6 +6655,11 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" +lz-string@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/lz-string/-/lz-string-1.5.0.tgz#c1ab50f77887b712621201ba9fd4e3a6ed099941" + integrity sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ== + magic-string@^0.30.0: version "0.30.10" resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.10.tgz#123d9c41a0cb5640c892b041d4cfb3bd0aa4b39e" @@ -5171,6 +6667,18 @@ magic-string@^0.30.0: dependencies: "@jridgewell/sourcemap-codec" "^1.4.15" +make-dir@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-4.0.0.tgz#c3c2307a771277cd9638305f915c29ae741b614e" + integrity sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw== + dependencies: + semver "^7.5.3" + +make-error@^1.1.1, make-error@^1.3.6: + version "1.3.6" + resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" + integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== + make-fetch-happen@^9.1.0: version "9.1.0" resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz#53085a09e7971433e6765f7971bf63f4e05cb968" @@ -5193,6 +6701,13 @@ make-fetch-happen@^9.1.0: socks-proxy-agent "^6.0.0" ssri "^8.0.0" +makeerror@1.0.12: + version "1.0.12" + resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a" + integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg== + dependencies: + tmpl "1.0.5" + md5@^2.1.0: version "2.3.0" resolved "https://registry.yarnpkg.com/md5/-/md5-2.3.0.tgz#c3da9a6aae3a30b46b7b0c349b87b110dc3bda4f" @@ -5252,6 +6767,11 @@ mimic-response@^3.1.0: resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9" integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== +min-indent@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" + integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== + minimatch@9.0.3: version "9.0.3" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.3.tgz#a6e00c3de44c3a542bfaae70abfc22420a6da825" @@ -5259,13 +6779,20 @@ minimatch@9.0.3: dependencies: brace-expansion "^2.0.1" -minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: +minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== dependencies: brace-expansion "^1.1.7" +minimatch@^5.0.1: + version "5.1.6" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" + integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== + dependencies: + brace-expansion "^2.0.1" + minimatch@^9.0.1, minimatch@^9.0.4: version "9.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.4.tgz#8e49c731d1749cbec05050ee5145147b32496a51" @@ -5489,11 +7016,21 @@ node-gyp@8.x: tar "^6.1.2" which "^2.0.2" +node-int64@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" + integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== + node-releases@^2.0.14: version "2.0.14" resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.14.tgz#2ffb053bceb8b2be8495ece1ab6ce600c4461b0b" integrity sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw== +node-releases@^2.0.18: + version "2.0.18" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.18.tgz#f010e8d35e2fe8d6b2944f03f70213ecedc4ca3f" + integrity sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g== + nopt@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/nopt/-/nopt-5.0.0.tgz#530942bb58a512fccafe53fe210f13a25355dc88" @@ -5506,7 +7043,7 @@ normalize-path@^3.0.0, normalize-path@~3.0.0: resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== -npm-run-path@^4.0.0: +npm-run-path@^4.0.0, 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" integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== @@ -5530,6 +7067,11 @@ nth-check@^2.0.1: dependencies: boolbase "^1.0.0" +nwsapi@^2.2.2: + version "2.2.12" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.12.tgz#fb6af5c0ec35b27b4581eb3bbad34ec9e5c696f8" + integrity sha512-qXDmcVlZV4XRtKFzddidpfVP4oMSGhga+xdMc25mv8kaLUHtgzCDhUxkrN8exkGdTlLNaXj7CV3GtON7zuGZ+w== + oauth@^0.9.15: version "0.9.15" resolved "https://registry.yarnpkg.com/oauth/-/oauth-0.9.15.tgz#bd1fefaf686c96b75475aed5196412ff60cfb9c1" @@ -5635,7 +7177,7 @@ once@^1.3.0, once@^1.3.1, once@^1.4.0: dependencies: wrappy "1" -onetime@^5.1.0: +onetime@^5.1.0, onetime@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== @@ -5669,13 +7211,27 @@ ospath@^1.2.2: resolved "https://registry.yarnpkg.com/ospath/-/ospath-1.2.2.tgz#1276639774a3f8ef2572f7fe4280e0ea4550c07b" integrity sha512-o6E5qJV5zkAbIDNhGSIlyOhScKXgQrSRMilfph0clDfM0nEnBOlKlH4sWDmG95BW/CvwNz0vmm7dJVtU2KlMiA== -p-limit@^3.0.2: +p-limit@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-limit@^3.0.2, p-limit@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== dependencies: yocto-queue "^0.1.0" +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + p-locate@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" @@ -5690,6 +7246,11 @@ p-map@^4.0.0: dependencies: aggregate-error "^3.0.0" +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + pako@^2.0.4: version "2.1.0" resolved "https://registry.yarnpkg.com/pako/-/pako-2.1.0.tgz#266cc37f98c7d883545d11335c00fbd4062c9a86" @@ -5717,6 +7278,13 @@ parse-json@^5.0.0, parse-json@^5.2.0: json-parse-even-better-errors "^2.3.0" lines-and-columns "^1.1.6" +parse5@^7.0.0, parse5@^7.1.1: + version "7.1.2" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-7.1.2.tgz#0736bebbfd77793823240a23b7fc5e010b7f8e32" + integrity sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw== + dependencies: + entities "^4.4.0" + path-exists@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" @@ -5773,6 +7341,11 @@ picocolors@^1.0.0: resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.1.tgz#a8ad579b571952f0e5d25892de5445bcfe25aaa1" integrity sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew== +picocolors@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.0.tgz#5358b76a78cde483ba5cef6a9dc9671440b27d59" + integrity sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw== + picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3, picomatch@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" @@ -5783,6 +7356,18 @@ pify@^2.2.0: resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== +pirates@^4.0.4: + version "4.0.6" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.6.tgz#3018ae32ecfcff6c29ba2267cbf21166ac1f36b9" + integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== + +pkg-dir@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" + integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== + dependencies: + find-up "^4.0.0" + possible-typed-array-names@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz#89bb63c6fada2c3e90adc4a647beeeb39cc7bf8f" @@ -5842,6 +7427,15 @@ pretty-bytes@^5.6.0: resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.6.0.tgz#356256f643804773c82f64723fe78c92c62beaeb" integrity sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg== +pretty-format@^27.0.2: + version "27.5.1" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-27.5.1.tgz#2181879fdea51a7a5851fb39d920faa63f01d88e" + integrity sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ== + dependencies: + ansi-regex "^5.0.1" + ansi-styles "^5.0.0" + react-is "^17.0.1" + pretty-format@^29.0.0, pretty-format@^29.7.0: version "29.7.0" resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.7.0.tgz#ca42c758310f365bfa71a0bda0a807160b776812" @@ -5881,6 +7475,14 @@ promise-retry@^2.0.1: err-code "^2.0.2" retry "^0.12.0" +prompts@^2.0.1: + version "2.4.2" + resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" + integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== + dependencies: + kleur "^3.0.3" + sisteransi "^1.0.5" + prop-types@^15.6.2, prop-types@^15.8.1: version "15.8.1" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" @@ -5923,6 +7525,11 @@ punycode@^2.1.0, punycode@^2.1.1: resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== +pure-rand@^6.0.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/pure-rand/-/pure-rand-6.1.0.tgz#d173cf23258231976ccbdb05247c9787957604f2" + integrity sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA== + qr-scanner@^1.4.2: version "1.4.2" resolved "https://registry.yarnpkg.com/qr-scanner/-/qr-scanner-1.4.2.tgz#bc4fb88022a8c9be95c49527a1c8fb8724b47dc4" @@ -6015,6 +7622,11 @@ react-is@^16.10.2, react-is@^16.13.1, react-is@^16.7.0: resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== +react-is@^17.0.1: + version "17.0.2" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" + integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== + react-is@^18.0.0, react-is@^18.2.0: version "18.3.1" resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.3.1.tgz#e83557dc12eae63a99e003a46388b1dcbb44db7e" @@ -6083,6 +7695,14 @@ recharts@^2.12.6: tiny-invariant "^1.3.1" victory-vendor "^36.6.8" +redent@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f" + integrity sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg== + dependencies: + indent-string "^4.0.0" + strip-indent "^3.0.0" + reflect.getprototypeof@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz#3ab04c32a8390b770712b7a8633972702d278859" @@ -6156,16 +7776,33 @@ request-progress@^3.0.0: dependencies: throttleit "^1.0.0" +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== + requires-port@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== +resolve-cwd@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" + integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== + dependencies: + resolve-from "^5.0.0" + resolve-from@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== +resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + resolve-pkg-maps@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz#616b3dc2c57056b5588c31cdf4b3d64db133720f" @@ -6178,7 +7815,12 @@ resolve-protobuf-schema@^2.1.0: dependencies: protocol-buffers-schema "^3.3.1" -resolve@^1.14.2, resolve@^1.19.0, resolve@^1.22.4: +resolve.exports@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-2.0.2.tgz#f8c934b8e6a13f539e38b7098e2e36134f01e800" + integrity sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg== + +resolve@^1.14.2, resolve@^1.19.0, resolve@^1.20.0, resolve@^1.22.4: version "1.22.8" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== @@ -6278,6 +7920,13 @@ sass@^1.75.0: immutable "^4.0.0" source-map-js ">=0.6.2 <2.0.0" +saxes@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/saxes/-/saxes-6.0.0.tgz#fe5b4a4768df4f14a201b1ba6a65c1f3d9988cc5" + integrity sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA== + dependencies: + xmlchars "^2.2.0" + scheduler@^0.23.2: version "0.23.2" resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.2.tgz#414ba64a3b282892e944cf2108ecc078d115cdc3" @@ -6285,12 +7934,12 @@ scheduler@^0.23.2: dependencies: loose-envify "^1.1.0" -semver@^6.3.1: +semver@^6.3.0, semver@^6.3.1: version "6.3.1" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^7.3.5: +semver@^7.3.5, semver@^7.6.3: version "7.6.3" resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== @@ -6349,7 +7998,7 @@ side-channel@^1.0.4, side-channel@^1.0.6: get-intrinsic "^1.2.4" object-inspect "^1.13.1" -signal-exit@^3.0.2, signal-exit@^3.0.7: +signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: version "3.0.7" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== @@ -6373,6 +8022,11 @@ simple-get@^4.0.0: once "^1.3.1" simple-concat "^1.0.0" +sisteransi@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" + integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== + slash@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" @@ -6431,16 +8085,34 @@ socks@^2.6.2: resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.0.tgz#16b809c162517b5b8c3e7dcd315a2a5c2612b2af" integrity sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg== +source-map-support@0.5.13: + version "0.5.13" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.13.tgz#31b24a9c2e73c2de85066c0feb7d44767ed52932" + integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + source-map@^0.5.7: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== +source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + sprintf-js@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.3.tgz#4914b903a2f8b685d17fdf78a70e917e872e444a" integrity sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA== +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== + sqlite3@^5.1.7: version "5.1.7" resolved "https://registry.yarnpkg.com/sqlite3/-/sqlite3-5.1.7.tgz#59ca1053c1ab38647396586edad019b1551041b7" @@ -6487,6 +8159,14 @@ streamsearch@^1.1.0: resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-1.1.0.tgz#404dd1e2247ca94af554e841a8ef0eaa238da764" integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg== +string-length@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a" + integrity sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ== + dependencies: + char-regex "^1.0.2" + strip-ansi "^6.0.0" + "string-width-cjs@npm:string-width@^4.2.0": version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" @@ -6591,11 +8271,23 @@ strip-bom@^3.0.0: resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== +strip-bom@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" + integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== + strip-final-newline@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== +strip-indent@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001" + integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ== + dependencies: + min-indent "^1.0.0" + strip-json-comments@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" @@ -6632,7 +8324,7 @@ supports-color@^7.1.0: dependencies: has-flag "^4.0.0" -supports-color@^8.1.1: +supports-color@^8.0.0, supports-color@^8.1.1: version "8.1.1" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== @@ -6662,6 +8354,11 @@ svgo@^3.0.2: csso "^5.0.5" picocolors "^1.0.0" +symbol-tree@^3.2.4: + version "3.2.4" + resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" + integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== + tapable@^2.2.0: version "2.2.1" resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" @@ -6700,6 +8397,15 @@ tar@^6.0.2, tar@^6.1.11, tar@^6.1.2: mkdirp "^1.0.3" yallist "^4.0.0" +test-exclude@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" + integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== + dependencies: + "@istanbuljs/schema" "^0.1.2" + glob "^7.1.4" + minimatch "^3.0.4" + text-table@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" @@ -6725,6 +8431,11 @@ tmp@~0.2.1: resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.3.tgz#eb783cc22bc1e8bebd0671476d46ea4eb32a79ae" integrity sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w== +tmpl@1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" + integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== + to-fast-properties@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" @@ -6737,7 +8448,7 @@ to-regex-range@^5.0.1: dependencies: is-number "^7.0.0" -tough-cookie@^4.1.3: +tough-cookie@^4.1.2, tough-cookie@^4.1.3: version "4.1.4" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.4.tgz#945f1461b45b5a8c76821c33ea49c3ac192c1b36" integrity sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag== @@ -6747,6 +8458,13 @@ tough-cookie@^4.1.3: universalify "^0.2.0" url-parse "^1.5.3" +tr46@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-3.0.0.tgz#555c4e297a950617e8eeddef633c87d4d9d6cbf9" + integrity sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA== + dependencies: + punycode "^2.1.1" + tr46@~0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" @@ -6757,6 +8475,47 @@ ts-api-utils@^1.0.1, ts-api-utils@^1.3.0: resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.3.0.tgz#4b490e27129f1e8e686b45cc4ab63714dc60eea1" integrity sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ== +ts-jest@^29.2.5: + version "29.2.5" + resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-29.2.5.tgz#591a3c108e1f5ebd013d3152142cb5472b399d63" + integrity sha512-KD8zB2aAZrcKIdGk4OwpJggeLcH1FgrICqDSROWqlnJXGCXK4Mn6FcdK2B6670Xr73lHMG1kHw8R87A0ecZ+vA== + dependencies: + bs-logger "^0.2.6" + ejs "^3.1.10" + fast-json-stable-stringify "^2.1.0" + jest-util "^29.0.0" + json5 "^2.2.3" + lodash.memoize "^4.1.2" + make-error "^1.3.6" + semver "^7.6.3" + yargs-parser "^21.1.1" + +ts-mockito@^2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/ts-mockito/-/ts-mockito-2.6.1.tgz#bc9ee2619033934e6fad1c4455aca5b5ace34e73" + integrity sha512-qU9m/oEBQrKq5hwfbJ7MgmVN5Gu6lFnIGWvpxSjrqq6YYEVv+RwVFWySbZMBgazsWqv6ctAyVBpo9TmAxnOEKw== + dependencies: + lodash "^4.17.5" + +ts-node@^10.9.2: + version "10.9.2" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.2.tgz#70f021c9e185bccdca820e26dc413805c101c71f" + integrity sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ== + dependencies: + "@cspotcode/source-map-support" "^0.8.0" + "@tsconfig/node10" "^1.0.7" + "@tsconfig/node12" "^1.0.7" + "@tsconfig/node14" "^1.0.0" + "@tsconfig/node16" "^1.0.2" + acorn "^8.4.1" + acorn-walk "^8.1.1" + arg "^4.1.0" + create-require "^1.1.0" + diff "^4.0.1" + make-error "^1.1.1" + v8-compile-cache-lib "^3.0.1" + yn "3.1.1" + tsconfig-paths@^3.15.0: version "3.15.0" resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz#5299ec605e55b1abb23ec939ef15edaf483070d4" @@ -6791,6 +8550,11 @@ type-check@^0.4.0, type-check@~0.4.0: dependencies: prelude-ls "^1.2.1" +type-detect@4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" + integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== + type-fest@^0.20.2: version "0.20.2" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" @@ -6946,6 +8710,14 @@ update-browserslist-db@^1.0.13: escalade "^3.1.2" picocolors "^1.0.0" +update-browserslist-db@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz#7ca61c0d8650766090728046e416a8cde682859e" + integrity sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ== + dependencies: + escalade "^3.1.2" + picocolors "^1.0.1" + uri-js@^4.2.2: version "4.4.1" resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" @@ -6987,6 +8759,20 @@ uuid@^8.3.2: resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== +v8-compile-cache-lib@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" + integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== + +v8-to-istanbul@^9.0.1: + version "9.3.0" + resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz#b9572abfa62bd556c16d75fdebc1a411d5ff3175" + integrity sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA== + dependencies: + "@jridgewell/trace-mapping" "^0.3.12" + "@types/istanbul-lib-coverage" "^2.0.1" + convert-source-map "^2.0.0" + verror@1.10.0: version "1.10.0" resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" @@ -7016,6 +8802,20 @@ victory-vendor@^36.6.8: d3-time "^3.0.0" d3-timer "^3.0.1" +w3c-xmlserializer@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz#aebdc84920d806222936e3cdce408e32488a3073" + integrity sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw== + dependencies: + xml-name-validator "^4.0.0" + +walker@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" + integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== + dependencies: + makeerror "1.0.12" + web-vitals@^3.5.2: version "3.5.2" resolved "https://registry.yarnpkg.com/web-vitals/-/web-vitals-3.5.2.tgz#5bb58461bbc173c3f00c2ddff8bfe6e680999ca9" @@ -7031,11 +8831,36 @@ webidl-conversions@^3.0.0: resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== +webidl-conversions@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-7.0.0.tgz#256b4e1882be7debbf01d05f0aa2039778ea080a" + integrity sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g== + +whatwg-encoding@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz#e7635f597fd87020858626805a2729fa7698ac53" + integrity sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg== + dependencies: + iconv-lite "0.6.3" + whatwg-fetch@^3.4.1: version "3.6.20" resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz#580ce6d791facec91d37c72890995a0b48d31c70" integrity sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg== +whatwg-mimetype@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz#5fa1a7623867ff1af6ca3dc72ad6b8a4208beba7" + integrity sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q== + +whatwg-url@^11.0.0: + version "11.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-11.0.0.tgz#0a849eebb5faf2119b901bb76fd795c2848d4018" + integrity sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ== + dependencies: + tr46 "^3.0.0" + webidl-conversions "^7.0.0" + whatwg-url@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" @@ -7154,6 +8979,24 @@ wrappy@1: resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== +write-file-atomic@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-4.0.2.tgz#a9df01ae5b77858a027fd2e80768ee433555fcfd" + integrity sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg== + dependencies: + imurmurhash "^0.1.4" + signal-exit "^3.0.7" + +ws@^8.11.0: + version "8.18.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.18.0.tgz#0d7505a6eafe2b0e712d232b42279f53bc289bbc" + integrity sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw== + +xml-name-validator@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-4.0.0.tgz#79a006e2e63149a8600f15430f0a4725d1524835" + integrity sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw== + xml-utils@^1.0.2: version "1.8.0" resolved "https://registry.yarnpkg.com/xml-utils/-/xml-utils-1.8.0.tgz#dd9baa161012849b97703d8423d09d9d815a5910" @@ -7164,6 +9007,16 @@ xml@^1.0.0: resolved "https://registry.yarnpkg.com/xml/-/xml-1.0.1.tgz#78ba72020029c5bc87b8a81a3cfcd74b4a2fc1e5" integrity sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw== +xmlchars@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" + integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== + +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + yallist@^3.0.2: version "3.1.1" resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" @@ -7179,6 +9032,24 @@ yaml@^1.10.0: resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== +yargs-parser@^21.1.1: + version "21.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" + integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== + +yargs@^17.3.1: + version "17.7.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" + integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== + dependencies: + cliui "^8.0.1" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.1.1" + yauzl@^2.10.0: version "2.10.0" resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9" @@ -7186,331 +9057,11 @@ yauzl@^2.10.0: dependencies: buffer-crc32 "~0.2.3" fd-slicer "~1.1.0" -abab@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291" - integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== - -abbrev@1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" - integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== - -acorn-globals@^7.0.0: - version "7.0.1" - resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-7.0.1.tgz#0dbf05c44fa7c94332914c02066d5beff62c40c3" - integrity sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q== - dependencies: - acorn "^8.1.0" - acorn-walk "^8.0.2" - -are-we-there-yet@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz#679df222b278c64f2cdba1175cdc00b0d96164bd" - integrity sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg== - dependencies: - delegates "^1.0.0" - readable-stream "^3.6.0" - -arg@^4.1.0: - version "4.1.3" - resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" - integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== - -argparse@^1.0.7: - version "1.0.10" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" - integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== - dependencies: - sprintf-js "~1.0.2" - -buffer-from@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" - integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== - -buffer@^5.5.0, buffer@^5.7.1: -decimal.js@^10.4.2: - version "10.4.3" - resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.4.3.tgz#1044092884d245d1b7f65725fa4ad4c6f781cc23" - integrity sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA== - -decompress-response@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc" - integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ== - dependencies: - mimic-response "^3.1.0" - -dedent@^1.0.0: - version "1.5.3" - resolved "https://registry.yarnpkg.com/dedent/-/dedent-1.5.3.tgz#99aee19eb9bae55a67327717b6e848d0bf777e5a" - integrity sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ== - -deep-extend@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" - integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== - -detect-libc@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.3.tgz#f0cd503b40f9939b894697d19ad50895e30cf700" - integrity sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw== - -detect-newline@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" - integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== - -exit@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" - integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== - -expand-template@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-2.0.3.tgz#6e14b3fcee0f3a6340ecb57d2e8918692052a47c" - integrity sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg== - -expect@^29.0.0, expect@^29.7.0: -file-uri-to-path@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" - integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== - -filelist@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/filelist/-/filelist-1.0.4.tgz#f78978a1e944775ff9e62e744424f215e58352b5" - integrity sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q== - dependencies: - minimatch "^5.0.1" - -https-proxy-agent@^5.0.0, https-proxy-agent@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" - integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== - dependencies: - agent-base "6" - debug "4" - -human-signals@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" - integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== - -humanize-ms@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed" - integrity sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ== - dependencies: - ms "^2.0.0" - -iconv-lite@0.6.3, iconv-lite@^0.6.2: - version "0.6.3" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" - integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== - dependencies: - safer-buffer ">= 2.1.2 < 3.0.0" - -make-dir@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-4.0.0.tgz#c3c2307a771277cd9638305f915c29ae741b614e" - integrity sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw== - dependencies: - semver "^7.5.3" - -make-error@^1.1.1, make-error@^1.3.6: - version "1.3.6" - resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" - integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== - -make-fetch-happen@^9.1.0: - version "9.1.0" - resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz#53085a09e7971433e6765f7971bf63f4e05cb968" - integrity sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg== - dependencies: - agentkeepalive "^4.1.3" - cacache "^15.2.0" - http-cache-semantics "^4.1.0" - http-proxy-agent "^4.0.1" - https-proxy-agent "^5.0.0" - is-lambda "^1.0.1" - lru-cache "^6.0.0" - minipass "^3.1.3" - minipass-collect "^1.0.2" - minipass-fetch "^1.3.2" - minipass-flush "^1.0.5" - minipass-pipeline "^1.2.4" - negotiator "^0.6.2" - promise-retry "^2.0.1" - socks-proxy-agent "^6.0.0" - ssri "^8.0.0" - -makeerror@1.0.12: - version "1.0.12" - resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a" - integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg== - dependencies: - tmpl "1.0.5" - -mimic-response@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9" - integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== - -min-indent@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" - integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== - -node-gyp@8.x: - version "8.4.1" - resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-8.4.1.tgz#3d49308fc31f768180957d6b5746845fbd429937" - integrity sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w== - dependencies: - env-paths "^2.2.0" - glob "^7.1.4" - graceful-fs "^4.2.6" - make-fetch-happen "^9.1.0" - nopt "^5.0.0" - npmlog "^6.0.0" - rimraf "^3.0.2" - semver "^7.3.5" - tar "^6.1.2" - which "^2.0.2" - -node-int64@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" - integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== - -node-releases@^2.0.18: - version "2.0.18" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.18.tgz#f010e8d35e2fe8d6b2944f03f70213ecedc4ca3f" - integrity sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g== - -nopt@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-5.0.0.tgz#530942bb58a512fccafe53fe210f13a25355dc88" - integrity sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ== - dependencies: - abbrev "1" - -promise-inflight@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" - integrity sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g== - -promise-retry@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/promise-retry/-/promise-retry-2.0.1.tgz#ff747a13620ab57ba688f5fc67855410c370da22" - integrity sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g== - dependencies: - err-code "^2.0.2" - retry "^0.12.0" - -prompts@^2.0.1: - version "2.4.2" - resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" - integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== - dependencies: - kleur "^3.0.3" - sisteransi "^1.0.5" - -semver@^7.3.5, semver@^7.6.3: - version "7.6.3" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" - integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== - -signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: -simple-concat@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f" - integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q== - -simple-get@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-4.0.1.tgz#4a39db549287c979d352112fa03fd99fd6bc3543" - integrity sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA== - dependencies: - decompress-response "^6.0.0" - once "^1.3.1" - simple-concat "^1.0.0" - -sisteransi@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" - integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== - -source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - -sprintf-js@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.3.tgz#4914b903a2f8b685d17fdf78a70e917e872e444a" - integrity sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA== - -sprintf-js@~1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== - -sqlite3@^5.1.7: - version "5.1.7" - resolved "https://registry.yarnpkg.com/sqlite3/-/sqlite3-5.1.7.tgz#59ca1053c1ab38647396586edad019b1551041b7" - integrity sha512-GGIyOiFaG+TUra3JIfkI/zGP8yZYLPQ0pl1bH+ODjiX57sPhrLU5sQJn1y9bDKZUFYkX1crlrPfSYt0BKKdkog== - dependencies: - bindings "^1.5.0" - node-addon-api "^7.0.0" - prebuild-install "^7.1.1" - tar "^6.1.11" - optionalDependencies: - node-gyp "8.x" - -tar-fs@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.1.tgz#489a15ab85f1f0befabb370b7de4f9eb5cbe8784" - integrity sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng== - dependencies: - chownr "^1.1.1" - mkdirp-classic "^0.5.2" - pump "^3.0.0" - tar-stream "^2.1.4" - -tar-stream@^2.1.4: - version "2.2.0" - resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287" - integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ== - dependencies: - bl "^4.0.3" - end-of-stream "^1.4.1" - fs-constants "^1.0.0" - inherits "^2.0.3" - readable-stream "^3.1.1" - -tar@^6.0.2, tar@^6.1.11, tar@^6.1.2: - version "6.2.1" - resolved "https://registry.yarnpkg.com/tar/-/tar-6.2.1.tgz#717549c541bc3c2af15751bea94b1dd068d4b03a" - integrity sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A== - dependencies: - chownr "^2.0.0" - fs-minipass "^2.0.0" - minipass "^5.0.0" - minizlib "^2.1.1" - mkdirp "^1.0.3" - yallist "^4.0.0" - -test-exclude@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" - integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== - dependencies: - "@istanbuljs/schema" "^0.1.2" - glob "^7.1.4" - minimatch "^3.0.4" +yn@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" + integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== yocto-queue@^0.1.0: version "0.1.0" From 847b65125183f78b18c3b9a1059e94f5b854ff0e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Frederik=20Schl=C3=BCter?= Date: Mon, 16 Sep 2024 16:49:53 +0200 Subject: [PATCH 45/55] updated compose.yml --- compose.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/compose.yml b/compose.yml index 2da3929..7767a04 100644 --- a/compose.yml +++ b/compose.yml @@ -2,9 +2,6 @@ networks: mnestix-network: driver: bridge name: mnestix-network - -volumes: - mnestix-database: volumes: mnestix-database: From b4820e5e99a7a8564ed006ab60e41a82ae409458 Mon Sep 17 00:00:00 2001 From: fleanegan Date: Wed, 18 Sep 2024 08:46:19 +0200 Subject: [PATCH 46/55] Update cypress/e2e/compareViewTest.spec.js Co-authored-by: Milo Franke --- cypress/e2e/compareViewTest.spec.js | 1 - 1 file changed, 1 deletion(-) diff --git a/cypress/e2e/compareViewTest.spec.js b/cypress/e2e/compareViewTest.spec.js index 5d3c64e..06826d3 100644 --- a/cypress/e2e/compareViewTest.spec.js +++ b/cypress/e2e/compareViewTest.spec.js @@ -33,7 +33,6 @@ describe('Test compare feature view', function () { cy.get('@IDInput').click().type(compareAAS[1].assetInformation.globalAssetId); cy.getByTestId('aasId-submit-button').click(); // assert if second aas is visible and contains correct values - // here it is cy.getByTestId('compare-aas-1').should('be.visible'); cy.getByTestId('compare-Data-0').click(); cy.getByTestId('compare-value-1').eq(1).contains('TEST_DATA2'); From 2000320af3dfd71a17847e0cc541f04ce625900f Mon Sep 17 00:00:00 2001 From: fleanegan Date: Wed, 18 Sep 2024 08:47:12 +0200 Subject: [PATCH 47/55] Update src/lib/services/searchUtilActions/AasSearcher.ts Co-authored-by: Milo Franke --- src/lib/services/searchUtilActions/AasSearcher.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/lib/services/searchUtilActions/AasSearcher.ts b/src/lib/services/searchUtilActions/AasSearcher.ts index 1e45ccf..8e5d198 100644 --- a/src/lib/services/searchUtilActions/AasSearcher.ts +++ b/src/lib/services/searchUtilActions/AasSearcher.ts @@ -141,14 +141,14 @@ export class AasSearcher { } /** - * Resolves the given AAS ID using the discovery service. + * Resolves the given Asset ID using the discovery service. * - * This function takes an AAS ID and attempts to resolve it using a discovery service. - * If the AAS ID is found, it returns the resolved AAS ID. + * This function takes an Asset ID and attempts to resolve it using a discovery service. + * If the Asset ID is found, it returns the resolved AAS ID. * If not found, it returns `null`. * - * @param {string} searchAssetId - The AAS ID to resolve using the discovery service. - * @returns {Promise} A promise that resolves to the resolved AAS ID as a string, or `null` if the AAS ID is not found. + * @param {string} searchAssetId - The Asset ID to resolve using the discovery service. + * @returns {Promise} A promise that resolves to the AAS ID as a string, or `null` if the Asset ID is not found. */ async handleAasDiscoverySearch(searchAssetId: string): Promise { try { From d312122060e54484dfb2c43bebd6116619ef8b1f Mon Sep 17 00:00:00 2001 From: fleanegan Date: Wed, 18 Sep 2024 08:47:21 +0200 Subject: [PATCH 48/55] Update src/lib/services/searchUtilActions/AasSearcher.ts Co-authored-by: Milo Franke --- src/lib/services/searchUtilActions/AasSearcher.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/services/searchUtilActions/AasSearcher.ts b/src/lib/services/searchUtilActions/AasSearcher.ts index 8e5d198..39fe489 100644 --- a/src/lib/services/searchUtilActions/AasSearcher.ts +++ b/src/lib/services/searchUtilActions/AasSearcher.ts @@ -209,7 +209,7 @@ export class AasSearcher { }, }; } catch (e) { - this.log.warn('Could not be found in the registry service, will continue to look in the AAS registry.'); + this.log.warn('Could not be found in the registry service, will continue to look in the AAS repository'); return null; } } From d79d4b491754486123d533b41d7c7d8d8b669ad2 Mon Sep 17 00:00:00 2001 From: fleanegan Date: Wed, 18 Sep 2024 08:47:29 +0200 Subject: [PATCH 49/55] Update src/lib/services/searchUtilActions/AasSearcher.ts Co-authored-by: Milo Franke --- src/lib/services/searchUtilActions/AasSearcher.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/services/searchUtilActions/AasSearcher.ts b/src/lib/services/searchUtilActions/AasSearcher.ts index 39fe489..a637055 100644 --- a/src/lib/services/searchUtilActions/AasSearcher.ts +++ b/src/lib/services/searchUtilActions/AasSearcher.ts @@ -163,7 +163,7 @@ export class AasSearcher { return aasIds; } catch (e) { - this.log.warn('Could not be found in the discovery service, will continue to look in the AAS repository.'); + this.log.warn('Could not be found in the discovery service, will continue to look in the AAS registry'); return null; } } From d16be5459c1e71c652a32170b2b0ead9397cff8c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Frederik=20Schl=C3=BCter?= Date: Wed, 18 Sep 2024 08:52:18 +0200 Subject: [PATCH 50/55] test strategy: apply to review comments --- cypress.config.ts | 8 ++-- cypress/e2e/listAasPageComparisonTest.spec.js | 1 - cypress/support/commands.ts | 2 +- .../MnestixConnectionServerActions.tsx | 46 ------------------- .../services/searchUtilActions/AasSearcher.ts | 8 ++-- .../searchUtilActions/searchServer.ts | 4 +- 6 files changed, 11 insertions(+), 58 deletions(-) delete mode 100644 src/app/[locale]/settings/_components/mnestix-connections/MnestixConnectionServerActions.tsx diff --git a/cypress.config.ts b/cypress.config.ts index 63e79e7..91fcd44 100644 --- a/cypress.config.ts +++ b/cypress.config.ts @@ -1,10 +1,10 @@ import { defineConfig } from 'cypress'; export default defineConfig({ - defaultCommandTimeout: 150000, // 150 - pageLoadTimeout: 600000, // 600 - requestTimeout: 150000, // 150 - responseTimeout: 200000, // 200 + defaultCommandTimeout: 15000, + pageLoadTimeout: 30000, + requestTimeout: 15000, + responseTimeout: 20000, video: true, videoCompression: true, retries: 2, diff --git a/cypress/e2e/listAasPageComparisonTest.spec.js b/cypress/e2e/listAasPageComparisonTest.spec.js index bf9a2b8..4949663 100644 --- a/cypress/e2e/listAasPageComparisonTest.spec.js +++ b/cypress/e2e/listAasPageComparisonTest.spec.js @@ -14,7 +14,6 @@ describe('Test that the list works together with the comparison view (Resolution cy.get('[data-testid="list-row-https://i40.xitaso.com/aas/testElement_2"]') .findByTestId('list-checkbox') .click(); - cy.screenshot('list-selected.png'); cy.getByTestId('compare-button').click(); cy.url().should('contain', '/compare'); cy.wait(60000); diff --git a/cypress/support/commands.ts b/cypress/support/commands.ts index b6a9cd5..9560b7b 100644 --- a/cypress/support/commands.ts +++ b/cypress/support/commands.ts @@ -24,7 +24,7 @@ Cypress.Commands.add('visitViewer', (aasId) => { }); Cypress.Commands.add('getByTestId', (dataTestId) => { - cy.get('[data-testid=' + dataTestId + ']', { timeout: 20000 }); + cy.get('[data-testid=' + dataTestId + ']'); }); Cypress.Commands.add('findByTestId', { prevSubject: true }, (subject, dataTestId) => { diff --git a/src/app/[locale]/settings/_components/mnestix-connections/MnestixConnectionServerActions.tsx b/src/app/[locale]/settings/_components/mnestix-connections/MnestixConnectionServerActions.tsx deleted file mode 100644 index e7df145..0000000 --- a/src/app/[locale]/settings/_components/mnestix-connections/MnestixConnectionServerActions.tsx +++ /dev/null @@ -1,46 +0,0 @@ -'use server'; - -import { prisma } from 'lib/database/prisma'; -import { ConnectionType } from '@prisma/client'; - -type DataSourceFormData = { - id: string; - url: string; - type: string; -}; - -export async function getConnectionDataAction() { - return prisma?.mnestixConnection.findMany({ include: { type: true } }); -} - -export async function upsertConnectionDataAction(formDataInput: DataSourceFormData[]) { - const existingData = await prisma?.mnestixConnection.findMany({ include: { type: true } }); - for (const existing of existingData) { - const formData = formDataInput.find((value) => value.id === existing.id); - // If an entry exists in the db and the updated data, update the existing db entry - if (formData) { - await prisma.mnestixConnection.update({ where: { id: existing.id }, data: { url: formData.url } }); - // If an entry exists in the db but NOT in the updated data, delete it from the db - } else { - await prisma.mnestixConnection.delete({ where: { id: existing.id } }); - } - } - // If an entry doesn't exist in the db but in the updated data, create it in the db - for (const updated of formDataInput) { - const formData = existingData.find((value) => value.id === updated.id); - const type = await prisma.connectionType.findFirst({ where: { typeName: updated.type } }); - if (!formData && type) { - await prisma.mnestixConnection.create({ data: { url: updated.url, typeId: type.id } }); - } - } -} - -export async function getConnectionDataByTypeAction(type: ConnectionType) { - const basePath = await prisma?.mnestixConnection.findMany({ - where: { - type: type, - }, - }); - - return basePath.map((item) => item.url); -} diff --git a/src/lib/services/searchUtilActions/AasSearcher.ts b/src/lib/services/searchUtilActions/AasSearcher.ts index a637055..f5f53b0 100644 --- a/src/lib/services/searchUtilActions/AasSearcher.ts +++ b/src/lib/services/searchUtilActions/AasSearcher.ts @@ -90,7 +90,7 @@ export class AasSearcher { } async fullSearch(val: string): Promise { - const aasIds = await this.handleAasDiscoverySearch(val); + const aasIds = await this.performAasDiscoverySearch(val); if (aasIds && aasIds.length > 1) { return { redirectUrl: `/viewer/discovery?assetId=${val}`, @@ -101,7 +101,7 @@ export class AasSearcher { // Check if an AAS ID is found in the Discovery service, or assign the input parameter for further search. // If there is exactly one AAS ID in the aasIds array, use it; otherwise, use the input parameter 'val'. const aasId = aasIds && aasIds.length === 1 ? aasIds[0] : val; - const registrySearchResult = await this.handleAasRegistrySearch(aasId); + const registrySearchResult = await this.performAasRegistrySearch(aasId); let aas: AssetAdministrationShell; if (registrySearchResult != null) { @@ -150,7 +150,7 @@ export class AasSearcher { * @param {string} searchAssetId - The Asset ID to resolve using the discovery service. * @returns {Promise} A promise that resolves to the AAS ID as a string, or `null` if the Asset ID is not found. */ - async handleAasDiscoverySearch(searchAssetId: string): Promise { + async performAasDiscoverySearch(searchAssetId: string): Promise { try { if (!searchAssetId) { throw new NotFoundError(); @@ -181,7 +181,7 @@ export class AasSearcher { * - `registryAasData` (optional): Additional data related to the retrieved AAS. * or `null` if the AAS is not found in the registry. */ - async handleAasRegistrySearch(searchAasId: string): Promise { + async performAasRegistrySearch(searchAasId: string): Promise { try { const shellDescription = await this.registryService.getAssetAdministrationShellDescriptorById(searchAasId); const endpoints = shellDescription.endpoints as Endpoint[]; diff --git a/src/lib/services/searchUtilActions/searchServer.ts b/src/lib/services/searchUtilActions/searchServer.ts index 6726329..47c3160 100644 --- a/src/lib/services/searchUtilActions/searchServer.ts +++ b/src/lib/services/searchUtilActions/searchServer.ts @@ -9,12 +9,12 @@ export async function performFullAasSearch(searchInput: string): Promise { const searcher = AasSearcher.create(); - return searcher.handleAasRegistrySearch(searchInput); + return searcher.performAasRegistrySearch(searchInput); } export async function performDiscoveryAasSearch(searchInput: string): Promise { const searcher = AasSearcher.create(); - return searcher.handleAasDiscoverySearch(searchInput); + return searcher.performAasDiscoverySearch(searchInput); } export async function getSubmodelFromSubmodelDescriptor(url: string) { From df7541ff9f95eeaf2fa6aa89305f5fdf14c26dc1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Frederik=20Schl=C3=BCter?= Date: Wed, 18 Sep 2024 09:08:27 +0200 Subject: [PATCH 51/55] test strategy: restore time outs --- cypress.config.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/cypress.config.ts b/cypress.config.ts index 91fcd44..63e79e7 100644 --- a/cypress.config.ts +++ b/cypress.config.ts @@ -1,10 +1,10 @@ import { defineConfig } from 'cypress'; export default defineConfig({ - defaultCommandTimeout: 15000, - pageLoadTimeout: 30000, - requestTimeout: 15000, - responseTimeout: 20000, + defaultCommandTimeout: 150000, // 150 + pageLoadTimeout: 600000, // 600 + requestTimeout: 150000, // 150 + responseTimeout: 200000, // 200 video: true, videoCompression: true, retries: 2, From dd7fbf193c6a2f28977ece33c1b5d0517097c0f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Frederik=20Schl=C3=BCter?= Date: Wed, 18 Sep 2024 10:23:39 +0200 Subject: [PATCH 52/55] test strategy: replied to remaining comments of review --- .../[locale]/_components/DashboardInput.tsx | 2 +- .../compare/_components/CompareView.tsx | 2 +- .../[locale]/viewer/[base64AasId]/page.tsx | 2 +- .../_components/SubmodelsOverviewCard.tsx | 2 +- .../_components/DiscoveryListView.tsx | 4 +- src/components/contexts/CompareAasContext.tsx | 2 +- .../SearchRepositoryHelper.ts | 68 ------------------- src/lib/searchUtilActions/searchClient.ts | 0 src/lib/searchUtilActions/searchServer.ts | 0 ....ts => MultipleRepositorySearchService.ts} | 21 ++---- .../multipleDataSourceActions.ts | 11 +-- .../{search.spec.ts => AasSearcher.spec.ts} | 0 .../services/searchUtilActions/AasSearcher.ts | 10 +-- .../{searchServer.ts => searchActions.ts} | 0 14 files changed, 24 insertions(+), 100 deletions(-) delete mode 100644 src/lib/searchUtilActions/SearchRepositoryHelper.ts delete mode 100644 src/lib/searchUtilActions/searchClient.ts delete mode 100644 src/lib/searchUtilActions/searchServer.ts rename src/lib/services/multipleDataSourceActions/{MultipleDataSource.ts => MultipleRepositorySearchService.ts} (83%) rename src/lib/services/searchUtilActions/{search.spec.ts => AasSearcher.spec.ts} (100%) rename src/lib/services/searchUtilActions/{searchServer.ts => searchActions.ts} (100%) diff --git a/src/app/[locale]/_components/DashboardInput.tsx b/src/app/[locale]/_components/DashboardInput.tsx index bf9d698..1624a9a 100644 --- a/src/app/[locale]/_components/DashboardInput.tsx +++ b/src/app/[locale]/_components/DashboardInput.tsx @@ -7,7 +7,7 @@ import { QrScanner } from 'app/[locale]/_components/QrScanner'; import { useRouter } from 'next/navigation'; import { useAasState, useRegistryAasState } from 'components/contexts/CurrentAasContext'; import { LocalizedError } from 'lib/util/LocalizedError'; -import { performFullAasSearch } from 'lib/services/searchUtilActions/searchServer'; +import { performFullAasSearch } from 'lib/services/searchUtilActions/searchActions'; export const DashboardInput = () => { const [, setAas] = useAasState(); diff --git a/src/app/[locale]/compare/_components/CompareView.tsx b/src/app/[locale]/compare/_components/CompareView.tsx index 404c395..dd861cd 100644 --- a/src/app/[locale]/compare/_components/CompareView.tsx +++ b/src/app/[locale]/compare/_components/CompareView.tsx @@ -12,7 +12,7 @@ import { useNotificationSpawner } from 'lib/hooks/UseNotificationSpawner'; import { useSearchParams } from 'next/navigation'; import { showError } from 'lib/util/ErrorHandlerUtil'; import { LocalizedError } from 'lib/util/LocalizedError'; -import { performFullAasSearch } from 'lib/services/searchUtilActions/searchServer'; +import { performFullAasSearch } from 'lib/services/searchUtilActions/searchActions'; import { AasSearchResult } from 'lib/services/searchUtilActions/AasSearcher'; export function CompareView() { diff --git a/src/app/[locale]/viewer/[base64AasId]/page.tsx b/src/app/[locale]/viewer/[base64AasId]/page.tsx index 0858640..832b1f9 100644 --- a/src/app/[locale]/viewer/[base64AasId]/page.tsx +++ b/src/app/[locale]/viewer/[base64AasId]/page.tsx @@ -18,7 +18,7 @@ import { AASOverviewCard } from 'app/[locale]/viewer/_components/AASOverviewCard import { useApis } from 'components/azureAuthentication/ApiProvider'; import { useEnv } from 'app/env/provider'; import { useAsyncEffect } from 'lib/hooks/UseAsyncEffect'; -import { performRegistryAasSearch } from 'lib/services/searchUtilActions/searchServer'; +import { performRegistryAasSearch } from 'lib/services/searchUtilActions/searchActions'; import { performSearchAasFromAllRepositories } from 'lib/services/multipleDataSourceActions/multipleDataSourceActions'; export default function Page() { diff --git a/src/app/[locale]/viewer/_components/SubmodelsOverviewCard.tsx b/src/app/[locale]/viewer/_components/SubmodelsOverviewCard.tsx index 1089b3b..6a9e747 100644 --- a/src/app/[locale]/viewer/_components/SubmodelsOverviewCard.tsx +++ b/src/app/[locale]/viewer/_components/SubmodelsOverviewCard.tsx @@ -11,7 +11,7 @@ import { TabSelectorItem, VerticalTabSelector } from 'components/basics/Vertical import { MobileModal } from 'components/basics/MobileModal'; import { useApis } from 'components/azureAuthentication/ApiProvider'; import { useRegistryAasState } from 'components/contexts/CurrentAasContext'; -import { getSubmodelFromSubmodelDescriptor } from 'lib/services/searchUtilActions/searchServer'; +import { getSubmodelFromSubmodelDescriptor } from 'lib/services/searchUtilActions/searchActions'; import { useEnv } from 'app/env/provider'; import { useNotificationSpawner } from 'lib/hooks/UseNotificationSpawner'; import { showError } from 'lib/util/ErrorHandlerUtil'; diff --git a/src/app/[locale]/viewer/discovery/_components/DiscoveryListView.tsx b/src/app/[locale]/viewer/discovery/_components/DiscoveryListView.tsx index 6a3eb4f..571c016 100644 --- a/src/app/[locale]/viewer/discovery/_components/DiscoveryListView.tsx +++ b/src/app/[locale]/viewer/discovery/_components/DiscoveryListView.tsx @@ -14,9 +14,9 @@ import { isAasAvailableInRepo } from 'lib/util/checkAasAvailabilityUtil'; import { useEnv } from 'app/env/provider'; import { encodeBase64 } from 'lib/util/Base64Util'; import ListHeader from 'components/basics/ListHeader'; -import { performDiscoveryAasSearch, performRegistryAasSearch } from 'lib/services/searchUtilActions/searchServer'; +import { performDiscoveryAasSearch, performRegistryAasSearch } from 'lib/services/searchUtilActions/searchActions'; import { performSearchAasFromAllRepositories } from 'lib/services/multipleDataSourceActions/multipleDataSourceActions'; -import { RepoSearchResult } from 'lib/services/multipleDataSourceActions/MultipleDataSource'; +import { RepoSearchResult } from 'lib/services/multipleDataSourceActions/MultipleRepositorySearchService'; export const DiscoveryListView = () => { const [isLoadingList, setIsLoadingList] = useState(false); diff --git a/src/components/contexts/CompareAasContext.tsx b/src/components/contexts/CompareAasContext.tsx index b98c77c..dda4581 100644 --- a/src/components/contexts/CompareAasContext.tsx +++ b/src/components/contexts/CompareAasContext.tsx @@ -7,7 +7,7 @@ import { useApis } from 'components/azureAuthentication/ApiProvider'; import { getSubmodelFromSubmodelDescriptor, performRegistryAasSearch, -} from 'lib/services/searchUtilActions/searchServer'; +} from 'lib/services/searchUtilActions/searchActions'; import { SubmodelDescriptor } from 'lib/types/registryServiceTypes'; type CompareAasContextType = { diff --git a/src/lib/searchUtilActions/SearchRepositoryHelper.ts b/src/lib/searchUtilActions/SearchRepositoryHelper.ts deleted file mode 100644 index da32904..0000000 --- a/src/lib/searchUtilActions/SearchRepositoryHelper.ts +++ /dev/null @@ -1,68 +0,0 @@ -import { getConnectionDataByTypeAction } from 'app/[locale]/settings/_components/mnestix-connections/MnestixConnectionServerActions'; -import { AssetAdministrationShellRepositoryApi, SubmodelRepositoryApi } from 'lib/api/basyx-v3/api'; -import { AssetAdministrationShell } from '@aas-core-works/aas-core3.0-typescript/types'; -import { NotFoundError } from 'lib/errors/NotFoundError'; - -export type RepoSearchResult = { - aas: AssetAdministrationShell; - location: string; -}; - -export async function getAasFromAllAasRepos( - aasId: string, - repositoryClient: AssetAdministrationShellRepositoryApi, -): Promise { - const basePathUrls = await getConnectionDataByTypeAction({ id: '0', typeName: 'AAS_REPOSITORY' }); - - const promises = basePathUrls.map( - (url) => - repositoryClient - .getAssetAdministrationShellById(aasId, undefined, url) - .then((aas) => ({ aas: aas, location: url })), // add the URL to the resolved value - ); - - const results = await Promise.allSettled(promises); - const fulfilledResults = results.filter(result => result.status === 'fulfilled'); - - if (fulfilledResults.length > 0) { - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-expect-error - return fulfilledResults.map(result => (result as unknown).value); - } else { - throw new NotFoundError('AAS not found'); - } -} - -export async function getSubmodelFromAllSubmodelRepos(submodelId: string, repositoryClient: SubmodelRepositoryApi) { - const basePathUrls = await getConnectionDataByTypeAction({ id: '2', typeName: 'SUBMODEL_REPOSITORY' }); - - const promises = basePathUrls.map((url) => repositoryClient.getSubmodelById(submodelId, undefined, url)); - - try { - return await Promise.any(promises); - } catch (error) { - throw new NotFoundError('Submodel not found'); - } -} - -export async function getAasThumbnailFromAllAasRepos( - aasId: string, - repositoryClient: AssetAdministrationShellRepositoryApi, -) { - const basePathUrls = await getConnectionDataByTypeAction({ id: '0', typeName: 'AAS_REPOSITORY' }); - - const promises = basePathUrls.map((url) => - repositoryClient.getThumbnailFromShell(aasId, undefined, url).then((image) => { - if (image.size === 0) { - throw new Error('Empty image'); - } - return image; - }), - ); - - try { - return await Promise.any(promises); - } catch { - throw new NotFoundError('Image not found'); - } -} diff --git a/src/lib/searchUtilActions/searchClient.ts b/src/lib/searchUtilActions/searchClient.ts deleted file mode 100644 index e69de29..0000000 diff --git a/src/lib/searchUtilActions/searchServer.ts b/src/lib/searchUtilActions/searchServer.ts deleted file mode 100644 index e69de29..0000000 diff --git a/src/lib/services/multipleDataSourceActions/MultipleDataSource.ts b/src/lib/services/multipleDataSourceActions/MultipleRepositorySearchService.ts similarity index 83% rename from src/lib/services/multipleDataSourceActions/MultipleDataSource.ts rename to src/lib/services/multipleDataSourceActions/MultipleRepositorySearchService.ts index d2b67a0..ea79dac 100644 --- a/src/lib/services/multipleDataSourceActions/MultipleDataSource.ts +++ b/src/lib/services/multipleDataSourceActions/MultipleRepositorySearchService.ts @@ -13,22 +13,20 @@ export type RepoSearchResult = { }; export interface NullableMultipleDataSourceSetupParameters { - shellsByRegistryEndpoint?: { path: string; aas: AssetAdministrationShell }[] | null; shellsSavedInTheRepositories?: INullableAasRepositoryEntries[] | null; submodelsSavedInTheRepository?: Submodel[] | null; log?: Log | null; } -export class MultipleDataSource { +export class MultipleRepositorySearchService { private constructor( protected readonly repositoryClient: IAssetAdministrationShellRepositoryApi, protected readonly submodelRepositoryClient: ISubmodelRepositoryApi, protected readonly prismaConnector: IPrismaConnector, - protected readonly fetch: (input: RequestInfo | URL, init?: RequestInit | undefined) => Promise, protected readonly log: Log, ) {} - static create(): MultipleDataSource { + static create(): MultipleRepositorySearchService { const repositoryClient = AssetAdministrationShellRepositoryApi.create({ basePath: process.env.AAS_REPO_API_URL, fetch: mnestixFetch(), @@ -39,28 +37,19 @@ export class MultipleDataSource { }); const log = Log.create(); const prismaConnector = PrismaConnector.create(); - return new MultipleDataSource(repositoryClient, submodelRepositoryClient, prismaConnector, fetch, log); + return new MultipleRepositorySearchService(repositoryClient, submodelRepositoryClient, prismaConnector, log); } static createNull({ - shellsByRegistryEndpoint = [], shellsSavedInTheRepositories = [], submodelsSavedInTheRepository = [], log = null, - }: NullableMultipleDataSourceSetupParameters = {}): MultipleDataSource { - const stubbedFetch = async (input: RequestInfo | URL): Promise => { - if (!shellsByRegistryEndpoint) return Promise.reject(new Error('no registry configuration')); - for (const aasEntry of shellsByRegistryEndpoint) { - if (aasEntry.path === input) return new Response(JSON.stringify(aasEntry.aas)); - } - return Promise.reject(new Error('no aas for on href:' + input)); - }; + }: NullableMultipleDataSourceSetupParameters = {}): MultipleRepositorySearchService { const aasUrls = [...new Set(shellsSavedInTheRepositories?.map((entry) => entry.repositoryUrl))]; - return new MultipleDataSource( + return new MultipleRepositorySearchService( AssetAdministrationShellRepositoryApi.createNull({ shellsSavedInTheRepositories }), SubmodelRepositoryApi.createNull({ submodelsSavedInTheRepository }), PrismaConnector.createNull({ aasUrls }), - stubbedFetch, log ?? Log.createNull(), ); } diff --git a/src/lib/services/multipleDataSourceActions/multipleDataSourceActions.ts b/src/lib/services/multipleDataSourceActions/multipleDataSourceActions.ts index 01bbdd1..058eca2 100644 --- a/src/lib/services/multipleDataSourceActions/multipleDataSourceActions.ts +++ b/src/lib/services/multipleDataSourceActions/multipleDataSourceActions.ts @@ -1,17 +1,20 @@ import { Submodel } from '@aas-core-works/aas-core3.0-typescript/dist/types/types'; -import { MultipleDataSource, RepoSearchResult } from 'lib/services/multipleDataSourceActions/MultipleDataSource'; +import { + MultipleRepositorySearchService, + RepoSearchResult, +} from 'lib/services/multipleDataSourceActions/MultipleRepositorySearchService'; export async function performSearchAasFromAllRepositories(searchInput: string): Promise { - const searcher = MultipleDataSource.create(); + const searcher = MultipleRepositorySearchService.create(); return searcher.getAasFromAllRepos(searchInput); } export async function performSearchSubmodelFromAllRepos(searchInput: string): Promise { - const searcher = MultipleDataSource.create(); + const searcher = MultipleRepositorySearchService.create(); return searcher.getSubmodelFromAllRepos(searchInput); } export async function performgetAasThumbnailFromAllRepos(searchInput: string): Promise { - const searcher = MultipleDataSource.create(); + const searcher = MultipleRepositorySearchService.create(); return searcher.getAasThumbnailFromAllRepos(searchInput); } diff --git a/src/lib/services/searchUtilActions/search.spec.ts b/src/lib/services/searchUtilActions/AasSearcher.spec.ts similarity index 100% rename from src/lib/services/searchUtilActions/search.spec.ts rename to src/lib/services/searchUtilActions/AasSearcher.spec.ts diff --git a/src/lib/services/searchUtilActions/AasSearcher.ts b/src/lib/services/searchUtilActions/AasSearcher.ts index f5f53b0..a01a0d9 100644 --- a/src/lib/services/searchUtilActions/AasSearcher.ts +++ b/src/lib/services/searchUtilActions/AasSearcher.ts @@ -13,9 +13,9 @@ import { DiscoveryServiceApi } from 'lib/api/discovery-service-api/discoveryServ import { encodeBase64 } from 'lib/util/Base64Util'; import { NotFoundError } from 'lib/errors/NotFoundError'; import { - MultipleDataSource, + MultipleRepositorySearchService, NullableMultipleDataSourceSetupParameters, -} from 'lib/services/multipleDataSourceActions/MultipleDataSource'; +} from 'lib/services/multipleDataSourceActions/MultipleRepositorySearchService'; import { INullableAasRepositoryEntries } from 'lib/api/basyx-v3/apiInMemory'; import { mnestixFetch } from 'lib/api/infrastructure'; @@ -48,13 +48,13 @@ export class AasSearcher { private constructor( protected readonly discoveryServiceClient: IDiscoveryServiceApi, protected readonly registryService: IRegistryServiceApi, - protected readonly multipleDataSource: MultipleDataSource, + protected readonly multipleDataSource: MultipleRepositorySearchService, protected readonly fetch: (input: RequestInfo | URL, init?: RequestInit | undefined) => Promise, protected readonly log: Log, ) {} static create(_baseUrl: string = ''): AasSearcher { - const multipleDataSource = MultipleDataSource.create(); + const multipleDataSource = MultipleRepositorySearchService.create(); const registryServiceClient = RegistryServiceApi.create(process.env.REGISTRY_API_URL, mnestixFetch()); const discoveryServiceClient = DiscoveryServiceApi.create(process.env.DISCOVERY_API_URL, mnestixFetch()); const log = Log.create(); @@ -79,7 +79,7 @@ export class AasSearcher { return new AasSearcher( DiscoveryServiceApi.createNull({ discoveryEntries: discoveryEntries }), RegistryServiceApi.createNull({ registryShellDescriptorEntries }), - MultipleDataSource.createNull({ + MultipleRepositorySearchService.createNull({ shellsByRegistryEndpoint, shellsSavedInTheRepositories: shellsSavedInTheRepositories, submodelsSavedInTheRepository, diff --git a/src/lib/services/searchUtilActions/searchServer.ts b/src/lib/services/searchUtilActions/searchActions.ts similarity index 100% rename from src/lib/services/searchUtilActions/searchServer.ts rename to src/lib/services/searchUtilActions/searchActions.ts From 9fcd9476e2643c75d420fa7d05715b78e5384f11 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Frederik=20Schl=C3=BCter?= Date: Wed, 18 Sep 2024 10:43:15 +0200 Subject: [PATCH 53/55] test strategy: fixed build --- src/lib/api/basyx-v3/apiInterface.ts | 4 ++-- src/lib/services/searchUtilActions/AasSearcher.ts | 1 - 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/lib/api/basyx-v3/apiInterface.ts b/src/lib/api/basyx-v3/apiInterface.ts index 0333893..e8678c6 100644 --- a/src/lib/api/basyx-v3/apiInterface.ts +++ b/src/lib/api/basyx-v3/apiInterface.ts @@ -18,7 +18,7 @@ export interface IAssetAdministrationShellRepositoryApi { /** * - * @summary Retrieves all Submodels from the Asset Administration Shell + * @summary Retrieves all Submodel References from the Asset Administration Shell * @param {string} aasId The Asset Administration Shell's unique id * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -64,4 +64,4 @@ export interface ISubmodelRepositoryApi { * @memberof SubmodelRepositoryApi */ getAttachmentFromSubmodelElement(submodelId: string, submodelElementPath: string, options?: object): Promise; -} \ No newline at end of file +} diff --git a/src/lib/services/searchUtilActions/AasSearcher.ts b/src/lib/services/searchUtilActions/AasSearcher.ts index a01a0d9..d4902ce 100644 --- a/src/lib/services/searchUtilActions/AasSearcher.ts +++ b/src/lib/services/searchUtilActions/AasSearcher.ts @@ -80,7 +80,6 @@ export class AasSearcher { DiscoveryServiceApi.createNull({ discoveryEntries: discoveryEntries }), RegistryServiceApi.createNull({ registryShellDescriptorEntries }), MultipleRepositorySearchService.createNull({ - shellsByRegistryEndpoint, shellsSavedInTheRepositories: shellsSavedInTheRepositories, submodelsSavedInTheRepository, }), From da26de62d2abf6c8928b72adde395650b4af1bf6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Frederik=20Schl=C3=BCter?= Date: Wed, 18 Sep 2024 10:47:07 +0200 Subject: [PATCH 54/55] test strategy: refactor --- src/app/[locale]/viewer/[base64AasId]/page.tsx | 2 +- src/app/[locale]/viewer/_components/AASOverviewCard.tsx | 2 +- src/app/[locale]/viewer/_components/SubmodelsOverviewCard.tsx | 2 +- .../viewer/discovery/_components/DiscoveryListView.tsx | 4 ++-- .../MultipleRepositorySearchActions.ts} | 2 +- .../MultipleRepositorySearchService.ts | 0 src/lib/services/searchUtilActions/AasSearcher.ts | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) rename src/lib/services/{multipleDataSourceActions/multipleDataSourceActions.ts => MultipleRepositorySearch/MultipleRepositorySearchActions.ts} (91%) rename src/lib/services/{multipleDataSourceActions => MultipleRepositorySearch}/MultipleRepositorySearchService.ts (100%) diff --git a/src/app/[locale]/viewer/[base64AasId]/page.tsx b/src/app/[locale]/viewer/[base64AasId]/page.tsx index 832b1f9..72d638a 100644 --- a/src/app/[locale]/viewer/[base64AasId]/page.tsx +++ b/src/app/[locale]/viewer/[base64AasId]/page.tsx @@ -19,7 +19,7 @@ import { useApis } from 'components/azureAuthentication/ApiProvider'; import { useEnv } from 'app/env/provider'; import { useAsyncEffect } from 'lib/hooks/UseAsyncEffect'; import { performRegistryAasSearch } from 'lib/services/searchUtilActions/searchActions'; -import { performSearchAasFromAllRepositories } from 'lib/services/multipleDataSourceActions/multipleDataSourceActions'; +import { performSearchAasFromAllRepositories } from 'lib/services/MultipleRepositorySearch/MultipleRepositorySearchActions'; export default function Page() { const navigate = useRouter(); diff --git a/src/app/[locale]/viewer/_components/AASOverviewCard.tsx b/src/app/[locale]/viewer/_components/AASOverviewCard.tsx index a392123..e30280a 100644 --- a/src/app/[locale]/viewer/_components/AASOverviewCard.tsx +++ b/src/app/[locale]/viewer/_components/AASOverviewCard.tsx @@ -25,7 +25,7 @@ import { useRouter } from 'next/navigation'; import { useApis } from 'components/azureAuthentication/ApiProvider'; import { useRegistryAasState } from 'components/contexts/CurrentAasContext'; import { AssetAdministrationShellRepositoryApi } from 'lib/api/basyx-v3/api'; -import { performgetAasThumbnailFromAllRepos } from 'lib/services/multipleDataSourceActions/multipleDataSourceActions'; +import { performgetAasThumbnailFromAllRepos } from 'lib/services/MultipleRepositorySearch/MultipleRepositorySearchActions'; type AASOverviewCardProps = { readonly aas: AssetAdministrationShell | null; diff --git a/src/app/[locale]/viewer/_components/SubmodelsOverviewCard.tsx b/src/app/[locale]/viewer/_components/SubmodelsOverviewCard.tsx index 6a9e747..88dd030 100644 --- a/src/app/[locale]/viewer/_components/SubmodelsOverviewCard.tsx +++ b/src/app/[locale]/viewer/_components/SubmodelsOverviewCard.tsx @@ -15,7 +15,7 @@ import { getSubmodelFromSubmodelDescriptor } from 'lib/services/searchUtilAction import { useEnv } from 'app/env/provider'; import { useNotificationSpawner } from 'lib/hooks/UseNotificationSpawner'; import { showError } from 'lib/util/ErrorHandlerUtil'; -import { performSearchSubmodelFromAllRepos } from 'lib/services/multipleDataSourceActions/multipleDataSourceActions'; +import { performSearchSubmodelFromAllRepos } from 'lib/services/MultipleRepositorySearch/MultipleRepositorySearchActions'; export type SubmodelsOverviewCardProps = { readonly smReferences?: Reference[]; readonly isLoading?: boolean }; diff --git a/src/app/[locale]/viewer/discovery/_components/DiscoveryListView.tsx b/src/app/[locale]/viewer/discovery/_components/DiscoveryListView.tsx index 571c016..0a7d0ca 100644 --- a/src/app/[locale]/viewer/discovery/_components/DiscoveryListView.tsx +++ b/src/app/[locale]/viewer/discovery/_components/DiscoveryListView.tsx @@ -15,8 +15,8 @@ import { useEnv } from 'app/env/provider'; import { encodeBase64 } from 'lib/util/Base64Util'; import ListHeader from 'components/basics/ListHeader'; import { performDiscoveryAasSearch, performRegistryAasSearch } from 'lib/services/searchUtilActions/searchActions'; -import { performSearchAasFromAllRepositories } from 'lib/services/multipleDataSourceActions/multipleDataSourceActions'; -import { RepoSearchResult } from 'lib/services/multipleDataSourceActions/MultipleRepositorySearchService'; +import { performSearchAasFromAllRepositories } from 'lib/services/MultipleRepositorySearch/MultipleRepositorySearchActions'; +import { RepoSearchResult } from 'lib/services/MultipleRepositorySearch/MultipleRepositorySearchService'; export const DiscoveryListView = () => { const [isLoadingList, setIsLoadingList] = useState(false); diff --git a/src/lib/services/multipleDataSourceActions/multipleDataSourceActions.ts b/src/lib/services/MultipleRepositorySearch/MultipleRepositorySearchActions.ts similarity index 91% rename from src/lib/services/multipleDataSourceActions/multipleDataSourceActions.ts rename to src/lib/services/MultipleRepositorySearch/MultipleRepositorySearchActions.ts index 058eca2..d8be584 100644 --- a/src/lib/services/multipleDataSourceActions/multipleDataSourceActions.ts +++ b/src/lib/services/MultipleRepositorySearch/MultipleRepositorySearchActions.ts @@ -2,7 +2,7 @@ import { Submodel } from '@aas-core-works/aas-core3.0-typescript/dist/types/type import { MultipleRepositorySearchService, RepoSearchResult, -} from 'lib/services/multipleDataSourceActions/MultipleRepositorySearchService'; +} from 'lib/services/MultipleRepositorySearch/MultipleRepositorySearchService'; export async function performSearchAasFromAllRepositories(searchInput: string): Promise { const searcher = MultipleRepositorySearchService.create(); diff --git a/src/lib/services/multipleDataSourceActions/MultipleRepositorySearchService.ts b/src/lib/services/MultipleRepositorySearch/MultipleRepositorySearchService.ts similarity index 100% rename from src/lib/services/multipleDataSourceActions/MultipleRepositorySearchService.ts rename to src/lib/services/MultipleRepositorySearch/MultipleRepositorySearchService.ts diff --git a/src/lib/services/searchUtilActions/AasSearcher.ts b/src/lib/services/searchUtilActions/AasSearcher.ts index d4902ce..df38338 100644 --- a/src/lib/services/searchUtilActions/AasSearcher.ts +++ b/src/lib/services/searchUtilActions/AasSearcher.ts @@ -15,7 +15,7 @@ import { NotFoundError } from 'lib/errors/NotFoundError'; import { MultipleRepositorySearchService, NullableMultipleDataSourceSetupParameters, -} from 'lib/services/multipleDataSourceActions/MultipleRepositorySearchService'; +} from 'lib/services/MultipleRepositorySearch/MultipleRepositorySearchService'; import { INullableAasRepositoryEntries } from 'lib/api/basyx-v3/apiInMemory'; import { mnestixFetch } from 'lib/api/infrastructure'; From a1b2aab3c0bfe55ef76aec3c394f32f7c87cd178 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Frederik=20Schl=C3=BCter?= Date: Wed, 18 Sep 2024 11:29:44 +0200 Subject: [PATCH 55/55] test strategy: responded to hidden comments --- .../mnestix-connections/MnestixConnectionsCard.tsx | 2 +- .../discovery-service-api/discoveryServiceApiInMemory.ts | 2 -- .../MnestixConnectionServerActions.ts | 5 +---- .../MultipleRepositorySearchService.ts | 6 +++--- .../services/MultipleRepositorySearch}/PrismaConnector.ts | 4 ++-- .../MultipleRepositorySearch}/PrismaConnectorInMemory.ts | 4 ++-- .../MultipleRepositorySearch}/PrismaConnectorInterface.ts | 2 +- src/lib/services/searchUtilActions/AasSearcher.spec.ts | 2 +- 8 files changed, 11 insertions(+), 16 deletions(-) rename src/{app/[locale]/settings/_components/mnestix-connections => lib/services/MultipleRepositorySearch}/MnestixConnectionServerActions.ts (82%) rename src/{app/[locale]/settings/_components/mnestix-connections => lib/services/MultipleRepositorySearch}/PrismaConnector.ts (90%) rename src/{app/[locale]/settings/_components/mnestix-connections => lib/services/MultipleRepositorySearch}/PrismaConnectorInMemory.ts (75%) rename src/{app/[locale]/settings/_components/mnestix-connections => lib/services/MultipleRepositorySearch}/PrismaConnectorInterface.ts (72%) diff --git a/src/app/[locale]/settings/_components/mnestix-connections/MnestixConnectionsCard.tsx b/src/app/[locale]/settings/_components/mnestix-connections/MnestixConnectionsCard.tsx index d8f8dec..7c49405 100644 --- a/src/app/[locale]/settings/_components/mnestix-connections/MnestixConnectionsCard.tsx +++ b/src/app/[locale]/settings/_components/mnestix-connections/MnestixConnectionsCard.tsx @@ -6,7 +6,7 @@ import { useNotificationSpawner } from 'lib/hooks/UseNotificationSpawner'; import { getConnectionDataAction, upsertConnectionDataAction, -} from 'app/[locale]/settings/_components/mnestix-connections/MnestixConnectionServerActions'; +} from 'lib/services/MultipleRepositorySearch/MnestixConnectionServerActions'; import { useForm } from 'react-hook-form'; import { useEnv } from 'app/env/provider'; import { SettingsCardHeader } from 'app/[locale]/settings/_components/SettingsCardHeader'; diff --git a/src/lib/api/discovery-service-api/discoveryServiceApiInMemory.ts b/src/lib/api/discovery-service-api/discoveryServiceApiInMemory.ts index 19df5cb..8ee6a69 100644 --- a/src/lib/api/discovery-service-api/discoveryServiceApiInMemory.ts +++ b/src/lib/api/discovery-service-api/discoveryServiceApiInMemory.ts @@ -27,8 +27,6 @@ export class DiscoveryServiceApiInMemory implements IDiscoveryServiceApi { } getAllAssetAdministrationShellIdsByAssetLink(_assetIds: { name: string; value: string }[]): Promise<{ - // const registryService = new ; - // const repositoryClient = new ; paging_metadata: string; result: string[]; }> { diff --git a/src/app/[locale]/settings/_components/mnestix-connections/MnestixConnectionServerActions.ts b/src/lib/services/MultipleRepositorySearch/MnestixConnectionServerActions.ts similarity index 82% rename from src/app/[locale]/settings/_components/mnestix-connections/MnestixConnectionServerActions.ts rename to src/lib/services/MultipleRepositorySearch/MnestixConnectionServerActions.ts index 3ba2e79..754ca83 100644 --- a/src/app/[locale]/settings/_components/mnestix-connections/MnestixConnectionServerActions.ts +++ b/src/lib/services/MultipleRepositorySearch/MnestixConnectionServerActions.ts @@ -1,10 +1,7 @@ 'use server'; import { ConnectionType } from '@prisma/client'; -import { - DataSourceFormData, - PrismaConnector, -} from 'app/[locale]/settings/_components/mnestix-connections/PrismaConnector'; +import { DataSourceFormData, PrismaConnector } from 'lib/services/MultipleRepositorySearch/PrismaConnector'; export async function getConnectionDataAction() { const prismaConnector = PrismaConnector.create(); diff --git a/src/lib/services/MultipleRepositorySearch/MultipleRepositorySearchService.ts b/src/lib/services/MultipleRepositorySearch/MultipleRepositorySearchService.ts index ea79dac..0a55692 100644 --- a/src/lib/services/MultipleRepositorySearch/MultipleRepositorySearchService.ts +++ b/src/lib/services/MultipleRepositorySearch/MultipleRepositorySearchService.ts @@ -4,8 +4,8 @@ import { AssetAdministrationShellRepositoryApi, SubmodelRepositoryApi } from 'li import { mnestixFetch } from 'lib/api/infrastructure'; import { AssetAdministrationShell, Submodel } from '@aas-core-works/aas-core3.0-typescript/dist/types/types'; import { INullableAasRepositoryEntries } from 'lib/api/basyx-v3/apiInMemory'; -import { PrismaConnector } from 'app/[locale]/settings/_components/mnestix-connections/PrismaConnector'; -import { IPrismaConnector } from 'app/[locale]/settings/_components/mnestix-connections/PrismaConnectorInterface'; +import { PrismaConnector } from 'lib/services/MultipleRepositorySearch/PrismaConnector'; +import { IPrismaConnector } from 'lib/services/MultipleRepositorySearch/PrismaConnectorInterface'; export type RepoSearchResult = { aas: AssetAdministrationShell; @@ -32,7 +32,7 @@ export class MultipleRepositorySearchService { fetch: mnestixFetch(), }); const submodelRepositoryClient = SubmodelRepositoryApi.create({ - basePath: process.env.SUBMODEL_REPO_API_URL, + basePath: process.env.SUBMODEL_REPO_API_URL ?? process.env.AAS_REPO_API_URL, fetch: mnestixFetch(), }); const log = Log.create(); diff --git a/src/app/[locale]/settings/_components/mnestix-connections/PrismaConnector.ts b/src/lib/services/MultipleRepositorySearch/PrismaConnector.ts similarity index 90% rename from src/app/[locale]/settings/_components/mnestix-connections/PrismaConnector.ts rename to src/lib/services/MultipleRepositorySearch/PrismaConnector.ts index f3c9be8..8dfb693 100644 --- a/src/app/[locale]/settings/_components/mnestix-connections/PrismaConnector.ts +++ b/src/lib/services/MultipleRepositorySearch/PrismaConnector.ts @@ -1,7 +1,7 @@ import { prisma } from 'lib/database/prisma'; import { ConnectionType } from '@prisma/client'; -import { IPrismaConnector } from 'app/[locale]/settings/_components/mnestix-connections/PrismaConnectorInterface'; -import { PrismaConnectorInMemory } from 'app/[locale]/settings/_components/mnestix-connections/PrismaConnectorInMemory'; +import { IPrismaConnector } from 'lib/services/MultipleRepositorySearch/PrismaConnectorInterface'; +import { PrismaConnectorInMemory } from 'lib/services/MultipleRepositorySearch/PrismaConnectorInMemory'; export type DataSourceFormData = { id: string; diff --git a/src/app/[locale]/settings/_components/mnestix-connections/PrismaConnectorInMemory.ts b/src/lib/services/MultipleRepositorySearch/PrismaConnectorInMemory.ts similarity index 75% rename from src/app/[locale]/settings/_components/mnestix-connections/PrismaConnectorInMemory.ts rename to src/lib/services/MultipleRepositorySearch/PrismaConnectorInMemory.ts index ed3897a..85ff3c6 100644 --- a/src/app/[locale]/settings/_components/mnestix-connections/PrismaConnectorInMemory.ts +++ b/src/lib/services/MultipleRepositorySearch/PrismaConnectorInMemory.ts @@ -1,5 +1,5 @@ -import { IPrismaConnector } from 'app/[locale]/settings/_components/mnestix-connections/PrismaConnectorInterface'; -import { DataSourceFormData } from 'app/[locale]/settings/_components/mnestix-connections/PrismaConnector'; +import { IPrismaConnector } from 'lib/services/MultipleRepositorySearch/PrismaConnectorInterface'; +import { DataSourceFormData } from 'lib/services/MultipleRepositorySearch/PrismaConnector'; export class PrismaConnectorInMemory implements IPrismaConnector { constructor(protected connectionData: string[]) {} diff --git a/src/app/[locale]/settings/_components/mnestix-connections/PrismaConnectorInterface.ts b/src/lib/services/MultipleRepositorySearch/PrismaConnectorInterface.ts similarity index 72% rename from src/app/[locale]/settings/_components/mnestix-connections/PrismaConnectorInterface.ts rename to src/lib/services/MultipleRepositorySearch/PrismaConnectorInterface.ts index 0f10309..1ab0692 100644 --- a/src/app/[locale]/settings/_components/mnestix-connections/PrismaConnectorInterface.ts +++ b/src/lib/services/MultipleRepositorySearch/PrismaConnectorInterface.ts @@ -1,5 +1,5 @@ import { ConnectionType } from '@prisma/client'; -import { DataSourceFormData } from 'app/[locale]/settings/_components/mnestix-connections/PrismaConnector'; +import { DataSourceFormData } from 'lib/services/MultipleRepositorySearch/PrismaConnector'; export interface IPrismaConnector { getConnectionData(): unknown; diff --git a/src/lib/services/searchUtilActions/AasSearcher.spec.ts b/src/lib/services/searchUtilActions/AasSearcher.spec.ts index 8581a36..1d95871 100644 --- a/src/lib/services/searchUtilActions/AasSearcher.spec.ts +++ b/src/lib/services/searchUtilActions/AasSearcher.spec.ts @@ -61,7 +61,7 @@ describe('Full Aas Search happy paths', () => { expect(result.redirectUrl).toBe('/viewer/' + encodeBase64(aasId)); }); - it('returns details of aas when exactly when discovery returns nothing and the aas is registered in the registry', async () => { + it('returns details of aas when discovery returns nothing and the aas is registered in the registry', async () => { const aasId = 'dummy aasId'; const searchString = aasId; const searcher = AasSearcher.createNull({