diff --git a/app/package.json b/app/package.json index e182d9ede..dda84f96c 100644 --- a/app/package.json +++ b/app/package.json @@ -56,8 +56,8 @@ "tag:release": "node scripts/tag.cjs release", "tag:remove": "node scripts/tag.cjs remove", "test": "yarn build:deps && jest --passWithNoTests && node --test scripts/tests/*.cjs", - "test:ci": "jest --passWithNoTests && node --test scripts/tests/*.cjs", "test:build": "yarn build:deps && yarn types && node ./scripts/bundle-analyze-ci.cjs ios && yarn test", + "test:ci": "jest --passWithNoTests && node --test scripts/tests/*.cjs", "test:coverage": "jest --coverage --passWithNoTests", "test:coverage:ci": "jest --coverage --passWithNoTests --ci --coverageReporters=lcov --coverageReporters=text --coverageReporters=json", "test:e2e:android": "./scripts/mobile-ci-build-android.sh && maestro test tests/e2e/launch.android.flow.yaml", diff --git a/packages/mobile-sdk-demo/package.json b/packages/mobile-sdk-demo/package.json index a95b4cd84..8b5a6a522 100644 --- a/packages/mobile-sdk-demo/package.json +++ b/packages/mobile-sdk-demo/package.json @@ -30,14 +30,12 @@ "@faker-js/faker": "^10.0.0", "@noble/hashes": "^1.5.0", "@react-native-async-storage/async-storage": "^2.2.0", - "@react-native/gradle-plugin": "0.76.9", "@selfxyz/common": "workspace:*", "@selfxyz/mobile-sdk-alpha": "workspace:*", "assert": "^2.1.0", "buffer": "^6.0.3", "constants-browserify": "^1.0.0", "ethers": "^6.11.0", - "find-yarn-workspace-root": "^2.0.0", "react": "^18.3.1", "react-native": "0.76.9", "react-native-get-random-values": "^1.11.0", @@ -51,10 +49,16 @@ "devDependencies": { "@babel/core": "^7.28.3", "@react-native-community/cli": "^16.0.3", + "@react-native/gradle-plugin": "0.76.9", "@react-native/metro-config": "0.76.9", + "@testing-library/dom": "^10.4.1", + "@testing-library/jest-dom": "^6.6.3", + "@testing-library/react": "^16.1.0", + "@testing-library/user-event": "^14.5.2", "@tsconfig/react-native": "^3.0.6", "@types/node": "^22.18.3", "@types/react": "^18.3.4", + "@types/react-dom": "^18.3.0", "@types/react-native-vector-icons": "^6.4.18", "@typescript-eslint/eslint-plugin": "^8.44.0", "@typescript-eslint/parser": "^8.44.0", @@ -66,9 +70,11 @@ "eslint-plugin-prettier": "^5.5.4", "eslint-plugin-simple-import-sort": "^12.1.1", "eslint-plugin-sort-exports": "^0.9.1", + "find-yarn-workspace-root": "^2.0.0", "jsdom": "^25.0.1", "metro-react-native-babel-preset": "0.76.9", "prettier": "^3.6.2", + "react-dom": "^18.3.1", "react-native-svg-transformer": "^1.5.1", "typescript": "^5.9.2", "vitest": "^2.1.8" diff --git a/packages/mobile-sdk-demo/src/polyfills/cryptoPolyfill.js b/packages/mobile-sdk-demo/src/polyfills/cryptoPolyfill.js index 5e7186f24..3661d5556 100644 --- a/packages/mobile-sdk-demo/src/polyfills/cryptoPolyfill.js +++ b/packages/mobile-sdk-demo/src/polyfills/cryptoPolyfill.js @@ -8,6 +8,26 @@ */ // Re-export the shared crypto polyfill implementation -const { cryptoPolyfill } = require('@selfxyz/common'); +const { cryptoPolyfill, createHash, createHmac, randomBytes, pbkdf2Sync } = require('@selfxyz/common'); -module.exports = cryptoPolyfill; +// Fallback to Node.js crypto implementation when the shared polyfill isn't available +const nodeCrypto = require('crypto'); + +const exportedPolyfill = cryptoPolyfill ?? { + createHash: createHash ?? nodeCrypto.createHash.bind(nodeCrypto), + createHmac: createHmac ?? nodeCrypto.createHmac.bind(nodeCrypto), + randomBytes: + randomBytes ?? + (size => { + if (!globalThis.crypto || typeof globalThis.crypto.getRandomValues !== 'function') { + throw new Error('globalThis.crypto.getRandomValues is not available'); + } + const out = new Uint8Array(size); + globalThis.crypto.getRandomValues(out); + return Buffer.from(out); + }), + pbkdf2Sync: pbkdf2Sync ?? nodeCrypto.pbkdf2Sync.bind(nodeCrypto), +}; + +module.exports = exportedPolyfill; +module.exports.default = exportedPolyfill; diff --git a/packages/mobile-sdk-demo/tests/App.test.tsx b/packages/mobile-sdk-demo/tests/App.test.tsx new file mode 100644 index 000000000..872520129 --- /dev/null +++ b/packages/mobile-sdk-demo/tests/App.test.tsx @@ -0,0 +1,198 @@ +import React from 'react'; +import { render, screen, waitFor, act } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; +import { beforeEach, describe, expect, it, vi } from 'vitest'; + +import { sdkMocks } from './mocks/sdk'; + +vi.mock('../src/providers/SelfClientProvider', () => ({ + __esModule: true, + default: ({ children }: { children: React.ReactNode }) => <>{children}, +})); + +type ScreenContext = import('../src/screens').ScreenContext; + +let latestContext: ScreenContext | null = null; +function createScreensModule() { + const descriptors = [ + { + id: 'generate', + title: 'Generate Mock Document', + subtitle: 'Create sample passport data for testing', + sectionTitle: 'Main', + status: 'working' as const, + load: () => () =>
Generate Screen
, + getProps: ({ navigate, refreshDocuments }: ScreenContext) => ({ + onBack: () => navigate('home'), + onNavigate: navigate, + onDocumentStored: refreshDocuments, + }), + }, + { + id: 'documents', + title: 'Document List', + subtitle: 'View and manage stored documents', + sectionTitle: 'Main', + status: 'working' as const, + load: () => () =>
Documents Screen
, + getProps: ({ navigate, documentCatalog }: ScreenContext) => ({ + onBack: () => navigate('home'), + catalog: documentCatalog, + }), + }, + ]; + + const screenMap = descriptors.reduce>((acc, descriptor) => { + acc[descriptor.id] = descriptor; + return acc; + }, {}); + + const orderedSectionEntries = [{ title: 'Main', items: descriptors }]; + + const HomeScreen = ({ screenContext }: { screenContext: ScreenContext }) => { + latestContext = screenContext; + return ( +
+

Self Demo App

+ {orderedSectionEntries.map(section => ( +
+

{section.title}

+ {section.items.map(descriptor => ( + + ))} +
+ ))} +
+ ); + }; + + return { + __esModule: true as const, + orderedSectionEntries, + screenDescriptors: descriptors, + screenMap, + HomeScreen, + }; +} + +vi.mock('../src/screens', () => { + const moduleExports = createScreensModule(); + return moduleExports; +}); + +vi.mock('../src/screens/HomeScreen', () => ({ + __esModule: true, + default: (props: { screenContext: ScreenContext }) => createScreensModule().HomeScreen(props), +})); + +import App from '../App'; + +describe('App integration', () => { + beforeEach(() => { + latestContext = null; + }); + + it('fetches catalog and selected document on mount', async () => { + const catalog = { + documents: [{ id: 'doc-1', documentType: 'mock_passport' }], + selectedDocumentId: 'doc-1', + } as any; + const selected = { + metadata: { id: 'doc-1', documentType: 'mock_passport' }, + data: { id: 'doc-1' }, + } as any; + + sdkMocks.selfClient.loadDocumentCatalog.mockResolvedValueOnce(catalog); + sdkMocks.loadSelectedDocumentMock.mockResolvedValueOnce(selected); + + render(); + + await waitFor(() => { + expect(sdkMocks.selfClient.loadDocumentCatalog).toHaveBeenCalled(); + expect(sdkMocks.loadSelectedDocumentMock).toHaveBeenCalled(); + expect(latestContext).not.toBeNull(); + }); + + expect(screen.getByText(/Self Demo App/i)).toBeInTheDocument(); + expect(latestContext?.documentCatalog).toEqual(catalog); + expect(latestContext?.selectedDocument).toEqual(selected); + }); + + it('navigates into descriptor screens from the home menu', async () => { + sdkMocks.selfClient.loadDocumentCatalog.mockResolvedValueOnce({ documents: [] }); + sdkMocks.loadSelectedDocumentMock.mockResolvedValueOnce(null); + + render(); + + await screen.findByText(/Self Demo App/i); + + await userEvent.click(screen.getByRole('button', { name: /document list/i })); + + expect(await screen.findByTestId('screen-Documents Screen')).toHaveTextContent('Documents Screen'); + + await act(async () => { + latestContext?.navigate('home'); + }); + + await screen.findByText(/Self Demo App/i); + await userEvent.click(screen.getByRole('button', { name: /generate mock document/i })); + + expect(await screen.findByTestId('screen-Generate Screen')).toHaveTextContent('Generate Screen'); + }); + + it('falls back to the home screen when navigating to an unknown route', async () => { + sdkMocks.selfClient.loadDocumentCatalog.mockResolvedValueOnce({ documents: [] }); + sdkMocks.loadSelectedDocumentMock.mockResolvedValueOnce(null); + + render(); + + await screen.findByText(/Self Demo App/i); + + await act(async () => { + latestContext?.navigate('documents'); + }); + + expect(await screen.findByTestId('screen-Documents Screen')).toBeInTheDocument(); + + await act(async () => { + latestContext?.navigate('unknown' as any); + }); + + await waitFor(() => expect(screen.getByText(/Self Demo App/i)).toBeInTheDocument()); + }); + + it('resets catalog and selection when refresh fails', async () => { + const catalog = { + documents: [{ id: 'doc-2', documentType: 'mock_passport' }], + selectedDocumentId: 'doc-2', + } as any; + const selected = { + metadata: { id: 'doc-2', documentType: 'mock_passport' }, + data: { id: 'doc-2' }, + } as any; + + sdkMocks.selfClient.loadDocumentCatalog + .mockResolvedValueOnce(catalog) + .mockRejectedValueOnce(new Error('no catalog')); + sdkMocks.loadSelectedDocumentMock.mockResolvedValueOnce(selected).mockRejectedValueOnce(new Error('no selection')); + + render(); + + await waitFor(() => expect(latestContext?.selectedDocument).toEqual(selected)); + + await act(async () => { + await latestContext?.refreshDocuments(); + }); + + await waitFor(() => { + expect(latestContext?.documentCatalog.documents).toEqual([]); + expect(latestContext?.selectedDocument).toBeNull(); + }); + }); +}); diff --git a/packages/mobile-sdk-demo/tests/components/MenuButton.test.tsx b/packages/mobile-sdk-demo/tests/components/MenuButton.test.tsx new file mode 100644 index 000000000..f08639b73 --- /dev/null +++ b/packages/mobile-sdk-demo/tests/components/MenuButton.test.tsx @@ -0,0 +1,35 @@ +import React from 'react'; +import { render, screen } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; +import { describe, expect, it, vi } from 'vitest'; + +import MenuButton from '../../src/components/MenuButton'; + +describe('MenuButton', () => { + it('renders the provided title and subtitle', () => { + render( {}} />); + + expect(screen.getByRole('button', { name: /documents/i })).toBeInTheDocument(); + expect(screen.getByText(/manage your ids/i)).toBeInTheDocument(); + }); + + it('invokes onPress when pressed if enabled', async () => { + const onPress = vi.fn(); + render(); + + await userEvent.click(screen.getByRole('button', { name: /open/i })); + + expect(onPress).toHaveBeenCalledTimes(1); + }); + + it('prevents presses and shows disabled styles when disabled', async () => { + const onPress = vi.fn(); + render(); + + const button = screen.getByRole('button', { name: /disabled/i }); + expect(button).toBeDisabled(); + + await userEvent.click(button); + expect(onPress).not.toHaveBeenCalled(); + }); +}); diff --git a/packages/mobile-sdk-demo/tests/components/ScreenLayout.test.tsx b/packages/mobile-sdk-demo/tests/components/ScreenLayout.test.tsx new file mode 100644 index 000000000..adaaf59de --- /dev/null +++ b/packages/mobile-sdk-demo/tests/components/ScreenLayout.test.tsx @@ -0,0 +1,33 @@ +import React from 'react'; +import { render, screen } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; +import { describe, expect, it, vi } from 'vitest'; + +import ScreenLayout from '../../src/components/ScreenLayout'; + +describe('ScreenLayout', () => { + it('renders title, children, and right action content', () => { + render( + {}} rightAction={Clear}> + Body content + , + ); + + expect(screen.getByText(/my title/i)).toBeInTheDocument(); + expect(screen.getByText(/body content/i)).toBeInTheDocument(); + expect(screen.getByText(/clear/i)).toBeInTheDocument(); + }); + + it('invokes onBack when the header back button is pressed', async () => { + const onBack = vi.fn(); + render( + + Content + , + ); + + await userEvent.click(screen.getByRole('button', { name: /back/i })); + + expect(onBack).toHaveBeenCalledTimes(1); + }); +}); diff --git a/packages/mobile-sdk-demo/tests/mocks/sdk.ts b/packages/mobile-sdk-demo/tests/mocks/sdk.ts new file mode 100644 index 000000000..04ea48a2c --- /dev/null +++ b/packages/mobile-sdk-demo/tests/mocks/sdk.ts @@ -0,0 +1,111 @@ +import React from 'react'; +import { vi } from 'vitest'; + +type SDKMocks = { + selfClient: { + loadDocumentCatalog: ReturnType; + saveDocumentCatalog: ReturnType; + deleteDocument: ReturnType; + saveDocument: ReturnType; + on: ReturnType; + useProvingStore: ((selector: (state: ProvingStoreState) => unknown) => unknown) & { + getState: () => ProvingStoreState; + setState: (next: Partial | ((state: ProvingStoreState) => Partial)) => void; + }; + }; + useSelfClientMock: ReturnType; + loadSelectedDocumentMock: ReturnType; + extractNameFromDocumentMock: ReturnType; + getAllDocumentsMock: ReturnType; + generateMockDocumentMock: ReturnType; + provingState: ProvingStoreState; + reset: () => void; +}; + +type ProvingStoreState = { + currentState: string; + circuitType: string; + init: ReturnType; + setUserConfirmed: ReturnType; +}; + +const createProvingStore = () => { + const state: ProvingStoreState = { + currentState: 'idle', + circuitType: 'register', + init: vi.fn(), + setUserConfirmed: vi.fn(), + }; + + const useProvingStore = ((selector: (value: ProvingStoreState) => unknown) => + selector(state)) as SDKMocks['selfClient']['useProvingStore']; + + useProvingStore.getState = () => state; + useProvingStore.setState = next => { + const updates = typeof next === 'function' ? next(state) : next; + Object.assign(state, updates); + }; + + return { useProvingStore, state } as const; +}; + +const createSelfClient = () => { + const { useProvingStore, state } = createProvingStore(); + return { + loadDocumentCatalog: vi.fn(async () => ({ documents: [] })), + saveDocumentCatalog: vi.fn(async () => undefined), + deleteDocument: vi.fn(async () => undefined), + saveDocument: vi.fn(async () => undefined), + on: vi.fn(() => vi.fn()), + useProvingStore, + provingState: state, + }; +}; + +const selfClient = createSelfClient(); +const useSelfClientMock = vi.fn(() => selfClient); +const loadSelectedDocumentMock = vi.fn(async () => null); +const extractNameFromDocumentMock = vi.fn(async () => null); +const getAllDocumentsMock = vi.fn(async () => ({})); +const generateMockDocumentMock = vi.fn(async () => undefined); + +export const sdkMocks: SDKMocks = { + selfClient, + useSelfClientMock, + loadSelectedDocumentMock, + extractNameFromDocumentMock, + getAllDocumentsMock, + generateMockDocumentMock, + provingState: selfClient.provingState, + reset: () => { + selfClient.loadDocumentCatalog.mockReset().mockResolvedValue({ documents: [] }); + selfClient.saveDocumentCatalog.mockReset().mockResolvedValue(undefined); + selfClient.deleteDocument.mockReset().mockResolvedValue(undefined); + selfClient.saveDocument.mockReset().mockResolvedValue(undefined); + selfClient.on.mockReset().mockImplementation(() => vi.fn()); + useSelfClientMock.mockClear(); + loadSelectedDocumentMock.mockReset().mockResolvedValue(null); + extractNameFromDocumentMock.mockReset().mockResolvedValue(null); + getAllDocumentsMock.mockReset().mockResolvedValue({}); + generateMockDocumentMock.mockReset().mockResolvedValue(undefined); + selfClient.provingState.currentState = 'idle'; + selfClient.provingState.circuitType = 'register'; + selfClient.provingState.init.mockReset(); + selfClient.provingState.setUserConfirmed.mockReset(); + }, +}; + +vi.mock('@selfxyz/mobile-sdk-alpha', () => ({ + __esModule: true, + useSelfClient: useSelfClientMock, + loadSelectedDocument: loadSelectedDocumentMock, + extractNameFromDocument: extractNameFromDocumentMock, + getAllDocuments: getAllDocumentsMock, + generateMockDocument: generateMockDocumentMock, + signatureAlgorithmToStrictSignatureAlgorithm: (value: string) => value, + SdkEvents: {}, + SelfClientProvider: ({ children }: { children: React.ReactNode }) => + React.createElement(React.Fragment, null, children), + createListenersMap: () => ({ map: new Map() }), + webScannerShim: {}, +})); diff --git a/packages/mobile-sdk-demo/tests/screens/DocumentCamera.test.tsx b/packages/mobile-sdk-demo/tests/screens/DocumentCamera.test.tsx new file mode 100644 index 000000000..f4be57707 --- /dev/null +++ b/packages/mobile-sdk-demo/tests/screens/DocumentCamera.test.tsx @@ -0,0 +1,21 @@ +import React from 'react'; +import { render, screen } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; +import { describe, expect, it, vi } from 'vitest'; + +import DocumentCamera from '../../src/screens/DocumentCamera'; + +describe('DocumentCamera screen', () => { + it('shows placeholder messaging and handles back navigation', async () => { + const onBack = vi.fn(); + + render(); + + expect(screen.getByText('Document Camera')).toBeInTheDocument(); + expect(screen.getByText(/camera-based document scanning/i)).toBeInTheDocument(); + + await userEvent.click(screen.getByRole('button', { name: /back/i })); + + expect(onBack).toHaveBeenCalledTimes(1); + }); +}); diff --git a/packages/mobile-sdk-demo/tests/screens/DocumentNFCScan.test.tsx b/packages/mobile-sdk-demo/tests/screens/DocumentNFCScan.test.tsx new file mode 100644 index 000000000..219145de6 --- /dev/null +++ b/packages/mobile-sdk-demo/tests/screens/DocumentNFCScan.test.tsx @@ -0,0 +1,22 @@ +import React from 'react'; +import { render, screen } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; +import { describe, expect, it, vi } from 'vitest'; + +import DocumentNFCScan from '../../src/screens/DocumentNFCScan'; + +describe('DocumentNFCScan screen', () => { + it('presents NFC scanning guidance and responds to back presses', async () => { + const onBack = vi.fn(); + + render(); + + expect(screen.getByText('Document NFC Scan')).toBeInTheDocument(); + expect(screen.getByText(/nfc-based passport reading/i)).toBeInTheDocument(); + expect(screen.getByText(/secure data extraction/i)).toBeInTheDocument(); + + await userEvent.click(screen.getByRole('button', { name: /back/i })); + + expect(onBack).toHaveBeenCalledTimes(1); + }); +}); diff --git a/packages/mobile-sdk-demo/tests/screens/DocumentsList.test.tsx b/packages/mobile-sdk-demo/tests/screens/DocumentsList.test.tsx new file mode 100644 index 000000000..f837b4ad4 --- /dev/null +++ b/packages/mobile-sdk-demo/tests/screens/DocumentsList.test.tsx @@ -0,0 +1,133 @@ +import React from 'react'; +import { render, screen, waitFor, act } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; +import { Alert } from 'react-native'; +import { beforeEach, describe, expect, it, vi } from 'vitest'; + +import DocumentsList from '../../src/screens/DocumentsList'; +import type { DocumentCatalog } from '@selfxyz/common/dist/esm/src/utils/types.js'; +import { sdkMocks } from '../mocks/sdk'; + +const useDocumentsMock = vi.fn(); + +vi.mock('../../src/hooks/useDocuments', () => ({ + useDocuments: () => useDocumentsMock(), +})); + +describe('DocumentsList', () => { + const baseCatalog: DocumentCatalog = { documents: [] } as DocumentCatalog; + + beforeEach(() => { + useDocumentsMock.mockReset(); + sdkMocks.extractNameFromDocumentMock.mockReset().mockResolvedValue(null); + }); + + it('renders a loading indicator while documents load', () => { + useDocumentsMock.mockReturnValue({ + documents: [], + loading: true, + error: null, + deleting: null, + clearing: false, + refresh: vi.fn(), + deleteDocument: vi.fn(), + clearAllDocuments: vi.fn(), + }); + + render( {}} catalog={baseCatalog} />); + + expect(screen.getByText(/loading your documents/i)).toBeInTheDocument(); + }); + + it('shows an error state when fetching fails', () => { + useDocumentsMock.mockReturnValue({ + documents: [], + loading: false, + error: 'Boom!', + deleting: null, + clearing: false, + refresh: vi.fn(), + deleteDocument: vi.fn(), + clearAllDocuments: vi.fn(), + }); + + render( {}} catalog={baseCatalog} />); + + expect(screen.getByText(/we hit a snag/i)).toBeInTheDocument(); + expect(screen.getByText(/boom!/i)).toBeInTheDocument(); + }); + + it('renders an empty state when there are no documents', () => { + useDocumentsMock.mockReturnValue({ + documents: [], + loading: false, + error: null, + deleting: null, + clearing: false, + refresh: vi.fn(), + deleteDocument: vi.fn(), + clearAllDocuments: vi.fn(), + }); + + render( {}} catalog={baseCatalog} />); + + expect(screen.getByText(/no documents/i)).toBeInTheDocument(); + expect(screen.getByRole('button', { name: /clear all/i })).toBeDisabled(); + }); + + it('displays documents and supports delete and clear flows', async () => { + const refresh = vi.fn(); + const deleteDocument = vi.fn(async () => undefined); + const clearAllDocuments = vi.fn(async () => undefined); + const documents = [ + { + metadata: { + id: '1234567890abcdef1234', + documentType: 'mock_passport', + documentCategory: 'passport', + data: 'LINE1\nLINE2\nLINE3', + mock: true, + isRegistered: true, + }, + data: {} as any, + }, + ]; + + useDocumentsMock.mockReturnValue({ + documents, + loading: false, + error: null, + deleting: null, + clearing: false, + refresh, + deleteDocument, + clearAllDocuments, + }); + + sdkMocks.extractNameFromDocumentMock.mockResolvedValueOnce({ firstName: 'Ada', lastName: 'Lovelace' }); + + render( {}} catalog={baseCatalog} />); + + await waitFor(() => expect(refresh).toHaveBeenCalled()); + await waitFor(() => expect(screen.getByText('Ada Lovelace')).toBeInTheDocument()); + + expect(screen.getByText(/mock passport/i)).toBeInTheDocument(); + expect(screen.getByText(/registered/i)).toBeInTheDocument(); + expect(screen.getByText(/12345678…ef1234/i)).toBeInTheDocument(); + expect(screen.getByText(/line1/i)).toHaveTextContent(/LINE1\s+LINE2/); + + await userEvent.click(screen.getByRole('button', { name: /delete/i })); + expect(Alert.alert).toHaveBeenCalled(); + + const deleteAlert = vi.mocked(Alert.alert).mock.calls.at(-1); + const deleteConfirm = deleteAlert?.[2]?.find(button => button.text === 'Delete'); + await act(async () => deleteConfirm?.onPress?.()); + expect(deleteDocument).toHaveBeenCalledWith('1234567890abcdef1234'); + + await userEvent.click(screen.getByRole('button', { name: /clear all/i })); + const clearAlert = vi.mocked(Alert.alert).mock.calls.at(-1); + const clearConfirm = clearAlert?.[2]?.find(button => button.text === 'Clear All'); + await act(async () => clearConfirm?.onPress?.()); + expect(clearAllDocuments).toHaveBeenCalledTimes(1); + }); +}); diff --git a/packages/mobile-sdk-demo/tests/screens/GenerateMock.test.tsx b/packages/mobile-sdk-demo/tests/screens/GenerateMock.test.tsx new file mode 100644 index 000000000..75e7919ae --- /dev/null +++ b/packages/mobile-sdk-demo/tests/screens/GenerateMock.test.tsx @@ -0,0 +1,99 @@ +import React from 'react'; +import { render, screen, waitFor } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; +import { Alert } from 'react-native'; +import { beforeEach, describe, expect, it, vi } from 'vitest'; + +import GenerateMock from '../../src/screens/GenerateMock'; +import type { DocumentCatalog } from '@selfxyz/common/dist/esm/src/utils/types.js'; +import { sdkMocks } from '../mocks/sdk'; + +describe('GenerateMock screen', () => { + beforeEach(() => { + sdkMocks.reset(); + }); + + it('creates a new mock document and navigates to registration for the first entry', async () => { + const onNavigate = vi.fn(); + const onDocumentStored = vi.fn(); + const baseCatalog: DocumentCatalog = { documents: [] } as DocumentCatalog; + + const mockDocument = { + documentType: 'mock_passport', + documentCategory: 'passport', + mock: true, + mrz: 'LINE1\nLINE2', + } as any; + + sdkMocks.selfClient.loadDocumentCatalog.mockResolvedValueOnce(baseCatalog); + sdkMocks.generateMockDocumentMock.mockResolvedValueOnce(mockDocument); + + render( {}} onDocumentStored={onDocumentStored} />); + + const generateButton = screen.getByRole('button', { name: /generate/i }); + + await userEvent.click(generateButton); + await waitFor(() => expect(sdkMocks.selfClient.saveDocument).toHaveBeenCalledTimes(1)); + await waitFor(() => expect(onNavigate).toHaveBeenCalledWith('register')); + await waitFor(() => expect(onDocumentStored).toHaveBeenCalledTimes(1)); + + const savedCatalog = sdkMocks.selfClient.saveDocumentCatalog.mock.calls.at(-1)?.[0]; + expect(savedCatalog?.documents).toHaveLength(1); + expect(savedCatalog?.documents?.[0]).toMatchObject({ + documentType: 'mock_passport', + mock: true, + }); + expect(savedCatalog?.selectedDocumentId).toBeTruthy(); + }); + + it('alerts on success when additional documents are generated', async () => { + const onNavigate = vi.fn(); + const existingCatalog: DocumentCatalog = { + documents: [ + { + id: 'existing-doc', + documentType: 'mock_passport', + documentCategory: 'passport', + data: 'MRZ', + mock: true, + isRegistered: false, + }, + ], + } as DocumentCatalog; + + const mockDocument = { + documentType: 'mock_id_card', + documentCategory: 'id_card', + mock: true, + mrz: 'LINEA\nLINEB', + } as any; + + sdkMocks.selfClient.loadDocumentCatalog.mockResolvedValueOnce(existingCatalog); + sdkMocks.generateMockDocumentMock.mockResolvedValueOnce(mockDocument); + + render( {}} />); + + await userEvent.click(screen.getByRole('button', { name: /generate/i })); + await waitFor(() => expect(sdkMocks.selfClient.saveDocumentCatalog).toHaveBeenCalled()); + expect(onNavigate).not.toHaveBeenCalled(); + await waitFor(() => expect(Alert.alert).toHaveBeenCalledWith('Success', 'Mock document generated successfully.')); + + const savedCatalog = sdkMocks.selfClient.saveDocumentCatalog.mock.calls.at(-1)?.[0]; + expect(savedCatalog?.documents?.length).toBe(2); + }); + + it('validates age input before generating', async () => { + const baseCatalog: DocumentCatalog = { documents: [] } as DocumentCatalog; + sdkMocks.selfClient.loadDocumentCatalog.mockResolvedValueOnce(baseCatalog); + + render( {}} onBack={() => {}} />); + + const ageInput = screen.getByDisplayValue('21'); + await userEvent.clear(ageInput); + await userEvent.type(ageInput, '999'); + + await userEvent.click(screen.getByRole('button', { name: /generate/i })); + await waitFor(() => expect(screen.getByText(/age must be a number between 0 and 120/i)).toBeInTheDocument()); + expect(sdkMocks.generateMockDocumentMock).not.toHaveBeenCalled(); + }); +}); diff --git a/packages/mobile-sdk-demo/tests/screens/HomeScreen.test.tsx b/packages/mobile-sdk-demo/tests/screens/HomeScreen.test.tsx new file mode 100644 index 000000000..6d5662adf --- /dev/null +++ b/packages/mobile-sdk-demo/tests/screens/HomeScreen.test.tsx @@ -0,0 +1,43 @@ +import React from 'react'; +import { render, screen } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; +import { describe, expect, it, vi } from 'vitest'; + +import HomeScreen from '../../src/screens/HomeScreen'; +import { orderedSectionEntries, type ScreenContext } from '../../src/screens'; + +describe('HomeScreen', () => { + const createContext = (): ScreenContext => ({ + navigate: vi.fn(), + goHome: vi.fn(), + documentCatalog: { documents: [] }, + selectedDocument: null, + refreshDocuments: vi.fn(async () => undefined), + }); + + it('renders sections and menu items from the screen descriptors', () => { + const context = createContext(); + render(); + + orderedSectionEntries.forEach(section => { + expect(screen.getByText(section.title)).toBeInTheDocument(); + section.items.forEach(item => { + const buttons = screen.getAllByRole('button', { + name: new RegExp(item.title, 'i'), + }); + expect(buttons.length).toBeGreaterThan(0); + }); + }); + }); + + it('navigates to the selected descriptor when a menu item is pressed', async () => { + const context = createContext(); + render(); + + await userEvent.click(screen.getByRole('button', { name: /document list/i })); + expect(context.navigate).toHaveBeenCalledWith('documents'); + + await userEvent.click(screen.getByRole('button', { name: /generate mock document/i })); + expect(context.navigate).toHaveBeenCalledWith('generate'); + }); +}); diff --git a/packages/mobile-sdk-demo/tests/screens/ProofHistory.test.tsx b/packages/mobile-sdk-demo/tests/screens/ProofHistory.test.tsx new file mode 100644 index 000000000..157e426d2 --- /dev/null +++ b/packages/mobile-sdk-demo/tests/screens/ProofHistory.test.tsx @@ -0,0 +1,25 @@ +import React from 'react'; +import { render, screen } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; +import { describe, expect, it, vi } from 'vitest'; + +import ProofHistory from '../../src/screens/ProofHistory'; + +describe('ProofHistory screen', () => { + it('renders the mock activity feed and supports back navigation', async () => { + const onBack = vi.fn(); + + render(); + + expect(screen.getByText('Proof History')).toBeInTheDocument(); + expect(screen.getByText(/demo proof history/i)).toBeInTheDocument(); + expect(screen.getByText('DemoBank')).toBeInTheDocument(); + expect(screen.getByText('VerifyMe')).toBeInTheDocument(); + expect(screen.getByText('TravelCheck')).toBeInTheDocument(); + expect(screen.getByText(/passport verification/i)).toBeInTheDocument(); + + await userEvent.click(screen.getByRole('button', { name: /back/i })); + + expect(onBack).toHaveBeenCalledTimes(1); + }); +}); diff --git a/packages/mobile-sdk-demo/tests/screens/QRCodeViewFinder.test.tsx b/packages/mobile-sdk-demo/tests/screens/QRCodeViewFinder.test.tsx new file mode 100644 index 000000000..ee1f0c5c4 --- /dev/null +++ b/packages/mobile-sdk-demo/tests/screens/QRCodeViewFinder.test.tsx @@ -0,0 +1,22 @@ +import React from 'react'; +import { render, screen } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; +import { describe, expect, it, vi } from 'vitest'; + +import QRCodeViewFinder from '../../src/screens/QRCodeViewFinder'; + +describe('QRCodeViewFinder screen', () => { + it('highlights QR scanning capabilities and handles back navigation', async () => { + const onBack = vi.fn(); + + render(); + + expect(screen.getByText('QR Code View Finder')).toBeInTheDocument(); + expect(screen.getByText(/proof verification requests/i)).toBeInTheDocument(); + expect(screen.getByText(/real-time qr detection feedback/i)).toBeInTheDocument(); + + await userEvent.click(screen.getByRole('button', { name: /back/i })); + + expect(onBack).toHaveBeenCalledTimes(1); + }); +}); diff --git a/packages/mobile-sdk-demo/tests/screens/RegisterDocument.test.tsx b/packages/mobile-sdk-demo/tests/screens/RegisterDocument.test.tsx new file mode 100644 index 000000000..fffac5577 --- /dev/null +++ b/packages/mobile-sdk-demo/tests/screens/RegisterDocument.test.tsx @@ -0,0 +1,160 @@ +import React from 'react'; +import { act, render, screen, waitFor } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; +import { Alert } from 'react-native'; +import { beforeEach, describe, expect, it, vi } from 'vitest'; + +import RegisterDocument from '../../src/screens/RegisterDocument'; +import type { DocumentCatalog, DocumentMetadata, IDDocument } from '@selfxyz/common/dist/esm/src/utils/types.js'; +import { sdkMocks } from '../mocks/sdk'; + +let registrationState = { + registering: false, + statusMessage: '', + currentState: 'idle', + logs: [] as string[], + showLogs: false, +}; + +const startMock = vi.fn(); +const setOnCompleteMock = vi.fn(); +const toggleLogsMock = vi.fn(); +const resetMock = vi.fn(); +let onCompleteHandler: (() => Promise | void) | null = null; + +vi.mock('../../src/hooks/useRegistration', () => ({ + useRegistration: () => ({ + state: registrationState, + actions: { + start: startMock, + setOnComplete: (cb: typeof onCompleteHandler) => { + onCompleteHandler = cb; + setOnCompleteMock(cb); + }, + toggleLogs: toggleLogsMock, + reset: resetMock, + }, + }), +})); + +describe('RegisterDocument screen', () => { + beforeEach(() => { + registrationState = { + registering: false, + statusMessage: '', + currentState: 'idle', + logs: [], + showLogs: false, + }; + startMock.mockReset(); + setOnCompleteMock.mockReset(); + toggleLogsMock.mockReset(); + resetMock.mockReset(); + onCompleteHandler = null; + }); + + const createCatalog = (documents: DocumentMetadata[]): DocumentCatalog => ({ documents }) as DocumentCatalog; + + it('lists unregistered documents and triggers registration flow', async () => { + const catalog = createCatalog([ + { + id: 'doc-1', + documentType: 'mock_passport', + documentCategory: 'passport', + data: 'MRZ', + mock: true, + isRegistered: false, + }, + { + id: 'doc-2', + documentType: 'mock_id_card', + documentCategory: 'id_card', + data: 'DATA', + mock: false, + isRegistered: true, + }, + ]); + + const documentData: IDDocument = { + documentType: 'mock_passport', + documentCategory: 'passport', + mock: true, + } as IDDocument; + + sdkMocks.extractNameFromDocumentMock.mockImplementation(async (_client, id: string) => { + if (id === 'doc-1') { + return { firstName: 'Ada', lastName: 'Lovelace' }; + } + return null; + }); + sdkMocks.getAllDocumentsMock.mockResolvedValue({ + 'doc-1': { data: documentData }, + }); + sdkMocks.selfClient.saveDocumentCatalog.mockResolvedValue(undefined); + sdkMocks.selfClient.loadDocumentCatalog.mockResolvedValue(catalog); + + const onBack = vi.fn(); + const onSuccess = vi.fn(); + + render(); + + await waitFor(() => expect(screen.getByText(/ada lovelace/i)).toBeInTheDocument()); + await waitFor(() => expect(screen.getByRole('button', { name: /register document/i })).toBeEnabled()); + + await userEvent.click(screen.getByRole('button', { name: /register document/i })); + + await waitFor(() => expect(sdkMocks.selfClient.saveDocumentCatalog).toHaveBeenCalled()); + expect(startMock).toHaveBeenCalledWith('doc-1', documentData); + + await userEvent.click(screen.getByRole('button', { name: /back/i })); + expect(onBack).toHaveBeenCalledTimes(1); + + expect(setOnCompleteMock).toHaveBeenCalledWith(expect.any(Function)); + + await act(async () => { + await onCompleteHandler?.(); + }); + + await waitFor(() => expect(onSuccess).toHaveBeenCalled()); + await waitFor(() => + expect(Alert.alert).toHaveBeenCalledWith( + 'Success! 🎉', + expect.stringContaining('registered on-chain'), + expect.arrayContaining([expect.objectContaining({ text: 'OK' })]), + ), + ); + + const alertCall = vi.mocked(Alert.alert).mock.calls.at(-1); + const okButton = alertCall?.[2]?.find(button => button.text === 'OK'); + await act(async () => okButton?.onPress?.()); + + expect(resetMock).toHaveBeenCalled(); + }); + + it('shows an empty state when no unregistered documents exist', () => { + const catalog = createCatalog([]); + + render( {}} />); + + expect(screen.getByText(/no unregistered documents available/i)).toBeInTheDocument(); + }); + + it('displays a not found message when the selected document cannot be loaded', async () => { + const catalog = createCatalog([ + { + id: 'missing-doc', + documentType: 'mock_passport', + documentCategory: 'passport', + data: 'MRZ', + mock: true, + isRegistered: false, + }, + ]); + + sdkMocks.getAllDocumentsMock.mockResolvedValue({}); + + render( {}} />); + + await waitFor(() => expect(screen.getByText(/document not found/i)).toBeInTheDocument()); + }); +}); diff --git a/packages/mobile-sdk-demo/tests/screens/index.test.ts b/packages/mobile-sdk-demo/tests/screens/index.test.ts new file mode 100644 index 000000000..c32611f85 --- /dev/null +++ b/packages/mobile-sdk-demo/tests/screens/index.test.ts @@ -0,0 +1,51 @@ +import { describe, expect, it, vi } from 'vitest'; + +import { orderedSectionEntries, screenDescriptors, screenMap, type ScreenContext } from '../../src/screens'; + +describe('screen descriptor index', () => { + const createContext = (): ScreenContext => ({ + navigate: vi.fn(), + goHome: vi.fn(), + documentCatalog: { documents: [] }, + selectedDocument: null, + refreshDocuments: vi.fn(async () => undefined), + }); + + it('exposes each descriptor via the screenMap', () => { + screenDescriptors.forEach(descriptor => { + expect(screenMap[descriptor.id]).toBe(descriptor); + }); + }); + + it('groups descriptors into ordered sections', () => { + const flattenedFromSections = orderedSectionEntries.flatMap(section => { + section.items.forEach(item => { + expect(item.sectionTitle).toBe(section.title); + }); + return section.items.map(item => item.id); + }); + + const descriptorOrder = screenDescriptors.map(descriptor => descriptor.id); + expect(flattenedFromSections).toEqual(descriptorOrder); + }); + + it('builds props that respect the provided screen context', async () => { + const context = createContext(); + + const generateProps = screenMap.generate.getProps?.(context) as any; + expect(generateProps).toMatchObject({ onDocumentStored: context.refreshDocuments }); + await generateProps?.onNavigate?.('documents'); + expect(context.navigate).toHaveBeenCalledWith('documents'); + generateProps?.onBack?.(); + expect(context.navigate).toHaveBeenCalledWith('home'); + + const registerProps = screenMap.register.getProps?.(context) as any; + registerProps?.onSuccess?.(); + expect(context.refreshDocuments).toHaveBeenCalled(); + + const documentsProps = screenMap.documents.getProps?.(context) as any; + expect(documentsProps).toMatchObject({ catalog: context.documentCatalog }); + documentsProps?.onBack?.(); + expect(context.navigate).toHaveBeenCalledWith('home'); + }); +}); diff --git a/packages/mobile-sdk-demo/tests/setup.ts b/packages/mobile-sdk-demo/tests/setup.ts index 9783332af..2a81c4f72 100644 --- a/packages/mobile-sdk-demo/tests/setup.ts +++ b/packages/mobile-sdk-demo/tests/setup.ts @@ -2,13 +2,44 @@ // SPDX-License-Identifier: BUSL-1.1 // NOTE: Converts to Apache-2.0 on 2029-06-11 per LICENSE. +import '@testing-library/jest-dom/vitest'; +import React, { createElement, forwardRef } from 'react'; +import { beforeEach, vi } from 'vitest'; + +import { sdkMocks } from './mocks/sdk'; + +vi.mock('@selfxyz/common', async () => { + const actual = await vi.importActual('../../../common/dist/cjs/index.cjs'); + const nodeCrypto = await import('node:crypto'); + + const polyfill = { + createHash: nodeCrypto.createHash.bind(nodeCrypto) as typeof nodeCrypto.createHash, + createHmac: nodeCrypto.createHmac.bind(nodeCrypto) as typeof nodeCrypto.createHmac, + randomBytes: nodeCrypto.randomBytes.bind(nodeCrypto) as typeof nodeCrypto.randomBytes, + pbkdf2Sync: nodeCrypto.pbkdf2Sync.bind(nodeCrypto) as typeof nodeCrypto.pbkdf2Sync, + }; + + const calculateContentHash = actual.calculateContentHash + ? actual.calculateContentHash + : (value: unknown) => + nodeCrypto + .createHash('sha256') + .update(typeof value === 'string' ? value : JSON.stringify(value)) + .digest('hex'); + + return { + ...actual, + ...polyfill, + calculateContentHash, + cryptoPolyfill: polyfill, + }; +}); + /** * Vitest setup file for mobile-sdk-demo tests * Mocks React Native modules and reduces console noise */ -import { vi } from 'vitest'; - const originalConsole = { warn: console.warn, error: console.error, @@ -19,36 +50,217 @@ const shouldShowOutput = process.env.DEBUG_TESTS === 'true'; // Suppress console noise in tests unless explicitly debugging if (!shouldShowOutput) { - console.warn = () => {}; // Suppress warnings - console.error = () => {}; // Suppress errors - console.log = () => {}; // Suppress logs + console.warn = () => {}; + console.error = () => {}; + console.log = () => {}; } // Restore console for debugging if needed -if (typeof global !== 'undefined') { - (global as any).restoreConsole = () => { +if (typeof globalThis !== 'undefined') { + (globalThis as any).restoreConsole = () => { console.warn = originalConsole.warn; console.error = originalConsole.error; console.log = originalConsole.log; }; + (globalThis as any).sdkMocks = sdkMocks; } -// Mock React Native modules +const flattenStyle = (style: any): Record | undefined => { + if (!style) return undefined; + if (Array.isArray(style)) { + return style.reduce>((acc, item) => { + const flat = flattenStyle(item); + return flat ? { ...acc, ...flat } : acc; + }, {}); + } + if (typeof style === 'number') { + return { ['data-style-token']: style }; + } + if (typeof style === 'object') { + return style as Record; + } + return undefined; +}; + +const createDomComponent = (tag: string) => + forwardRef(({ children, style, testID, ...props }, ref) => + createElement(tag, { ref, style: flattenStyle(style), 'data-testid': testID, ...props }, children), + ); + +const TouchableOpacity = forwardRef( + ({ children, onPress, disabled, style, testID, accessibilityRole, ...props }, ref) => + createElement( + 'button', + { + type: 'button', + ref, + disabled: Boolean(disabled), + style: flattenStyle(style), + 'data-testid': testID, + 'aria-busy': props['aria-busy'], + 'aria-disabled': disabled ? 'true' : undefined, + 'data-role': accessibilityRole, + onClick: disabled + ? undefined + : (event: React.MouseEvent) => { + event.preventDefault(); + onPress?.(); + }, + ...props, + }, + children, + ), +); + +const ScrollView = forwardRef(({ children, style, contentContainerStyle, testID, ...props }, ref) => + createElement( + 'div', + { ref, style: flattenStyle(style), 'data-testid': testID, ...props }, + createElement('div', { style: flattenStyle(contentContainerStyle) }, children), + ), +); + +const Pressable = forwardRef(({ children, onPress, disabled, style, testID, ...props }, ref) => + createElement( + 'button', + { + type: 'button', + ref, + disabled: Boolean(disabled), + style: flattenStyle(style), + 'data-testid': testID, + onClick: disabled + ? undefined + : (event: React.MouseEvent) => { + event.preventDefault(); + onPress?.(); + }, + ...props, + }, + children, + ), +); + +const TextInput = forwardRef( + ({ onChangeText, value, secureTextEntry, style, testID, keyboardType, ...props }, ref) => + createElement('input', { + ref, + value, + style: flattenStyle(style), + type: secureTextEntry ? 'password' : 'text', + inputMode: keyboardType === 'numeric' ? 'numeric' : undefined, + 'data-testid': testID, + onChange: (event: React.ChangeEvent) => { + const target = event.target as any; + onChangeText?.(target.value); + }, + ...props, + }), +); + +const Switch = ({ + value, + onValueChange, + testID, +}: { + value: boolean; + onValueChange?: (next: boolean) => void; + testID?: string; +}) => + createElement('input', { + type: 'checkbox', + checked: value, + 'data-testid': testID, + onChange: (event: React.ChangeEvent) => { + const target = event.target as any; + onValueChange?.(target.checked); + }, + }); + +const Button = ({ + title, + onPress, + disabled, + testID, +}: { + title: string; + onPress?: () => void; + disabled?: boolean; + testID?: string; +}) => + createElement( + 'button', + { + type: 'button', + disabled: Boolean(disabled), + onClick: disabled + ? undefined + : (event: React.MouseEvent) => { + event.preventDefault(); + onPress?.(); + }, + 'data-testid': testID, + }, + title, + ); + +const Modal = ({ visible, children, testID }: { visible: boolean; children: React.ReactNode; testID?: string }) => + visible ? createElement('div', { 'data-testid': testID }, children) : null; + +const SafeAreaView = createDomComponent('div'); + +const FlatList = ({ + data = [], + renderItem, + keyExtractor, + testID, +}: { + data?: any[]; + renderItem: ({ item, index }: { item: any; index: number }) => React.ReactNode; + keyExtractor?: (item: any, index: number) => string; + testID?: string; +}) => + createElement( + 'div', + { 'data-testid': testID }, + data.map((item, index) => + createElement( + React.Fragment, + { key: keyExtractor ? keyExtractor(item, index) : index }, + renderItem({ item, index }), + ), + ), + ); + +const ActivityIndicator = ({ testID, accessibilityLabel }: { testID?: string; accessibilityLabel?: string }) => + createElement('div', { + role: 'status', + 'aria-label': accessibilityLabel ?? 'loading', + 'data-testid': testID, + }); + +const alertSpy = vi.fn(); + +beforeEach(() => { + sdkMocks.reset(); + alertSpy.mockReset(); +}); + vi.mock('react-native', () => ({ + __esModule: true, Platform: { OS: 'ios', select: (obj: Record) => (Object.prototype.hasOwnProperty.call(obj, 'ios') ? obj.ios : obj.default), }, + Dimensions: { + get: () => ({ width: 375, height: 812, scale: 2 }), + }, + PixelRatio: { + get: () => 2, + }, NativeModules: { PlatformConstants: { - getConstants: () => ({ - isTesting: true, - reactNativeVersion: { - major: 0, - minor: 76, - patch: 9, - }, - }), + getConstants: () => ({ isTesting: true }), }, DeviceInfo: { getConstants: () => ({ @@ -59,16 +271,10 @@ vi.mock('react-native', () => ({ PixelRatio: 2, }), }, - StatusBarManager: { - getConstants: () => ({}), - }, - Appearance: { - getConstants: () => ({}), - }, + StatusBarManager: { getConstants: () => ({}) }, + Appearance: { getConstants: () => ({ colorScheme: 'light' }) }, SourceCode: { - getConstants: () => ({ - scriptURL: 'http://localhost:8081/index.bundle?platform=ios&dev=true', - }), + getConstants: () => ({ scriptURL: 'http://localhost/index.bundle' }), }, UIManager: { getConstants: () => ({}), @@ -85,48 +291,95 @@ vi.mock('react-native', () => ({ removeListeners: vi.fn(), }, }, - requireNativeComponent: vi.fn(() => 'div'), StyleSheet: { - create: vi.fn(styles => styles), + create: (styles: Record) => styles, + flatten: flattenStyle, + hairlineWidth: 0.5, }, + View: createDomComponent('div'), + Text: createDomComponent('span'), + ScrollView, + TextInput, + Pressable, + Button, + Switch, + Modal, + SafeAreaView, + FlatList, + TouchableOpacity, + ActivityIndicator, + Alert: { alert: alertSpy }, +})); + +// Mock safe area context primitives +vi.mock('react-native-safe-area-context', () => ({ + __esModule: true, + SafeAreaProvider: ({ children }: { children: React.ReactNode }) => createElement('div', null, children), + SafeAreaView: forwardRef(({ children, style, testID }, ref) => + createElement('div', { ref, style: flattenStyle(style), 'data-testid': testID }, children), + ), + useSafeAreaInsets: () => ({ top: 0, bottom: 0, left: 0, right: 0 }), +})); + +// Mock vector icons +vi.mock('react-native-vector-icons/Ionicons', () => ({ + __esModule: true, + default: ({ name, testID }: { name: string; testID?: string }) => + createElement('span', { 'data-icon': name, 'data-testid': testID }, name), })); // Mock @react-native-async-storage/async-storage +const asyncStorageStore = new Map(); +const asyncStorageApi = { + setItem: vi.fn(async (key: string, value: string) => { + asyncStorageStore.set(key, value); + }), + getItem: vi.fn(async (key: string) => asyncStorageStore.get(key) ?? null), + removeItem: vi.fn(async (key: string) => { + asyncStorageStore.delete(key); + }), + clear: vi.fn(async () => { + asyncStorageStore.clear(); + }), + getAllKeys: vi.fn(async () => Array.from(asyncStorageStore.keys())), + multiGet: vi.fn(async (keys: string[]) => keys.map(key => [key, asyncStorageStore.get(key) ?? null] as const)), + multiSet: vi.fn(async (entries: Array<[string, string]>) => { + entries.forEach(([key, value]) => asyncStorageStore.set(key, value)); + }), + multiRemove: vi.fn(async (keys: string[]) => { + keys.forEach(key => asyncStorageStore.delete(key)); + }), +}; + vi.mock('@react-native-async-storage/async-storage', () => ({ - default: { - setItem: vi.fn(() => Promise.resolve()), - getItem: vi.fn(() => Promise.resolve(null)), - removeItem: vi.fn(() => Promise.resolve()), - clear: vi.fn(() => Promise.resolve()), - getAllKeys: vi.fn(() => Promise.resolve([])), - multiGet: vi.fn(() => Promise.resolve([])), - multiSet: vi.fn(() => Promise.resolve()), - multiRemove: vi.fn(() => Promise.resolve()), - }, + __esModule: true, + default: asyncStorageApi, + ...asyncStorageApi, })); // Mock react-native-keychain with in-memory storage const keychainStore: Record = {}; -const mockSetGenericPassword = vi.fn((username: string, password: string, options?: { service?: string }) => { +const mockSetGenericPassword = vi.fn(async (username: string, password: string, options?: { service?: string }) => { const key = options?.service || 'default'; keychainStore[key] = { username, password }; - return Promise.resolve(true); + return true; }); -const mockGetGenericPassword = vi.fn((options?: { service?: string }) => { +const mockGetGenericPassword = vi.fn(async (options?: { service?: string }) => { const key = options?.service || 'default'; const credentials = keychainStore[key]; - return Promise.resolve(credentials || false); + return credentials || false; }); -const mockResetGenericPassword = vi.fn((options?: { service?: string }) => { +const mockResetGenericPassword = vi.fn(async (options?: { service?: string }) => { const key = options?.service || 'default'; delete keychainStore[key]; - return Promise.resolve(true); + return true; }); vi.mock('react-native-keychain', () => ({ + __esModule: true, default: { setGenericPassword: mockSetGenericPassword, getGenericPassword: mockGetGenericPassword, @@ -143,10 +396,17 @@ vi.mock('react-native-keychain', () => ({ // Mock react-native-get-random-values vi.mock('react-native-get-random-values', () => ({ + __esModule: true, polyfillGlobal: vi.fn(), })); -// Mock window.matchMedia +// Mock SVG asset used on the home screen +vi.mock('../src/assets/images/logo.svg', () => ({ + __esModule: true, + default: (props: Record) => createElement('svg', { 'data-testid': 'logo', ...props }), +})); + +// Ensure window.matchMedia exists for libraries relying on it if (typeof (globalThis as any).window !== 'undefined') { Object.defineProperty((globalThis as any).window, 'matchMedia', { writable: true, diff --git a/packages/mobile-sdk-demo/tests/utils/document.test.ts b/packages/mobile-sdk-demo/tests/utils/document.test.ts index 2e99ef94c..4f9797473 100644 --- a/packages/mobile-sdk-demo/tests/utils/document.test.ts +++ b/packages/mobile-sdk-demo/tests/utils/document.test.ts @@ -10,12 +10,12 @@ import { formatDataPreview, humanizeDocumentType, maskId } from '../../src/utils describe('document utils', () => { describe('humanizeDocumentType', () => { - it('formats mock_* types with Mock prefix and capitalization', () => { + it('adds a Mock prefix for mock document identifiers', () => { expect(humanizeDocumentType('mock_passport')).toBe('Mock Passport'); - expect(humanizeDocumentType('mock_id_card')).toBe('Mock Id card'.replace(/\b\w/g, c => c.toUpperCase())); + expect(humanizeDocumentType('mock_driver_license')).toBe('Mock Driver License'); }); - it('formats non-mock types by replacing underscores and capitalizing words', () => { + it('converts underscores into spaces and capitalises words', () => { expect(humanizeDocumentType('eu_id_card')).toBe('Eu Id Card'); expect(humanizeDocumentType('aadhaar')).toBe('Aadhaar'); }); @@ -32,17 +32,17 @@ describe('document utils', () => { isRegistered: false, }) as DocumentMetadata; - it('returns a friendly message when no data present', () => { + it('returns a friendly message when no data is available', () => { expect(formatDataPreview(baseMeta(''))).toBe('No preview available'); expect(formatDataPreview(baseMeta(undefined as unknown as string))).toBe('No preview available'); }); - it('returns first two lines joined by newline', () => { - const meta = baseMeta('LINE1\nLINE2\nLINE3'); + it('normalises newlines and limits the preview to two lines', () => { + const meta = baseMeta('LINE1\r\nLINE2\r\nLINE3'); expect(formatDataPreview(meta)).toBe('LINE1\nLINE2'); }); - it('truncates to 120 chars with ellipsis', () => { + it('truncates long previews to 120 characters with an ellipsis', () => { const long = 'A'.repeat(200); const meta = baseMeta(`${long}\nNEXT`); const preview = formatDataPreview(meta); @@ -52,12 +52,12 @@ describe('document utils', () => { }); describe('maskId', () => { - it('masks id with 8-char prefix and 6-char suffix', () => { + it('preserves an 8 character prefix and 6 character suffix for long identifiers', () => { const id = '12345678abcdefghij123456'; expect(maskId(id)).toBe('12345678…123456'); }); - it('handles short ids gracefully', () => { + it('omits the ellipsis when the identifier is shorter than the threshold', () => { expect(maskId('123456')).toBe('123456'); expect(maskId('1234567')).toBe('1234567'); expect(maskId('12345678')).toBe('12345678'); diff --git a/yarn.lock b/yarn.lock index ceb6c1289..5d724a06c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5,6 +5,13 @@ __metadata: version: 8 cacheKey: 10c0 +"@adobe/css-tools@npm:^4.4.0": + version: 4.4.4 + resolution: "@adobe/css-tools@npm:4.4.4" + checksum: 10c0/8f3e6cfaa5e6286e6f05de01d91d060425be2ebaef490881f5fe6da8bbdb336835c5d373ea337b0c3b0a1af4be048ba18780f0f6021d30809b4545922a7e13d9 + languageName: node + linkType: hard + "@adraffy/ens-normalize@npm:1.10.1": version: 1.10.1 resolution: "@adraffy/ens-normalize@npm:1.10.1" @@ -176,25 +183,25 @@ __metadata: languageName: node linkType: hard -"@angular-devkit/architect@npm:0.2003.3, @angular-devkit/architect@npm:>= 0.2000.0 < 0.2100.0": - version: 0.2003.3 - resolution: "@angular-devkit/architect@npm:0.2003.3" +"@angular-devkit/architect@npm:0.2003.4, @angular-devkit/architect@npm:>= 0.2000.0 < 0.2100.0": + version: 0.2003.4 + resolution: "@angular-devkit/architect@npm:0.2003.4" dependencies: - "@angular-devkit/core": "npm:20.3.3" + "@angular-devkit/core": "npm:20.3.4" rxjs: "npm:7.8.2" - checksum: 10c0/7e72e032e2d870e9e14ba296e65d28a2f0486a554b90d7e40660a9faab154ee0f0b77f57f63d58386719534137168ae31ecf06005b7c033562f2c1ae30c257f4 + checksum: 10c0/18a24dfbf6eb921c52671ecdb76b550e0c508aff8698d571f828bde01b16879445374155e0e3ad5cd8624a2ecff566702ca6c29e11187afeda1eb5718b6afd94 languageName: node linkType: hard "@angular-devkit/build-angular@npm:^20.3.0": - version: 20.3.3 - resolution: "@angular-devkit/build-angular@npm:20.3.3" + version: 20.3.4 + resolution: "@angular-devkit/build-angular@npm:20.3.4" dependencies: "@ampproject/remapping": "npm:2.3.0" - "@angular-devkit/architect": "npm:0.2003.3" - "@angular-devkit/build-webpack": "npm:0.2003.3" - "@angular-devkit/core": "npm:20.3.3" - "@angular/build": "npm:20.3.3" + "@angular-devkit/architect": "npm:0.2003.4" + "@angular-devkit/build-webpack": "npm:0.2003.4" + "@angular-devkit/core": "npm:20.3.4" + "@angular/build": "npm:20.3.4" "@babel/core": "npm:7.28.3" "@babel/generator": "npm:7.28.3" "@babel/helper-annotate-as-pure": "npm:7.27.3" @@ -205,7 +212,7 @@ __metadata: "@babel/preset-env": "npm:7.28.3" "@babel/runtime": "npm:7.28.3" "@discoveryjs/json-ext": "npm:0.6.3" - "@ngtools/webpack": "npm:20.3.3" + "@ngtools/webpack": "npm:20.3.4" ansi-colors: "npm:4.1.3" autoprefixer: "npm:10.4.21" babel-loader: "npm:10.0.0" @@ -252,7 +259,7 @@ __metadata: "@angular/platform-browser": ^20.0.0 "@angular/platform-server": ^20.0.0 "@angular/service-worker": ^20.0.0 - "@angular/ssr": ^20.3.3 + "@angular/ssr": ^20.3.4 "@web/test-runner": ^0.20.0 browser-sync: ^3.0.2 jest: ^29.5.0 @@ -294,26 +301,26 @@ __metadata: optional: true tailwindcss: optional: true - checksum: 10c0/5b1de39370f761458feb00de1751afe0bde9ff3617925a9b457cfd0145ed51d03c6976724a0dd4f7d5203b78b75ef969de833890cbbd00073736634cc52cc7ef + checksum: 10c0/88bc7f4c4bd6db1cb43caaadef0800a64bf69f4e98ba504429a06fc7d30072ad27695b6b9eb92a5bc2ac28670de29b7952716c6652f447932b3e584e9a6e0cb0 languageName: node linkType: hard -"@angular-devkit/build-webpack@npm:0.2003.3": - version: 0.2003.3 - resolution: "@angular-devkit/build-webpack@npm:0.2003.3" +"@angular-devkit/build-webpack@npm:0.2003.4": + version: 0.2003.4 + resolution: "@angular-devkit/build-webpack@npm:0.2003.4" dependencies: - "@angular-devkit/architect": "npm:0.2003.3" + "@angular-devkit/architect": "npm:0.2003.4" rxjs: "npm:7.8.2" peerDependencies: webpack: ^5.30.0 webpack-dev-server: ^5.0.2 - checksum: 10c0/d6cfa16abb87334ddfad8717146e41e5eb458a00e3bbf4803ffda81e7ffe6ba56065696ea64fe6d4764fc8093553943eec33f647a9db45268cf457cf92e9329c + checksum: 10c0/3ac356208382be8b066326c09c5967df019a989c069a42648fbf862f5eb36f356511f2c7ed8dc94956d244c677bc8de2e3436c8a9b5a1d4e21a66b70f0fa3755 languageName: node linkType: hard -"@angular-devkit/core@npm:20.3.3, @angular-devkit/core@npm:>= 20.0.0 < 21.0.0": - version: 20.3.3 - resolution: "@angular-devkit/core@npm:20.3.3" +"@angular-devkit/core@npm:20.3.4, @angular-devkit/core@npm:>= 20.0.0 < 21.0.0": + version: 20.3.4 + resolution: "@angular-devkit/core@npm:20.3.4" dependencies: ajv: "npm:8.17.1" ajv-formats: "npm:3.0.1" @@ -326,20 +333,20 @@ __metadata: peerDependenciesMeta: chokidar: optional: true - checksum: 10c0/f141ba8c2bbaee54b110e24a170921055a9a22a04ccb22c85e9d26f5692f4545f0af4ffb96334bfa764593e41de3cd611a58b18d1d48ec401d936cf9247a712d + checksum: 10c0/1a7dc93244afb941bf1cbe3550a320b7f695e4ddc6bf3efc90f130aaa26dde7b3d17aa7174956fdcc8bf8a22d1726b9f0b799e30264051fe0330489e90a7d846 languageName: node linkType: hard -"@angular-devkit/schematics@npm:20.3.3, @angular-devkit/schematics@npm:>= 20.0.0 < 21.0.0": - version: 20.3.3 - resolution: "@angular-devkit/schematics@npm:20.3.3" +"@angular-devkit/schematics@npm:20.3.4, @angular-devkit/schematics@npm:>= 20.0.0 < 21.0.0": + version: 20.3.4 + resolution: "@angular-devkit/schematics@npm:20.3.4" dependencies: - "@angular-devkit/core": "npm:20.3.3" + "@angular-devkit/core": "npm:20.3.4" jsonc-parser: "npm:3.3.1" magic-string: "npm:0.30.17" ora: "npm:8.2.0" rxjs: "npm:7.8.2" - checksum: 10c0/f110e6f2d1ae5bba56599435c564924afd9842bc4b1873752f0f72a7df725c0848d2bb8a67a3b96c92d8c393c61073d16138047138fa5f09c06355a4fa67f554 + checksum: 10c0/ddd257ac680440e40d5c6f59c15b08e906ac43687798b14374cfbcac44d08b2d3355bac4852cb76e8751eefa7798cafc2c44774d6dc50398d27b19e2b6f8226d languageName: node linkType: hard @@ -438,22 +445,22 @@ __metadata: linkType: hard "@angular/animations@npm:^20.3.0": - version: 20.3.2 - resolution: "@angular/animations@npm:20.3.2" + version: 20.3.3 + resolution: "@angular/animations@npm:20.3.3" dependencies: tslib: "npm:^2.3.0" peerDependencies: - "@angular/core": 20.3.2 - checksum: 10c0/45912f113ca449ac31d0253648733d27342430a31f7d1bf3fd3600465080453ffdd8665bf5be61cdbe66fe1d67cd1fe4792d3e8ecd65058c6e51b223740f0826 + "@angular/core": 20.3.3 + checksum: 10c0/bf4b06d2cbdb1303602b362389d02c0ce435f1638913c5f579a42b0453d322810e87c2d72809aee8415610ab640dc1b3a9ab620d548ccbc6ace3ded9c7e0c8e3 languageName: node linkType: hard -"@angular/build@npm:20.3.3": - version: 20.3.3 - resolution: "@angular/build@npm:20.3.3" +"@angular/build@npm:20.3.4": + version: 20.3.4 + resolution: "@angular/build@npm:20.3.4" dependencies: "@ampproject/remapping": "npm:2.3.0" - "@angular-devkit/architect": "npm:0.2003.3" + "@angular-devkit/architect": "npm:0.2003.4" "@babel/core": "npm:7.28.3" "@babel/helper-annotate-as-pure": "npm:7.27.3" "@babel/helper-split-export-declaration": "npm:7.24.7" @@ -472,7 +479,7 @@ __metadata: parse5-html-rewriting-stream: "npm:8.0.0" picomatch: "npm:4.0.3" piscina: "npm:5.1.3" - rolldown: "npm:1.0.0-beta.38" + rollup: "npm:4.52.3" sass: "npm:1.90.0" semver: "npm:7.7.2" source-map-support: "npm:0.5.21" @@ -487,7 +494,7 @@ __metadata: "@angular/platform-browser": ^20.0.0 "@angular/platform-server": ^20.0.0 "@angular/service-worker": ^20.0.0 - "@angular/ssr": ^20.3.3 + "@angular/ssr": ^20.3.4 karma: ^6.4.0 less: ^4.2.0 ng-packagr: ^20.0.0 @@ -524,21 +531,21 @@ __metadata: optional: true vitest: optional: true - checksum: 10c0/a1e473820b6c930bc86edd53c18636e482036348b531796bed691592b159c6c412e7110ff70e87455287f233aa4a0e96e27037e82b4dfb43148f23073b923364 + checksum: 10c0/0a5df215b8ae9463dc9e198e09d008b3317d2da0a8eaed1fffc51b9f6e73e9f6be0a2f2727cf2943ddf4a221c37a82cbcc24419f490ff580d0dd66d85266d2c0 languageName: node linkType: hard "@angular/cli@npm:^20.3.0": - version: 20.3.3 - resolution: "@angular/cli@npm:20.3.3" + version: 20.3.4 + resolution: "@angular/cli@npm:20.3.4" dependencies: - "@angular-devkit/architect": "npm:0.2003.3" - "@angular-devkit/core": "npm:20.3.3" - "@angular-devkit/schematics": "npm:20.3.3" + "@angular-devkit/architect": "npm:0.2003.4" + "@angular-devkit/core": "npm:20.3.4" + "@angular-devkit/schematics": "npm:20.3.4" "@inquirer/prompts": "npm:7.8.2" "@listr2/prompt-adapter-inquirer": "npm:3.0.1" "@modelcontextprotocol/sdk": "npm:1.17.3" - "@schematics/angular": "npm:20.3.3" + "@schematics/angular": "npm:20.3.4" "@yarnpkg/lockfile": "npm:1.1.0" algoliasearch: "npm:5.35.0" ini: "npm:5.0.0" @@ -552,25 +559,25 @@ __metadata: zod: "npm:3.25.76" bin: ng: bin/ng.js - checksum: 10c0/ef5e7eede5578034e97e712dd545714b0e55a9eff65ad14ac6c76335704727e28452a74956df98f1890617628f4021d3ec37c8c42b3e37d64b0b9a0b58c56f36 + checksum: 10c0/278960777ca935c809772bd09141ecd1f27b319e832e8abef5c715b2b38e528be3302fca1feb2fb6e82e4082d00d256be241123f1828d0b806bfc20d982de71c languageName: node linkType: hard "@angular/common@npm:^20.3.0": - version: 20.3.2 - resolution: "@angular/common@npm:20.3.2" + version: 20.3.3 + resolution: "@angular/common@npm:20.3.3" dependencies: tslib: "npm:^2.3.0" peerDependencies: - "@angular/core": 20.3.2 + "@angular/core": 20.3.3 rxjs: ^6.5.3 || ^7.4.0 - checksum: 10c0/4a7bd6b30b83efdaccce2dbfa4f8bbd6f59b2519f4f0c493e983c904be7a9ec741095767d47a8434ab2babf04159730b2cef8d3c0692046a573576120c428046 + checksum: 10c0/5cfc57e58d5874e0f6c4a13e1bcbe7ffd70fb9e4fe74e236235b7616b6116fead8d15580eea911c66da4cbe47fcf6ddfc62fe4f053b3cf3f59740895a8ffb5b9 languageName: node linkType: hard "@angular/compiler-cli@npm:^20.3.0": - version: 20.3.2 - resolution: "@angular/compiler-cli@npm:20.3.2" + version: 20.3.3 + resolution: "@angular/compiler-cli@npm:20.3.3" dependencies: "@babel/core": "npm:7.28.3" "@jridgewell/sourcemap-codec": "npm:^1.4.14" @@ -581,7 +588,7 @@ __metadata: tslib: "npm:^2.3.0" yargs: "npm:^18.0.0" peerDependencies: - "@angular/compiler": 20.3.2 + "@angular/compiler": 20.3.3 typescript: ">=5.8 <6.0" peerDependenciesMeta: typescript: @@ -589,26 +596,26 @@ __metadata: bin: ng-xi18n: bundles/src/bin/ng_xi18n.js ngc: bundles/src/bin/ngc.js - checksum: 10c0/04482f988aa4012a13b2ca8efbc2febfcb901022c1d56dfc16c13c93a29aea2da1da4ee3d1cac709aa64401257ff6a147fec686de25b61d09abd2d10c44b0eaf + checksum: 10c0/26ea196a383db321485e6ce77f787ace7c171015a12b1849983fd0c7f131c0467f23da31e42f76530abade656c8545fa8859f213bcda74efeaef4877bd5d8f1a languageName: node linkType: hard "@angular/compiler@npm:^20.3.0": - version: 20.3.2 - resolution: "@angular/compiler@npm:20.3.2" + version: 20.3.3 + resolution: "@angular/compiler@npm:20.3.3" dependencies: tslib: "npm:^2.3.0" - checksum: 10c0/13f9ce84a6ecd5748c008cf6d79ef1a6a0fd5647ae86ae8f409a1e51532d66c2c84f729b793114f048dda6d07d7cebcc394533fe27eb0d7225c6bf646f1e404c + checksum: 10c0/affcf730a765b66328d21361ee1b26be04e8b83087c615eb96bcd6f3d0d8c995626ed3213f966db525a51a33d4dd6146f998b69c8377c4bfd349b4312ae2a9e9 languageName: node linkType: hard "@angular/core@npm:^20.3.0": - version: 20.3.2 - resolution: "@angular/core@npm:20.3.2" + version: 20.3.3 + resolution: "@angular/core@npm:20.3.3" dependencies: tslib: "npm:^2.3.0" peerDependencies: - "@angular/compiler": 20.3.2 + "@angular/compiler": 20.3.3 rxjs: ^6.5.3 || ^7.4.0 zone.js: ~0.15.0 peerDependenciesMeta: @@ -616,37 +623,37 @@ __metadata: optional: true zone.js: optional: true - checksum: 10c0/7eac9f334ed1a6927e031cbb099eda471f55c527c7546cc920885031c123594ab9ac36f253c8eb77f68b0b19ca6efd2b722d6aa45ab158ce4b19869e2f9f823e + checksum: 10c0/af10e914c98e4e4a5cb2a0548da9f9ec34c8cd6a750c3c25f2ca56c27286b33b3959bef2d6cc2cdea259593cde227b51ccc1eda745e03d45b5f65042b1156b16 languageName: node linkType: hard "@angular/platform-browser-dynamic@npm:^20.3.0": - version: 20.3.2 - resolution: "@angular/platform-browser-dynamic@npm:20.3.2" + version: 20.3.3 + resolution: "@angular/platform-browser-dynamic@npm:20.3.3" dependencies: tslib: "npm:^2.3.0" peerDependencies: - "@angular/common": 20.3.2 - "@angular/compiler": 20.3.2 - "@angular/core": 20.3.2 - "@angular/platform-browser": 20.3.2 - checksum: 10c0/9e3c03cbe9c3176cd1d8aaff721a453a0eb4299fd1b78c9fa7ab980ad82016876a635656b9dad10624ba27d97e1f65e2e79e5279bc41f2f0d46d833463dcd247 + "@angular/common": 20.3.3 + "@angular/compiler": 20.3.3 + "@angular/core": 20.3.3 + "@angular/platform-browser": 20.3.3 + checksum: 10c0/eed6c7b7baea183aca02a4f172dffd99c8b96caaefaa1e66bc016ae53bae32390745daf15f3cf15e403d6c57d8571d959b20d2a97201b20808ee272da134dbae languageName: node linkType: hard "@angular/platform-browser@npm:^20.3.0": - version: 20.3.2 - resolution: "@angular/platform-browser@npm:20.3.2" + version: 20.3.3 + resolution: "@angular/platform-browser@npm:20.3.3" dependencies: tslib: "npm:^2.3.0" peerDependencies: - "@angular/animations": 20.3.2 - "@angular/common": 20.3.2 - "@angular/core": 20.3.2 + "@angular/animations": 20.3.3 + "@angular/common": 20.3.3 + "@angular/core": 20.3.3 peerDependenciesMeta: "@angular/animations": optional: true - checksum: 10c0/121cca56cef5f6218db20a4c6509d670c3da7f587bea4286e98d098a34eef4ae43294a049c211b8082770699c6771283b310b6033b74383d067822d85cc7de94 + checksum: 10c0/b18881936425c4792b3f6f7f644ab6f2aa9a0578b360a23c4c81f05b0db995d4b6effc4577951c4396abe3a839229874b43e4ae607570df625b522e4dbb5495a languageName: node linkType: hard @@ -4808,24 +4815,24 @@ __metadata: linkType: hard "@napi-rs/wasm-runtime@npm:^1.0.5": - version: 1.0.5 - resolution: "@napi-rs/wasm-runtime@npm:1.0.5" + version: 1.0.6 + resolution: "@napi-rs/wasm-runtime@npm:1.0.6" dependencies: "@emnapi/core": "npm:^1.5.0" "@emnapi/runtime": "npm:^1.5.0" "@tybys/wasm-util": "npm:^0.10.1" - checksum: 10c0/8d29299933c57b6ead61f46fad5c3dfabc31e1356bbaf25c3a8ae57be0af0db0006a808f2c1bb16e28925e027f20e0856550dac94e015f56dd6ed53b38f9a385 + checksum: 10c0/af48168c6e13c970498fda3ce7238234a906bc69dd474dc9abd560cdf8a7dea6410147afec8f0191a1d19767c8347d8ec0125a8a93225312f7ac37e06e8c15ad languageName: node linkType: hard -"@ngtools/webpack@npm:20.3.3": - version: 20.3.3 - resolution: "@ngtools/webpack@npm:20.3.3" +"@ngtools/webpack@npm:20.3.4": + version: 20.3.4 + resolution: "@ngtools/webpack@npm:20.3.4" peerDependencies: "@angular/compiler-cli": ^20.0.0 typescript: ">=5.8 <6.0" webpack: ^5.54.0 - checksum: 10c0/ae34b0313223520dd704e6a1897b4a98ceb761c810b1ac2bb129fed053877e3edaa5128a9c72051f2768ff8785934e6c090423a910a215495d4df18b91082e58 + checksum: 10c0/53c8ba27d5a1c20c03b0a07fc6c2479109a3a522a343b51e404798a168d6fa283873a16fe2a899f0cc86caeb46d8ce49b51f254319d3d06afc96f723008c6a88 languageName: node linkType: hard @@ -5439,144 +5446,137 @@ __metadata: languageName: node linkType: hard -"@oxc-project/types@npm:=0.89.0": - version: 0.89.0 - resolution: "@oxc-project/types@npm:0.89.0" - checksum: 10c0/2e971397f32d28aef443b0863f915eb56bacb0d94ced10da0d8366e076c1a8f9284cbe107f03ad709b7ac65cd2ddfe4c13f754ddf214001f39f079126fa40622 - languageName: node - linkType: hard - -"@oxc-resolver/binding-android-arm-eabi@npm:11.8.4": - version: 11.8.4 - resolution: "@oxc-resolver/binding-android-arm-eabi@npm:11.8.4" +"@oxc-resolver/binding-android-arm-eabi@npm:11.9.0": + version: 11.9.0 + resolution: "@oxc-resolver/binding-android-arm-eabi@npm:11.9.0" conditions: os=android & cpu=arm languageName: node linkType: hard -"@oxc-resolver/binding-android-arm64@npm:11.8.4": - version: 11.8.4 - resolution: "@oxc-resolver/binding-android-arm64@npm:11.8.4" +"@oxc-resolver/binding-android-arm64@npm:11.9.0": + version: 11.9.0 + resolution: "@oxc-resolver/binding-android-arm64@npm:11.9.0" conditions: os=android & cpu=arm64 languageName: node linkType: hard -"@oxc-resolver/binding-darwin-arm64@npm:11.8.4": - version: 11.8.4 - resolution: "@oxc-resolver/binding-darwin-arm64@npm:11.8.4" +"@oxc-resolver/binding-darwin-arm64@npm:11.9.0": + version: 11.9.0 + resolution: "@oxc-resolver/binding-darwin-arm64@npm:11.9.0" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@oxc-resolver/binding-darwin-x64@npm:11.8.4": - version: 11.8.4 - resolution: "@oxc-resolver/binding-darwin-x64@npm:11.8.4" +"@oxc-resolver/binding-darwin-x64@npm:11.9.0": + version: 11.9.0 + resolution: "@oxc-resolver/binding-darwin-x64@npm:11.9.0" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@oxc-resolver/binding-freebsd-x64@npm:11.8.4": - version: 11.8.4 - resolution: "@oxc-resolver/binding-freebsd-x64@npm:11.8.4" +"@oxc-resolver/binding-freebsd-x64@npm:11.9.0": + version: 11.9.0 + resolution: "@oxc-resolver/binding-freebsd-x64@npm:11.9.0" conditions: os=freebsd & cpu=x64 languageName: node linkType: hard -"@oxc-resolver/binding-linux-arm-gnueabihf@npm:11.8.4": - version: 11.8.4 - resolution: "@oxc-resolver/binding-linux-arm-gnueabihf@npm:11.8.4" +"@oxc-resolver/binding-linux-arm-gnueabihf@npm:11.9.0": + version: 11.9.0 + resolution: "@oxc-resolver/binding-linux-arm-gnueabihf@npm:11.9.0" conditions: os=linux & cpu=arm languageName: node linkType: hard -"@oxc-resolver/binding-linux-arm-musleabihf@npm:11.8.4": - version: 11.8.4 - resolution: "@oxc-resolver/binding-linux-arm-musleabihf@npm:11.8.4" +"@oxc-resolver/binding-linux-arm-musleabihf@npm:11.9.0": + version: 11.9.0 + resolution: "@oxc-resolver/binding-linux-arm-musleabihf@npm:11.9.0" conditions: os=linux & cpu=arm languageName: node linkType: hard -"@oxc-resolver/binding-linux-arm64-gnu@npm:11.8.4": - version: 11.8.4 - resolution: "@oxc-resolver/binding-linux-arm64-gnu@npm:11.8.4" +"@oxc-resolver/binding-linux-arm64-gnu@npm:11.9.0": + version: 11.9.0 + resolution: "@oxc-resolver/binding-linux-arm64-gnu@npm:11.9.0" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@oxc-resolver/binding-linux-arm64-musl@npm:11.8.4": - version: 11.8.4 - resolution: "@oxc-resolver/binding-linux-arm64-musl@npm:11.8.4" +"@oxc-resolver/binding-linux-arm64-musl@npm:11.9.0": + version: 11.9.0 + resolution: "@oxc-resolver/binding-linux-arm64-musl@npm:11.9.0" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@oxc-resolver/binding-linux-ppc64-gnu@npm:11.8.4": - version: 11.8.4 - resolution: "@oxc-resolver/binding-linux-ppc64-gnu@npm:11.8.4" +"@oxc-resolver/binding-linux-ppc64-gnu@npm:11.9.0": + version: 11.9.0 + resolution: "@oxc-resolver/binding-linux-ppc64-gnu@npm:11.9.0" conditions: os=linux & cpu=ppc64 & libc=glibc languageName: node linkType: hard -"@oxc-resolver/binding-linux-riscv64-gnu@npm:11.8.4": - version: 11.8.4 - resolution: "@oxc-resolver/binding-linux-riscv64-gnu@npm:11.8.4" +"@oxc-resolver/binding-linux-riscv64-gnu@npm:11.9.0": + version: 11.9.0 + resolution: "@oxc-resolver/binding-linux-riscv64-gnu@npm:11.9.0" conditions: os=linux & cpu=riscv64 & libc=glibc languageName: node linkType: hard -"@oxc-resolver/binding-linux-riscv64-musl@npm:11.8.4": - version: 11.8.4 - resolution: "@oxc-resolver/binding-linux-riscv64-musl@npm:11.8.4" +"@oxc-resolver/binding-linux-riscv64-musl@npm:11.9.0": + version: 11.9.0 + resolution: "@oxc-resolver/binding-linux-riscv64-musl@npm:11.9.0" conditions: os=linux & cpu=riscv64 & libc=musl languageName: node linkType: hard -"@oxc-resolver/binding-linux-s390x-gnu@npm:11.8.4": - version: 11.8.4 - resolution: "@oxc-resolver/binding-linux-s390x-gnu@npm:11.8.4" +"@oxc-resolver/binding-linux-s390x-gnu@npm:11.9.0": + version: 11.9.0 + resolution: "@oxc-resolver/binding-linux-s390x-gnu@npm:11.9.0" conditions: os=linux & cpu=s390x & libc=glibc languageName: node linkType: hard -"@oxc-resolver/binding-linux-x64-gnu@npm:11.8.4": - version: 11.8.4 - resolution: "@oxc-resolver/binding-linux-x64-gnu@npm:11.8.4" +"@oxc-resolver/binding-linux-x64-gnu@npm:11.9.0": + version: 11.9.0 + resolution: "@oxc-resolver/binding-linux-x64-gnu@npm:11.9.0" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@oxc-resolver/binding-linux-x64-musl@npm:11.8.4": - version: 11.8.4 - resolution: "@oxc-resolver/binding-linux-x64-musl@npm:11.8.4" +"@oxc-resolver/binding-linux-x64-musl@npm:11.9.0": + version: 11.9.0 + resolution: "@oxc-resolver/binding-linux-x64-musl@npm:11.9.0" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@oxc-resolver/binding-wasm32-wasi@npm:11.8.4": - version: 11.8.4 - resolution: "@oxc-resolver/binding-wasm32-wasi@npm:11.8.4" +"@oxc-resolver/binding-wasm32-wasi@npm:11.9.0": + version: 11.9.0 + resolution: "@oxc-resolver/binding-wasm32-wasi@npm:11.9.0" dependencies: "@napi-rs/wasm-runtime": "npm:^1.0.5" conditions: cpu=wasm32 languageName: node linkType: hard -"@oxc-resolver/binding-win32-arm64-msvc@npm:11.8.4": - version: 11.8.4 - resolution: "@oxc-resolver/binding-win32-arm64-msvc@npm:11.8.4" +"@oxc-resolver/binding-win32-arm64-msvc@npm:11.9.0": + version: 11.9.0 + resolution: "@oxc-resolver/binding-win32-arm64-msvc@npm:11.9.0" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@oxc-resolver/binding-win32-ia32-msvc@npm:11.8.4": - version: 11.8.4 - resolution: "@oxc-resolver/binding-win32-ia32-msvc@npm:11.8.4" +"@oxc-resolver/binding-win32-ia32-msvc@npm:11.9.0": + version: 11.9.0 + resolution: "@oxc-resolver/binding-win32-ia32-msvc@npm:11.9.0" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@oxc-resolver/binding-win32-x64-msvc@npm:11.8.4": - version: 11.8.4 - resolution: "@oxc-resolver/binding-win32-x64-msvc@npm:11.8.4" +"@oxc-resolver/binding-win32-x64-msvc@npm:11.9.0": + version: 11.9.0 + resolution: "@oxc-resolver/binding-win32-x64-msvc@npm:11.9.0" conditions: os=win32 & cpu=x64 languageName: node linkType: hard @@ -6608,106 +6608,6 @@ __metadata: languageName: node linkType: hard -"@rolldown/binding-android-arm64@npm:1.0.0-beta.38": - version: 1.0.0-beta.38 - resolution: "@rolldown/binding-android-arm64@npm:1.0.0-beta.38" - conditions: os=android & cpu=arm64 - languageName: node - linkType: hard - -"@rolldown/binding-darwin-arm64@npm:1.0.0-beta.38": - version: 1.0.0-beta.38 - resolution: "@rolldown/binding-darwin-arm64@npm:1.0.0-beta.38" - conditions: os=darwin & cpu=arm64 - languageName: node - linkType: hard - -"@rolldown/binding-darwin-x64@npm:1.0.0-beta.38": - version: 1.0.0-beta.38 - resolution: "@rolldown/binding-darwin-x64@npm:1.0.0-beta.38" - conditions: os=darwin & cpu=x64 - languageName: node - linkType: hard - -"@rolldown/binding-freebsd-x64@npm:1.0.0-beta.38": - version: 1.0.0-beta.38 - resolution: "@rolldown/binding-freebsd-x64@npm:1.0.0-beta.38" - conditions: os=freebsd & cpu=x64 - languageName: node - linkType: hard - -"@rolldown/binding-linux-arm-gnueabihf@npm:1.0.0-beta.38": - version: 1.0.0-beta.38 - resolution: "@rolldown/binding-linux-arm-gnueabihf@npm:1.0.0-beta.38" - conditions: os=linux & cpu=arm - languageName: node - linkType: hard - -"@rolldown/binding-linux-arm64-gnu@npm:1.0.0-beta.38": - version: 1.0.0-beta.38 - resolution: "@rolldown/binding-linux-arm64-gnu@npm:1.0.0-beta.38" - conditions: os=linux & cpu=arm64 & libc=glibc - languageName: node - linkType: hard - -"@rolldown/binding-linux-arm64-musl@npm:1.0.0-beta.38": - version: 1.0.0-beta.38 - resolution: "@rolldown/binding-linux-arm64-musl@npm:1.0.0-beta.38" - conditions: os=linux & cpu=arm64 & libc=musl - languageName: node - linkType: hard - -"@rolldown/binding-linux-x64-gnu@npm:1.0.0-beta.38": - version: 1.0.0-beta.38 - resolution: "@rolldown/binding-linux-x64-gnu@npm:1.0.0-beta.38" - conditions: os=linux & cpu=x64 & libc=glibc - languageName: node - linkType: hard - -"@rolldown/binding-linux-x64-musl@npm:1.0.0-beta.38": - version: 1.0.0-beta.38 - resolution: "@rolldown/binding-linux-x64-musl@npm:1.0.0-beta.38" - conditions: os=linux & cpu=x64 & libc=musl - languageName: node - linkType: hard - -"@rolldown/binding-openharmony-arm64@npm:1.0.0-beta.38": - version: 1.0.0-beta.38 - resolution: "@rolldown/binding-openharmony-arm64@npm:1.0.0-beta.38" - conditions: os=openharmony & cpu=arm64 - languageName: node - linkType: hard - -"@rolldown/binding-wasm32-wasi@npm:1.0.0-beta.38": - version: 1.0.0-beta.38 - resolution: "@rolldown/binding-wasm32-wasi@npm:1.0.0-beta.38" - dependencies: - "@napi-rs/wasm-runtime": "npm:^1.0.5" - conditions: cpu=wasm32 - languageName: node - linkType: hard - -"@rolldown/binding-win32-arm64-msvc@npm:1.0.0-beta.38": - version: 1.0.0-beta.38 - resolution: "@rolldown/binding-win32-arm64-msvc@npm:1.0.0-beta.38" - conditions: os=win32 & cpu=arm64 - languageName: node - linkType: hard - -"@rolldown/binding-win32-ia32-msvc@npm:1.0.0-beta.38": - version: 1.0.0-beta.38 - resolution: "@rolldown/binding-win32-ia32-msvc@npm:1.0.0-beta.38" - conditions: os=win32 & cpu=ia32 - languageName: node - linkType: hard - -"@rolldown/binding-win32-x64-msvc@npm:1.0.0-beta.38": - version: 1.0.0-beta.38 - resolution: "@rolldown/binding-win32-x64-msvc@npm:1.0.0-beta.38" - conditions: os=win32 & cpu=x64 - languageName: node - linkType: hard - "@rolldown/pluginutils@npm:1.0.0-beta.27": version: 1.0.0-beta.27 resolution: "@rolldown/pluginutils@npm:1.0.0-beta.27" @@ -6715,13 +6615,6 @@ __metadata: languageName: node linkType: hard -"@rolldown/pluginutils@npm:1.0.0-beta.38": - version: 1.0.0-beta.38 - resolution: "@rolldown/pluginutils@npm:1.0.0-beta.38" - checksum: 10c0/8353ec2528349f79e27d1a3193806725b85830da334e935cbb606d88c1177c58ea6519c578e4e93e5f677f5b22aecb8738894dbed14603e14b6bffe3facf1002 - languageName: node - linkType: hard - "@rollup/plugin-json@npm:^6.1.0": version: 6.1.0 resolution: "@rollup/plugin-json@npm:6.1.0" @@ -6759,6 +6652,13 @@ __metadata: languageName: node linkType: hard +"@rollup/rollup-android-arm-eabi@npm:4.52.4": + version: 4.52.4 + resolution: "@rollup/rollup-android-arm-eabi@npm:4.52.4" + conditions: os=android & cpu=arm + languageName: node + linkType: hard + "@rollup/rollup-android-arm64@npm:4.52.3": version: 4.52.3 resolution: "@rollup/rollup-android-arm64@npm:4.52.3" @@ -6766,6 +6666,13 @@ __metadata: languageName: node linkType: hard +"@rollup/rollup-android-arm64@npm:4.52.4": + version: 4.52.4 + resolution: "@rollup/rollup-android-arm64@npm:4.52.4" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + "@rollup/rollup-darwin-arm64@npm:4.52.3": version: 4.52.3 resolution: "@rollup/rollup-darwin-arm64@npm:4.52.3" @@ -6773,6 +6680,13 @@ __metadata: languageName: node linkType: hard +"@rollup/rollup-darwin-arm64@npm:4.52.4": + version: 4.52.4 + resolution: "@rollup/rollup-darwin-arm64@npm:4.52.4" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + "@rollup/rollup-darwin-x64@npm:4.52.3": version: 4.52.3 resolution: "@rollup/rollup-darwin-x64@npm:4.52.3" @@ -6780,6 +6694,13 @@ __metadata: languageName: node linkType: hard +"@rollup/rollup-darwin-x64@npm:4.52.4": + version: 4.52.4 + resolution: "@rollup/rollup-darwin-x64@npm:4.52.4" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + "@rollup/rollup-freebsd-arm64@npm:4.52.3": version: 4.52.3 resolution: "@rollup/rollup-freebsd-arm64@npm:4.52.3" @@ -6787,6 +6708,13 @@ __metadata: languageName: node linkType: hard +"@rollup/rollup-freebsd-arm64@npm:4.52.4": + version: 4.52.4 + resolution: "@rollup/rollup-freebsd-arm64@npm:4.52.4" + conditions: os=freebsd & cpu=arm64 + languageName: node + linkType: hard + "@rollup/rollup-freebsd-x64@npm:4.52.3": version: 4.52.3 resolution: "@rollup/rollup-freebsd-x64@npm:4.52.3" @@ -6794,6 +6722,13 @@ __metadata: languageName: node linkType: hard +"@rollup/rollup-freebsd-x64@npm:4.52.4": + version: 4.52.4 + resolution: "@rollup/rollup-freebsd-x64@npm:4.52.4" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + "@rollup/rollup-linux-arm-gnueabihf@npm:4.52.3": version: 4.52.3 resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.52.3" @@ -6801,6 +6736,13 @@ __metadata: languageName: node linkType: hard +"@rollup/rollup-linux-arm-gnueabihf@npm:4.52.4": + version: 4.52.4 + resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.52.4" + conditions: os=linux & cpu=arm & libc=glibc + languageName: node + linkType: hard + "@rollup/rollup-linux-arm-musleabihf@npm:4.52.3": version: 4.52.3 resolution: "@rollup/rollup-linux-arm-musleabihf@npm:4.52.3" @@ -6808,6 +6750,13 @@ __metadata: languageName: node linkType: hard +"@rollup/rollup-linux-arm-musleabihf@npm:4.52.4": + version: 4.52.4 + resolution: "@rollup/rollup-linux-arm-musleabihf@npm:4.52.4" + conditions: os=linux & cpu=arm & libc=musl + languageName: node + linkType: hard + "@rollup/rollup-linux-arm64-gnu@npm:4.52.3": version: 4.52.3 resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.52.3" @@ -6815,6 +6764,13 @@ __metadata: languageName: node linkType: hard +"@rollup/rollup-linux-arm64-gnu@npm:4.52.4": + version: 4.52.4 + resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.52.4" + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + "@rollup/rollup-linux-arm64-musl@npm:4.52.3": version: 4.52.3 resolution: "@rollup/rollup-linux-arm64-musl@npm:4.52.3" @@ -6822,6 +6778,13 @@ __metadata: languageName: node linkType: hard +"@rollup/rollup-linux-arm64-musl@npm:4.52.4": + version: 4.52.4 + resolution: "@rollup/rollup-linux-arm64-musl@npm:4.52.4" + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + "@rollup/rollup-linux-loong64-gnu@npm:4.52.3": version: 4.52.3 resolution: "@rollup/rollup-linux-loong64-gnu@npm:4.52.3" @@ -6829,6 +6792,13 @@ __metadata: languageName: node linkType: hard +"@rollup/rollup-linux-loong64-gnu@npm:4.52.4": + version: 4.52.4 + resolution: "@rollup/rollup-linux-loong64-gnu@npm:4.52.4" + conditions: os=linux & cpu=loong64 & libc=glibc + languageName: node + linkType: hard + "@rollup/rollup-linux-ppc64-gnu@npm:4.52.3": version: 4.52.3 resolution: "@rollup/rollup-linux-ppc64-gnu@npm:4.52.3" @@ -6836,6 +6806,13 @@ __metadata: languageName: node linkType: hard +"@rollup/rollup-linux-ppc64-gnu@npm:4.52.4": + version: 4.52.4 + resolution: "@rollup/rollup-linux-ppc64-gnu@npm:4.52.4" + conditions: os=linux & cpu=ppc64 & libc=glibc + languageName: node + linkType: hard + "@rollup/rollup-linux-riscv64-gnu@npm:4.52.3": version: 4.52.3 resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.52.3" @@ -6843,6 +6820,13 @@ __metadata: languageName: node linkType: hard +"@rollup/rollup-linux-riscv64-gnu@npm:4.52.4": + version: 4.52.4 + resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.52.4" + conditions: os=linux & cpu=riscv64 & libc=glibc + languageName: node + linkType: hard + "@rollup/rollup-linux-riscv64-musl@npm:4.52.3": version: 4.52.3 resolution: "@rollup/rollup-linux-riscv64-musl@npm:4.52.3" @@ -6850,6 +6834,13 @@ __metadata: languageName: node linkType: hard +"@rollup/rollup-linux-riscv64-musl@npm:4.52.4": + version: 4.52.4 + resolution: "@rollup/rollup-linux-riscv64-musl@npm:4.52.4" + conditions: os=linux & cpu=riscv64 & libc=musl + languageName: node + linkType: hard + "@rollup/rollup-linux-s390x-gnu@npm:4.52.3": version: 4.52.3 resolution: "@rollup/rollup-linux-s390x-gnu@npm:4.52.3" @@ -6857,6 +6848,13 @@ __metadata: languageName: node linkType: hard +"@rollup/rollup-linux-s390x-gnu@npm:4.52.4": + version: 4.52.4 + resolution: "@rollup/rollup-linux-s390x-gnu@npm:4.52.4" + conditions: os=linux & cpu=s390x & libc=glibc + languageName: node + linkType: hard + "@rollup/rollup-linux-x64-gnu@npm:4.52.3": version: 4.52.3 resolution: "@rollup/rollup-linux-x64-gnu@npm:4.52.3" @@ -6864,6 +6862,13 @@ __metadata: languageName: node linkType: hard +"@rollup/rollup-linux-x64-gnu@npm:4.52.4": + version: 4.52.4 + resolution: "@rollup/rollup-linux-x64-gnu@npm:4.52.4" + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + "@rollup/rollup-linux-x64-musl@npm:4.52.3": version: 4.52.3 resolution: "@rollup/rollup-linux-x64-musl@npm:4.52.3" @@ -6871,6 +6876,13 @@ __metadata: languageName: node linkType: hard +"@rollup/rollup-linux-x64-musl@npm:4.52.4": + version: 4.52.4 + resolution: "@rollup/rollup-linux-x64-musl@npm:4.52.4" + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + "@rollup/rollup-openharmony-arm64@npm:4.52.3": version: 4.52.3 resolution: "@rollup/rollup-openharmony-arm64@npm:4.52.3" @@ -6878,6 +6890,13 @@ __metadata: languageName: node linkType: hard +"@rollup/rollup-openharmony-arm64@npm:4.52.4": + version: 4.52.4 + resolution: "@rollup/rollup-openharmony-arm64@npm:4.52.4" + conditions: os=openharmony & cpu=arm64 + languageName: node + linkType: hard + "@rollup/rollup-win32-arm64-msvc@npm:4.52.3": version: 4.52.3 resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.52.3" @@ -6885,6 +6904,13 @@ __metadata: languageName: node linkType: hard +"@rollup/rollup-win32-arm64-msvc@npm:4.52.4": + version: 4.52.4 + resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.52.4" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + "@rollup/rollup-win32-ia32-msvc@npm:4.52.3": version: 4.52.3 resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.52.3" @@ -6892,6 +6918,13 @@ __metadata: languageName: node linkType: hard +"@rollup/rollup-win32-ia32-msvc@npm:4.52.4": + version: 4.52.4 + resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.52.4" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + "@rollup/rollup-win32-x64-gnu@npm:4.52.3": version: 4.52.3 resolution: "@rollup/rollup-win32-x64-gnu@npm:4.52.3" @@ -6899,6 +6932,13 @@ __metadata: languageName: node linkType: hard +"@rollup/rollup-win32-x64-gnu@npm:4.52.4": + version: 4.52.4 + resolution: "@rollup/rollup-win32-x64-gnu@npm:4.52.4" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + "@rollup/rollup-win32-x64-msvc@npm:4.52.3": version: 4.52.3 resolution: "@rollup/rollup-win32-x64-msvc@npm:4.52.3" @@ -6906,9 +6946,16 @@ __metadata: languageName: node linkType: hard +"@rollup/rollup-win32-x64-msvc@npm:4.52.4": + version: 4.52.4 + resolution: "@rollup/rollup-win32-x64-msvc@npm:4.52.4" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + "@rollup/wasm-node@npm:^4.24.0": - version: 4.52.3 - resolution: "@rollup/wasm-node@npm:4.52.3" + version: 4.52.4 + resolution: "@rollup/wasm-node@npm:4.52.4" dependencies: "@types/estree": "npm:1.0.8" fsevents: "npm:~2.3.2" @@ -6917,7 +6964,7 @@ __metadata: optional: true bin: rollup: dist/bin/rollup - checksum: 10c0/c1feefd902408428bec0bd087c5970f5b64ee3939d558e45c511525964d5e1484da04b8eeeb46c3f037eab0131f48bac206e87bdb204fb1e44c479764d3612c6 + checksum: 10c0/2a69c0a21d91499718f9fc58f7f4f490b7620b9b5958bd2ab6c34d5a377def75ddb7c2b6ae0e213b2c6eb2a931c6ea08392c7bce90845cdbd0a13009cc27da9a languageName: node linkType: hard @@ -6935,14 +6982,14 @@ __metadata: languageName: node linkType: hard -"@schematics/angular@npm:20.3.3": - version: 20.3.3 - resolution: "@schematics/angular@npm:20.3.3" +"@schematics/angular@npm:20.3.4": + version: 20.3.4 + resolution: "@schematics/angular@npm:20.3.4" dependencies: - "@angular-devkit/core": "npm:20.3.3" - "@angular-devkit/schematics": "npm:20.3.3" + "@angular-devkit/core": "npm:20.3.4" + "@angular-devkit/schematics": "npm:20.3.4" jsonc-parser: "npm:3.3.1" - checksum: 10c0/8f026d72ee76d05fb7b37f47cd958f8c215b69f8fad0387b47fb1cfbc3a34fb1957d6c67004f1b07c5cf7531b00bf1839db5bd37132a87b93d7aeac6633bd48f + checksum: 10c0/94eeb65cd78131bbf82b4ac9ae286d4431aba40ca19e0b38c7064b0be02f3142e3879cd8c246eaeffb7f1a51a5bae4f69cb32359df712331ae1ac6939cfb5eca languageName: node linkType: hard @@ -11173,6 +11220,22 @@ __metadata: languageName: node linkType: hard +"@testing-library/dom@npm:^10.4.1": + version: 10.4.1 + resolution: "@testing-library/dom@npm:10.4.1" + dependencies: + "@babel/code-frame": "npm:^7.10.4" + "@babel/runtime": "npm:^7.12.5" + "@types/aria-query": "npm:^5.0.1" + aria-query: "npm:5.3.0" + dom-accessibility-api: "npm:^0.5.9" + lz-string: "npm:^1.5.0" + picocolors: "npm:1.1.1" + pretty-format: "npm:^27.0.2" + checksum: 10c0/19ce048012d395ad0468b0dbcc4d0911f6f9e39464d7a8464a587b29707eed5482000dad728f5acc4ed314d2f4d54f34982999a114d2404f36d048278db815b1 + languageName: node + linkType: hard + "@testing-library/dom@npm:^9.0.0": version: 9.3.4 resolution: "@testing-library/dom@npm:9.3.4" @@ -11189,6 +11252,20 @@ __metadata: languageName: node linkType: hard +"@testing-library/jest-dom@npm:^6.6.3": + version: 6.9.1 + resolution: "@testing-library/jest-dom@npm:6.9.1" + dependencies: + "@adobe/css-tools": "npm:^4.4.0" + aria-query: "npm:^5.0.0" + css.escape: "npm:^1.5.1" + dom-accessibility-api: "npm:^0.6.3" + picocolors: "npm:^1.1.1" + redent: "npm:^3.0.0" + checksum: 10c0/4291ebd2f0f38d14cefac142c56c337941775a5807e2a3d6f1a14c2fbd6be76a18e498ed189e95bedc97d9e8cf1738049bc76c85b5bc5e23fae7c9e10f7b3a12 + languageName: node + linkType: hard + "@testing-library/react-native@npm:^13.3.3": version: 13.3.3 resolution: "@testing-library/react-native@npm:13.3.3" @@ -11223,6 +11300,35 @@ __metadata: languageName: node linkType: hard +"@testing-library/react@npm:^16.1.0": + version: 16.3.0 + resolution: "@testing-library/react@npm:16.3.0" + dependencies: + "@babel/runtime": "npm:^7.12.5" + peerDependencies: + "@testing-library/dom": ^10.0.0 + "@types/react": ^18.0.0 || ^19.0.0 + "@types/react-dom": ^18.0.0 || ^19.0.0 + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 10c0/3a2cb1f87c9a67e1ebbbcfd99b94b01e496fc35147be8bc5d8bf07a699c7d523a09d57ef2f7b1d91afccd1a28e21eda3b00d80187fbb51b1de01e422592d845e + languageName: node + linkType: hard + +"@testing-library/user-event@npm:^14.5.2": + version: 14.6.1 + resolution: "@testing-library/user-event@npm:14.6.1" + peerDependencies: + "@testing-library/dom": ">=7.21.4" + checksum: 10c0/75fea130a52bf320d35d46ed54f3eec77e71a56911b8b69a3fe29497b0b9947b2dc80d30f04054ad4ce7f577856ae3e5397ea7dff0ef14944d3909784c7a93fe + languageName: node + linkType: hard + "@tootallnate/quickjs-emscripten@npm:^0.23.0": version: 0.23.0 resolution: "@tootallnate/quickjs-emscripten@npm:0.23.0" @@ -11799,11 +11905,11 @@ __metadata: linkType: hard "@types/node@npm:^22.18.3": - version: 22.18.6 - resolution: "@types/node@npm:22.18.6" + version: 22.18.8 + resolution: "@types/node@npm:22.18.8" dependencies: undici-types: "npm:~6.21.0" - checksum: 10c0/7ba190da2e64e56c59270661af8cd682c830a1375b6f965ab153be90baabfdaa867aa1d63f87b42de80956996d46dfe1cf93ecefe982d9a16e485b6756949f9a + checksum: 10c0/54473730e7417b923fec427f62ed3204259acbd8e450a7593bad8ae02a75effcfcc864b34bf02c108eeb9c04a404791687f42b801bafa5264a8761f4df9122fd languageName: node linkType: hard @@ -11913,12 +12019,12 @@ __metadata: linkType: hard "@types/react@npm:^18.3.4": - version: 18.3.24 - resolution: "@types/react@npm:18.3.24" + version: 18.3.25 + resolution: "@types/react@npm:18.3.25" dependencies: "@types/prop-types": "npm:*" csstype: "npm:^3.0.2" - checksum: 10c0/9e188fa8e50f172cf647fc48fea2e04d88602afff47190b697de281a8ac88df9ee059864757a2a438ff599eaf9276d9a9e0e60585e88f7d57f01a2e4877d37ec + checksum: 10c0/ef4fad7c845ce44cb454e47e826d1b04ff5081bccdac06d0260fc6e47de730268f8f9ff2ffc5085ee793d7466493c1175b2309b3d71c20916efefac0fd7612f1 languageName: node linkType: hard @@ -11939,11 +12045,11 @@ __metadata: linkType: hard "@types/secp256k1@npm:^4.0.1": - version: 4.0.6 - resolution: "@types/secp256k1@npm:4.0.6" + version: 4.0.7 + resolution: "@types/secp256k1@npm:4.0.7" dependencies: "@types/node": "npm:*" - checksum: 10c0/0e391316ae30c218779583b626382a56546ddbefb65f1ff9cf5e078af8a7118f67f3e66e30914399cc6f8710c424d0d8c3f34262ffb1f429c6ad911fd0d0bc26 + checksum: 10c0/3e4a22bb699597adc723414a841d2e8a1fa71c95c3d018c6a2dd8482500b6e9fe2d78d87e758f18c1aabe333cac22ac2a96f456e3bc147df30b7fac4e6346618 languageName: node linkType: hard @@ -11955,6 +12061,15 @@ __metadata: linkType: hard "@types/send@npm:*": + version: 1.2.0 + resolution: "@types/send@npm:1.2.0" + dependencies: + "@types/node": "npm:*" + checksum: 10c0/66d34fbb49c9a7848244eb227c39d499c205875d7f6b3a7536b9c6b1e44a7764ee33ade9bc14188454c05caa7b2c583c823e8b5a1afdaa51141307cd5b3660c0 + languageName: node + linkType: hard + +"@types/send@npm:<1": version: 0.17.5 resolution: "@types/send@npm:0.17.5" dependencies: @@ -11974,13 +12089,13 @@ __metadata: linkType: hard "@types/serve-static@npm:*, @types/serve-static@npm:^1.15.5": - version: 1.15.8 - resolution: "@types/serve-static@npm:1.15.8" + version: 1.15.9 + resolution: "@types/serve-static@npm:1.15.9" dependencies: "@types/http-errors": "npm:*" "@types/node": "npm:*" - "@types/send": "npm:*" - checksum: 10c0/8ad86a25b87da5276cb1008c43c74667ff7583904d46d5fcaf0355887869d859d453d7dc4f890788ae04705c23720e9b6b6f3215e2d1d2a4278bbd090a9268dd + "@types/send": "npm:<1" + checksum: 10c0/3dc98f41085afbc1ea4768e764b891a6b917f01f0db8a1610a6bc8f0e989015c22af71a05f7b0ae336456169f86e863a60273ddd64c0fa13855ae4ed50ed7789 languageName: node linkType: hard @@ -12102,23 +12217,23 @@ __metadata: linkType: hard "@typescript-eslint/eslint-plugin@npm:^8.0.0, @typescript-eslint/eslint-plugin@npm:^8.39.0, @typescript-eslint/eslint-plugin@npm:^8.44.0": - version: 8.44.1 - resolution: "@typescript-eslint/eslint-plugin@npm:8.44.1" + version: 8.45.0 + resolution: "@typescript-eslint/eslint-plugin@npm:8.45.0" dependencies: "@eslint-community/regexpp": "npm:^4.10.0" - "@typescript-eslint/scope-manager": "npm:8.44.1" - "@typescript-eslint/type-utils": "npm:8.44.1" - "@typescript-eslint/utils": "npm:8.44.1" - "@typescript-eslint/visitor-keys": "npm:8.44.1" + "@typescript-eslint/scope-manager": "npm:8.45.0" + "@typescript-eslint/type-utils": "npm:8.45.0" + "@typescript-eslint/utils": "npm:8.45.0" + "@typescript-eslint/visitor-keys": "npm:8.45.0" graphemer: "npm:^1.4.0" ignore: "npm:^7.0.0" natural-compare: "npm:^1.4.0" ts-api-utils: "npm:^2.1.0" peerDependencies: - "@typescript-eslint/parser": ^8.44.1 + "@typescript-eslint/parser": ^8.45.0 eslint: ^8.57.0 || ^9.0.0 typescript: ">=4.8.4 <6.0.0" - checksum: 10c0/86d17444c38992a5dc0e45c107a2c2545eb26a1314c2475e7518e4b7645781be4449ec49463667d63aaffaa002e2edacbd2098104cc83e8399e3dd6e0fb6ed51 + checksum: 10c0/0c60a0e5d07fa8618348db38b5a81e66143d528e1b3cdb5678bbc6c60590cd559b27c98c36f5663230fc4cf6920dff2cd604de30b58df26a37fcfcc5dc1dbd45 languageName: node linkType: hard @@ -12141,31 +12256,31 @@ __metadata: linkType: hard "@typescript-eslint/parser@npm:^8.0.0, @typescript-eslint/parser@npm:^8.39.0, @typescript-eslint/parser@npm:^8.44.0": - version: 8.44.1 - resolution: "@typescript-eslint/parser@npm:8.44.1" + version: 8.45.0 + resolution: "@typescript-eslint/parser@npm:8.45.0" dependencies: - "@typescript-eslint/scope-manager": "npm:8.44.1" - "@typescript-eslint/types": "npm:8.44.1" - "@typescript-eslint/typescript-estree": "npm:8.44.1" - "@typescript-eslint/visitor-keys": "npm:8.44.1" + "@typescript-eslint/scope-manager": "npm:8.45.0" + "@typescript-eslint/types": "npm:8.45.0" + "@typescript-eslint/typescript-estree": "npm:8.45.0" + "@typescript-eslint/visitor-keys": "npm:8.45.0" debug: "npm:^4.3.4" peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: ">=4.8.4 <6.0.0" - checksum: 10c0/278d7f6a8a686fade0cff372faabb5e114f98ce4032bd991e8905622c720f3a4867b99f7a07897aa2e26311efd8cbb84669059ab57ac99c644b9fbae7564b251 + checksum: 10c0/8b419bcf795b112a39fcac05dcf147835059345b6399035ffa3f76a9d8e320f3fac79cae2fe4320dcda83fa059b017ca7626a7b4e3da08a614415c8867d169b8 languageName: node linkType: hard -"@typescript-eslint/project-service@npm:8.44.1": - version: 8.44.1 - resolution: "@typescript-eslint/project-service@npm:8.44.1" +"@typescript-eslint/project-service@npm:8.45.0": + version: 8.45.0 + resolution: "@typescript-eslint/project-service@npm:8.45.0" dependencies: - "@typescript-eslint/tsconfig-utils": "npm:^8.44.1" - "@typescript-eslint/types": "npm:^8.44.1" + "@typescript-eslint/tsconfig-utils": "npm:^8.45.0" + "@typescript-eslint/types": "npm:^8.45.0" debug: "npm:^4.3.4" peerDependencies: typescript: ">=4.8.4 <6.0.0" - checksum: 10c0/2caaa94832574658f1b451d94a319fcd476ad34171e6dff6607da9a5f91387011206487b7743fc71c9c91099632871fa6d209783cbc0a7cb3bac5cbf9d36cdae + checksum: 10c0/98af065a1a3ed9d3d1eb265e09d3e9c2ae676d500a8c1d764f5609fe2c1b86749516b709804eb814fae688be7809d11748b9ae691d43c28da51dac390ca81fa9 languageName: node linkType: hard @@ -12189,22 +12304,22 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/scope-manager@npm:8.44.1": - version: 8.44.1 - resolution: "@typescript-eslint/scope-manager@npm:8.44.1" +"@typescript-eslint/scope-manager@npm:8.45.0": + version: 8.45.0 + resolution: "@typescript-eslint/scope-manager@npm:8.45.0" dependencies: - "@typescript-eslint/types": "npm:8.44.1" - "@typescript-eslint/visitor-keys": "npm:8.44.1" - checksum: 10c0/a6f3b2d9fbda037327574bb2a7d3831cc100122fe660545a8220e4eed0ee36e42262ce78cc7438dd155100d0abca38edd9e6941e29abe6f8ba7f935223059b89 + "@typescript-eslint/types": "npm:8.45.0" + "@typescript-eslint/visitor-keys": "npm:8.45.0" + checksum: 10c0/54cd36206f6b4fc8e1e48576ed01e0d6ab20c2a9c4c7d90d5cc3a2d317dd8a13abe148ffecf471b16f1224aba5749e0905472745626bef9ae5bed771776f4abe languageName: node linkType: hard -"@typescript-eslint/tsconfig-utils@npm:8.44.1, @typescript-eslint/tsconfig-utils@npm:^8.44.1": - version: 8.44.1 - resolution: "@typescript-eslint/tsconfig-utils@npm:8.44.1" +"@typescript-eslint/tsconfig-utils@npm:8.45.0, @typescript-eslint/tsconfig-utils@npm:^8.45.0": + version: 8.45.0 + resolution: "@typescript-eslint/tsconfig-utils@npm:8.45.0" peerDependencies: typescript: ">=4.8.4 <6.0.0" - checksum: 10c0/05fee17cdb38729f82bdfff3bf2844435f5f8e4e55cdaf1bbff72c410ab98a4f9e166011f1eda01f715053d4bc9eb2d8d6c05e9e7114cc08946c4c81785367a0 + checksum: 10c0/227a9b7a5baaf35466fd369992cb933192515df1156ddf22f438deb344c2523695208e1036f5590b20603f31724de75a47fe0ee84e2fd4c8e9f3606f23f68112 languageName: node linkType: hard @@ -12225,19 +12340,19 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/type-utils@npm:8.44.1": - version: 8.44.1 - resolution: "@typescript-eslint/type-utils@npm:8.44.1" +"@typescript-eslint/type-utils@npm:8.45.0": + version: 8.45.0 + resolution: "@typescript-eslint/type-utils@npm:8.45.0" dependencies: - "@typescript-eslint/types": "npm:8.44.1" - "@typescript-eslint/typescript-estree": "npm:8.44.1" - "@typescript-eslint/utils": "npm:8.44.1" + "@typescript-eslint/types": "npm:8.45.0" + "@typescript-eslint/typescript-estree": "npm:8.45.0" + "@typescript-eslint/utils": "npm:8.45.0" debug: "npm:^4.3.4" ts-api-utils: "npm:^2.1.0" peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: ">=4.8.4 <6.0.0" - checksum: 10c0/f17b9ae60327b9187354499d67c2667811ca2b09d436cf6c13b89ba6eaceabd5695f87644a8cb4dc93da5e4188612a6bc7b07b1b022ad75ca360ff2608a64511 + checksum: 10c0/ce0f4c209c2418ebeb65e7de053499fb68bf6000bdd71068594fdb8c8ac3dbbd62935a3cea233989491f7da3ef5db87e7efd2910133c6abf6d0cbf57248f6442 languageName: node linkType: hard @@ -12255,10 +12370,10 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/types@npm:8.44.1, @typescript-eslint/types@npm:^8.0.0, @typescript-eslint/types@npm:^8.44.1": - version: 8.44.1 - resolution: "@typescript-eslint/types@npm:8.44.1" - checksum: 10c0/cba2d724ac0c7e5a35945aa2f7f8ed96dd5508942e30ec88274dcd2e8fa2c177b0952403c7eb6cacbcc2014224bd36685947d140c093637e3a4e5495c52fbd9f +"@typescript-eslint/types@npm:8.45.0, @typescript-eslint/types@npm:^8.0.0, @typescript-eslint/types@npm:^8.45.0": + version: 8.45.0 + resolution: "@typescript-eslint/types@npm:8.45.0" + checksum: 10c0/0213a0573c671d13bc91961a2b2e814ec7f6381ff093bce6704017bd96b2fc7fee25906c815cedb32a0601cf5071ca6c7c5f940d087c3b0d3dd7d4bc03478278 languageName: node linkType: hard @@ -12299,14 +12414,14 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/typescript-estree@npm:8.44.1": - version: 8.44.1 - resolution: "@typescript-eslint/typescript-estree@npm:8.44.1" +"@typescript-eslint/typescript-estree@npm:8.45.0": + version: 8.45.0 + resolution: "@typescript-eslint/typescript-estree@npm:8.45.0" dependencies: - "@typescript-eslint/project-service": "npm:8.44.1" - "@typescript-eslint/tsconfig-utils": "npm:8.44.1" - "@typescript-eslint/types": "npm:8.44.1" - "@typescript-eslint/visitor-keys": "npm:8.44.1" + "@typescript-eslint/project-service": "npm:8.45.0" + "@typescript-eslint/tsconfig-utils": "npm:8.45.0" + "@typescript-eslint/types": "npm:8.45.0" + "@typescript-eslint/visitor-keys": "npm:8.45.0" debug: "npm:^4.3.4" fast-glob: "npm:^3.3.2" is-glob: "npm:^4.0.3" @@ -12315,7 +12430,7 @@ __metadata: ts-api-utils: "npm:^2.1.0" peerDependencies: typescript: ">=4.8.4 <6.0.0" - checksum: 10c0/cef0827614cf33eab54de2f671c6e6d8cab45286ea4980e8205a7a50504e0c0984f1c12c69c7046ee3aedf29a745f0c823324dcd36c59c81b179517d6de5017f + checksum: 10c0/8c2f44a00fe859a6cd4b50157c484c5b6a1c7af5d48e89ae79c5f4924947964962fc8f478ad4c2ade788907fceee9b72d4e376508ea79b51392f91082a37d239 languageName: node linkType: hard @@ -12333,18 +12448,18 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/utils@npm:8.44.1, @typescript-eslint/utils@npm:^6.0.0 || ^7.0.0 || ^8.0.0, @typescript-eslint/utils@npm:^8.0.0": - version: 8.44.1 - resolution: "@typescript-eslint/utils@npm:8.44.1" +"@typescript-eslint/utils@npm:8.45.0, @typescript-eslint/utils@npm:^6.0.0 || ^7.0.0 || ^8.0.0, @typescript-eslint/utils@npm:^8.0.0": + version: 8.45.0 + resolution: "@typescript-eslint/utils@npm:8.45.0" dependencies: "@eslint-community/eslint-utils": "npm:^4.7.0" - "@typescript-eslint/scope-manager": "npm:8.44.1" - "@typescript-eslint/types": "npm:8.44.1" - "@typescript-eslint/typescript-estree": "npm:8.44.1" + "@typescript-eslint/scope-manager": "npm:8.45.0" + "@typescript-eslint/types": "npm:8.45.0" + "@typescript-eslint/typescript-estree": "npm:8.45.0" peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: ">=4.8.4 <6.0.0" - checksum: 10c0/5f855c8a18c3112160c04d1d7bad5abee5e4712574d2f75b8a898f4e132e6e0dee3112f98010a1def47bbf0ac2fb05b6e81d343e577d144769a8d685b42b0809 + checksum: 10c0/b3c83a23813b15e20e303d7153789508c01e06dec355b1a80547c59aa36998d498102f45fcd13f111031fac57270608abb04d20560248d4448fd00b1cf4dc4ab languageName: node linkType: hard @@ -12386,13 +12501,13 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/visitor-keys@npm:8.44.1": - version: 8.44.1 - resolution: "@typescript-eslint/visitor-keys@npm:8.44.1" +"@typescript-eslint/visitor-keys@npm:8.45.0": + version: 8.45.0 + resolution: "@typescript-eslint/visitor-keys@npm:8.45.0" dependencies: - "@typescript-eslint/types": "npm:8.44.1" + "@typescript-eslint/types": "npm:8.45.0" eslint-visitor-keys: "npm:^4.2.1" - checksum: 10c0/b2b06c9c45b1c27d9fc05805a5d6bac3cf8f17d2ccaa59bd40718e911df474b47b85dbab3494522917d9ba469338246f226b5332c3be2da52636f8a3b842fbf7 + checksum: 10c0/119adcf50c902dad7f7757bcdd88fad0a23a171d309d9b7cefe78af12e451cf84c04ae611f4c31f7e23f16c2b47665ad92e6e5648fc77d542ef306f465bf1f29 languageName: node linkType: hard @@ -13531,13 +13646,6 @@ __metadata: languageName: node linkType: hard -"ansis@npm:^4.0.0": - version: 4.2.0 - resolution: "ansis@npm:4.2.0" - checksum: 10c0/cd6a7a681ecd36e72e0d79c1e34f1f3bcb1b15bcbb6f0f8969b4228062d3bfebbef468e09771b00d93b2294370b34f707599d4a113542a876de26823b795b5d2 - languageName: node - linkType: hard - "antlr4ts@npm:^0.5.0-alpha.4": version: 0.5.0-dev resolution: "antlr4ts@npm:0.5.0-dev" @@ -13612,7 +13720,16 @@ __metadata: languageName: node linkType: hard -"aria-query@npm:5.3.2": +"aria-query@npm:5.3.0": + version: 5.3.0 + resolution: "aria-query@npm:5.3.0" + dependencies: + dequal: "npm:^2.0.3" + checksum: 10c0/2bff0d4eba5852a9dd578ecf47eaef0e82cc52569b48469b0aac2db5145db0b17b7a58d9e01237706d1e14b7a1b0ac9b78e9c97027ad97679dd8f91b85da1469 + languageName: node + linkType: hard + +"aria-query@npm:5.3.2, aria-query@npm:^5.0.0": version: 5.3.2 resolution: "aria-query@npm:5.3.2" checksum: 10c0/003c7e3e2cff5540bf7a7893775fc614de82b0c5dde8ae823d47b7a28a9d4da1f7ed85f340bdb93d5649caa927755f0e31ecc7ab63edfdfc00c8ef07e505e03e @@ -13889,6 +14006,13 @@ __metadata: languageName: node linkType: hard +"async-generator-function@npm:^1.0.0": + version: 1.0.0 + resolution: "async-generator-function@npm:1.0.0" + checksum: 10c0/2c50ef856c543ad500d8d8777d347e3c1ba623b93e99c9263ecc5f965c1b12d2a140e2ab6e43c3d0b85366110696f28114649411cbcd10b452a92a2318394186 + languageName: node + linkType: hard + "async-limiter@npm:~1.0.0": version: 1.0.1 resolution: "async-limiter@npm:1.0.1" @@ -14269,12 +14393,12 @@ __metadata: languageName: node linkType: hard -"baseline-browser-mapping@npm:^2.8.3": - version: 2.8.9 - resolution: "baseline-browser-mapping@npm:2.8.9" +"baseline-browser-mapping@npm:^2.8.9": + version: 2.8.11 + resolution: "baseline-browser-mapping@npm:2.8.11" bin: baseline-browser-mapping: dist/cli.js - checksum: 10c0/c54356eb90cf251f351708f151fa42d0331814c03baa7bdcc802767f721fd9fe069eea88ae42395984bfddcae0c2fba2e5ee25d7921ce7cdcefc2f47440673d4 + checksum: 10c0/9c345d41152782c20cc11ad0aff273d252d6063efdfc45a602abd8798b50d81deeb89aa3ab6eedd33dce2ad714d16de96783e248f850e95b6063e81cd2ea62ba languageName: node linkType: hard @@ -14560,18 +14684,18 @@ __metadata: languageName: node linkType: hard -"browserslist@npm:^4.21.5, browserslist@npm:^4.22.1, browserslist@npm:^4.22.2, browserslist@npm:^4.23.0, browserslist@npm:^4.24.0, browserslist@npm:^4.24.4, browserslist@npm:^4.25.3": - version: 4.26.2 - resolution: "browserslist@npm:4.26.2" +"browserslist@npm:^4.21.5, browserslist@npm:^4.22.1, browserslist@npm:^4.22.2, browserslist@npm:^4.23.0, browserslist@npm:^4.24.0, browserslist@npm:^4.24.4, browserslist@npm:^4.24.5, browserslist@npm:^4.25.3": + version: 4.26.3 + resolution: "browserslist@npm:4.26.3" dependencies: - baseline-browser-mapping: "npm:^2.8.3" - caniuse-lite: "npm:^1.0.30001741" - electron-to-chromium: "npm:^1.5.218" + baseline-browser-mapping: "npm:^2.8.9" + caniuse-lite: "npm:^1.0.30001746" + electron-to-chromium: "npm:^1.5.227" node-releases: "npm:^2.0.21" update-browserslist-db: "npm:^1.1.3" bin: browserslist: cli.js - checksum: 10c0/1146339dad33fda77786b11ea07f1c40c48899edd897d73a9114ee0dbb1ee6475bb4abda263a678c104508bdca8e66760ff8e10be1947d3e20d34bae01d8b89b + checksum: 10c0/3899ee3b7fd205ece4ffe4392697c3f2b120b68f3741ef1789212b4971771aee3f66cf37c5c3accf86ce59c0605b5980c0f132711abbcc9e62c132e6e0ee45f3 languageName: node linkType: hard @@ -14820,10 +14944,10 @@ __metadata: languageName: node linkType: hard -"caniuse-lite@npm:^1.0.30001702, caniuse-lite@npm:^1.0.30001741": - version: 1.0.30001745 - resolution: "caniuse-lite@npm:1.0.30001745" - checksum: 10c0/646ca4b57baaa7a835cf7204c8a257490ee8e36364c04638212e3750c5e8ef45c39f352307e6205114487bcc179d42f5216f6dac146641b16a60b20b29d6f2a6 +"caniuse-lite@npm:^1.0.30001702, caniuse-lite@npm:^1.0.30001746": + version: 1.0.30001747 + resolution: "caniuse-lite@npm:1.0.30001747" + checksum: 10c0/cef0c7fff34d4c0ac3edc33660f07785301c98858bb4a6b8702b7b09ca2b0fd5457a7772af7b9fc3591fdd13862f649e57eed824f4cb6cf4aedf563e58fc7d0c languageName: node linkType: hard @@ -16097,6 +16221,13 @@ __metadata: languageName: node linkType: hard +"css.escape@npm:^1.5.1": + version: 1.5.1 + resolution: "css.escape@npm:1.5.1" + checksum: 10c0/5e09035e5bf6c2c422b40c6df2eb1529657a17df37fda5d0433d722609527ab98090baf25b13970ca754079a0f3161dd3dfc0e743563ded8cfa0749d861c1525 + languageName: node + linkType: hard + "cssesc@npm:^3.0.0": version: 3.0.0 resolution: "cssesc@npm:3.0.0" @@ -16465,6 +16596,13 @@ __metadata: languageName: node linkType: hard +"dequal@npm:^2.0.3": + version: 2.0.3 + resolution: "dequal@npm:2.0.3" + checksum: 10c0/f98860cdf58b64991ae10205137c0e97d384c3a4edc7f807603887b7c4b850af1224a33d88012009f150861cbee4fa2d322c4cc04b9313bee312e47f6ecaa888 + languageName: node + linkType: hard + "destroy@npm:1.2.0": version: 1.2.0 resolution: "destroy@npm:1.2.0" @@ -16617,6 +16755,13 @@ __metadata: languageName: node linkType: hard +"dom-accessibility-api@npm:^0.6.3": + version: 0.6.3 + resolution: "dom-accessibility-api@npm:0.6.3" + checksum: 10c0/10bee5aa514b2a9a37c87cd81268db607a2e933a050074abc2f6fa3da9080ebed206a320cbc123567f2c3087d22292853bdfdceaffdd4334ffe2af9510b29360 + languageName: node + linkType: hard + "dom-serializer@npm:^2.0.0": version: 2.0.0 resolution: "dom-serializer@npm:2.0.0" @@ -16761,10 +16906,10 @@ __metadata: languageName: node linkType: hard -"electron-to-chromium@npm:^1.5.218": - version: 1.5.227 - resolution: "electron-to-chromium@npm:1.5.227" - checksum: 10c0/6b220ea024bcdd1560ffaca6b6b4c220d789b3e9c580c37509e8c176f369c93a4de8497a6e25cbfd9619ab9d129069368e4a4317dec0335d3a0cb61c2353e6f1 +"electron-to-chromium@npm:^1.5.227": + version: 1.5.230 + resolution: "electron-to-chromium@npm:1.5.230" + checksum: 10c0/b8bf382868b2780fa0c7ba3bce0644e94ec21af8f9b199ee094273904a575b46c8705fa4c10a22a0ed90e42dbbf72efbc3089bbecf8324a9db099c8c6c1c1101 languageName: node linkType: hard @@ -19249,7 +19394,7 @@ __metadata: languageName: node linkType: hard -"fs-extra@npm:^9.0.0, fs-extra@npm:^9.1.0": +"fs-extra@npm:^9.1.0": version: 9.1.0 resolution: "fs-extra@npm:9.1.0" dependencies: @@ -19354,6 +19499,13 @@ __metadata: languageName: node linkType: hard +"generator-function@npm:^2.0.0": + version: 2.0.1 + resolution: "generator-function@npm:2.0.1" + checksum: 10c0/8a9f59df0f01cfefafdb3b451b80555e5cf6d76487095db91ac461a0e682e4ff7a9dbce15f4ecec191e53586d59eece01949e05a4b4492879600bbbe8e28d6b8 + languageName: node + linkType: hard + "gensync@npm:^1.0.0-beta.2": version: 1.0.0-beta.2 resolution: "gensync@npm:1.0.0-beta.2" @@ -19383,20 +19535,23 @@ __metadata: linkType: hard "get-intrinsic@npm:^1.1.3, get-intrinsic@npm:^1.2.2, get-intrinsic@npm:^1.2.4, get-intrinsic@npm:^1.2.5, get-intrinsic@npm:^1.2.6, get-intrinsic@npm:^1.2.7, get-intrinsic@npm:^1.3.0": - version: 1.3.0 - resolution: "get-intrinsic@npm:1.3.0" + version: 1.3.1 + resolution: "get-intrinsic@npm:1.3.1" dependencies: + async-function: "npm:^1.0.0" + async-generator-function: "npm:^1.0.0" call-bind-apply-helpers: "npm:^1.0.2" es-define-property: "npm:^1.0.1" es-errors: "npm:^1.3.0" es-object-atoms: "npm:^1.1.1" function-bind: "npm:^1.1.2" + generator-function: "npm:^2.0.0" get-proto: "npm:^1.0.1" gopd: "npm:^1.2.0" has-symbols: "npm:^1.1.0" hasown: "npm:^2.0.2" math-intrinsics: "npm:^1.1.0" - checksum: 10c0/52c81808af9a8130f581e6a6a83e1ba4a9f703359e7a438d1369a5267a25412322f03dcbd7c549edaef0b6214a0630a28511d7df0130c93cfd380f4fa0b5b66a + checksum: 10c0/9f4ab0cf7efe0fd2c8185f52e6f637e708f3a112610c88869f8f041bb9ecc2ce44bf285dfdbdc6f4f7c277a5b88d8e94a432374d97cca22f3de7fc63795deb5d languageName: node linkType: hard @@ -19523,11 +19678,11 @@ __metadata: linkType: hard "glob-to-regex.js@npm:^1.0.1": - version: 1.0.1 - resolution: "glob-to-regex.js@npm:1.0.1" + version: 1.2.0 + resolution: "glob-to-regex.js@npm:1.2.0" peerDependencies: tslib: 2 - checksum: 10c0/d8f62efd63405f880bbcf902019485462ab0a93ca707161babb204bd5df144b45961218bba04074750587c1182d3fd77d527495cca735579ac9cc58dfe63e814 + checksum: 10c0/011c81ae2a4d7ac5fd617038209fd9639d54c76211cc88fe8dd85d1a0850bc683a63cf5b1eae370141fca7dd2c834dfb9684dfdd8bf7472f2c1e4ef6ab6e34f9 languageName: node linkType: hard @@ -20818,14 +20973,15 @@ __metadata: linkType: hard "is-generator-function@npm:^1.0.10, is-generator-function@npm:^1.0.7": - version: 1.1.0 - resolution: "is-generator-function@npm:1.1.0" + version: 1.1.2 + resolution: "is-generator-function@npm:1.1.2" dependencies: - call-bound: "npm:^1.0.3" - get-proto: "npm:^1.0.0" + call-bound: "npm:^1.0.4" + generator-function: "npm:^2.0.0" + get-proto: "npm:^1.0.1" has-tostringtag: "npm:^1.0.2" safe-regex-test: "npm:^1.1.0" - checksum: 10c0/fdfa96c8087bf36fc4cd514b474ba2ff404219a4dd4cfa6cf5426404a1eed259bdcdb98f082a71029a48d01f27733e3436ecc6690129a7ec09cb0434bee03a2a + checksum: 10c0/83da102e89c3e3b71d67b51d47c9f9bc862bceb58f87201727e27f7fa19d1d90b0ab223644ecaee6fc6e3d2d622bb25c966fbdaf87c59158b01ce7c0fe2fa372 languageName: node linkType: hard @@ -21807,11 +21963,11 @@ __metadata: linkType: hard "jiti@npm:^2.4.2, jiti@npm:^2.6.0": - version: 2.6.0 - resolution: "jiti@npm:2.6.0" + version: 2.6.1 + resolution: "jiti@npm:2.6.1" bin: jiti: lib/jiti-cli.mjs - checksum: 10c0/5002ccecdb02e85413e5bfe3819a5ac458dcce12b358c556b6cf17b5b6cbedd36514f6a67d4aa2b290caa2b933406502a1985d0bfee784ece788e90a0392d534 + checksum: 10c0/79b2e96a8e623f66c1b703b98ec1b8be4500e1d217e09b09e343471bbb9c105381b83edbb979d01cef18318cc45ce6e153571b6c83122170eefa531c64b6789b languageName: node linkType: hard @@ -23080,8 +23236,8 @@ __metadata: linkType: hard "memfs@npm:^4.43.1, memfs@npm:^4.6.0": - version: 4.47.0 - resolution: "memfs@npm:4.47.0" + version: 4.48.1 + resolution: "memfs@npm:4.48.1" dependencies: "@jsonjoy.com/json-pack": "npm:^1.11.0" "@jsonjoy.com/util": "npm:^1.9.0" @@ -23089,7 +23245,7 @@ __metadata: thingies: "npm:^2.5.0" tree-dump: "npm:^1.0.3" tslib: "npm:^2.0.0" - checksum: 10c0/2c8094d9fe34422b8d1ceaa1e8bb2afde80d1497649cb63d6f2a09f542cfb2eec8a34a417dfdbb85c84f89dc67eadcf23e41c49814f2f73b260bbc5c7c662d0b + checksum: 10c0/3053b03a69acff1681e8570790c7cf75be823b05b5cd28473710c28cb385e3b8643b6727068f355f262e71974d39213687ed33a38fc82c01134dfee8ecbcae19 languageName: node linkType: hard @@ -23819,9 +23975,14 @@ __metadata: "@react-native/metro-config": "npm:0.76.9" "@selfxyz/common": "workspace:*" "@selfxyz/mobile-sdk-alpha": "workspace:*" + "@testing-library/dom": "npm:^10.4.1" + "@testing-library/jest-dom": "npm:^6.6.3" + "@testing-library/react": "npm:^16.1.0" + "@testing-library/user-event": "npm:^14.5.2" "@tsconfig/react-native": "npm:^3.0.6" "@types/node": "npm:^22.18.3" "@types/react": "npm:^18.3.4" + "@types/react-dom": "npm:^18.3.0" "@types/react-native-vector-icons": "npm:^6.4.18" "@typescript-eslint/eslint-plugin": "npm:^8.44.0" "@typescript-eslint/parser": "npm:^8.44.0" @@ -23842,6 +24003,7 @@ __metadata: metro-react-native-babel-preset: "npm:0.76.9" prettier: "npm:^3.6.2" react: "npm:^18.3.1" + react-dom: "npm:^18.3.1" react-native: "npm:0.76.9" react-native-get-random-values: "npm:^1.11.0" react-native-keychain: "npm:^10.0.0" @@ -24380,9 +24542,9 @@ __metadata: linkType: hard "node-releases@npm:^2.0.21": - version: 2.0.21 - resolution: "node-releases@npm:2.0.21" - checksum: 10c0/0eb94916eeebbda9d51da6a9ea47428a12b2bb0dd94930c949632b0c859356abf53b2e5a2792021f96c5fda4f791a8e195f2375b78ae7dba8d8bc3141baa1469 + version: 2.0.23 + resolution: "node-releases@npm:2.0.23" + checksum: 10c0/3fdcddb574a9d56c050469b027f3fd2b8830fd321edd12f34b862969b67d0a3d6713eb2af8916f91618d555354f6c7bd33ae39e3b37117b1e7ddf2e42bc3f4be languageName: node linkType: hard @@ -24934,29 +25096,28 @@ __metadata: linkType: hard "oxc-resolver@npm:^11.8.3": - version: 11.8.4 - resolution: "oxc-resolver@npm:11.8.4" - dependencies: - "@oxc-resolver/binding-android-arm-eabi": "npm:11.8.4" - "@oxc-resolver/binding-android-arm64": "npm:11.8.4" - "@oxc-resolver/binding-darwin-arm64": "npm:11.8.4" - "@oxc-resolver/binding-darwin-x64": "npm:11.8.4" - "@oxc-resolver/binding-freebsd-x64": "npm:11.8.4" - "@oxc-resolver/binding-linux-arm-gnueabihf": "npm:11.8.4" - "@oxc-resolver/binding-linux-arm-musleabihf": "npm:11.8.4" - "@oxc-resolver/binding-linux-arm64-gnu": "npm:11.8.4" - "@oxc-resolver/binding-linux-arm64-musl": "npm:11.8.4" - "@oxc-resolver/binding-linux-ppc64-gnu": "npm:11.8.4" - "@oxc-resolver/binding-linux-riscv64-gnu": "npm:11.8.4" - "@oxc-resolver/binding-linux-riscv64-musl": "npm:11.8.4" - "@oxc-resolver/binding-linux-s390x-gnu": "npm:11.8.4" - "@oxc-resolver/binding-linux-x64-gnu": "npm:11.8.4" - "@oxc-resolver/binding-linux-x64-musl": "npm:11.8.4" - "@oxc-resolver/binding-wasm32-wasi": "npm:11.8.4" - "@oxc-resolver/binding-win32-arm64-msvc": "npm:11.8.4" - "@oxc-resolver/binding-win32-ia32-msvc": "npm:11.8.4" - "@oxc-resolver/binding-win32-x64-msvc": "npm:11.8.4" - napi-postinstall: "npm:^0.3.0" + version: 11.9.0 + resolution: "oxc-resolver@npm:11.9.0" + dependencies: + "@oxc-resolver/binding-android-arm-eabi": "npm:11.9.0" + "@oxc-resolver/binding-android-arm64": "npm:11.9.0" + "@oxc-resolver/binding-darwin-arm64": "npm:11.9.0" + "@oxc-resolver/binding-darwin-x64": "npm:11.9.0" + "@oxc-resolver/binding-freebsd-x64": "npm:11.9.0" + "@oxc-resolver/binding-linux-arm-gnueabihf": "npm:11.9.0" + "@oxc-resolver/binding-linux-arm-musleabihf": "npm:11.9.0" + "@oxc-resolver/binding-linux-arm64-gnu": "npm:11.9.0" + "@oxc-resolver/binding-linux-arm64-musl": "npm:11.9.0" + "@oxc-resolver/binding-linux-ppc64-gnu": "npm:11.9.0" + "@oxc-resolver/binding-linux-riscv64-gnu": "npm:11.9.0" + "@oxc-resolver/binding-linux-riscv64-musl": "npm:11.9.0" + "@oxc-resolver/binding-linux-s390x-gnu": "npm:11.9.0" + "@oxc-resolver/binding-linux-x64-gnu": "npm:11.9.0" + "@oxc-resolver/binding-linux-x64-musl": "npm:11.9.0" + "@oxc-resolver/binding-wasm32-wasi": "npm:11.9.0" + "@oxc-resolver/binding-win32-arm64-msvc": "npm:11.9.0" + "@oxc-resolver/binding-win32-ia32-msvc": "npm:11.9.0" + "@oxc-resolver/binding-win32-x64-msvc": "npm:11.9.0" dependenciesMeta: "@oxc-resolver/binding-android-arm-eabi": optional: true @@ -24996,7 +25157,7 @@ __metadata: optional: true "@oxc-resolver/binding-win32-x64-msvc": optional: true - checksum: 10c0/986a4c12175a35ca646ac33417a209b108829c0944517832aace1f3bc111b9e84fba917a3a18dd55839b0d555b71eb60ca0096f5fc29ba274bfd9857fd4afc2d + checksum: 10c0/5a6c3381dd190c003cf07e8020684e9818ffd7fb4e75f4ec171fcc537037c55a28a84980c4949b209ba4f29d7c93aaa57a652287bede5d1dc31d58ebda123431 languageName: node linkType: hard @@ -25286,27 +25447,26 @@ __metadata: linkType: hard "patch-package@npm:^8.0.0": - version: 8.0.0 - resolution: "patch-package@npm:8.0.0" + version: 8.0.1 + resolution: "patch-package@npm:8.0.1" dependencies: "@yarnpkg/lockfile": "npm:^1.1.0" chalk: "npm:^4.1.2" ci-info: "npm:^3.7.0" cross-spawn: "npm:^7.0.3" find-yarn-workspace-root: "npm:^2.0.0" - fs-extra: "npm:^9.0.0" + fs-extra: "npm:^10.0.0" json-stable-stringify: "npm:^1.0.2" klaw-sync: "npm:^6.0.0" minimist: "npm:^1.2.6" open: "npm:^7.4.2" - rimraf: "npm:^2.6.3" semver: "npm:^7.5.3" slash: "npm:^2.0.0" - tmp: "npm:^0.0.33" + tmp: "npm:^0.2.4" yaml: "npm:^2.2.2" bin: patch-package: index.js - checksum: 10c0/690eab0537e953a3fd7d32bb23f0e82f97cd448f8244c3227ed55933611a126f9476397325c06ad2c11d881a19b427a02bd1881bee78d89f1731373fc4fe0fee + checksum: 10c0/6dd7cdd8b814902f1a66bc9082bd5a5a484956563538a694ff1de2e7f4cc14a13480739f5f04e0d1747395d6f1b651eb1ddbc39687ce5ff8a3927f212cffd2ac languageName: node linkType: hard @@ -25456,7 +25616,7 @@ __metadata: languageName: node linkType: hard -"picocolors@npm:^1.0.0, picocolors@npm:^1.1.0, picocolors@npm:^1.1.1": +"picocolors@npm:1.1.1, picocolors@npm:^1.0.0, picocolors@npm:^1.1.0, picocolors@npm:^1.1.1": version: 1.1.1 resolution: "picocolors@npm:1.1.1" checksum: 10c0/e2e3e8170ab9d7c7421969adaa7e1b31434f789afb9b3f115f6b96d91945041ac3ceb02e9ec6fe6510ff036bcc0bf91e69a1772edc0b707e12b19c0f2d6bcf58 @@ -26286,9 +26446,9 @@ __metadata: linkType: hard "react-is@npm:^19.1.0": - version: 19.1.1 - resolution: "react-is@npm:19.1.1" - checksum: 10c0/3dba763fcd69835ae263dcd6727d7ffcc44c1d616f04b7329e67aefdc66a567af4f8dcecdd29454c7a707c968aa1eb85083a83fb616f01675ef25e71cf082f97 + version: 19.2.0 + resolution: "react-is@npm:19.2.0" + checksum: 10c0/a63cb346aeced8ac0e671b0f9b33720d2906de02a066ca067075d871a5d4c64cdb328f495baf9b5842d5868c0d5edd1ce18465a7358b52f4b6aa983479c9bfa2 languageName: node linkType: hard @@ -26680,15 +26840,15 @@ __metadata: linkType: hard "react-qr-barcode-scanner@npm:^2.1.8": - version: 2.1.14 - resolution: "react-qr-barcode-scanner@npm:2.1.14" + version: 2.1.15 + resolution: "react-qr-barcode-scanner@npm:2.1.15" dependencies: "@zxing/library": "npm:^0.21.3" react-webcam: "npm:^7.2.0" peerDependencies: react: ">=18.0.0" react-dom: ">=18.0.0" - checksum: 10c0/c185d3690da505c080c3e25dc143649dd2b9d21bb5b8a47cd20ab978fbcd4906edc4439e05b745b9721ae88c3bdc06903c18b364ff22f40208095f64928447ed + checksum: 10c0/85f08562c5b43de79f9b87ae213ba724100d32dcbe6102795dee0e629e157f1f101c42b1e064ed396f5cece3bb4c5e2e80e28f105e13b2739e7f65bdd383726d languageName: node linkType: hard @@ -27271,17 +27431,6 @@ __metadata: languageName: node linkType: hard -"rimraf@npm:^2.6.3": - version: 2.7.1 - resolution: "rimraf@npm:2.7.1" - dependencies: - glob: "npm:^7.1.3" - bin: - rimraf: ./bin.js - checksum: 10c0/4eef73d406c6940927479a3a9dee551e14a54faf54b31ef861250ac815172bade86cc6f7d64a4dc5e98b65e4b18a2e1c9ff3b68d296be0c748413f092bb0dd40 - languageName: node - linkType: hard - "rimraf@npm:^3.0.2": version: 3.0.2 resolution: "rimraf@npm:3.0.2" @@ -27325,62 +27474,6 @@ __metadata: languageName: node linkType: hard -"rolldown@npm:1.0.0-beta.38": - version: 1.0.0-beta.38 - resolution: "rolldown@npm:1.0.0-beta.38" - dependencies: - "@oxc-project/types": "npm:=0.89.0" - "@rolldown/binding-android-arm64": "npm:1.0.0-beta.38" - "@rolldown/binding-darwin-arm64": "npm:1.0.0-beta.38" - "@rolldown/binding-darwin-x64": "npm:1.0.0-beta.38" - "@rolldown/binding-freebsd-x64": "npm:1.0.0-beta.38" - "@rolldown/binding-linux-arm-gnueabihf": "npm:1.0.0-beta.38" - "@rolldown/binding-linux-arm64-gnu": "npm:1.0.0-beta.38" - "@rolldown/binding-linux-arm64-musl": "npm:1.0.0-beta.38" - "@rolldown/binding-linux-x64-gnu": "npm:1.0.0-beta.38" - "@rolldown/binding-linux-x64-musl": "npm:1.0.0-beta.38" - "@rolldown/binding-openharmony-arm64": "npm:1.0.0-beta.38" - "@rolldown/binding-wasm32-wasi": "npm:1.0.0-beta.38" - "@rolldown/binding-win32-arm64-msvc": "npm:1.0.0-beta.38" - "@rolldown/binding-win32-ia32-msvc": "npm:1.0.0-beta.38" - "@rolldown/binding-win32-x64-msvc": "npm:1.0.0-beta.38" - "@rolldown/pluginutils": "npm:1.0.0-beta.38" - ansis: "npm:^4.0.0" - dependenciesMeta: - "@rolldown/binding-android-arm64": - optional: true - "@rolldown/binding-darwin-arm64": - optional: true - "@rolldown/binding-darwin-x64": - optional: true - "@rolldown/binding-freebsd-x64": - optional: true - "@rolldown/binding-linux-arm-gnueabihf": - optional: true - "@rolldown/binding-linux-arm64-gnu": - optional: true - "@rolldown/binding-linux-arm64-musl": - optional: true - "@rolldown/binding-linux-x64-gnu": - optional: true - "@rolldown/binding-linux-x64-musl": - optional: true - "@rolldown/binding-openharmony-arm64": - optional: true - "@rolldown/binding-wasm32-wasi": - optional: true - "@rolldown/binding-win32-arm64-msvc": - optional: true - "@rolldown/binding-win32-ia32-msvc": - optional: true - "@rolldown/binding-win32-x64-msvc": - optional: true - bin: - rolldown: bin/cli.mjs - checksum: 10c0/5c77fe444585d9d06c2383dbb0480e9ef4c8c565c8f87119f8ee8d7f9e63df749eb24f3342c66273510635fd32aedda7cbad94f4c40c9ffed2e9e76097c0961e - languageName: node - linkType: hard - "rollup-plugin-dts@npm:^6.2.0": version: 6.2.3 resolution: "rollup-plugin-dts@npm:6.2.3" @@ -27398,8 +27491,8 @@ __metadata: linkType: hard "rollup-plugin-visualizer@npm:^6.0.3": - version: 6.0.3 - resolution: "rollup-plugin-visualizer@npm:6.0.3" + version: 6.0.4 + resolution: "rollup-plugin-visualizer@npm:6.0.4" dependencies: open: "npm:^8.0.0" picomatch: "npm:^4.0.2" @@ -27415,11 +27508,11 @@ __metadata: optional: true bin: rollup-plugin-visualizer: dist/bin/cli.js - checksum: 10c0/595d68936a6338744e8facd165fceedf7f2ebedc44863e640e725198001ed62948cc4a5d8403aa74e679de92957e4def3b1dffc4a9f8de71e4245929566553a3 + checksum: 10c0/e5d472bec0c863c9c3c46f55b303a9457e854bf1b654215e727a586da12897e2cfc30029f029c6c44dd8e9e61ce0d22f113a68ed8e5fe2256abeb58f265c0a89 languageName: node linkType: hard -"rollup@npm:^4.20.0, rollup@npm:^4.24.0, rollup@npm:^4.34.8, rollup@npm:^4.43.0": +"rollup@npm:4.52.3": version: 4.52.3 resolution: "rollup@npm:4.52.3" dependencies: @@ -27500,6 +27593,87 @@ __metadata: languageName: node linkType: hard +"rollup@npm:^4.20.0, rollup@npm:^4.24.0, rollup@npm:^4.34.8, rollup@npm:^4.43.0": + version: 4.52.4 + resolution: "rollup@npm:4.52.4" + dependencies: + "@rollup/rollup-android-arm-eabi": "npm:4.52.4" + "@rollup/rollup-android-arm64": "npm:4.52.4" + "@rollup/rollup-darwin-arm64": "npm:4.52.4" + "@rollup/rollup-darwin-x64": "npm:4.52.4" + "@rollup/rollup-freebsd-arm64": "npm:4.52.4" + "@rollup/rollup-freebsd-x64": "npm:4.52.4" + "@rollup/rollup-linux-arm-gnueabihf": "npm:4.52.4" + "@rollup/rollup-linux-arm-musleabihf": "npm:4.52.4" + "@rollup/rollup-linux-arm64-gnu": "npm:4.52.4" + "@rollup/rollup-linux-arm64-musl": "npm:4.52.4" + "@rollup/rollup-linux-loong64-gnu": "npm:4.52.4" + "@rollup/rollup-linux-ppc64-gnu": "npm:4.52.4" + "@rollup/rollup-linux-riscv64-gnu": "npm:4.52.4" + "@rollup/rollup-linux-riscv64-musl": "npm:4.52.4" + "@rollup/rollup-linux-s390x-gnu": "npm:4.52.4" + "@rollup/rollup-linux-x64-gnu": "npm:4.52.4" + "@rollup/rollup-linux-x64-musl": "npm:4.52.4" + "@rollup/rollup-openharmony-arm64": "npm:4.52.4" + "@rollup/rollup-win32-arm64-msvc": "npm:4.52.4" + "@rollup/rollup-win32-ia32-msvc": "npm:4.52.4" + "@rollup/rollup-win32-x64-gnu": "npm:4.52.4" + "@rollup/rollup-win32-x64-msvc": "npm:4.52.4" + "@types/estree": "npm:1.0.8" + fsevents: "npm:~2.3.2" + dependenciesMeta: + "@rollup/rollup-android-arm-eabi": + optional: true + "@rollup/rollup-android-arm64": + optional: true + "@rollup/rollup-darwin-arm64": + optional: true + "@rollup/rollup-darwin-x64": + optional: true + "@rollup/rollup-freebsd-arm64": + optional: true + "@rollup/rollup-freebsd-x64": + optional: true + "@rollup/rollup-linux-arm-gnueabihf": + optional: true + "@rollup/rollup-linux-arm-musleabihf": + optional: true + "@rollup/rollup-linux-arm64-gnu": + optional: true + "@rollup/rollup-linux-arm64-musl": + optional: true + "@rollup/rollup-linux-loong64-gnu": + optional: true + "@rollup/rollup-linux-ppc64-gnu": + optional: true + "@rollup/rollup-linux-riscv64-gnu": + optional: true + "@rollup/rollup-linux-riscv64-musl": + optional: true + "@rollup/rollup-linux-s390x-gnu": + optional: true + "@rollup/rollup-linux-x64-gnu": + optional: true + "@rollup/rollup-linux-x64-musl": + optional: true + "@rollup/rollup-openharmony-arm64": + optional: true + "@rollup/rollup-win32-arm64-msvc": + optional: true + "@rollup/rollup-win32-ia32-msvc": + optional: true + "@rollup/rollup-win32-x64-gnu": + optional: true + "@rollup/rollup-win32-x64-msvc": + optional: true + fsevents: + optional: true + bin: + rollup: dist/bin/rollup + checksum: 10c0/aaec0f57e887d4fb37d152f93cf7133954eec79d11643e95de768ec9a377f08793b1745c648ca65a0dcc6c795c4d9ca398724d013e5745de270e88a543782aea + languageName: node + linkType: hard + "router@npm:^2.2.0": version: 2.2.0 resolution: "router@npm:2.2.0" @@ -27726,14 +27900,14 @@ __metadata: linkType: hard "schema-utils@npm:^4.0.0, schema-utils@npm:^4.2.0, schema-utils@npm:^4.3.0, schema-utils@npm:^4.3.2": - version: 4.3.2 - resolution: "schema-utils@npm:4.3.2" + version: 4.3.3 + resolution: "schema-utils@npm:4.3.3" dependencies: "@types/json-schema": "npm:^7.0.9" ajv: "npm:^8.9.0" ajv-formats: "npm:^2.1.1" ajv-keywords: "npm:^5.1.0" - checksum: 10c0/981632f9bf59f35b15a9bcdac671dd183f4946fe4b055ae71a301e66a9797b95e5dd450de581eb6cca56fb6583ce8f24d67b2d9f8e1b2936612209697f6c277e + checksum: 10c0/1c8d2c480a026d7c02ab2ecbe5919133a096d6a721a3f201fa50663e4f30f6d6ba020dfddd93cb828b66b922e76b342e103edd19a62c95c8f60e9079cc403202 languageName: node linkType: hard @@ -29357,10 +29531,10 @@ __metadata: languageName: node linkType: hard -"tapable@npm:^2.1.1, tapable@npm:^2.2.0, tapable@npm:^2.2.1": - version: 2.2.3 - resolution: "tapable@npm:2.2.3" - checksum: 10c0/e57fd8e2d756c317f8726a1bec8f2c904bc42e37fcbd4a78211daeab89f42c734b6a20e61774321f47be9a421da628a0c78b62d36c5ed186f4d5232d09ae15f2 +"tapable@npm:^2.1.1, tapable@npm:^2.2.0, tapable@npm:^2.2.1, tapable@npm:^2.2.3": + version: 2.3.0 + resolution: "tapable@npm:2.3.0" + checksum: 10c0/cb9d67cc2c6a74dedc812ef3085d9d681edd2c1fa18e4aef57a3c0605fdbe44e6b8ea00bd9ef21bc74dd45314e39d31227aa031ebf2f5e38164df514136f2681 languageName: node linkType: hard @@ -29700,7 +29874,7 @@ __metadata: languageName: node linkType: hard -"tmp@npm:0.0.33, tmp@npm:^0.0.33": +"tmp@npm:0.0.33": version: 0.0.33 resolution: "tmp@npm:0.0.33" dependencies: @@ -29709,7 +29883,7 @@ __metadata: languageName: node linkType: hard -"tmp@npm:^0.2.0": +"tmp@npm:^0.2.0, tmp@npm:^0.2.4": version: 0.2.5 resolution: "tmp@npm:0.2.5" checksum: 10c0/cee5bb7d674bb4ba3ab3f3841c2ca7e46daeb2109eec395c1ec7329a91d52fcb21032b79ac25161a37b2565c4858fefab927af9735926a113ef7bac9091a6e0e @@ -30343,12 +30517,12 @@ __metadata: linkType: hard "typescript@npm:^5.8.2, typescript@npm:^5.9.2, typescript@npm:~5.9.0": - version: 5.9.2 - resolution: "typescript@npm:5.9.2" + version: 5.9.3 + resolution: "typescript@npm:5.9.3" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 10c0/cd635d50f02d6cf98ed42de2f76289701c1ec587a363369255f01ed15aaf22be0813226bff3c53e99d971f9b540e0b3cc7583dbe05faded49b1b0bed2f638a18 + checksum: 10c0/6bd7552ce39f97e711db5aa048f6f9995b53f1c52f7d8667c1abdc1700c68a76a308f579cd309ce6b53646deb4e9a1be7c813a93baaf0a28ccd536a30270e1c5 languageName: node linkType: hard @@ -30363,12 +30537,12 @@ __metadata: linkType: hard "typescript@patch:typescript@npm%3A^5.8.2#optional!builtin, typescript@patch:typescript@npm%3A^5.9.2#optional!builtin, typescript@patch:typescript@npm%3A~5.9.0#optional!builtin": - version: 5.9.2 - resolution: "typescript@patch:typescript@npm%3A5.9.2#optional!builtin::version=5.9.2&hash=5786d5" + version: 5.9.3 + resolution: "typescript@patch:typescript@npm%3A5.9.3#optional!builtin::version=5.9.3&hash=5786d5" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 10c0/34d2a8e23eb8e0d1875072064d5e1d9c102e0bdce56a10a25c0b917b8aa9001a9cf5c225df12497e99da107dc379360bc138163c66b55b95f5b105b50578067e + checksum: 10c0/ad09fdf7a756814dce65bc60c1657b40d44451346858eea230e10f2e95a289d9183b6e32e5c11e95acc0ccc214b4f36289dcad4bf1886b0adb84d711d336a430 languageName: node linkType: hard @@ -30676,11 +30850,11 @@ __metadata: linkType: hard "use-sync-external-store@npm:^1.2.0, use-sync-external-store@npm:^1.2.2, use-sync-external-store@npm:^1.5.0": - version: 1.5.0 - resolution: "use-sync-external-store@npm:1.5.0" + version: 1.6.0 + resolution: "use-sync-external-store@npm:1.6.0" peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - checksum: 10c0/1b8663515c0be34fa653feb724fdcce3984037c78dd4a18f68b2c8be55cc1a1084c578d5b75f158d41b5ddffc2bf5600766d1af3c19c8e329bb20af2ec6f52f4 + checksum: 10c0/35e1179f872a53227bdf8a827f7911da4c37c0f4091c29b76b1e32473d1670ebe7bcd880b808b7549ba9a5605c233350f800ffab963ee4a4ee346ee983b6019b languageName: node linkType: hard @@ -30952,8 +31126,8 @@ __metadata: linkType: hard "vite@npm:^7.0.0": - version: 7.1.7 - resolution: "vite@npm:7.1.7" + version: 7.1.9 + resolution: "vite@npm:7.1.9" dependencies: esbuild: "npm:^0.25.0" fdir: "npm:^6.5.0" @@ -31002,7 +31176,7 @@ __metadata: optional: true bin: vite: bin/vite.js - checksum: 10c0/3f6bd61a65aaa81368f4dda804f0e23b103664724218ccb5a0b1a0c7e284df498107b57ced951dc40ae4c5d472435bc8fb5c836414e729ee7e102809eaf6ff80 + checksum: 10c0/f628f903a137c1410232558bde99c223ea00a090bda6af77752c61f912955f0050aac12d3cfe024d08a0f150ff6fab61b3d0be75d634a59b94d49f525392e1f7 languageName: node linkType: hard @@ -31203,7 +31377,7 @@ __metadata: languageName: node linkType: hard -"watchpack@npm:2.4.4, watchpack@npm:^2.4.1": +"watchpack@npm:2.4.4, watchpack@npm:^2.4.1, watchpack@npm:^2.4.4": version: 2.4.4 resolution: "watchpack@npm:2.4.4" dependencies: @@ -31451,8 +31625,8 @@ __metadata: linkType: hard "webpack@npm:^5.95.0, webpack@npm:^5.98.0": - version: 5.101.3 - resolution: "webpack@npm:5.101.3" + version: 5.102.0 + resolution: "webpack@npm:5.102.0" dependencies: "@types/eslint-scope": "npm:^3.7.7" "@types/estree": "npm:^1.0.8" @@ -31462,7 +31636,7 @@ __metadata: "@webassemblyjs/wasm-parser": "npm:^1.14.1" acorn: "npm:^8.15.0" acorn-import-phases: "npm:^1.0.3" - browserslist: "npm:^4.24.0" + browserslist: "npm:^4.24.5" chrome-trace-event: "npm:^1.0.2" enhanced-resolve: "npm:^5.17.3" es-module-lexer: "npm:^1.2.1" @@ -31475,16 +31649,16 @@ __metadata: mime-types: "npm:^2.1.27" neo-async: "npm:^2.6.2" schema-utils: "npm:^4.3.2" - tapable: "npm:^2.1.1" + tapable: "npm:^2.2.3" terser-webpack-plugin: "npm:^5.3.11" - watchpack: "npm:^2.4.1" + watchpack: "npm:^2.4.4" webpack-sources: "npm:^3.3.3" peerDependenciesMeta: webpack-cli: optional: true bin: webpack: bin/webpack.js - checksum: 10c0/3c204d4f1df0ef2774ae043f62e4db56c11b7a0594e82fbb1fbbaf69893570f3bf08a8b5d2d5a0302ce6346132bf3eb9dbde81e4fab3d68307b2e506d606f064 + checksum: 10c0/da8f18a5a4b2284d8f3bae0639cd46798d9b0949c48908680b5798125e57fa4898e80155cc367c9758d444d1251df57b2c76fd6c0988dd95ffc89df3bb712f89 languageName: node linkType: hard @@ -31892,9 +32066,9 @@ __metadata: linkType: hard "xstate@npm:^5.20.2": - version: 5.22.0 - resolution: "xstate@npm:5.22.0" - checksum: 10c0/247d589c0dfd61161747e5ef4c8f06345add346f74355d65ed417a3ae81165defb4d18cbe5456c2f73dfc99cd7019d312f88200becc955543b935fb21cf0a1ea + version: 5.22.1 + resolution: "xstate@npm:5.22.1" + checksum: 10c0/d219bcb24c2d3e3310778dd3d14177c67922e0bd070e8d150d4775c56672540ddb3de229c314d48166d8c9b77e01eab3b729461282460a956511344ffd0ce628 languageName: node linkType: hard