diff --git a/.eslintrc.js b/.eslintrc.js index e412de9a..ff2df746 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/.gitignore b/.gitignore index a59c5970..726ee84c 100644 --- a/.gitignore +++ b/.gitignore @@ -8,5 +8,5 @@ cypress-artifacts .env /cypress/videos/ /cypress/screenshots/ -/cypress/results/* /prisma/mnestix-database.db +/cypress/results/* diff --git a/compose.yml b/compose.yml index 5454810f..7767a043 100644 --- a/compose.yml +++ b/compose.yml @@ -2,7 +2,7 @@ networks: mnestix-network: driver: bridge name: mnestix-network - + volumes: mnestix-database: @@ -10,19 +10,19 @@ services: mnestix-browser: container_name: mnestix-browser image: mnestix/mnestix-browser:latest - profiles: ["", "frontend", "tests"] + profiles: [ "", "frontend", "tests" ] build: dockerfile: Dockerfile target: production ports: - '3000:3000' environment: - REGISTRY_API_URL: 'https://localhost:8083/' # 'https://registry.dpp40-2-v2.industrialdigitaltwin.org/' - SUBMODEL_REGISTRY_API_URL: 'http://localhost:8084' - DISCOVERY_API_URL: 'http://localhost:5064/discovery' - AAS_REPO_API_URL: 'http://localhost:5064/repo' - SUBMODEL_REPO_API_URL: 'http://localhost:5064/repo' - MNESTIX_BACKEND_API_URL: 'http://localhost:5064' + REGISTRY_API_URL: 'https://aas-registry:8083/' # 'https://registry.dpp40-2-v2.industrialdigitaltwin.org/' + SUBMODEL_REGISTRY_API_URL: 'http://submodel-registry:8084' + 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' + MNESTIX_BACKEND_API_URL: 'http://mnestix-api:5064' AAS_LIST_FEATURE_FLAG: "true" COMPARISON_FEATURE_FLAG: "true" AUTHENTICATION_FEATURE_FLAG: "false" @@ -39,7 +39,7 @@ services: mnestix-api: image: mnestix/mnestix-api:1.2.0 container_name: mnestix-api - profiles: ["", "backend", "tests"] + profiles: [ "", "backend", "tests" ] ports: - '5064:5064' environment: @@ -79,7 +79,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 +100,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 +132,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 +160,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 +180,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/cypress.config.ts b/cypress.config.ts index 7e53f80a..63e79e77 100644 --- a/cypress.config.ts +++ b/cypress.config.ts @@ -1,6 +1,10 @@ import { defineConfig } from 'cypress'; export default defineConfig({ + defaultCommandTimeout: 150000, // 150 + pageLoadTimeout: 600000, // 600 + requestTimeout: 150000, // 150 + responseTimeout: 200000, // 200 video: true, videoCompression: true, retries: 2, @@ -13,6 +17,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/compareViewTest.spec.js b/cypress/e2e/compareViewTest.spec.js index 07386833..06826d32 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'); @@ -49,6 +50,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); @@ -74,6 +76,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); @@ -104,11 +107,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/dnsRedirectTest.spec.js b/cypress/e2e/dnsRedirectTest.spec.js index dd92e483..506504e0 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); diff --git a/cypress/e2e/listAasPageComparisonTest.spec.js b/cypress/e2e/listAasPageComparisonTest.spec.js index d38d66f2..4949663e 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,13 +14,13 @@ 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.getByTestId('compare-button').click(); - cy.wait(100); cy.url().should('contain', '/compare'); + cy.wait(60000); + 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'); diff --git a/cypress/support/commands.ts b/cypress/support/commands.ts index b5163138..9560b7bb 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) => { diff --git a/jest.config.ts b/jest.config.ts new file mode 100644 index 00000000..e5ffe100 --- /dev/null +++ b/jest.config.ts @@ -0,0 +1,10 @@ +export {}; +module.exports = { + moduleDirectories: ['node_modules', 'src'], + transform: { + '^.+\\.(t|j)sx?$': '@swc/jest', + }, + preset: 'ts-jest', + testEnvironment: 'node', + testMatch: ['**/__tests__/**/*.ts', '**/?(*.)+(spec|test).ts'], +}; diff --git a/jest.setup.ts b/jest.setup.ts new file mode 100644 index 00000000..c44951a6 --- /dev/null +++ b/jest.setup.ts @@ -0,0 +1 @@ +import '@testing-library/jest-dom' diff --git a/package.json b/package.json index 92efa37b..002736ad 100644 --- a/package.json +++ b/package.json @@ -7,10 +7,16 @@ "@babel/plugin-proposal-private-property-in-object": "^7.21.11", "@eslint/js": "^9.2.0", "@next/eslint-plugin-next": "^14.2.3", + "@swc/core": "^1.7.23", + "@swc/jest": "^0.2.36", + "@testing-library/dom": "^10.4.0", + "@testing-library/jest-dom": "^6.5.0", + "@testing-library/react": "^16.0.1", + "@testing-library/user-event": "^14.5.2", "@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", @@ -24,9 +30,14 @@ "eslint-plugin-react": "^7.34.1", "eslint-plugin-react-hooks": "^4.6.0", "globals": "^15.1.0", + "jest": "^29.7.0", + "jest-environment-jsdom": "^29.7.0", "lodash": "^4.17.21", "prettier": "^3.2.5", "prisma": "^5.18.0", + "ts-jest": "^29.2.5", + "ts-mockito": "^2.6.1", + "ts-node": "^10.9.2", "typescript-eslint": "^7.8.0" }, "dependencies": { diff --git a/src/app/[locale]/_components/DashboardInput.tsx b/src/app/[locale]/_components/DashboardInput.tsx index 2a6ce49b..1624a9ac 100644 --- a/src/app/[locale]/_components/DashboardInput.tsx +++ b/src/app/[locale]/_components/DashboardInput.tsx @@ -4,21 +4,19 @@ 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 { useRouter } from 'next/navigation'; import { useAasState, useRegistryAasState } from 'components/contexts/CurrentAasContext'; import { LocalizedError } from 'lib/util/LocalizedError'; -import { useApis } from 'components/azureAuthentication/ApiProvider'; +import { performFullAasSearch } from 'lib/services/searchUtilActions/searchActions'; 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 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 917f6a4c..dd861cd3 100644 --- a/src/app/[locale]/compare/_components/CompareView.tsx +++ b/src/app/[locale]/compare/_components/CompareView.tsx @@ -11,9 +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/searchUtilActions/searchClient'; import { LocalizedError } from 'lib/util/LocalizedError'; -import { useApis } from 'components/azureAuthentication/ApiProvider'; +import { performFullAasSearch } from 'lib/services/searchUtilActions/searchActions'; +import { AasSearchResult } from 'lib/services/searchUtilActions/AasSearcher'; export function CompareView() { const { compareAas, addSeveralAas, deleteAas, addAas } = useCompareAasContext(); @@ -25,8 +25,6 @@ export function CompareView() { }); const [addModalOpen, setAddModalOpen] = useState(false); - const { repositoryClient } = useApis(); - useEffect(() => { async function _fetchAas() { try { @@ -61,7 +59,7 @@ export function CompareView() { const handleAddAas = async (aasId: string) => { let aasSearch: AasSearchResult; try { - aasSearch = await handleSearchForAas(aasId, repositoryClient); + aasSearch = await performFullAasSearch(aasId); } catch (e) { throw new LocalizedError(messages.mnestix.aasUrlNotFound); } 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 e7df1458..00000000 --- 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/MnestixConnectionsCard.tsx b/src/app/[locale]/settings/_components/mnestix-connections/MnestixConnectionsCard.tsx index d8f8dece..7c494050 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/app/[locale]/viewer/[base64AasId]/page.tsx b/src/app/[locale]/viewer/[base64AasId]/page.tsx index 0e7b7388..72d638a3 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 { handleAasRegistrySearch } from 'lib/searchUtilActions/searchServer'; -import { getAasFromAllAasRepos } from 'lib/searchUtilActions/SearchRepositoryHelper'; import { useAsyncEffect } from 'lib/hooks/UseAsyncEffect'; +import { performRegistryAasSearch } from 'lib/services/searchUtilActions/searchActions'; +import { performSearchAasFromAllRepositories } from 'lib/services/MultipleRepositorySearch/MultipleRepositorySearchActions'; export default function Page() { const navigate = useRouter(); @@ -55,7 +55,7 @@ export default function Page() { try { const aasIdDecoded = safeBase64Decode(base64AasId); - const registrySearchResult = await handleAasRegistrySearch(aasIdDecoded); + const registrySearchResult = await performRegistryAasSearch(aasIdDecoded); if (registrySearchResult) { setAas(registrySearchResult.registryAas as AssetAdministrationShell); @@ -73,11 +73,11 @@ export default function Page() { repoUrl, ); } catch (e) { - const repoSearchResults = await getAasFromAllAasRepos(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 449e1ac1..e30280a7 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 { getAasThumbnailFromAllAasRepos } from 'lib/searchUtilActions/SearchRepositoryHelper'; +import { performgetAasThumbnailFromAllRepos } from 'lib/services/MultipleRepositorySearch/MultipleRepositorySearchActions'; type AASOverviewCardProps = { readonly aas: AssetAdministrationShell | null; @@ -78,7 +78,7 @@ export function AASOverviewCard(props: AASOverviewCardProps) { try { let image: Blob; if (registryAasData) { - const registryRepository = new AssetAdministrationShellRepositoryApi({ + const registryRepository = AssetAdministrationShellRepositoryApi.create({ basePath: registryAasData.aasRegistryRepositoryOrigin, }); image = await registryRepository.getThumbnailFromShell(props.aas.id); @@ -87,7 +87,7 @@ export function AASOverviewCard(props: AASOverviewCardProps) { try { image = await repositoryClient.getThumbnailFromShell(props.aas.id); } catch (e) { - image = await getAasThumbnailFromAllAasRepos(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 43da053e..88dd0303 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/searchActions'; import { useEnv } from 'app/env/provider'; -import { getSubmodelFromAllSubmodelRepos } from 'lib/searchUtilActions/SearchRepositoryHelper'; import { useNotificationSpawner } from 'lib/hooks/UseNotificationSpawner'; import { showError } from 'lib/util/ErrorHandlerUtil'; +import { performSearchSubmodelFromAllRepos } from 'lib/services/MultipleRepositorySearch/MultipleRepositorySearchActions'; 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 getSubmodelFromAllSubmodelRepos(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 bf9faa4b..0a7d0ca5 100644 --- a/src/app/[locale]/viewer/discovery/_components/DiscoveryListView.tsx +++ b/src/app/[locale]/viewer/discovery/_components/DiscoveryListView.tsx @@ -7,16 +7,16 @@ import { useState } from 'react'; import DiscoveryList from 'app/[locale]/viewer/discovery/_components/DiscoveryList'; import { useSearchParams } from 'next/navigation'; import { Typography } from '@mui/material'; -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'; import { isAasAvailableInRepo } from 'lib/util/checkAasAvailabilityUtil'; import { useEnv } from 'app/env/provider'; -import { getAasFromAllAasRepos, 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/services/searchUtilActions/searchActions'; +import { performSearchAasFromAllRepositories } from 'lib/services/MultipleRepositorySearch/MultipleRepositorySearchActions'; +import { RepoSearchResult } from 'lib/services/MultipleRepositorySearch/MultipleRepositorySearchService'; export const DiscoveryListView = () => { const [isLoadingList, setIsLoadingList] = useState(false); @@ -28,7 +28,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 () => { @@ -36,12 +35,17 @@ export const DiscoveryListView = () => { const entryList: IDiscoveryListEntry[] = []; if (assetId) { - const aasIds = await handleAasDiscoverySearch(assetId); + const aasIds = await performDiscoveryAasSearch(assetId); + + if (!aasIds || aasIds.length === 0) { + setIsLoadingList(false); + return; + } await Promise.all( aasIds.map(async (aasId) => { try { - const registrySearchResult = await handleAasRegistrySearch(aasId); + const registrySearchResult = await performRegistryAasSearch(aasId); let aasRepositoryUrl = registrySearchResult?.registryAasData?.aasRegistryRepositoryOrigin; if (!aasRepositoryUrl) { @@ -66,7 +70,7 @@ export const DiscoveryListView = () => { } else if (aasId) { let searchResults: RepoSearchResult[] = []; try { - searchResults = await getAasFromAllAasRepos(encodeBase64(aasId), repositoryClient); + searchResults = await performSearchAasFromAllRepositories(encodeBase64(aasId)); } catch (e) { setIsError(true); } diff --git a/src/components/azureAuthentication/ApiProvider.tsx b/src/components/azureAuthentication/ApiProvider.tsx index 51e563b2..70084d24 100644 --- a/src/components/azureAuthentication/ApiProvider.tsx +++ b/src/components/azureAuthentication/ApiProvider.tsx @@ -10,32 +10,35 @@ import { TemplateShellApi } from 'lib/api/template-shell-api/templateShellApi'; import { DiscoveryServiceApi } from 'lib/api/discovery-service-api/discoveryServiceApi'; import { RegistryServiceApi } from 'lib/api/registry-service-api/registryServiceApi'; import { SubmodelRegistryServiceApi } from 'lib/api/submodel-registry-service/submodelRegistryServiceApi'; +import { IRegistryServiceApi } from 'lib/api/registry-service-api/registryServiceApiInterface'; 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, + mnestixFetch(), ), - 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() }), - discoveryServiceClient: new DiscoveryServiceApi(env.DISCOVERY_API_URL), - registryServiceClient: new RegistryServiceApi(env.REGISTRY_API_URL), - submodelRegistryServiceClient: new SubmodelRegistryServiceApi(env.SUBMODEL_REGISTRY_API_URL), + 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, mnestixFetch()), + registryServiceClient: RegistryServiceApi.create(env.REGISTRY_API_URL, mnestixFetch()), + submodelRegistryServiceClient: new SubmodelRegistryServiceApi(env.SUBMODEL_REGISTRY_API_URL, mnestixFetch()), }; return {props.children}; @@ -57,6 +60,6 @@ export type Apis = { templatesClient: TemplateShellApi; submodelClient: SubmodelRepositoryApi; discoveryServiceClient: DiscoveryServiceApi; - registryServiceClient: RegistryServiceApi; + registryServiceClient: IRegistryServiceApi; submodelRegistryServiceClient: SubmodelRegistryServiceApi; }; diff --git a/src/components/contexts/CompareAasContext.tsx b/src/components/contexts/CompareAasContext.tsx index 41c393d3..dda4581d 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, handleAasRegistrySearch } from 'lib/searchUtilActions/searchServer'; +import { + getSubmodelFromSubmodelDescriptor, + performRegistryAasSearch, +} from 'lib/services/searchUtilActions/searchActions'; import { SubmodelDescriptor } from 'lib/types/registryServiceTypes'; type CompareAasContextType = { @@ -73,7 +76,7 @@ export const CompareAasContextProvider = (props: PropsWithChildren) => { let compareDataTemp: SubmodelCompareData[] = []; for (const aasId of input as string[]) { let shell; - const registrySearchResult = await handleAasRegistrySearch(aasId); + const registrySearchResult = await performRegistryAasSearch(aasId); if (registrySearchResult != null) { shell = registrySearchResult.registryAas as AssetAdministrationShell; } else { diff --git a/src/lib/api/basyx-v3/api.ts b/src/lib/api/basyx-v3/api.ts index 19e47ae6..567561ab 100644 --- a/src/lib/api/basyx-v3/api.ts +++ b/src/lib/api/basyx-v3/api.ts @@ -4,6 +4,12 @@ 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, ISubmodelRepositoryApi } from 'lib/api/basyx-v3/apiInterface'; +import { + AssetAdministrationShellRepositoryApiInMemory, + INullableAasRepositoryEntries, + SubmodelRepositoryApiInMemory +} from 'lib/api/basyx-v3/apiInMemory'; const BASE_PATH = '/'.replace(/\/+$/, ''); @@ -15,6 +21,7 @@ const BASE_PATH = '/'.replace(/\/+$/, ''); export type FetchAPI = { fetch: (url: RequestInfo, init?: RequestInit) => Promise; }; + /** * * @export @@ -68,7 +75,25 @@ export class RequiredError extends Error { * @class AssetAdministrationShellRepositoryApi * @extends {BaseAPI} */ -export class AssetAdministrationShellRepositoryApi extends BaseAPI { +export class AssetAdministrationShellRepositoryApi extends BaseAPI implements IAssetAdministrationShellRepositoryApi { + private constructor(configuration?: Configuration | undefined, basePath?: string, fetch?: FetchAPI) { + super(configuration, basePath, fetch); + } + + static create( + configuration?: Configuration | undefined, + basePath?: string, + fetch?: FetchAPI, + ): AssetAdministrationShellRepositoryApi { + return new AssetAdministrationShellRepositoryApi(configuration, basePath, fetch); + } + + static createNull(options: { + shellsSavedInTheRepositories: INullableAasRepositoryEntries[] | null; + }): AssetAdministrationShellRepositoryApiInMemory { + return new AssetAdministrationShellRepositoryApiInMemory(options); + } + /** * @summary Retrieves a specific Asset Administration Shell from the Asset Administration Shell repository * @param {string} aasId The Asset Administration Shell's unique id @@ -77,7 +102,7 @@ export class AssetAdministrationShellRepositoryApi extends BaseAPI { * @throws {RequiredError} * @memberof AssetAdministrationShellRepositoryApi */ - public getAssetAdministrationShellById(aasId: string, options?: any, basePath?: string) { + getAssetAdministrationShellById(aasId: string, options?: any, basePath?: string) { return AssetAdministrationShellRepositoryApiFp(this.configuration).getAssetAdministrationShellById( aasId, options, @@ -92,7 +117,7 @@ export class AssetAdministrationShellRepositoryApi extends BaseAPI { * @throws {RequiredError} * @memberof AssetAdministrationShellRepositoryApi */ - public getSubmodelReferencesFromShell(aasId: string, options?: any) { + getSubmodelReferencesFromShell(aasId: string, options?: any) { return AssetAdministrationShellRepositoryApiFp(this.configuration).getSubmodelReferencesFromShell( aasId, options, @@ -106,7 +131,7 @@ export class AssetAdministrationShellRepositoryApi extends BaseAPI { * @param {string} [basePath] The URL for the current repository endpoint. * @returns The thumbnail retrieved from the Asset Administration Shell. */ - public getThumbnailFromShell(aasId: string, options?: any, basePath?: string) { + getThumbnailFromShell(aasId: string, options?: any, basePath?: string) { return AssetAdministrationShellRepositoryApiFp(this.configuration).getThumbnailFromAssetInformation( aasId, options, @@ -135,7 +160,10 @@ export const AssetAdministrationShellRepositoryApiFp = function (configuration?: configuration, ).getAssetAdministrationShellById(aasId, options); return async (requestHandler: FetchAPI = isomorphicFetch, basePath: string = BASE_PATH) => { - const response = await requestHandler.fetch(basePath + localVarFetchArgs.url, localVarFetchArgs.options); + const response = await requestHandler.fetch( + basePath + localVarFetchArgs.url, + localVarFetchArgs.options, + ); if (response.status >= 200 && response.status < 300) { return response.json(); } else { @@ -158,7 +186,10 @@ export const AssetAdministrationShellRepositoryApiFp = function (configuration?: configuration, ).getSubmodelReferencesFromShell(aasId, options); return async (requestHandler: FetchAPI = isomorphicFetch, basePath: string = BASE_PATH) => { - const response = await requestHandler.fetch(basePath + localVarFetchArgs.url, localVarFetchArgs.options); + const response = await requestHandler.fetch( + basePath + localVarFetchArgs.url, + localVarFetchArgs.options, + ); if (response.status >= 200 && response.status < 300) { return response.json().then((resp) => { return resp.result as Reference[]; @@ -183,7 +214,10 @@ export const AssetAdministrationShellRepositoryApiFp = function (configuration?: configuration, ).getThumbnailFromAssetInformation(aasId, options); return async (requestHandler: FetchAPI = isomorphicFetch, basePath: string = BASE_PATH) => { - const response = await requestHandler.fetch(basePath + localVarFetchArgs.url, localVarFetchArgs.options); + const response = await requestHandler.fetch( + basePath + localVarFetchArgs.url, + localVarFetchArgs.options, + ); if (response.status >= 200 && response.status < 300) { return response.blob(); } else { @@ -302,7 +336,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 @@ -310,7 +360,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, @@ -325,7 +375,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, @@ -339,11 +389,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, @@ -373,7 +419,10 @@ export const SubmodelRepositoryApiFp = function (configuration?: Configuration) options, ); return async (requestHandler: FetchAPI = isomorphicFetch, basePath: string = BASE_PATH) => { - const response = await requestHandler.fetch(basePath + localVarFetchArgs.url, localVarFetchArgs.options); + const response = await requestHandler.fetch( + basePath + localVarFetchArgs.url, + localVarFetchArgs.options, + ); if (response.status >= 200 && response.status < 300) { return response.json(); } else { @@ -393,7 +442,10 @@ export const SubmodelRepositoryApiFp = function (configuration?: Configuration) options, ); return async (requestHandler: FetchAPI = isomorphicFetch, basePath: string = BASE_PATH) => { - const response = await requestHandler.fetch(basePath + localVarFetchArgs.url, localVarFetchArgs.options); + const response = await requestHandler.fetch( + basePath + localVarFetchArgs.url, + localVarFetchArgs.options, + ); if (response.status >= 200 && response.status < 300) { return response.json(); } else { @@ -416,7 +468,10 @@ export const SubmodelRepositoryApiFp = function (configuration?: Configuration) configuration, ).getAttachmentFromSubmodelElement(submodelId, submodelElementPath, options); return async (requestHandler: FetchAPI = isomorphicFetch, basePath: string = BASE_PATH) => { - const response = await requestHandler.fetch(basePath + localVarFetchArgs.url, localVarFetchArgs.options); + const response = await requestHandler.fetch( + basePath + localVarFetchArgs.url, + localVarFetchArgs.options, + ); if (response.status >= 200 && response.status < 300) { return response.blob(); } else { diff --git a/src/lib/api/basyx-v3/apiInMemory.ts b/src/lib/api/basyx-v3/apiInMemory.ts new file mode 100644 index 00000000..b080d9d9 --- /dev/null +++ b/src/lib/api/basyx-v3/apiInMemory.ts @@ -0,0 +1,92 @@ +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 interface INullableAasRepositoryEntries { + repositoryUrl: string; + aas: AssetAdministrationShell; +} + +export class AssetAdministrationShellRepositoryApiInMemory implements IAssetAdministrationShellRepositoryApi { + private shellsSavedInTheRepositories: INullableAasRepositoryEntries[] | null | undefined; + + constructor(options: { shellsSavedInTheRepositories: INullableAasRepositoryEntries[] | null }) { + this.shellsSavedInTheRepositories = options.shellsSavedInTheRepositories; + } + + static getDefaultRepositoryUrl(): string { + return 'www.aas.default.com/repository'; + } + + getAssetAdministrationShellById( + aasId: string, + _options?: object | undefined, + _basePath?: string | undefined, + ): Promise { + 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 ' + + targetRepositoryKind + + ' repository for aasId: ' + + aasId + + ', which is :' + + decodeBase64(aasId) + + ' encoded in base64', + ); + } + + getSubmodelReferencesFromShell(_aasId: string, _options?: object | undefined): Promise { + throw new Error('Method not implemented.'); + } + + getThumbnailFromShell( + _aasId: string, + _options?: object | undefined, + _basePath?: string | undefined, + ): Promise { + throw new Error('Method not implemented.'); + } +} + +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); + } + return Promise.reject('no submodel found in the default repository for submodelId: ' + submodelId); + } + + 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 new file mode 100644 index 00000000..e8678c6d --- /dev/null +++ b/src/lib/api/basyx-v3/apiInterface.ts @@ -0,0 +1,67 @@ +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 { + /** + * @summary Retrieves a specific Asset Administration Shell from the Asset Administration Shell repository + * @param {string} aasId The Asset Administration Shell's unique id + * @param {*} [options] Override http request option. + * @param {string} [basePath] The URL for the current repository endpoint. + * @throws {RequiredError} + * @memberof AssetAdministrationShellRepositoryApi + */ + getAssetAdministrationShellById( + aasId: string, + options?: object, + basePath?: string, + ): Promise; + + /** + * + * @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} + * @memberof AssetAdministrationShellRepositoryApi + */ + getSubmodelReferencesFromShell(aasId: string, options?: object): Promise; + + /** + * @summary Retrieves the thumbnail from the Asset Administration Shell. + * @param aasId aasId The ID of the Asset Administration Shell. + * @param options {*} [options] Override http request option. + * @param {string} [basePath] The URL for the current repository endpoint. + * @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; +} diff --git a/src/lib/api/discovery-service-api/discoveryServiceApi.ts b/src/lib/api/discovery-service-api/discoveryServiceApi.ts index cec7ce25..9bde82a6 100644 --- a/src/lib/api/discovery-service-api/discoveryServiceApi.ts +++ b/src/lib/api/discovery-service-api/discoveryServiceApi.ts @@ -1,13 +1,35 @@ import { encodeBase64 } from 'lib/util/Base64Util'; +import { IDiscoveryServiceApi } from 'lib/api/discovery-service-api/discoveryServiceApiInterface'; +import { DiscoveryServiceApiInMemory } from 'lib/api/discovery-service-api/discoveryServiceApiInMemory'; -export class DiscoveryServiceApi { +export class DiscoveryServiceApi implements IDiscoveryServiceApi { baseUrl: string; - constructor(protected _baseUrl: string = '') { + private constructor( + protected _baseUrl: string = '', + protected http: { + fetch(url: RequestInfo, init?: RequestInit): Promise; + }, + ) { this.baseUrl = _baseUrl; } - public async linkAasIdAndAssetId(aasId: string, assetId: string) { + static create( + _baseUrl: string = '', + http?: { + fetch(url: RequestInfo, init?: RequestInit): Promise; + }, + ): DiscoveryServiceApi { + return new DiscoveryServiceApi(_baseUrl, http ?? window); + } + + static createNull(options: { + discoveryEntries: { assetId: string; aasIds: string[] }[]; + }): DiscoveryServiceApiInMemory { + return new DiscoveryServiceApiInMemory(options); + } + + async linkAasIdAndAssetId(aasId: string, assetId: string) { return this.postAllAssetLinksById(aasId, [ { name: 'globalAssetId', @@ -16,7 +38,7 @@ export class DiscoveryServiceApi { ]); } - public async getAasIdsByAssetId(assetId: string) { + async getAasIdsByAssetId(assetId: string) { return this.getAllAssetAdministrationShellIdsByAssetLink([ { name: 'globalAssetId', @@ -25,7 +47,7 @@ export class DiscoveryServiceApi { ]); } - public async deleteAllAssetLinksById(aasId: string) { + async deleteAllAssetLinksById(aasId: string) { const b64_aasId = encodeBase64(aasId); const headers = { @@ -33,7 +55,7 @@ export class DiscoveryServiceApi { '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, }); @@ -45,7 +67,7 @@ export class DiscoveryServiceApi { } } - public async getAllAssetAdministrationShellIdsByAssetLink( + async getAllAssetAdministrationShellIdsByAssetLink( assetIds: { name: string; value: string }[], ): Promise<{ paging_metadata: string; result: string[] }> { const headers = { @@ -59,7 +81,7 @@ export class DiscoveryServiceApi { url.searchParams.append('assetIds', encodeBase64(JSON.stringify(obj))); }); - const response = await fetch(url, { + const response = await this.http.fetch(url.toString(), { method: 'GET', headers, }); @@ -71,7 +93,7 @@ export class DiscoveryServiceApi { } } - public async getAllAssetLinksById(aasId: string) { + async getAllAssetLinksById(aasId: string) { const b64_aasId = encodeBase64(aasId); const headers = { @@ -79,7 +101,7 @@ export class DiscoveryServiceApi { '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, }); @@ -91,7 +113,7 @@ export class DiscoveryServiceApi { } } - public async postAllAssetLinksById(aasId: string, assetLinks: { name: string; value: string }[]) { + async postAllAssetLinksById(aasId: string, assetLinks: { name: string; value: string }[]) { const b64_aasId = encodeBase64(aasId); const headers = { @@ -99,7 +121,7 @@ export class DiscoveryServiceApi { '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/discovery-service-api/discoveryServiceApiInMemory.ts b/src/lib/api/discovery-service-api/discoveryServiceApiInMemory.ts new file mode 100644 index 00000000..8ee6a69f --- /dev/null +++ b/src/lib/api/discovery-service-api/discoveryServiceApiInMemory.ts @@ -0,0 +1,43 @@ +import { IDiscoveryServiceApi } from 'lib/api/discovery-service-api/discoveryServiceApiInterface'; + +export class DiscoveryServiceApiInMemory implements IDiscoveryServiceApi { + private discoveryEntries: { assetId: string; aasIds: string[] }[]; + + constructor(options: { discoveryEntries: { assetId: string; aasIds: string[] }[] }) { + this.discoveryEntries = options.discoveryEntries; + } + + linkAasIdAndAssetId(_aasId: string, _assetId: string): Promise { + throw new Error('Method not implemented.'); + } + + getAasIdsByAssetId(assetId: string): Promise<{ paging_metadata: string; result: string[] }> { + for (const discoveryEntry of this.discoveryEntries) { + if (discoveryEntry.assetId === assetId) + return Promise.resolve({ + paging_metadata: '', + result: discoveryEntry.aasIds, + }); + } + return Promise.reject('not found'); + } + + deleteAllAssetLinksById(_aasId: string): Promise { + throw new Error('Method not implemented.'); + } + + getAllAssetAdministrationShellIdsByAssetLink(_assetIds: { name: string; value: string }[]): Promise<{ + paging_metadata: string; + result: string[]; + }> { + throw new Error('Method not implemented.'); + } + + getAllAssetLinksById(_aasId: string): Promise { + throw new Error('Method not implemented.'); + } + + postAllAssetLinksById(_aasId: string, _assetLinks: { name: string; value: string }[]): Promise { + throw new Error('Method not implemented.'); + } +} diff --git a/src/lib/api/discovery-service-api/discoveryServiceApiInterface.ts b/src/lib/api/discovery-service-api/discoveryServiceApiInterface.ts new file mode 100644 index 00000000..d26ff7e9 --- /dev/null +++ b/src/lib/api/discovery-service-api/discoveryServiceApiInterface.ts @@ -0,0 +1,15 @@ +export interface IDiscoveryServiceApi { + linkAasIdAndAssetId(aasId: string, assetId: string): Promise; + + getAasIdsByAssetId(assetId: string): Promise<{ paging_metadata: string; result: string[] }>; + + deleteAllAssetLinksById(aasId: string): Promise; + + getAllAssetAdministrationShellIdsByAssetLink( + assetIds: { name: string; value: string }[], + ): Promise<{ paging_metadata: string; result: string[] }>; + + getAllAssetLinksById(aasId: string): Promise; + + postAllAssetLinksById(aasId: string, assetLinks: { name: string; value: string }[]): Promise; +} \ No newline at end of file diff --git a/src/lib/api/infrastructure.ts b/src/lib/api/infrastructure.ts index 252fdf20..bee8c185 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,17 +20,15 @@ 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)); - - if (response.status !== 401) { - return response; - } - return response; + const text = await performServerFetch(url, await initializeRequestOptions(await getBearerToken(), init)); + return new Response(text); }, }; }; @@ -41,4 +40,4 @@ export const sessionLogOut = async (keycloakEnabled: boolean) => { } catch (err) { console.error(err); } -} +}; diff --git a/src/lib/api/registry-service-api/registryServiceApi.ts b/src/lib/api/registry-service-api/registryServiceApi.ts index f9dc5bbb..663788ab 100644 --- a/src/lib/api/registry-service-api/registryServiceApi.ts +++ b/src/lib/api/registry-service-api/registryServiceApi.ts @@ -1,21 +1,43 @@ import { encodeBase64 } from 'lib/util/Base64Util'; import { AssetAdministrationShellDescriptor } from 'lib/types/registryServiceTypes'; +import { IRegistryServiceApi } from 'lib/api/registry-service-api/registryServiceApiInterface'; +import { RegistryServiceApiInMemory } from 'lib/api/registry-service-api/registryServiceApiInMemory'; -export class RegistryServiceApi { +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; } - public async getAllAssetAdministrationShellDescriptors() { + 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 }) { + return new RegistryServiceApiInMemory(options); + } + + async getAllAssetAdministrationShellDescriptors() { const headers = { Accept: 'application/json', }; const url = new URL(`${this.baseUrl}/shell-descriptors`); - const response = await fetch(url, { + const response = await this.http.fetch(url.toString(), { method: 'GET', headers, }); @@ -27,7 +49,7 @@ export class RegistryServiceApi { } } - public async getAssetAdministrationShellDescriptorById(aasId: string) { + async getAssetAdministrationShellDescriptorById(aasId: string) { const b64_aasId = encodeBase64(aasId); const headers = { @@ -37,7 +59,7 @@ export class RegistryServiceApi { 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, }); @@ -49,7 +71,7 @@ export class RegistryServiceApi { } } - public async postAssetAdministrationShellDescriptor(shellDescriptor: AssetAdministrationShellDescriptor) { + async postAssetAdministrationShellDescriptor(shellDescriptor: AssetAdministrationShellDescriptor) { const headers = { Accept: 'application/json', 'Content-Type': 'application/json', @@ -57,7 +79,7 @@ export class RegistryServiceApi { 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), @@ -70,7 +92,7 @@ export class RegistryServiceApi { } } - public async putAssetAdministrationShellDescriptorById( + async putAssetAdministrationShellDescriptorById( aasId: string, shellDescriptor: AssetAdministrationShellDescriptor, ) { @@ -83,7 +105,7 @@ export class RegistryServiceApi { 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), @@ -96,12 +118,12 @@ export class RegistryServiceApi { } } - public async deleteAssetAdministrationShellDescriptorById(aasId: string) { + async deleteAssetAdministrationShellDescriptorById(aasId: string) { const b64_aasId = encodeBase64(aasId); 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/registry-service-api/registryServiceApiInMemory.ts b/src/lib/api/registry-service-api/registryServiceApiInMemory.ts new file mode 100644 index 00000000..5171b01d --- /dev/null +++ b/src/lib/api/registry-service-api/registryServiceApiInMemory.ts @@ -0,0 +1,40 @@ +import { IRegistryServiceApi } from 'lib/api/registry-service-api/registryServiceApiInterface'; +import { AssetAdministrationShellDescriptor } from 'lib/types/registryServiceTypes'; + +export class RegistryServiceApiInMemory implements IRegistryServiceApi { + private registryShellDescriptorEntries: AssetAdministrationShellDescriptor[] | null; + baseUrl: string; + _baseUrl: string; + + constructor(options: { registryShellDescriptorEntries: AssetAdministrationShellDescriptor[] | null }) { + this.registryShellDescriptorEntries = options.registryShellDescriptorEntries; + } + + getAllAssetAdministrationShellDescriptors(): Promise { + throw new Error('Method not implemented.'); + } + + getAssetAdministrationShellDescriptorById(aasId: string): Promise { + if (!this.registryShellDescriptorEntries) return Promise.reject(new Error('no registry configuration')); + let shellDescriptor: AssetAdministrationShellDescriptor; + for (shellDescriptor of this.registryShellDescriptorEntries) { + if (shellDescriptor.id === aasId) return Promise.resolve(shellDescriptor); + } + return Promise.reject(new Error('no shell descriptor for aasId:' + aasId)); + } + + postAssetAdministrationShellDescriptor(_shellDescriptor: AssetAdministrationShellDescriptor): Promise { + throw new Error('Method not implemented.'); + } + + putAssetAdministrationShellDescriptorById( + _aasId: string, + _shellDescriptor: AssetAdministrationShellDescriptor, + ): Promise { + throw new Error('Method not implemented.'); + } + + deleteAssetAdministrationShellDescriptorById(_aasId: string): Promise { + throw new Error('Method not implemented.'); + } +} diff --git a/src/lib/api/registry-service-api/registryServiceApiInterface.ts b/src/lib/api/registry-service-api/registryServiceApiInterface.ts new file mode 100644 index 00000000..1646abb7 --- /dev/null +++ b/src/lib/api/registry-service-api/registryServiceApiInterface.ts @@ -0,0 +1,18 @@ +import { AssetAdministrationShellDescriptor } from 'lib/types/registryServiceTypes'; + +export interface IRegistryServiceApi { + baseUrl: string; + + getAllAssetAdministrationShellDescriptors(): Promise; + + getAssetAdministrationShellDescriptorById(aasId: string): Promise; + + postAssetAdministrationShellDescriptor(shellDescriptor: AssetAdministrationShellDescriptor): Promise; + + putAssetAdministrationShellDescriptorById( + aasId: string, + shellDescriptor: AssetAdministrationShellDescriptor, + ): Promise; + + deleteAssetAdministrationShellDescriptorById(aasId: string): Promise; +} \ No newline at end of file diff --git a/src/lib/api/serverFetch.ts b/src/lib/api/serverFetch.ts new file mode 100644 index 00000000..ab380eb4 --- /dev/null +++ b/src/lib/api/serverFetch.ts @@ -0,0 +1,11 @@ +'use server'; + +export async function performServerFetch( + input: string | Request | URL, + init?: RequestInit | undefined, +): Promise { + const result = await fetch(input, init); + if (result.status >= 200 && result.status < 300) { + return Promise.resolve(await result.text()); + } else throw result; +} diff --git a/src/lib/api/submodel-registry-service/submodelRegistryServiceApi.ts b/src/lib/api/submodel-registry-service/submodelRegistryServiceApi.ts index d5a95fec..aaa41c45 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 b4960eb8..9f0b2442 100644 --- a/src/lib/api/template-shell-api/templateShellApi.ts +++ b/src/lib/api/template-shell-api/templateShellApi.ts @@ -5,16 +5,23 @@ export class TemplateShellApi { basePathOwnApi: string; basePathCustoms: string; enable_authentication: boolean; - constructor(backendApiUrl: string, enable_authentication: boolean) { + private http: { fetch(url: RequestInfo, init?: RequestInit): Promise }; + + 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, }); @@ -29,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, }); @@ -44,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(); @@ -61,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/searchUtilActions/SearchRepositoryHelper.ts b/src/lib/searchUtilActions/SearchRepositoryHelper.ts deleted file mode 100644 index da329048..00000000 --- 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 69d7eedd..00000000 --- a/src/lib/searchUtilActions/searchClient.ts +++ /dev/null @@ -1,74 +0,0 @@ -'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'; -import { getAasFromAllAasRepos } from 'lib/searchUtilActions/SearchRepositoryHelper'; -import { NotFoundError } from 'lib/errors/NotFoundError'; - -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.length > 1) { - return { - redirectUrl: `/viewer/discovery?assetId=${encodeURI(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); - let aas; - - if (registrySearchResult) { - aas = registrySearchResult.registryAas; - } else { - try { - aas = await repositoryClient.getAssetAdministrationShellById(encodeBase64(aasId)); - } catch (e) { - const repoSearchResults = await getAasFromAllAasRepos(encodeBase64(aasId), repositoryClient); - if (repoSearchResults.length > 1) { - return { - redirectUrl: `/viewer/discovery?aasId=${encodeURIComponent(val)}`, - aas: null, - aasData: null, - }; - } - aas = repoSearchResults[0].aas; - } - } - - const aasData = - registrySearchResult?.registryAasData != null - ? { - submodelDescriptors: registrySearchResult.registryAasData.submodelDescriptors, - aasRegistryRepositoryOrigin: registrySearchResult.registryAasData.aasRegistryRepositoryOrigin, - } - : null; - - if (!aas) throw new NotFoundError(); - - return { - redirectUrl: `/viewer/${encodeBase64(aas.id)}`, - aas: aas, - aasData: aasData, - }; - } -} diff --git a/src/lib/searchUtilActions/searchServer.ts b/src/lib/searchUtilActions/searchServer.ts deleted file mode 100644 index 59f703d0..00000000 --- a/src/lib/searchUtilActions/searchServer.ts +++ /dev/null @@ -1,97 +0,0 @@ -'use server'; - -import { NotFoundError } from 'lib/errors/NotFoundError'; -import { 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 } from '@aas-core-works/aas-core3.0-typescript/types'; - -interface RegistrySearchResult { - registryAas: AssetAdministrationShell; - registryAasData?: RegistryAasData; -} - -/** - * 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. - */ -export async function handleAasRegistrySearch(searchAasId: string): Promise { - const registryServiceClient = new RegistryServiceApi(process.env.REGISTRY_API_URL); - - try { - const shellDescription = await registryServiceClient.getAssetAdministrationShellDescriptorById(searchAasId); - const endpoints = shellDescription.endpoints as Endpoint[]; - const submodelDescriptors = shellDescription.submodelDescriptors as SubmodelDescriptor[]; - - if (!endpoints) { - throw new NotFoundError(); - } - - const aasEndpoint = endpoints.map((endpoint) => endpoint.protocolInformation.href)[0]; - const aasRepositoryOrigin = getAasRepositoryOrigin(aasEndpoint); - - const aas = await fetch(aasEndpoint, { - method: 'GET', - }); - - return { - registryAas: await aas.json(), - registryAasData: { - submodelDescriptors: submodelDescriptors, - aasRegistryRepositoryOrigin: aasRepositoryOrigin, - }, - }; - } catch (e) { - console.warn('Could not be found in the registry service, will continue to look in the AAS repository.'); - return null; - } -} - -/** - * Resolves the given AAS ID using the discovery service. - * - * This function takes an AAS ID and attempts to resolve it using a discovery service. - * - * @param {string} searchAssetId - The AAS ID to resolve using the discovery service. - * @returns {Promise} A promise that resolves to the resolved AAS IDs as an array of strings. - */ -export async function handleAasDiscoverySearch(searchAssetId: string): Promise { - try { - const discoveryServiceClient = new DiscoveryServiceApi(process.env.DISCOVERY_API_URL); - - if (!searchAssetId) { - throw new NotFoundError(); - } - const aasIds = (await discoveryServiceClient.getAasIdsByAssetId(searchAssetId)).result; - - if (aasIds.length === 0) { - throw new NotFoundError(); - } - - return aasIds; - } catch (e) { - console.warn('Could not be found in the discovery service, will continue to look in the AAS registry.'); - return []; - } -} - -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; -} diff --git a/src/lib/services/MultipleRepositorySearch/MnestixConnectionServerActions.ts b/src/lib/services/MultipleRepositorySearch/MnestixConnectionServerActions.ts new file mode 100644 index 00000000..754ca833 --- /dev/null +++ b/src/lib/services/MultipleRepositorySearch/MnestixConnectionServerActions.ts @@ -0,0 +1,19 @@ +'use server'; + +import { ConnectionType } from '@prisma/client'; +import { DataSourceFormData, PrismaConnector } from 'lib/services/MultipleRepositorySearch/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/lib/services/MultipleRepositorySearch/MultipleRepositorySearchActions.ts b/src/lib/services/MultipleRepositorySearch/MultipleRepositorySearchActions.ts new file mode 100644 index 00000000..d8be5844 --- /dev/null +++ b/src/lib/services/MultipleRepositorySearch/MultipleRepositorySearchActions.ts @@ -0,0 +1,20 @@ +import { Submodel } from '@aas-core-works/aas-core3.0-typescript/dist/types/types'; +import { + MultipleRepositorySearchService, + RepoSearchResult, +} from 'lib/services/MultipleRepositorySearch/MultipleRepositorySearchService'; + +export async function performSearchAasFromAllRepositories(searchInput: string): Promise { + const searcher = MultipleRepositorySearchService.create(); + return searcher.getAasFromAllRepos(searchInput); +} + +export async function performSearchSubmodelFromAllRepos(searchInput: string): Promise { + const searcher = MultipleRepositorySearchService.create(); + return searcher.getSubmodelFromAllRepos(searchInput); +} + +export async function performgetAasThumbnailFromAllRepos(searchInput: string): Promise { + const searcher = MultipleRepositorySearchService.create(); + return searcher.getAasThumbnailFromAllRepos(searchInput); +} diff --git a/src/lib/services/MultipleRepositorySearch/MultipleRepositorySearchService.ts b/src/lib/services/MultipleRepositorySearch/MultipleRepositorySearchService.ts new file mode 100644 index 00000000..0a55692f --- /dev/null +++ b/src/lib/services/MultipleRepositorySearch/MultipleRepositorySearchService.ts @@ -0,0 +1,123 @@ +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 { AssetAdministrationShell, Submodel } from '@aas-core-works/aas-core3.0-typescript/dist/types/types'; +import { INullableAasRepositoryEntries } from 'lib/api/basyx-v3/apiInMemory'; +import { PrismaConnector } from 'lib/services/MultipleRepositorySearch/PrismaConnector'; +import { IPrismaConnector } from 'lib/services/MultipleRepositorySearch/PrismaConnectorInterface'; + +export type RepoSearchResult = { + aas: AssetAdministrationShell; + location: string; +}; + +export interface NullableMultipleDataSourceSetupParameters { + shellsSavedInTheRepositories?: INullableAasRepositoryEntries[] | null; + submodelsSavedInTheRepository?: Submodel[] | null; + log?: Log | null; +} + +export class MultipleRepositorySearchService { + private constructor( + protected readonly repositoryClient: IAssetAdministrationShellRepositoryApi, + protected readonly submodelRepositoryClient: ISubmodelRepositoryApi, + protected readonly prismaConnector: IPrismaConnector, + protected readonly log: Log, + ) {} + + static create(): MultipleRepositorySearchService { + const repositoryClient = AssetAdministrationShellRepositoryApi.create({ + basePath: process.env.AAS_REPO_API_URL, + fetch: mnestixFetch(), + }); + const submodelRepositoryClient = SubmodelRepositoryApi.create({ + basePath: process.env.SUBMODEL_REPO_API_URL ?? process.env.AAS_REPO_API_URL, + fetch: mnestixFetch(), + }); + const log = Log.create(); + const prismaConnector = PrismaConnector.create(); + return new MultipleRepositorySearchService(repositoryClient, submodelRepositoryClient, prismaConnector, log); + } + + static createNull({ + shellsSavedInTheRepositories = [], + submodelsSavedInTheRepository = [], + log = null, + }: NullableMultipleDataSourceSetupParameters = {}): MultipleRepositorySearchService { + const aasUrls = [...new Set(shellsSavedInTheRepositories?.map((entry) => entry.repositoryUrl))]; + return new MultipleRepositorySearchService( + AssetAdministrationShellRepositoryApi.createNull({ shellsSavedInTheRepositories }), + SubmodelRepositoryApi.createNull({ submodelsSavedInTheRepository }), + PrismaConnector.createNull({ aasUrls }), + log ?? Log.createNull(), + ); + } + + async getAasFromAllRepos(aasId: string): Promise { + const basePathUrls = await this.prismaConnector.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 getAasFromDefaultRepository(aasId: string): Promise { + return this.repositoryClient.getAssetAdministrationShellById(aasId); + } + + async getSubmodelFromAllRepos(submodelId: string) { + const basePathUrls = await this.prismaConnector.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 this.prismaConnector.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/MultipleRepositorySearch/PrismaConnector.ts b/src/lib/services/MultipleRepositorySearch/PrismaConnector.ts new file mode 100644 index 00000000..8dfb6932 --- /dev/null +++ b/src/lib/services/MultipleRepositorySearch/PrismaConnector.ts @@ -0,0 +1,58 @@ +import { prisma } from 'lib/database/prisma'; +import { ConnectionType } from '@prisma/client'; +import { IPrismaConnector } from 'lib/services/MultipleRepositorySearch/PrismaConnectorInterface'; +import { PrismaConnectorInMemory } from 'lib/services/MultipleRepositorySearch/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/lib/services/MultipleRepositorySearch/PrismaConnectorInMemory.ts b/src/lib/services/MultipleRepositorySearch/PrismaConnectorInMemory.ts new file mode 100644 index 00000000..85ff3c65 --- /dev/null +++ b/src/lib/services/MultipleRepositorySearch/PrismaConnectorInMemory.ts @@ -0,0 +1,24 @@ +import { IPrismaConnector } from 'lib/services/MultipleRepositorySearch/PrismaConnectorInterface'; +import { DataSourceFormData } from 'lib/services/MultipleRepositorySearch/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/lib/services/MultipleRepositorySearch/PrismaConnectorInterface.ts b/src/lib/services/MultipleRepositorySearch/PrismaConnectorInterface.ts new file mode 100644 index 00000000..1ab06929 --- /dev/null +++ b/src/lib/services/MultipleRepositorySearch/PrismaConnectorInterface.ts @@ -0,0 +1,10 @@ +import { ConnectionType } from '@prisma/client'; +import { DataSourceFormData } from 'lib/services/MultipleRepositorySearch/PrismaConnector'; + +export interface IPrismaConnector { + getConnectionData(): unknown; + + upsertConnectionDataAction(formDataInput: DataSourceFormData[]): Promise; + + getConnectionDataByTypeAction(type: ConnectionType): Promise; +} diff --git a/src/lib/services/searchUtilActions/AasSearcher.spec.ts b/src/lib/services/searchUtilActions/AasSearcher.spec.ts new file mode 100644 index 00000000..1d95871e --- /dev/null +++ b/src/lib/services/searchUtilActions/AasSearcher.spec.ts @@ -0,0 +1,210 @@ +import { expect } from '@jest/globals'; +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'; +import { AssetAdministrationShellRepositoryApiInMemory } from 'lib/api/basyx-v3/apiInMemory'; + +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 searchString = 'irrelevant assetId'; + const searcher = AasSearcher.createNull({ + discoveryEntries: [{ assetId: searchString, aasIds: [aasId] }], + registryShellDescriptorEntries: [createDummyShellDescriptor(AAS_ENDPOINT, aasId)], + shellsByRegistryEndpoint: [{ path: AAS_ENDPOINT, aas: createDummyAas({ id: aasId }) }], + }); + + 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 searchString = 'irrelevant assetId'; + const searcher = AasSearcher.createNull({ + discoveryEntries: [{ assetId: searchString, aasIds: [aasId] }], + shellsSavedInTheRepositories: [ + { + aas: createDummyAas({ id: aasId }), + repositoryUrl: AssetAdministrationShellRepositoryApiInMemory.getDefaultRepositoryUrl(), + }, + ], + }); + + const result = await searcher.fullSearch(searchString); + + expect(result.redirectUrl).toBe('/viewer/' + encodeBase64(aasId)); + }); + + 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({ + registryShellDescriptorEntries: [createDummyShellDescriptor(AAS_ENDPOINT, aasId)], + shellsByRegistryEndpoint: [{ path: AAS_ENDPOINT, aas: createDummyAas({ id: aasId }) }], + }); + + 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 searchString = aasId; + const searcher = AasSearcher.createNull({ + 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', () => { + it('logs to the console when finding nothing', async () => { + const searchString = 'irrelevant assetId'; + const log = Log.createNull(); + const searcher = AasSearcher.createNull({ + log: log, + }); + + await assertThatFunctionThrows(searcher, searchString); + }); + + 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); + const s = instance(aas); + s.id = id; + return s; +} + +function createDummyShellDescriptor(href: string, id: string): AssetAdministrationShellDescriptor { + return { + endpoints: [ + { + interface: 'AAS-3.0', + protocolInformation: { + href: href, + }, + }, + ], + 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/services/searchUtilActions/AasSearcher.ts b/src/lib/services/searchUtilActions/AasSearcher.ts new file mode 100644 index 00000000..df383381 --- /dev/null +++ b/src/lib/services/searchUtilActions/AasSearcher.ts @@ -0,0 +1,220 @@ +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 { 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 { + MultipleRepositorySearchService, + NullableMultipleDataSourceSetupParameters, +} from 'lib/services/MultipleRepositorySearch/MultipleRepositorySearchService'; +import { INullableAasRepositoryEntries } from 'lib/api/basyx-v3/apiInMemory'; +import { mnestixFetch } from 'lib/api/infrastructure'; + +export interface RegistrySearchResult { + registryAas: AssetAdministrationShell; + registryAasData?: RegistryAasData; +} + +interface NullableSearchSetupParameters { + discoveryEntries?: { assetId: string; aasIds: string[] }[]; + registryShellDescriptorEntries?: AssetAdministrationShellDescriptor[] | null; + shellsByRegistryEndpoint?: { path: string; aas: AssetAdministrationShell }[] | null; + shellsSavedInTheRepositories?: INullableAasRepositoryEntries[] | null; + submodelsSavedInTheRepository?: Submodel[] | null; + entitiesInMultipleDataSources?: NullableMultipleDataSourceSetupParameters | null; + 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, + protected readonly registryService: IRegistryServiceApi, + 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 = 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(); + return new AasSearcher(discoveryServiceClient, registryServiceClient, multipleDataSource, fetch, log); + } + + static createNull({ + discoveryEntries = [], + registryShellDescriptorEntries = [], + shellsByRegistryEndpoint = [], + shellsSavedInTheRepositories = [], + 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 }), + MultipleRepositorySearchService.createNull({ + shellsSavedInTheRepositories: shellsSavedInTheRepositories, + submodelsSavedInTheRepository, + }), + stubbedFetch, + log ?? Log.createNull(), + ); + } + + async fullSearch(val: string): Promise { + const aasIds = await this.performAasDiscoverySearch(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.performAasRegistrySearch(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 + ? { + 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 Asset ID using the discovery service. + * + * 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 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 performAasDiscoverySearch(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 registry'); + 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 performAasRegistrySearch(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 repository'); + return null; + } + } +} + +export type RepoSearchResult = { + aas: AssetAdministrationShell; + location: string; +}; diff --git a/src/lib/services/searchUtilActions/searchActions.ts b/src/lib/services/searchUtilActions/searchActions.ts new file mode 100644 index 00000000..47c31606 --- /dev/null +++ b/src/lib/services/searchUtilActions/searchActions.ts @@ -0,0 +1,25 @@ +'use server'; + +import { AasSearcher, AasSearchResult, RegistrySearchResult } from 'lib/services/searchUtilActions/AasSearcher'; + +export async function performFullAasSearch(searchInput: string): Promise { + const searcher = AasSearcher.create(); + return searcher.fullSearch(searchInput); +} + +export async function performRegistryAasSearch(searchInput: string): Promise { + const searcher = AasSearcher.create(); + return searcher.performAasRegistrySearch(searchInput); +} + +export async function performDiscoveryAasSearch(searchInput: string): Promise { + const searcher = AasSearcher.create(); + return searcher.performAasDiscoverySearch(searchInput); +} + +export async function getSubmodelFromSubmodelDescriptor(url: string) { + const response = await fetch(url, { + method: 'GET', + }); + return response.json(); +} diff --git a/src/lib/util/Log.ts b/src/lib/util/Log.ts new file mode 100644 index 00000000..42ab0367 --- /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 00000000..2baf53b1 --- /dev/null +++ b/src/lib/util/tracker.ts @@ -0,0 +1,43 @@ +import { EventEmitter } from '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; + } +} diff --git a/yarn.lock b/yarn.lock index 20292a54..c554a491 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,23 +3374,52 @@ babel-plugin-polyfill-regenerator@^0.6.1: dependencies: "@babel/helper-define-polyfill-provider" "^0.6.2" -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== - -base64-js@^1.3.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" - integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== - -bcrypt-pbkdf@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" - integrity sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w== +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: - tweetnacl "^0.14.3" - + "@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== + +base64-js@^1.3.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + +bcrypt-pbkdf@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" + integrity sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w== + dependencies: + tweetnacl "^0.14.3" + binary-extensions@^2.0.0: version "2.3.0" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" @@ -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,6 +5949,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 +6049,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 +6150,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 +6285,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 +6341,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 +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" @@ -7187,6 +9058,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"