diff --git a/.cursor/rules/project-rules.mdc b/.cursor/rules/project-rules.mdc index c36c0193a..f34793522 100644 --- a/.cursor/rules/project-rules.mdc +++ b/.cursor/rules/project-rules.mdc @@ -42,7 +42,7 @@ pnpm add ## Directory Structure - **`src/background`**: Contains the code for the extension's background script. - - **`service/`**: Houses various services that run in the background, like API calls and wallet logic. See [userWallet.ts](mdc:src/background/service/userWallet.ts). + - **`service/`**: Houses various services that run in the background, like API calls and wallet logic. See [userWallet.ts](mdc:src/core/service/userWallet.ts). - **`utils/`**: Utilities for the background script. - **`src/ui`**: Contains all UI-related code. - **`components/`**: Shared, reusable React components. See [FRWProfile.tsx](mdc:src/ui/components/FRWProfile.tsx). @@ -64,7 +64,7 @@ To maintain consistency, please adhere to the following naming conventions for n - **Flow Interaction**: The [@onflow/fcl](mdc:https:/github.com/onflow/fcl-js) library is used for all interactions with the Flow blockchain. - **State Management**: The application uses a combination of React hooks, and data cache storage using chrome storage. -- **Firebase**: Used for remote configuration. See [firebaseConfig.ts](mdc:src/background/utils/firebaseConfig.ts). +- **Firebase**: Used for remote configuration. See [firebaseConfig.ts](mdc:src/core/utils/firebaseConfig.ts). - **Internationalization (i18n)**: Text is managed in [messages.json](mdc:src/messages.json) and loaded via `i18n.ts`. ## Data Caching @@ -89,7 +89,7 @@ The extension uses a custom stale-while-revalidate caching system designed for t - **`docs/cache-data-model.md`**: The primary documentation for this system. - **`src/shared/utils/cache-data-keys.ts`**: Defines keys and data types for temporary session data. - **`src/shared/utils/user-data-keys.ts`**: Defines keys and data types for persistent user data. -- **`src/background/utils/data-cache.ts`**: Contains the core logic for the caching mechanism, including `registerRefreshListener` for single items and `registerBatchRefreshListener` for batching multiple requests. +- **`src/core/utils/data-cache.ts`**: Contains the core logic for the caching mechanism, including `registerRefreshListener` for single items and `registerBatchRefreshListener` for batching multiple requests. ### Implementation Pattern diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 98895cba6..e56b08766 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -2,6 +2,7 @@ name: Extension Build on: push: + workflow_dispatch: jobs: determine-env: @@ -121,23 +122,23 @@ jobs: EOF } - # Always create .env.pro - create_env_file ".env.pro" + # Always create .env.pro in extension directory + create_env_file "apps/extension/.env.pro" # Create .env.dev if environment is development if [[ "${{ needs.determine-env.outputs.env_name }}" == "development" || "${{ needs.determine-env.outputs.env_name }}" == "staging" ]]; then - create_env_file ".env.dev" + create_env_file "apps/extension/.env.dev" fi - name: Run tests - run: pnpm test + run: pnpm -F flow-wallet-extension test:run - name: Build run: | if [[ "${{ needs.determine-env.outputs.env_name }}" == "development" || "${{ needs.determine-env.outputs.env_name }}" == "staging" ]]; then - pnpm run build:dev-ci + pnpm -F flow-wallet-extension build:dev-ci else - pnpm run build:ci + pnpm -F flow-wallet-extension build:ci fi env: CI: true @@ -151,12 +152,12 @@ jobs: uses: actions/upload-artifact@v4 with: name: extension-build - path: dist/ + path: apps/extension/dist/ - name: Check build size run: | echo "Build size:" - du -sh dist/ + du -sh apps/extension/dist/ test: needs: [determine-env, build] @@ -185,11 +186,11 @@ jobs: uses: actions/download-artifact@v4 with: name: extension-build - path: dist/ + path: apps/extension/dist/ - name: Create .env.test file run: | - cat << EOF > .env.test + cat << EOF > apps/extension/.env.test # Test secrets TEST_PASSWORD="${{ secrets.TEST_PASSWORD }}" TEST_SEED_PHRASE_RECEIVER="${{ secrets.TEST_SEED_PHRASE_RECEIVER }}" @@ -212,31 +213,80 @@ jobs: - name: Install Playwright Browsers run: pnpm playwright install --with-deps chromium - name: Run Playwright tests - run: pnpm test:e2e + run: pnpm -F flow-wallet-extension test:e2e env: CI: true HEADLESS: true - name: Sanitize Playwright Report if: always() - run: pnpm tsx build/sanitize-playwright.ts + run: cd apps/extension && pnpm tsx build/sanitize-playwright.ts - uses: actions/upload-artifact@v4 if: always() with: name: playwright-report - path: playwright-report/ + path: apps/extension/playwright-report/ retention-days: 30 - deploy-storybook-and-reports: - needs: [test] # Depends on the Playwright test job + deploy-reports: + needs: [test] runs-on: ubuntu-latest - if: always() # Run even if tests fail to publish what's available + if: always() + permissions: + contents: 'read' + id-token: 'write' + steps: + - name: Download Playwright Report + uses: actions/download-artifact@v4 + with: + name: playwright-report + path: playwright-report + + - name: Authenticate to Google Cloud + id: auth + uses: google-github-actions/auth@v2 + with: + token_format: 'access_token' + workload_identity_provider: ${{ secrets.WORKLOAD_IDENTITY_PROVIDER }} + service_account: ${{ secrets.SERVICE_ACCOUNT }} + + - name: Setup Google Cloud CLI + uses: google-github-actions/setup-gcloud@v1 + with: + project_id: ${{ secrets.PROJECT_ID }} + + - name: Upload reports to GCS + run: | + RUN_DIR="reports/run-${{ github.run_id }}" + gsutil -m cp -r playwright-report/* gs://${{ vars.GCS_BUCKET_NAME }}/$RUN_DIR/ + echo "REPORT_URL=https://storage.googleapis.com/${{ vars.GCS_BUCKET_NAME }}/$RUN_DIR/index.html" >> $GITHUB_ENV + + - name: Add Job Summary + if: always() + run: | + echo "## 🎭 Playwright Test Results" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "### 📊 Report Details" >> $GITHUB_STEP_SUMMARY + echo "- **Run ID**: ${{ github.run_id }}" >> $GITHUB_STEP_SUMMARY + echo "- **Branch**: ${{ github.ref_name }}" >> $GITHUB_STEP_SUMMARY + echo "- **Commit**: ${{ github.sha }}" >> $GITHUB_STEP_SUMMARY + echo "- **Triggered by**: ${{ github.event_name }}" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "### 🔗 Links" >> $GITHUB_STEP_SUMMARY + echo "- 📋 **[View Full Report](${{ env.REPORT_URL }})**" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "> 💡 **Tip**: Click the report link above to view detailed test results, traces, and screenshots!" >> $GITHUB_STEP_SUMMARY + + deploy-storybook: + needs: [build] + runs-on: ubuntu-latest + if: always() strategy: matrix: node-version: [22.x] steps: - uses: actions/checkout@v4 with: - fetch-depth: 0 # Fetch all history for tags + fetch-depth: 0 - name: Install pnpm uses: pnpm/action-setup@v4 @@ -250,47 +300,12 @@ jobs: - name: Install dependencies run: pnpm install - - name: Download Playwright Report - uses: actions/download-artifact@v4 - with: - name: playwright-report - path: playwright-report/ # Download to this path - - - name: Create .nojekyll file - run: touch playwright-report/.nojekyll - - - name: Deploy Playwright Report - uses: peaceiris/actions-gh-pages@v4 - if: always() # Deploy even if tests fail - with: - github_token: ${{ secrets.GITHUB_TOKEN }} - publish_dir: ./playwright-report - destination_dir: reports/run-${{ github.run_id }} - keep_files: true - - name: Build Storybook - run: pnpm build-storybook # Assumes output is storybook-static + run: pnpm -F flow-wallet-extension build-storybook - name: Publish to Chromatic uses: chromaui/action@v1 with: projectToken: ${{ secrets.CHROMATIC_PROJECT_TOKEN }} - storybookBuildDir: storybook-static # Directory with Storybook and reports - exitZeroOnChanges: true # Optional: useful for PR checks - # workingDir: . # Not needed if storybookBuildDir is set correctly - - - name: Add Job Summary - if: always() - run: | - echo "## 🎭 Playwright Test Results" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "### 📊 Report Details" >> $GITHUB_STEP_SUMMARY - echo "- **Run ID**: ${{ github.run_id }}" >> $GITHUB_STEP_SUMMARY - echo "- **Branch**: ${{ github.ref_name }}" >> $GITHUB_STEP_SUMMARY - echo "- **Commit**: ${{ github.sha }}" >> $GITHUB_STEP_SUMMARY - echo "- **Triggered by**: ${{ github.event_name }}" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "### 🔗 Links" >> $GITHUB_STEP_SUMMARY - echo "- 📋 **[View Full Report](https://${{ github.repository_owner }}.github.io/${{ github.event.repository.name }}/reports/run-${{ github.run_id }}/)**" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "> 💡 **Tip**: Click the report link above to view detailed test results, traces, and screenshots!" >> $GITHUB_STEP_SUMMARY + storybookBuildDir: apps/extension/storybook-static + exitZeroOnChanges: true diff --git a/.gitignore b/.gitignore index 518774a98..1cdad77aa 100644 --- a/.gitignore +++ b/.gitignore @@ -12,29 +12,28 @@ yarn.lock .env.pro .env.* dist.zip -_raw/manifest.json -_raw/react-devtools.js +apps/extension/_raw/manifest.json +apps/extension/_raw/react-devtools.js yarn-error.log dist2 -src/background/utils/firebase.config.json dist.rar dist.7z +**/firebase.config.json .cursorrules -/test-results/ -/playwright-report/ -/blob-report/ -/playwright/.cache/ +test-results +playwright-report +blob-report +playwright dependency-usage.md extension-dependencies.md emulator-account.pkey flow.json coverage .github-data -playwright/.auth **/.claude/settings.local.json *storybook.log storybook-static -/docs-archive/ +docs-archive diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 000000000..2bd5a0a98 --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +22 diff --git a/.storybook/preview.ts b/.storybook/preview.ts deleted file mode 100644 index e95fd575c..000000000 --- a/.storybook/preview.ts +++ /dev/null @@ -1,140 +0,0 @@ -// Enhanced Chrome API mock for Storybook - must be at the very top -/* (() => { - const mockStorageArea = { - get: () => Promise.resolve({}), - set: () => Promise.resolve(), - remove: () => Promise.resolve(), - clear: () => Promise.resolve(), - }; - - const mockOnChanged = { - addListener: () => {}, - removeListener: () => {}, - hasListener: () => false, - }; - - const chromeApiMock = { - storage: { - local: mockStorageArea, - session: mockStorageArea, - sync: mockStorageArea, - onChanged: mockOnChanged, - }, - runtime: { - onMessage: { - addListener: () => {}, - removeListener: () => {}, - }, - }, - i18n: { - getMessage: (messageName: string, substitutions?: unknown) => { - // Simple fallback - just return the message name for now - return messageName || 'Missing translation'; - }, - }, - }; - - // Set on both global and window immediately - (globalThis as any).chrome = chromeApiMock; - if (typeof window !== 'undefined') { - (window as any).chrome = chromeApiMock; - } - if (typeof global !== 'undefined') { - (global as any).chrome = chromeApiMock; - } -})(); - -// Mock useProfiles hook at the global level -if (typeof window !== 'undefined') { - (window as any).__STORYBOOK_MOCKS__ = { - useProfiles: () => ({ - fetchProfileData: () => {}, - clearProfileData: () => {}, - currentWallet: null, - mainAddress: '', - evmAddress: '', - childAccounts: [], - evmWallet: null, - userInfo: null, - otherAccounts: [], - walletList: [], - currentBalance: '0', - parentAccountStorageBalance: null, - parentWallet: null, - parentWalletIndex: -1, - evmLoading: false, - mainAddressLoading: false, - profileIds: [], - activeAccountType: 'none', - noAddress: false, - registerStatus: false, - canMoveToChild: false, - currentWalletList: [], - payer: false, - network: 'mainnet', - pendingAccountTransactions: [], - }), - }; -} - */ -import { ThemeProvider, CssBaseline, createTheme } from '@mui/material'; -import { withThemeFromJSXProvider } from '@storybook/addon-themes'; -import type { Preview } from '@storybook/react-webpack5'; -import { themes, ensure } from 'storybook/theming'; - -import messages from '../src/messages.json'; -import themeOptions from '../src/ui/style/LLTheme'; // Import your theme options - -import '../src/ui/style/fonts.css'; - -// Add this mock -if (typeof global.chrome === 'undefined' || typeof global.chrome.i18n === 'undefined') { - global.chrome = { - i18n: { - getMessage: (messageName: string, substitutions?: unknown) => { - if (substitutions) { - if (Array.isArray(substitutions)) { - // Simple substitution for array format - return messageName + ': ' + substitutions.join(', '); - } - // For object substitutions, you might want a more complex replacement logic - return messageName + ': ' + JSON.stringify(substitutions); - } - if (messages[messageName as keyof typeof messages]) { - return messages[messageName as keyof typeof messages].message; - } - return messageName; - }, - }, - } as unknown as typeof chrome; // Use 'as any' to simplify mocking complex global objects -} - -const theme = createTheme(themeOptions); // Create a theme instance - -const preview: Preview = { - parameters: { - controls: { - matchers: { - color: /(background|color)$/i, - date: /Date$/i, - }, - }, - docs: { - theme: themes.dark, - }, - }, - - decorators: [ - withThemeFromJSXProvider({ - GlobalStyles: CssBaseline, - Provider: ThemeProvider, - themes: { - // Provide your custom themes here - dark: theme, - }, - defaultTheme: 'dark', - }), - ], -}; - -export default preview; diff --git a/.vscode/settings.json b/.vscode/settings.json index 6b4e9051b..0c78e8b35 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -4,7 +4,7 @@ "editor.codeActionsOnSave": { "source.fixAll": "explicit", "source.fixAll.eslint": "explicit", - "source.organizeImports": "never" + "source.organizeImports": "never" // Let ESLint handle import ordering }, "files.trimTrailingWhitespace": true, "files.insertFinalNewline": true, diff --git a/CLAUDE.md b/CLAUDE.md index 44cdd1738..4560d2741 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -36,21 +36,18 @@ Flow Reference Wallet (FRW) is a Chrome extension that serves as a digital walle The extension follows a strict separation of concerns: 1. **Background Service Worker** (`src/background/`) - - Handles all blockchain interactions, key management, and secure operations - Cannot access DOM or window objects - Communicates via Chrome runtime messaging - Main controller: `src/background/controller/wallet.ts` 2. **UI Layer** (`src/ui/`) - - React-based popup interface - Communicates with background via `WalletController` proxy - Uses MUI v7 for component library - Routing with React Router v5 3. **Content Scripts** (`src/content-script/`) - - Injects wallet provider into web pages - Handles dApp communication - Implements Flow FCL and Ethereum provider interfaces @@ -69,7 +66,6 @@ The extension follows a strict separation of concerns: ## Environment Setup 1. **Required Environment Variables** (in `.env.dev`): - - Firebase configuration keys - API endpoints - Feature flags @@ -173,7 +169,6 @@ The extension implements a sophisticated caching system to optimize API calls an ``` 3. **Batch Operations** (`registerBatchRefreshListener`): - - Collects multiple refresh requests within a time window - Executes batch API calls for efficiency - Used for fetching multiple tokens, NFTs, etc. diff --git a/README.md b/README.md index 2983742f5..aebed6c02 100644 --- a/README.md +++ b/README.md @@ -11,6 +11,14 @@ If you'd like to contribute to the extension, you'll need to install Node.js, pn 5. `pnpm build:dev` 6. Load Unpacked at `chrome://extensions/` in developer mode and pick the `dist` folder created by build:dev +## Documentation + +- [Architecture Separation](docs/architecture-separation.md): Folder structure, import rules, and architectural boundaries enforced by ESLint. +- [Wallet Account Structure](docs/wallet-account-structure.md): Overview of wallet account organization and structure. +- [Cache Data Model](docs/cache-data-model.md): Details on the extension's cache data structure and usage. +- [Cadence Scripts Usage Analysis](docs/cadence-scripts-usage-analysis.md): Analysis of Cadence script usage in the extension. +- [Import Profile/Accounts from Mobile](docs/import-from-mobile.md): How to import profiles and accounts from the mobile app using WalletConnect. + ### Install Node & Dependencies 1. Install Node.js version v22.11 or later using a [package manager](https://nodejs.org/en/download/package-manager) @@ -157,7 +165,6 @@ This repository includes tools to analyze high-priority issues across repositori ``` Follow the prompts to complete authentication. Make sure to: - - Choose "GitHub.com" for the account - Choose "HTTPS" for the protocol - Choose "Y" to authenticate Git with your GitHub credentials diff --git a/.storybook/main.ts b/apps/extension/.storybook/main.ts similarity index 83% rename from .storybook/main.ts rename to apps/extension/.storybook/main.ts index bac6bc871..a0cd740b1 100644 --- a/.storybook/main.ts +++ b/apps/extension/.storybook/main.ts @@ -1,7 +1,6 @@ -import path from 'path'; - import type { StorybookConfig } from '@storybook/react-webpack5'; import dotenv from 'dotenv'; +import path from 'path'; import webpack from 'webpack'; import packageJson from '../package.json'; @@ -16,6 +15,7 @@ const config: StorybookConfig = { '@storybook/addon-onboarding', '@storybook/addon-docs', '@storybook/addon-themes', + 'storybook-addon-remix-react-router', ], framework: { name: '@storybook/react-webpack5', @@ -28,35 +28,42 @@ const config: StorybookConfig = { config.resolve.alias = { ...config.resolve.alias, + // Specific hook aliases first + '@onflow/flow-wallet-shared/utils/user-data-access$': path.resolve( + __dirname, + '../../../packages/shared/src/utils/user-data-access.mock.ts' + ), + '@onflow/flow-wallet-shared/utils/cache-data-access$': path.resolve( + __dirname, + '../../../packages/shared/src/utils/cache-data-access.mock.ts' + ), + + '@onflow/flow-wallet-shared': path.resolve(__dirname, '../../../packages/shared/src'), + '@/ui/hooks/use-feature-flags$': path.resolve( __dirname, - '../src/stories/use-feature-flags.mock.ts' + '../src/ui/hooks/use-feature-flags.mock.ts' ), '@/ui/hooks/use-account-hooks$': path.resolve( __dirname, - '../src/stories/use-account-hooks.mock.ts' + '../src/ui/hooks/use-account-hooks.mock.ts' ), - '@/ui/hooks/useNftHook$': path.resolve(__dirname, '../src/stories/use-nft-hooks.mock.ts'), + '@/ui/hooks/useNftHook$': path.resolve(__dirname, '../src/ui/hooks/useNftHook.mock.ts'), '@/ui/hooks/useProfileHook$': path.resolve( __dirname, - '../src/stories/useProfileHook.mock.ts' + '../src/ui/hooks/useProfileHook.mock.ts' ), '@/ui/hooks/useNetworkHook$': path.resolve( __dirname, - '../src/stories/useNetworkHook.mock.ts' + '../src/ui/hooks/useNetworkHook.mock.ts' ), - // General hooks alias (fallback) - '@/ui/hooks': path.resolve(__dirname, '../src/stories/ui-hooks.mock.ts'), + '@/ui/hooks/use-wallet$': path.resolve(__dirname, '../src/ui/hooks/use-wallet.mock.ts'), + // Other aliases - '@/ui/utils/WalletContext': path.resolve(__dirname, '../src/stories/wallet-context.mock.ts'), - 'ui/utils$': path.resolve(__dirname, '../src/stories/ui-utils.mock.ts'), - 'react-router-dom': path.resolve(__dirname, '../src/stories/react-router-dom.mock.ts'), - '@/ui/utils/WalletContext$': path.resolve(__dirname, '../src/stories/wallet-context.mock.ts'), '@': path.resolve(__dirname, '../src'), ui: path.resolve(__dirname, '../src/ui'), background: path.resolve(__dirname, '../src/background'), - consts: path.resolve(__dirname, '../src/constant/index'), }; config.plugins.push( diff --git a/apps/extension/.storybook/preview.ts b/apps/extension/.storybook/preview.ts new file mode 100644 index 000000000..bbd884f1b --- /dev/null +++ b/apps/extension/.storybook/preview.ts @@ -0,0 +1,95 @@ +// Enhanced Chrome API mock for Storybook - must be at the very top + +import { ThemeProvider, CssBaseline, createTheme } from '@mui/material'; +import { withThemeFromJSXProvider } from '@storybook/addon-themes'; +import type { Preview } from '@storybook/react-webpack5'; +import { themes } from 'storybook/theming'; + +import messages from '../src/messages.json'; +import themeOptions from '../src/ui/style/LLTheme'; // Import your theme options + +import '../src/ui/style/fonts.css'; + +// Add this mock +if (typeof global.chrome === 'undefined' || typeof global.chrome.i18n === 'undefined') { + global.chrome = { + i18n: { + getMessage: (messageName: string, substitutions?: unknown) => { + const entry = messages[messageName as keyof typeof messages]; + let msg = entry ? entry.message : messageName; + if (substitutions) { + if (Array.isArray(substitutions)) { + // Replace $1$, $2$, ... with array values + substitutions.forEach((val, idx) => { + msg = msg.replace(new RegExp(`\\$[^$]+\\$`), String(val)); + }); + return msg; + } + if (typeof substitutions === 'object') { + // Replace $key$ with object values + Object.entries(substitutions).forEach(([key, val]) => { + msg = msg.replace(new RegExp(`\\$${key}\\$`, 'g'), String(val)); + }); + return msg; + } + } + return msg; + }, + }, + storage: { + onChanged: { + addListener: () => {}, + removeListener: () => {}, + }, + local: { + get: () => Promise.resolve({}), + set: () => Promise.resolve(), + remove: () => Promise.resolve(), + clear: () => Promise.resolve(), + }, + session: { + get: () => Promise.resolve({}), + set: () => Promise.resolve(), + remove: () => Promise.resolve(), + clear: () => Promise.resolve(), + }, + sync: { + get: () => Promise.resolve({}), + set: () => Promise.resolve(), + remove: () => Promise.resolve(), + clear: () => Promise.resolve(), + }, + }, + } as unknown as typeof chrome; // Use 'as any' to simplify mocking complex global objects +} + +const theme = createTheme(themeOptions); // Create a theme instance + +const preview: Preview = { + parameters: { + actions: { argTypesRegex: '^on.*' }, + controls: { + matchers: { + color: /(background|color)$/i, + date: /Date$/i, + }, + }, + docs: { + theme: themes.dark, + }, + }, + + decorators: [ + withThemeFromJSXProvider({ + GlobalStyles: CssBaseline, + Provider: ThemeProvider, + themes: { + // Provide your custom themes here + dark: theme, + }, + defaultTheme: 'dark', + }), + ], +}; + +export default preview; diff --git a/src/messages.json b/apps/extension/_raw/_locales/en/messages.json similarity index 96% rename from src/messages.json rename to apps/extension/_raw/_locales/en/messages.json index 721e0367f..b0bb0d7ca 100644 --- a/src/messages.json +++ b/apps/extension/_raw/_locales/en/messages.json @@ -442,7 +442,20 @@ "message": "Domain creation complete" }, "STEP": { - "message": "STEP" + "message": "Step" + }, + "Step_X_of_Y": { + "message": "Step $step$ of $total$", + "placeholders": { + "step": { + "content": "$1", + "example": "2" + }, + "total": { + "content": "$2", + "example": "6" + } + } }, "No__backup__found": { "message": "No Backup found" @@ -1051,7 +1064,7 @@ "message": "Edit Linked Account" }, "Accessible": { - "message": "Accessible" + "message": "Accessible assets" }, "Collected": { "message": "Collected" @@ -1059,6 +1072,9 @@ "Hide_Empty_collection": { "message": "Hide Empty Collections" }, + "View_Empty": { + "message": "View empty" + }, "Inaccessible": { "message": "Inaccessible" }, @@ -1137,6 +1153,9 @@ "Support_Flow_Wallet_Blocto": { "message": "From Recovery Phrase, Keystore or Private Key" }, + "Import_Profile_Subtitle": { + "message": "Select from the following options to import your profile" + }, "A_crypto_wallet_on_Flow": { "message": "A crypto wallet on Flow built for" }, @@ -1535,5 +1554,32 @@ }, "Import_from_Mobile_Submit": { "message": "Get Started" + }, + "Add_Profile": { + "message": "Add new profile" + }, + "Unlink_account": { + "message": "Unlink account" + }, + "Show__in__account__sidebar": { + "message": "Show in account sidebar" + }, + "Contacts": { + "message": "Contacts" + }, + "I_already_have_an_account": { + "message": "I already have an account" + }, + "Get_Started_with_Flow_wallet": { + "message": "Get Started with Flow wallet" + }, + "Welcome_to_Flow_Wallet": { + "message": "Welcome to Flow Wallet!" + }, + "Create_an_account_to_get_started": { + "message": "Create an account to get started." + }, + "legal_text": { + "message": "By using Flow Wallet you agree to our Terms of Service and Privacy Policy" } } diff --git a/_raw/_locales/ja/messages.json b/apps/extension/_raw/_locales/ja/messages.json similarity index 97% rename from _raw/_locales/ja/messages.json rename to apps/extension/_raw/_locales/ja/messages.json index 8c3dbea1d..3be961fb9 100644 --- a/_raw/_locales/ja/messages.json +++ b/apps/extension/_raw/_locales/ja/messages.json @@ -447,6 +447,19 @@ "STEP": { "message": "ステップ" }, + "Step_X_of_Y": { + "message": "ステップ $step$ の $total$", + "placeholders": { + "step": { + "content": "$1", + "example": "2" + }, + "total": { + "content": "$2", + "example": "6" + } + } + }, "No__backup__found": { "message": "バックアップが見つかりません" }, @@ -1063,7 +1076,7 @@ "message": "編集リンクアカウント" }, "Accessible": { - "message": "アクセス可能" + "message": "アクセス可能な資産" }, "Collected": { "message": "収集された" @@ -1071,6 +1084,9 @@ "Hide_Empty_collection": { "message": "空のコレクションを非表示にする" }, + "View_Empty": { + "message": "空のコレクションを表示" + }, "Inaccessible": { "message": "アクセス不可 " }, @@ -1149,6 +1165,9 @@ "Support_Flow_Wallet_Blocto": { "message": "Flowウォレット、Blocto、リカバリーフレーズ、キーストア、プライベートキーをサポート" }, + "Import_Profile_Subtitle": { + "message": "以下のオプションからプロファイルをインポートしてください" + }, "A_crypto_wallet_on_Flow": { "message": "探検家、コレクター、ゲーマー向けのFlow上の暗号ウォレット" }, @@ -1526,5 +1545,32 @@ }, "Import_from_Mobile_Submit": { "message": "はじめる" + }, + "Add_Profile": { + "message": "新しいプロファイルを追加" + }, + "Unlink_account": { + "message": "アカウントをリンク解除" + }, + "Show__in__account__sidebar": { + "message": "アカウントサイドバーに表示" + }, + "Contacts": { + "message": "連絡先" + }, + "I_already_have_an_account": { + "message": "アカウントを持っています" + }, + "Get_Started_with_Flow_wallet": { + "message": "Flowウォレットを使用してみる" + }, + "Welcome_to_Flow_Wallet": { + "message": "Flowウォレットへようこそ!" + }, + "Create_an_account_to_get_started": { + "message": "アカウントを作成して開始します。" + }, + "legal_text": { + "message": "Flowウォレットを使用することで、利用規約プライバシーポリシーに同意します" } } diff --git a/_raw/_locales/ru/messages.json b/apps/extension/_raw/_locales/ru/messages.json similarity index 97% rename from _raw/_locales/ru/messages.json rename to apps/extension/_raw/_locales/ru/messages.json index bed374f8b..1f1956964 100644 --- a/_raw/_locales/ru/messages.json +++ b/apps/extension/_raw/_locales/ru/messages.json @@ -442,7 +442,20 @@ "message": "Создание домена завершено" }, "STEP": { - "message": "ШАГ" + "message": "Шаг" + }, + "Step_X_of_Y": { + "message": "Шаг $step$ из $total$", + "placeholders": { + "step": { + "content": "$1", + "example": "2" + }, + "total": { + "content": "$2", + "example": "6" + } + } }, "No__backup__found": { "message": "Резервная копия не найдена" @@ -1063,7 +1076,7 @@ "message": "Редактировать связанный аккаунт" }, "Accessible": { - "message": "Доступный" + "message": "Доступные активы" }, "Collected": { "message": "Собрано" @@ -1071,6 +1084,9 @@ "Hide_Empty_collection": { "message": "Скрыть Пустые Коллекции" }, + "View_Empty": { + "message": "Посмотреть пустые" + }, "Inaccessible": { "message": "Недоступный " }, @@ -1149,6 +1165,9 @@ "Support_Flow_Wallet_Blocto": { "message": "Поддержка Flow Wallet, Blocto, Recovery Phrase, Keystore и Private Key" }, + "Import_Profile_Subtitle": { + "message": "Выберите один из следующих вариантов для импорта вашего профиля" + }, "A_crypto_wallet_on_Flow": { "message": "Криптокошелек на Flow для исследователей, коллекционеров и геймеров" }, @@ -1526,5 +1545,32 @@ }, "Import_from_Mobile_Submit": { "message": "Начать" + }, + "Add_Profile": { + "message": "Добавить новый профиль" + }, + "Unlink_account": { + "message": "Отвязать аккаунт" + }, + "Show__in__account__sidebar": { + "message": "Показывать в боковой панели аккаунтов" + }, + "Contacts": { + "message": "Контакты" + }, + "I_already_have_an_account": { + "message": "У меня уже есть аккаунт" + }, + "Get_Started_with_Flow_wallet": { + "message": "Начать использовать Flow кошелек" + }, + "Welcome_to_Flow_Wallet": { + "message": "Добро пожаловать в Flow Wallet!" + }, + "Create_an_account_to_get_started": { + "message": "Создайте аккаунт, чтобы начать использовать." + }, + "legal_text": { + "message": "Используя Flow Wallet, вы соглашаетесь с Условиями использования и Политикой конфиденциальности" } } diff --git a/_raw/_locales/zh_CN/messages.json b/apps/extension/_raw/_locales/zh_CN/messages.json similarity index 96% rename from _raw/_locales/zh_CN/messages.json rename to apps/extension/_raw/_locales/zh_CN/messages.json index 105afeae7..585eea6d6 100644 --- a/_raw/_locales/zh_CN/messages.json +++ b/apps/extension/_raw/_locales/zh_CN/messages.json @@ -447,6 +447,19 @@ "STEP": { "message": "步骤" }, + "Step_X_of_Y": { + "message": "步骤 $step$ 的 $total$", + "placeholders": { + "step": { + "content": "$1", + "example": "2" + }, + "total": { + "content": "$2", + "example": "6" + } + } + }, "No__backup__found": { "message": "没有找到备份" }, @@ -1063,7 +1076,7 @@ "message": "编辑关联账户" }, "Accessible": { - "message": "可访问" + "message": "可访问资产" }, "Collected": { "message": "已收集" @@ -1071,6 +1084,9 @@ "Hide_Empty_collection": { "message": "隐藏空专辑" }, + "View_Empty": { + "message": "查看空专辑" + }, "Inaccessible": { "message": "不可访问" }, @@ -1149,6 +1165,9 @@ "Support_Flow_Wallet_Blocto": { "message": "支持 Flow 钱包、Blocto、恢复短语、密钥库和私钥" }, + "Import_Profile_Subtitle": { + "message": "从以下选项中选择导入您的个人资料" + }, "A_crypto_wallet_on_Flow": { "message": "Flow 上的加密钱包适用于" }, @@ -1523,5 +1542,32 @@ }, "Import_from_Mobile_Submit": { "message": "开始" + }, + "Add_Profile": { + "message": "添加新用户" + }, + "Unlink_account": { + "message": "取消关联账户" + }, + "Show__in__account__sidebar": { + "message": "在账户侧边栏显示" + }, + "Contacts": { + "message": "联系人" + }, + "I_already_have_an_account": { + "message": "我已经有账户了" + }, + "Get_Started_with_Flow_wallet": { + "message": "开始使用Flow钱包" + }, + "Welcome_to_Flow_Wallet": { + "message": "欢迎使用Flow钱包!" + }, + "Create_an_account_to_get_started": { + "message": "创建一个账户以开始使用。" + }, + "legal_text": { + "message": "使用Flow钱包即表示您同意服务条款隐私政策" } } diff --git a/_raw/images/icon-128.png b/apps/extension/_raw/images/icon-128.png similarity index 100% rename from _raw/images/icon-128.png rename to apps/extension/_raw/images/icon-128.png diff --git a/_raw/images/icon-16.png b/apps/extension/_raw/images/icon-16.png similarity index 100% rename from _raw/images/icon-16.png rename to apps/extension/_raw/images/icon-16.png diff --git a/_raw/images/icon-19.png b/apps/extension/_raw/images/icon-19.png similarity index 100% rename from _raw/images/icon-19.png rename to apps/extension/_raw/images/icon-19.png diff --git a/_raw/images/icon-256.png b/apps/extension/_raw/images/icon-256.png similarity index 100% rename from _raw/images/icon-256.png rename to apps/extension/_raw/images/icon-256.png diff --git a/_raw/images/icon-32.png b/apps/extension/_raw/images/icon-32.png similarity index 100% rename from _raw/images/icon-32.png rename to apps/extension/_raw/images/icon-32.png diff --git a/_raw/images/icon-38.png b/apps/extension/_raw/images/icon-38.png similarity index 100% rename from _raw/images/icon-38.png rename to apps/extension/_raw/images/icon-38.png diff --git a/_raw/images/icon-48.png b/apps/extension/_raw/images/icon-48.png similarity index 100% rename from _raw/images/icon-48.png rename to apps/extension/_raw/images/icon-48.png diff --git a/_raw/images/icon-512.png b/apps/extension/_raw/images/icon-512.png similarity index 100% rename from _raw/images/icon-512.png rename to apps/extension/_raw/images/icon-512.png diff --git a/_raw/images/icon-64.png b/apps/extension/_raw/images/icon-64.png similarity index 100% rename from _raw/images/icon-64.png rename to apps/extension/_raw/images/icon-64.png diff --git a/_raw/images/icon_iphone_29.png b/apps/extension/_raw/images/icon_iphone_29.png similarity index 100% rename from _raw/images/icon_iphone_29.png rename to apps/extension/_raw/images/icon_iphone_29.png diff --git a/_raw/manifest/manifest.dev.json b/apps/extension/_raw/manifest/manifest.dev.json similarity index 98% rename from _raw/manifest/manifest.dev.json rename to apps/extension/_raw/manifest/manifest.dev.json index 42c73d5fb..6bb0cd0d2 100644 --- a/_raw/manifest/manifest.dev.json +++ b/apps/extension/_raw/manifest/manifest.dev.json @@ -34,7 +34,7 @@ { "js": ["content-script.js", "script.js"], "matches": ["file://*/*", "http://*/*", "https://*/*"], - "all_frames": true + "all_frames": false } ], "content_security_policy": { diff --git a/_raw/manifest/manifest.pro.json b/apps/extension/_raw/manifest/manifest.pro.json similarity index 98% rename from _raw/manifest/manifest.pro.json rename to apps/extension/_raw/manifest/manifest.pro.json index 359853ebf..349528971 100644 --- a/_raw/manifest/manifest.pro.json +++ b/apps/extension/_raw/manifest/manifest.pro.json @@ -34,7 +34,7 @@ { "js": ["content-script.js", "script.js"], "matches": ["file://*/*", "http://*/*", "https://*/*"], - "all_frames": true + "all_frames": false } ], "content_security_policy": { diff --git a/_raw/sw.js b/apps/extension/_raw/sw.js similarity index 100% rename from _raw/sw.js rename to apps/extension/_raw/sw.js diff --git a/build/__tests__/sanitize-playwright.test.ts b/apps/extension/build/__tests__/sanitize-playwright.test.ts similarity index 98% rename from build/__tests__/sanitize-playwright.test.ts rename to apps/extension/build/__tests__/sanitize-playwright.test.ts index a4eba0fbc..e9d4d43d5 100644 --- a/build/__tests__/sanitize-playwright.test.ts +++ b/apps/extension/build/__tests__/sanitize-playwright.test.ts @@ -1,10 +1,9 @@ /// import { type Stats } from 'fs'; import fs from 'fs/promises'; -import path from 'path'; - import JSZip from 'jszip'; -import { describe, it, expect, vi, beforeEach, type Mock } from 'vitest'; +import path from 'path'; +import { describe, it, expect, vi, beforeEach } from 'vitest'; import { loadSecrets, scrubValue, sanitizeTrace } from '../sanitize-playwright'; diff --git a/build/analysis-types.ts b/apps/extension/build/analysis-types.ts similarity index 100% rename from build/analysis-types.ts rename to apps/extension/build/analysis-types.ts diff --git a/build/analyze-dependencies.ts b/apps/extension/build/analyze-dependencies.ts similarity index 99% rename from build/analyze-dependencies.ts rename to apps/extension/build/analyze-dependencies.ts index e3a3ba315..5be3e6a55 100644 --- a/build/analyze-dependencies.ts +++ b/apps/extension/build/analyze-dependencies.ts @@ -1,10 +1,9 @@ -import fs from 'fs'; -import path from 'path'; -import { fileURLToPath } from 'url'; - import { parse } from '@babel/parser'; import traverseDefault from '@babel/traverse'; +import fs from 'fs'; import { glob } from 'glob'; +import path from 'path'; +import { fileURLToPath } from 'url'; import webpack from 'webpack'; import webpackConfig from '../webpack.config.js'; diff --git a/build/analyze-imports.ts b/apps/extension/build/analyze-imports.ts similarity index 99% rename from build/analyze-imports.ts rename to apps/extension/build/analyze-imports.ts index 86e575ef8..5b364305b 100644 --- a/build/analyze-imports.ts +++ b/apps/extension/build/analyze-imports.ts @@ -1,9 +1,8 @@ -import fs from 'fs'; -import path from 'path'; - import parser from '@babel/parser'; import traverse from '@babel/traverse'; +import fs from 'fs'; import { glob } from 'glob'; +import path from 'path'; type PackageLocations = { background: Set; diff --git a/build/analyze-project.ts b/apps/extension/build/analyze-project.ts similarity index 100% rename from build/analyze-project.ts rename to apps/extension/build/analyze-project.ts diff --git a/build/bug-reports-index-html.ts b/apps/extension/build/bug-reports-index-html.ts similarity index 100% rename from build/bug-reports-index-html.ts rename to apps/extension/build/bug-reports-index-html.ts diff --git a/build/extract_colors.ts b/apps/extension/build/extract_colors.ts similarity index 100% rename from build/extract_colors.ts rename to apps/extension/build/extract_colors.ts diff --git a/build/fetch-project-data.sh b/apps/extension/build/fetch-project-data.sh similarity index 100% rename from build/fetch-project-data.sh rename to apps/extension/build/fetch-project-data.sh diff --git a/build/hot-spot-analysis-html.ts b/apps/extension/build/hot-spot-analysis-html.ts similarity index 100% rename from build/hot-spot-analysis-html.ts rename to apps/extension/build/hot-spot-analysis-html.ts diff --git a/build/paths.ts b/apps/extension/build/paths.ts similarity index 100% rename from build/paths.ts rename to apps/extension/build/paths.ts diff --git a/build/prepareManifest.ts b/apps/extension/build/prepareManifest.ts similarity index 82% rename from build/prepareManifest.ts rename to apps/extension/build/prepareManifest.ts index 47831db73..c99fd45f3 100644 --- a/build/prepareManifest.ts +++ b/apps/extension/build/prepareManifest.ts @@ -1,10 +1,9 @@ +import dotenv from 'dotenv'; import fs from 'fs'; import http from 'http'; import path from 'path'; import { fileURLToPath } from 'url'; -import dotenv from 'dotenv'; - const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); @@ -51,8 +50,15 @@ async function fetchDevTools(): Promise { } async function prepare() { - const manifestPath = path.resolve(PROJECT_ROOT, '_raw', 'manifest.json'); - const manifest = JSON.parse(fs.readFileSync(manifestPath, 'utf-8')); + // Determine source manifest based on mode + const sourceManifestFile = mode === 'dev' ? 'manifest.dev.json' : 'manifest.pro.json'; + const sourceManifestPath = path.resolve(PROJECT_ROOT, '_raw', 'manifest', sourceManifestFile); + const destinationManifestPath = path.resolve(PROJECT_ROOT, '_raw', 'manifest.json'); + + // Copy the correct manifest to the expected location + fs.copyFileSync(sourceManifestPath, destinationManifestPath); + + const manifest = JSON.parse(fs.readFileSync(destinationManifestPath, 'utf-8')); manifest.oauth2 = { client_id: process.env.OAUTH2_CLIENT_ID, @@ -72,7 +78,6 @@ async function prepare() { manifest.description = '__MSG_appDescriptionBeta__'; manifest.key = process.env.BETA_MANIFEST_KEY; manifest.oauth2.client_id = process.env.BETA_OAUTH2_CLIENT_ID; - } else { manifest.version = version; manifest.name = '__MSG_appName__'; @@ -97,7 +102,7 @@ async function prepare() { } } - fs.writeFileSync(manifestPath, JSON.stringify(manifest, null, 2)); + fs.writeFileSync(destinationManifestPath, JSON.stringify(manifest, null, 2)); return manifest; } diff --git a/build/release.ts b/apps/extension/build/release.ts similarity index 99% rename from build/release.ts rename to apps/extension/build/release.ts index 7df4cef7a..2f76a0099 100644 --- a/build/release.ts +++ b/apps/extension/build/release.ts @@ -1,9 +1,8 @@ +import { prompt } from 'enquirer'; import fs from 'fs'; import path from 'path'; -import { fileURLToPath } from 'url'; - -import { prompt } from 'enquirer'; import shell from 'shelljs'; +import { fileURLToPath } from 'url'; import zipdir from 'zip-dir'; const __filename = fileURLToPath(import.meta.url); diff --git a/build/sanitize-playwright.ts b/apps/extension/build/sanitize-playwright.ts similarity index 99% rename from build/sanitize-playwright.ts rename to apps/extension/build/sanitize-playwright.ts index a95339db2..dd8d6a7b4 100644 --- a/build/sanitize-playwright.ts +++ b/apps/extension/build/sanitize-playwright.ts @@ -1,7 +1,6 @@ import fs from 'fs/promises'; -import path from 'path'; - import JSZip from 'jszip'; +import path from 'path'; export async function loadSecrets() { const secrets = new Set(); diff --git a/build/webpack-cli-wrapper.cjs b/apps/extension/build/webpack-cli-wrapper.cjs similarity index 100% rename from build/webpack-cli-wrapper.cjs rename to apps/extension/build/webpack-cli-wrapper.cjs diff --git a/build/webpack.common.config.ts b/apps/extension/build/webpack.common.config.ts similarity index 88% rename from build/webpack.common.config.ts rename to apps/extension/build/webpack.common.config.ts index 6c35b50f4..35291ce37 100644 --- a/build/webpack.common.config.ts +++ b/apps/extension/build/webpack.common.config.ts @@ -1,12 +1,10 @@ -import fs from 'fs'; -import path from 'path'; - import CopyPlugin from 'copy-webpack-plugin'; +import fs from 'fs'; import HtmlWebpackPlugin from 'html-webpack-plugin'; +import path from 'path'; import webpack from 'webpack'; import packageJson from '../package.json' with { type: 'json' }; - import paths from './paths'; const { version } = packageJson; @@ -49,7 +47,8 @@ const config = (env: { config: 'dev' | 'pro' | 'none' }): webpack.Configuration rules: [ { test: /\.jsx?$|\.tsx?$/, - exclude: /node_modules/, + exclude: + /node_modules\/(?!@onflow\/flow-wallet-shared|@onflow\/flow-wallet-reducers)|\.stories\.(jsx?|tsx?)$|\.test\.(jsx?|tsx?)$|\.spec\.(jsx?|tsx?)$|\/__tests__\//, oneOf: [ { // prevent webpack remove this file's output even it's not been used in entry @@ -126,9 +125,18 @@ const config = (env: { config: 'dev' | 'pro' | 'none' }): webpack.Configuration new CopyPlugin({ patterns: [ { - from: 'node_modules/@trustwallet/wallet-core/dist/lib/wallet-core.wasm', + from: '../../node_modules/@trustwallet/wallet-core/dist/lib/wallet-core.wasm', to: 'wallet-core.wasm', }, + // Add this pattern to copy the manifest.json from _raw to dist + { + from: '_raw/_locales', + to: '_locales', + }, + { + from: '_raw/', + to: '.', + }, ], }), new HtmlWebpackPlugin({ @@ -173,10 +181,9 @@ const config = (env: { config: 'dev' | 'pro' | 'none' }): webpack.Configuration alias: { moment: 'dayjs', 'cross-fetch': 'cross-fetch', + '@onflow/flow-wallet-shared': paths.rootResolve('../../packages/shared/src'), + '@onflow/flow-wallet-reducers': paths.rootResolve('../../packages/reducers/src'), '@': paths.rootResolve('src'), - ui: paths.rootResolve('src/ui'), - background: paths.rootResolve('src/background'), - consts: paths.rootResolve('src/constant/index'), }, plugins: [], fallback: { diff --git a/build/webpack.dev.config.ts b/apps/extension/build/webpack.dev.config.ts similarity index 100% rename from build/webpack.dev.config.ts rename to apps/extension/build/webpack.dev.config.ts diff --git a/build/webpack.pro.config.ts b/apps/extension/build/webpack.pro.config.ts similarity index 100% rename from build/webpack.pro.config.ts rename to apps/extension/build/webpack.pro.config.ts diff --git a/e2e/(template).test.ts b/apps/extension/e2e/(template).test.ts similarity index 100% rename from e2e/(template).test.ts rename to apps/extension/e2e/(template).test.ts diff --git a/e2e/registration/login.test.ts b/apps/extension/e2e/registration/login.test.ts similarity index 95% rename from e2e/registration/login.test.ts rename to apps/extension/e2e/registration/login.test.ts index 604b98ea2..25ce5fa71 100644 --- a/e2e/registration/login.test.ts +++ b/apps/extension/e2e/registration/login.test.ts @@ -17,7 +17,8 @@ test('Remove profile test', async ({ page, extensionId }) => { await page.getByLabel('avatar').click(); await page.getByLabel('avatar').click(); await page.getByLabel('avatar').click(); - await page.getByRole('button', { name: 'Profile end' }).click(); + await page.getByTestId('setting-goto-account-button').click(); + await page.getByRole('button', { name: 'Remove Profile' }).click(); await fillInPassword({ page, password: keysFile.password }); await page.getByRole('button', { name: 'Remove' }).click(); diff --git a/e2e/registration/registration.setup.ts b/apps/extension/e2e/registration/registration.setup.ts similarity index 100% rename from e2e/registration/registration.setup.ts rename to apps/extension/e2e/registration/registration.setup.ts diff --git a/e2e/registration/registration.teardown.ts b/apps/extension/e2e/registration/registration.teardown.ts similarity index 100% rename from e2e/registration/registration.teardown.ts rename to apps/extension/e2e/registration/registration.teardown.ts diff --git a/e2e/registration/switch-account.test.ts b/apps/extension/e2e/registration/switch-account.test.ts similarity index 100% rename from e2e/registration/switch-account.test.ts rename to apps/extension/e2e/registration/switch-account.test.ts diff --git a/e2e/transaction/balance-transaction.test.ts b/apps/extension/e2e/transaction/balance-transaction.test.ts similarity index 100% rename from e2e/transaction/balance-transaction.test.ts rename to apps/extension/e2e/transaction/balance-transaction.test.ts diff --git a/e2e/transaction/cadence-transaction.test.ts b/apps/extension/e2e/transaction/cadence-transaction.test.ts similarity index 100% rename from e2e/transaction/cadence-transaction.test.ts rename to apps/extension/e2e/transaction/cadence-transaction.test.ts diff --git a/e2e/transaction/evm-transaction.test.ts b/apps/extension/e2e/transaction/evm-transaction.test.ts similarity index 100% rename from e2e/transaction/evm-transaction.test.ts rename to apps/extension/e2e/transaction/evm-transaction.test.ts diff --git a/e2e/transaction/transaction.setup.ts b/apps/extension/e2e/transaction/transaction.setup.ts similarity index 100% rename from e2e/transaction/transaction.setup.ts rename to apps/extension/e2e/transaction/transaction.setup.ts diff --git a/e2e/transaction/transaction.teardown.ts b/apps/extension/e2e/transaction/transaction.teardown.ts similarity index 100% rename from e2e/transaction/transaction.teardown.ts rename to apps/extension/e2e/transaction/transaction.teardown.ts diff --git a/e2e/utils/helper.ts b/apps/extension/e2e/utils/helper.ts similarity index 95% rename from e2e/utils/helper.ts rename to apps/extension/e2e/utils/helper.ts index 174bb77ec..21cb3d9fb 100644 --- a/e2e/utils/helper.ts +++ b/apps/extension/e2e/utils/helper.ts @@ -1,8 +1,8 @@ import { type Page } from '@playwright/test'; -import { isValidEthereumAddress } from '../../src/shared/utils/address'; +import { isValidEthereumAddress } from '@onflow/flow-wallet-shared/utils/address'; -import { getAuth, saveAuth, expect } from './loader'; +import { expect, getAuth, saveAuth } from './loader'; export const getClipboardText = async () => { const text = await navigator.clipboard.readText(); return text; @@ -110,12 +110,12 @@ const getNumber = (str: string) => { export const fillInPassword = async ({ page, password }) => { // Handle both create a password and confirm your password let filledAtLeastOneField = false; - if (await page.getByLabel('Password').isVisible()) { - await page.getByLabel('Password').clear(); - await page.getByLabel('Password').fill(password); + + if (await page.getByPlaceholder('Password').first().isVisible()) { + await page.getByPlaceholder('Password').first().clear(); + await page.getByPlaceholder('Password').first().fill(password); filledAtLeastOneField = true; } - if (await page.getByPlaceholder('Enter your password').isVisible()) { await page.getByPlaceholder('Enter your password').clear(); await page.getByPlaceholder('Enter your password').fill(password); @@ -131,6 +131,9 @@ export const fillInPassword = async ({ page, password }) => { await page.getByPlaceholder('Confirm your password').fill(password); filledAtLeastOneField = true; } + if (await page.getByRole('checkbox', { name: /.*agree to Flow Wallet.*/ }).isVisible()) { + await page.getByRole('checkbox', { name: /.*agree to Flow Wallet.*/ }).setChecked(true); + } // Make sure we filled at least one field expect(filledAtLeastOneField).toBe(true); }; @@ -139,10 +142,10 @@ export const registerAccount = async ({ page, extensionId, username, password }) // We're starting from a fresh install, so create a new wallet await closeOpenedPages(page); // Wait for the welcome page to be fully loaded - await page.waitForSelector('.welcomeBox', { state: 'visible' }); + await page.waitForSelector('.welcome-box', { state: 'visible' }); // Click on register button - await page.getByRole('link', { name: 'Create a new wallet' }).click(); + await page.getByTestId('create-account-button').click(); // Wait for the register page to be fully loaded await page.getByText('Your username will be used to').isVisible(); @@ -163,9 +166,10 @@ export const registerAccount = async ({ page, extensionId, username, password }) // got keys from clipboard const clipboardText = await page.evaluate(getClipboardText); + expect(clipboardText).toBeDefined(); const keyArr = clipboardText.split(' '); - + expect(keyArr.length).toBe(12); // next step await page.getByRole('button', { name: 'Okay, I have saved it properly' }).click(); @@ -194,7 +198,7 @@ export const registerAccount = async ({ page, extensionId, username, password }) // fill await fillInPassword({ page, password }); - await page.getByLabel("I agree to Flow Wallet's").click(); + await page.getByLabel("I agree to Flow Wallet's").setChecked(true); const registerBtn = await page.getByRole('button', { name: 'Register' }); await registerBtn.click(); @@ -266,7 +270,7 @@ export const importAccountBySeedPhrase = async ({ } // Go to the import page - await page.goto(`chrome-extension://${extensionId}/index.html#/welcome/accountimport`); + await page.goto(`chrome-extension://${extensionId}/index.html#/welcome/RecoverProfile`); // Close all pages except the current page (the extension opens them in the background) await closeOpenedPages(page); diff --git a/e2e/utils/loader.ts b/apps/extension/e2e/utils/loader.ts similarity index 99% rename from e2e/utils/loader.ts rename to apps/extension/e2e/utils/loader.ts index 5d39a7a38..b5bc10c2e 100644 --- a/e2e/utils/loader.ts +++ b/apps/extension/e2e/utils/loader.ts @@ -1,8 +1,7 @@ +import base, { type BrowserContext, chromium } from '@playwright/test'; import fs from 'fs'; import path from 'path'; -import base, { type BrowserContext, chromium } from '@playwright/test'; - const getKeysFilePath = () => { return path.join(import.meta.dirname, `../../playwright/.auth/keys.json`); }; diff --git a/.env.example b/apps/extension/env.example similarity index 74% rename from .env.example rename to apps/extension/env.example index e2fa76fb2..1bd373879 100644 --- a/.env.example +++ b/apps/extension/env.example @@ -33,6 +33,10 @@ MIXPANEL_TOKEN="" API_GO_SERVER_URL="" API_BASE_URL="" +# External URLs +TERMS_OF_SERVICE_URL="https://lilico.app/about/terms" +PRIVACY_POLICY_URL="https://lilico.app/about/privacy-policy" + # Scripts public key SCRIPTS_PUBLIC_KEY="" @@ -59,3 +63,12 @@ TEST_MULTI_ACCOUNT_TESTER_EVM_ADDR2="" TEST_PASSWORD="" TEST_SEED_PHRASE_SENDER="" TEST_SEED_PHRASE_RECEIVER="" + +## For the playwright reports on CI you need this. We use the same project as PROJECT_ID +PROJECT_ID="" +WORKLOAD_IDENTITY_PROVIDER="" +SERVICE_ACCOUNT="" +GCS_BUCKET_NAME="" + +## For chromatic you need +CHROMATIC_PROJECT_TOKEN="" diff --git a/apps/extension/eslint.config.mjs b/apps/extension/eslint.config.mjs new file mode 100644 index 000000000..bb922dc16 --- /dev/null +++ b/apps/extension/eslint.config.mjs @@ -0,0 +1,234 @@ +import storybook from 'eslint-plugin-storybook'; +import { baseConfig, testConfig, buildConfig } from '../../eslint.config.base.mjs'; + +const config = [ + // Base config for all files + { + ignores: [ + '**/dist/**', + '**/node_modules/**', + '**/.git/**', + '**/coverage/**', + '**/playwright/**', + '**/playwright-report/**', + '**/test-results/**', + '**/_raw/**', + ], + }, + // JavaScript and TypeScript files + { + ...baseConfig, + files: ['**/*.{js,jsx,ts,tsx}'], + }, + // Test files specific config + { + ...baseConfig, + ...testConfig, + files: [ + 'e2e/**/*', + 'playwright.config.ts', + 'vitest.config.ts', + 'vitest.init.ts', + '**/*.test.ts', + '**/__tests__/**', + ], + languageOptions: { + ...baseConfig.languageOptions, + parserOptions: { + project: './tsconfig.test.json', + }, + }, + }, + // Build files specific config + { + ...baseConfig, + ...buildConfig, + files: ['build/**/*.{js,jsx,ts,tsx}', '.storybook/**/*.{js,jsx,ts,tsx}'], + }, + // Background-specific config for chrome extension + { + files: ['**/src/background/**/*.{js,jsx,ts,tsx}'], + rules: { + 'no-restricted-globals': [ + 'error', + { + name: 'window', + message: 'Do not use window in background scripts - use globalThis instead', + }, + { + name: 'document', + message: 'DOM APIs are not available in background scripts', + }, + ], + 'no-restricted-imports': [ + 'error', + { + patterns: [ + { + group: ['@/ui/*', '@/ui/**'], + message: 'Background cannot import from UI layer', + }, + ], + }, + ], + }, + }, + // Core folder import restrictions + { + files: ['**/src/core/**/*.{js,jsx,ts,tsx}'], + rules: { + 'no-restricted-imports': [ + 'error', + { + patterns: [ + { + group: ['@/ui/*', '@/ui/**'], + message: 'Core cannot import from UI layer', + }, + { + group: ['@/background/*', '!@/background/webapi/**'], + message: 'Core can only import webapi from background', + }, + ], + }, + ], + }, + }, + // Core service specific restrictions + { + files: ['**/src/core/service/**/*.{js,jsx,ts,tsx}'], + rules: { + 'no-restricted-imports': [ + 'error', + { + patterns: [ + { + group: ['@/ui/*', '@/ui/**'], + message: 'Core services cannot import from UI layer', + }, + { + group: ['@/background/*', '!@/background/webapi/**'], + message: 'Core services can only import webapi from background', + }, + { + group: ['@/content-script/*', '@/content-script/**'], + message: 'Core services cannot import from content scripts', + }, + { + group: ['@/core/*', '!@/core/service/**', '!@/core/utils/**'], + message: 'Core services can only import from core/service or core/utils', + }, + ], + }, + ], + }, + }, + // UI-specific config to block imports from other layers + { + files: ['**/src/ui/**/*.{js,jsx,ts,tsx}'], + rules: { + 'no-restricted-imports': [ + 'error', + { + patterns: [ + { + group: ['@/core/*', '@/core/**'], + message: 'UI cannot import from Core layer', + }, + { + group: ['@/background/*', '@/background/**'], + message: 'UI cannot import from Background layer', + }, + ], + }, + ], + }, + }, + // Exception for WalletContext and useWallet - they need the controller type + { + files: ['**/src/ui/utils/WalletContext.tsx', '**/src/ui/hooks/use-wallet.ts'], + rules: { + 'no-restricted-imports': [ + 'error', + { + patterns: [ + { + group: ['@/core/*', '@/core/**'], + message: 'UI cannot import from Core layer', + }, + // Allow importing types from background controller for these specific files + { + group: [ + '@/background/*', + '!@/background/controller/wallet', + '!@/background/controller/serviceDefinition', + ], + message: 'Only wallet controller types can be imported here', + }, + ], + }, + ], + }, + }, + // UI reducers must be pure - only import from shared + { + files: ['**/src/ui/reducers/**/*.{js,jsx,ts,tsx}'], + rules: { + 'no-restricted-imports': [ + 'error', + { + patterns: [ + { + group: ['@/ui/*', '@/ui/**'], + message: 'Reducers must be pure - cannot import from other UI modules', + }, + { + group: ['@/core/*', '@/core/**'], + message: 'Reducers must be pure - cannot import from Core layer', + }, + { + group: ['@/background/*', '@/background/**'], + message: 'Reducers must be pure - cannot import from Background layer', + }, + { + group: ['@/content-script/*', '@/content-script/**'], + message: 'Reducers must be pure - cannot import from content scripts', + }, + { + group: ['@/data-model/*', '@/data-model/**'], + message: 'Reducers must be pure - cannot import from data model', + }, + { + group: ['@/extension-shared/*', '@/extension-shared/**'], + message: 'Reducers must be pure - cannot import from extension-shared', + }, + ], + }, + ], + }, + }, + // Content script restrictions + { + files: ['**/src/content-script/**/*.{js,jsx,ts,tsx}'], + rules: { + 'no-restricted-imports': [ + 'error', + { + patterns: [ + { + group: ['@/ui/*', '@/ui/**'], + message: 'Content scripts cannot import from UI layer', + }, + { + group: ['@/core/*', '@/core/**'], + message: 'Content scripts cannot import from Core layer', + }, + ], + }, + ], + }, + }, + ...storybook.configs['flat/recommended'], +]; + +export default config; diff --git a/iconfont.json b/apps/extension/iconfont.json similarity index 100% rename from iconfont.json rename to apps/extension/iconfont.json diff --git a/apps/extension/package.json b/apps/extension/package.json new file mode 100644 index 000000000..64f49b2cb --- /dev/null +++ b/apps/extension/package.json @@ -0,0 +1,193 @@ +{ + "name": "flow-wallet-extension", + "version": "2.9.0", + "description": "Digital wallet created for everyone.", + "type": "module", + "scripts": { + "prepare:dev": "pnpx tsx ./build/prepareManifest.ts dev", + "prepare:pro": "pnpx tsx ./build/prepareManifest.ts pro", + "clean": "rimraf dist", + "build:dev": "cross-env NODE_OPTIONS=--max-old-space-size=8192 pnpm run prepare:dev && pnpm run clean && node build/webpack-cli-wrapper.cjs --progress --env config=dev", + "build:dev-ci": "cross-env NODE_OPTIONS=--max-old-space-size=8192 pnpm run prepare:dev && pnpm run clean && node build/webpack-cli-wrapper.cjs --env config=dev --no-watch", + "build:ci": "pnpm run prepare:pro && pnpm run clean && node build/webpack-cli-wrapper.cjs --env config=pro", + "build:pro": "pnpm run prepare:pro && pnpm run clean && node build/webpack-cli-wrapper.cjs --progress --env config=pro", + "build:test": "pnpm run prepare:dev && pnpm run clean && node build/webpack-cli-wrapper.cjs --progress --env config=none", + "lint:fix": "eslint --fix .", + "lint": "eslint .", + "format:fix": "prettier --write .", + "format": "prettier .", + "icon": "npx iconfont-h5", + "test": "vitest", + "test:run": "vitest --run", + "test:e2e": "playwright test", + "test:e2e:ui": "playwright test --ui", + "test:e2e:ui:debug": "playwright test --ui --debug", + "test:unit": "vitest", + "test:unit:coverage": "vitest --coverage", + "pub": "pnpx tsx build/release.ts", + "preinstall": "npx only-allow pnpm", + "analyze:imports": "pnpx tsx build/analyze-imports.ts", + "analyze:dependencies": "pnpx tsx build/analyze-dependencies.ts", + "analyze:fetch": "./build/fetch-project-data.sh", + "analyze:project": "pnpx tsx build/analyze-project.ts", + "analyze:priority": "pnpm analyze:fetch && pnpm analyze:project", + "emulate:testnet": "flow emulator --chain-id testnet --rpc-host access.devnet.nodes.onflow.org:9000", + "emulate:mainnet": "flow emulator --chain-id mainnet --rpc-host access.mainnet.nodes.onflow.org:9000", + "gh:login": "gh auth login -s project && gh auth status", + "storybook": "storybook dev -p 6006", + "build-storybook": "storybook build" + }, + "dependencies": { + "@coinbase/cbpay-js": "^1.10.0", + "@debank/common": "^0.3.60", + "@emotion/react": "^11.14.0", + "@emotion/styled": "^11.14.1", + "@mui/icons-material": "^7.2.0", + "@mui/material": "^7.2.0", + "@mui/system": "^7.2.0", + "@noble/secp256k1": "^1.7.2", + "@onflow/fcl": "^1.19.0", + "@onflow/flow-wallet-reducers": "workspace:*", + "@onflow/flow-wallet-shared": "workspace:*", + "@reown/walletkit": "^1.2.8", + "@trustwallet/wallet-core": "^4.3.6", + "@tsparticles/engine": "^3.8.1", + "@tsparticles/react": "^3.0.0", + "@walletconnect/core": "^2.21.4", + "@walletconnect/jsonrpc-utils": "^1.0.8", + "@walletconnect/sign-client": "^2.21.4", + "@walletconnect/types": "^2.21.4", + "@walletconnect/utils": "^2.21.4", + "aes-js": "^3.1.2", + "assert": "^2.1.0", + "bignumber.js": "^9.3.0", + "bip39": "^3.1.0", + "browser-passworder": "^2.0.3", + "compare-versions": "^4.1.4", + "cross-fetch": "^4.1.0", + "crypto-browserify": "^3.12.1", + "dayjs": "^1.11.13", + "debounce": "^2.2.0", + "dedent": "^0.7.0", + "eth-rpc-errors": "^4.0.3", + "ethereum-hdwallet": "^0.0.26", + "ethereumjs-util": "^7.1.5", + "ethers": "^6.15.0", + "file-saver": "^2.0.5", + "firebase": "^10.14.1", + "hdkey": "0.8.0", + "history": "^4.10.1", + "koa-compose": "^4.1.0", + "lodash": "^4.17.21", + "loglevel": "^1.9.2", + "lru-cache": "^11.1.0", + "nanoid": "^3.3.11", + "process": "^0.11.10", + "qr-code-styling": "^1.9.2", + "qr-scanner": "^1.4.2", + "raw-loader": "^4.0.2", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "react-highlight": "^0.15.0", + "react-hook-form": "^7.60.0", + "react-infinite-scroll-component": "^6.1.0", + "react-qrcode-logo": "^3.0.0", + "react-router": "^7.6.3", + "recharts": "^2.15.4", + "reflect-metadata": "^0.1.14", + "rlp": "^3.0.0", + "secp256k1": "^4.0.4", + "sha3": "^2.1.4", + "stream-browserify": "^3.0.0", + "stream-http": "^3.2.0", + "ts-toolbelt": "^9.6.0", + "tsparticles": "~3.6.0", + "use-debounce": "^10.0.5", + "uuid": "^11.1.0", + "vm-browserify": "^1.1.2", + "web3": "^4.16.0", + "web3-utils": "^4.3.3", + "webextension-polyfill": "^0.12.0", + "zxcvbn": "^4.4.2" + }, + "devDependencies": { + "@eslint/js": "^9.30.1", + "@metamask/eth-sig-util": "^8.2.0", + "@playwright/test": "^1.53.2", + "@storybook/addon-docs": "^9.0.16", + "@storybook/addon-onboarding": "^9.0.16", + "@storybook/addon-themes": "^9.0.16", + "@storybook/addon-webpack5-compiler-swc": "^3.0.0", + "@storybook/react-webpack5": "^9.0.16", + "@svgr/webpack": "^5.5.0", + "@types/chrome": "^0.0.281", + "@types/koa-compose": "^3.2.8", + "@types/lodash": "^4.17.20", + "@types/node": "^22.16.2", + "@types/react": "^18.3.23", + "@types/react-dom": "^18.3.7", + "@types/webpack": "^5.28.5", + "@typescript-eslint/eslint-plugin": "^8.36.0", + "@typescript-eslint/parser": "^8.36.0", + "@vitest/coverage-v8": "3.2.4", + "@welldone-software/why-did-you-render": "^8.0.3", + "autoprefixer": "^10.4.21", + "chromatic": "^12.2.0", + "copy-webpack-plugin": "^12.0.2", + "cross-env": "^7.0.3", + "css-loader": "^7.1.2", + "dotenv": "^16.6.1", + "dotenv-webpack": "^8.1.1", + "enquirer": "^2.4.1", + "eslint": "^9.30.1", + "eslint-import-resolver-typescript": "^3.10.1", + "eslint-plugin-import": "^2.32.0", + "eslint-plugin-react": "^7.37.5", + "eslint-plugin-react-hooks": "^5.2.0", + "eslint-plugin-storybook": "^9.0.16", + "eslint-plugin-unused-imports": "^4.1.4", + "file-loader": "^6.2.0", + "globals": "^15.15.0", + "html-webpack-plugin": "^5.6.3", + "i18next": "^24.2.3", + "jszip": "^3.10.1", + "os-browserify": "^0.3.0", + "path-browserify": "^1.0.1", + "pinst": "^3.0.0", + "postcss": "^8.5.6", + "postcss-custom-properties": "^14.0.6", + "postcss-import": "^16.1.1", + "postcss-loader": "^5.3.0", + "postcss-nested": "^7.0.2", + "prettier": "^3.6.2", + "react-devtools": "^6.1.5", + "react-i18next": "^15.6.0", + "rimraf": "^6.0.1", + "shelljs": "^0.8.5", + "sinon-chrome": "^3.0.1", + "storybook": "^9.0.16", + "storybook-addon-remix-react-router": "^5.0.0", + "style-loader": "^4.0.0", + "table": "^6.9.0", + "ts-loader": "^9.5.2", + "ts-node": "^10.9.2", + "tsx": "^4.20.3", + "typescript": "^5.8.3", + "typescript-eslint": "^8.36.0", + "typescript-transform-paths": "^3.5.5", + "url-loader": "^4.1.1", + "vitest": "^3.2.4", + "webpack": "^5.99.9", + "webpack-cli": "^4.10.0", + "webpack-merge": "^5.10.0", + "zip-dir": "^2.0.0" + }, + "keywords": [], + "author": "", + "license": "LGPL-3.0-or-later", + "engines": { + "node": ">=22.11.0", + "pnpm": ">=9" + }, + "packageManager": "pnpm@10.12.1" +} diff --git a/playwright.config.ts b/apps/extension/playwright.config.ts similarity index 100% rename from playwright.config.ts rename to apps/extension/playwright.config.ts diff --git a/postcss.config.mjs b/apps/extension/postcss.config.mjs similarity index 100% rename from postcss.config.mjs rename to apps/extension/postcss.config.mjs diff --git a/src/background/controller/__tests__/controller.test.ts b/apps/extension/src/background/controller/__tests__/controller.test.ts similarity index 83% rename from src/background/controller/__tests__/controller.test.ts rename to apps/extension/src/background/controller/__tests__/controller.test.ts index 80e5afbea..ece832e78 100644 --- a/src/background/controller/__tests__/controller.test.ts +++ b/apps/extension/src/background/controller/__tests__/controller.test.ts @@ -10,49 +10,60 @@ vi.mock('../wallet', () => ({ }, })); -vi.mock('@/background/utils/modules/findAddressWithPubKey', () => ({ +vi.mock('@/core/utils/modules/findAddressWithPubKey', () => ({ getAccountsByPublicKeyTuple: vi.fn(), })); -vi.mock('background/service', () => { +// Consolidate mocks for services imported from '@/core/service' +vi.mock('@/core/service', () => { return { keyringService: { getCurrentPublicPrivateKeyTuple: vi.fn(), }, - notificationService: { - requestApproval: vi.fn(), - }, signTextHistoryService: { createHistory: vi.fn(), }, mixpanelTrack: vi.fn(), userWalletService: { - // Mock userWalletService to prevent openapi init issues - setupFcl: vi.fn(), // Explicitly mock setupFcl - // Mock other userWalletService methods if they are used by controller + setupFcl: vi.fn(), + }, + permissionService: { + hasPermission: vi.fn(), + addConnectedSite: vi.fn(), + }, + sessionService: { + broadcastEvent: vi.fn(), }, - // permissionService and sessionService might need similar stubs if controller uses them - // If they are used and not part of 'actual' or cause issues, define them here: - // permissionService: { ... vi.fn() for its methods ... }, - // sessionService: { ... vi.fn() for its methods ... }, }; }); +vi.mock('../notification', () => ({ + default: { + requestApproval: vi.fn(), + }, +})); + // 2. ADD THE FOLLOWING BLOCK of clean imports here: -import { ecrecover, bufferToHex, stripHexPrefix } from 'ethereumjs-util'; import * as ethUtil from 'ethereumjs-util'; +import { bufferToHex, ecrecover, stripHexPrefix } from 'ethereumjs-util'; import { ethers } from 'ethers'; import RLP from 'rlp'; -import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest'; +import { afterEach, beforeEach, describe, expect, it, vi, type MockedFunction } from 'vitest'; // --- Other Specific Imports (ensure these remain as they were) --- -import * as findAddressWithPubKey from '@/background/utils/modules/findAddressWithPubKey'; -import { pk2PubKeyTuple } from '@/background/utils/modules/publicPrivateKey'; -import { tupleToPubKey } from '@/shared/types/key-types'; -import { TESTNET_CHAIN_ID } from '@/shared/types/network-types'; -import { SIGN_ALGO_NUM_DEFAULT, HASH_ALGO_NUM_DEFAULT } from '@/shared/utils/algo-constants'; -import { keyringService, notificationService, signTextHistoryService } from 'background/service'; +// Change these imports to be named imports from '@/core/service' +import { + HASH_ALGO_NUM_DEFAULT, + SIGN_ALGO_NUM_DEFAULT, +} from '@onflow/flow-wallet-shared/constant/algo-constants'; +import { tupleToPubKey } from '@onflow/flow-wallet-shared/types/key-types'; +import { TESTNET_CHAIN_ID } from '@onflow/flow-wallet-shared/types/network-types'; + +import { keyringService, signTextHistoryService } from '@/core/service'; +import * as findAddressWithPubKey from '@/core/utils/modules/findAddressWithPubKey'; +import { pk2PubKeyTuple } from '@/core/utils/modules/publicPrivateKey'; +import notificationService from '../notification'; import providerController from '../provider/controller'; import walletController from '../wallet'; @@ -99,7 +110,7 @@ describe('ProviderController - signTypeData (EIP-1271)', async () => { const getEIP712Hash = (typedData: typeof sampleTypedData) => { // Remove the EIP712Domain type from the types object - // eslint-disable-next-line @typescript-eslint/no-unused-vars + const { EIP712Domain, ...otherTypes } = typedData.types; return ethers.TypedDataEncoder.hash(typedData.domain, otherTypes, typedData.message); }; @@ -113,9 +124,13 @@ describe('ProviderController - signTypeData (EIP-1271)', async () => { walletController.getParentAddress = vi.fn().mockResolvedValue(mockFlowAddress); walletController.queryEvmAddress = vi.fn().mockResolvedValue(mockEvmAddress); walletController.getCurrentAddress = vi.fn().mockResolvedValue(mockEvmAddress); - // Spy and mock for keyringService - keyringService.getCurrentPublicPrivateKeyTuple = vi.fn().mockResolvedValue({ + // Spy and mock for keyringService + ( + keyringService.getCurrentPublicPrivateKeyTuple as MockedFunction< + typeof keyringService.getCurrentPublicPrivateKeyTuple + > + ).mockResolvedValue({ SECP256K1: { pk: mockPrivateKeyHex.slice(2), pubK: mockPubKeyTuple.SECP256K1.pubK, @@ -163,8 +178,16 @@ describe('ProviderController - signTypeData (EIP-1271)', async () => { ); */ // Configure functions imported for mocking their modules - vi.mocked(notificationService.requestApproval).mockResolvedValue({}); - vi.mocked(signTextHistoryService.createHistory).mockImplementation(() => {}); + ( + signTextHistoryService.createHistory as MockedFunction< + typeof signTextHistoryService.createHistory + > + ).mockImplementation(() => {}); + ( + notificationService.requestApproval as MockedFunction< + typeof notificationService.requestApproval + > + ).mockResolvedValue({}); }); afterEach(() => { @@ -228,7 +251,6 @@ describe('ProviderController - signTypeData (EIP-1271)', async () => { const originalMessageHash = getEIP712Hash(sampleTypedData); const originalMessageHashBuffer = Buffer.from(originalMessageHash.slice(2), 'hex'); - // eslint-disable-next-line @typescript-eslint/no-unused-vars const recoveredPubKey = ecrecover(originalMessageHashBuffer, vForEcrecover, r, s); // Can't get this to work, so skipping for now // expect(recoveredPubKey.toString('hex')).toBe(mockPubKey); diff --git a/src/background/controller/__tests__/hash-comparison.test.ts b/apps/extension/src/background/controller/__tests__/hash-comparison.test.ts similarity index 98% rename from src/background/controller/__tests__/hash-comparison.test.ts rename to apps/extension/src/background/controller/__tests__/hash-comparison.test.ts index dfa3d59b1..21d4b36e9 100644 --- a/src/background/controller/__tests__/hash-comparison.test.ts +++ b/apps/extension/src/background/controller/__tests__/hash-comparison.test.ts @@ -1,12 +1,12 @@ import * as ethSigUtil from '@metamask/eth-sig-util'; import { ethers } from 'ethers'; -import { test, expect, describe, vi, beforeAll } from 'vitest'; +import { describe, expect, test, vi } from 'vitest'; // Import TypedDataUtils directly from the controller import { TypedDataUtils } from '../provider/controller'; // Mock all necessary services -vi.mock('@/background/service', () => ({ +vi.mock('@/core/service', () => ({ openapiService: { getFeatureFlag: vi.fn().mockResolvedValue(false), }, diff --git a/src/background/controller/base.ts b/apps/extension/src/background/controller/base.ts similarity index 84% rename from src/background/controller/base.ts rename to apps/extension/src/background/controller/base.ts index df673266b..8f409a5b2 100644 --- a/src/background/controller/base.ts +++ b/apps/extension/src/background/controller/base.ts @@ -1,5 +1,5 @@ -import { preferenceService, keyringService } from 'background/service'; -import { type PreferenceAccount } from 'background/service/preference'; +import { keyringService, preferenceService } from '@/core/service'; +import { type PreferenceAccount } from '@/core/service/preference'; class BaseController { getCurrentAccount = async () => { diff --git a/src/background/controller/index.ts b/apps/extension/src/background/controller/index.ts similarity index 100% rename from src/background/controller/index.ts rename to apps/extension/src/background/controller/index.ts diff --git a/src/background/service/notification.ts b/apps/extension/src/background/controller/notification.ts similarity index 95% rename from src/background/service/notification.ts rename to apps/extension/src/background/controller/notification.ts index 89507b687..4207a1bd2 100644 --- a/src/background/service/notification.ts +++ b/apps/extension/src/background/controller/notification.ts @@ -1,12 +1,11 @@ -import Events from 'events'; - import { ethErrors } from 'eth-rpc-errors'; import { EthereumProviderError } from 'eth-rpc-errors/dist/classes'; +import Events from 'events'; -import { winMgr } from 'background/webapi'; -import { IS_CHROME, IS_LINUX } from 'consts'; +import { IS_CHROME, IS_LINUX } from '@/background/webapi/environment'; +import { setEnvironmentBadge } from '@/core/utils/setEnvironmentBadge'; -import { setEnvironmentBadge } from '../utils/setEnvironmentBadge'; +import winMgr from '../webapi/window'; interface Approval { data: { diff --git a/src/background/controller/provider/controller.ts b/apps/extension/src/background/controller/provider/controller.ts similarity index 95% rename from src/background/controller/provider/controller.ts rename to apps/extension/src/background/controller/provider/controller.ts index 828207f10..49aa3e2ab 100644 --- a/src/background/controller/provider/controller.ts +++ b/apps/extension/src/background/controller/provider/controller.ts @@ -1,31 +1,32 @@ -import * as fcl from '@onflow/fcl'; import BigNumber from 'bignumber.js'; import { ethErrors } from 'eth-rpc-errors'; -import { isHexString, intToHex } from 'ethereumjs-util'; +import { intToHex, isHexString } from 'ethereumjs-util'; import { ethers } from 'ethers'; import RLP from 'rlp'; import Web3 from 'web3'; import { stringToHex } from 'web3-utils'; -import { getAccountsByPublicKeyTuple } from '@/background/utils/modules/findAddressWithPubKey'; -import { signWithKey } from '@/background/utils/modules/publicPrivateKey'; -import { tupleToPrivateKey } from '@/shared/types/key-types'; -import { MAINNET_CHAIN_ID, TESTNET_CHAIN_ID } from '@/shared/types/network-types'; -import { ensureEvmAddressPrefix, isValidEthereumAddress } from '@/shared/utils/address'; -import { consoleError } from '@/shared/utils/console-log'; +import { EVM_ENDPOINT } from '@onflow/flow-wallet-shared/constant/domain-constants'; +import { tupleToPrivateKey } from '@onflow/flow-wallet-shared/types/key-types'; +import { MAINNET_CHAIN_ID, TESTNET_CHAIN_ID } from '@onflow/flow-wallet-shared/types/network-types'; import { + ensureEvmAddressPrefix, + isValidEthereumAddress, +} from '@onflow/flow-wallet-shared/utils/address'; +import { consoleError } from '@onflow/flow-wallet-shared/utils/console-log'; + +import BaseController from '@/background/controller/base'; +import Wallet from '@/background/controller/wallet'; +import { + keyringService, permissionService, sessionService, signTextHistoryService, - keyringService, - notificationService, - userWalletService, -} from 'background/service'; -import { EVM_ENDPOINT } from 'consts'; - -import { storage } from '../../webapi'; -import BaseController from '../base'; -import Wallet from '../wallet'; +} from '@/core/service'; +import { getAccountsByPublicKeyTuple } from '@/core/utils/modules/findAddressWithPubKey'; +import { signWithKey } from '@/core/utils/modules/publicPrivateKey'; + +import notificationService from '../notification'; interface Web3WalletPermission { // The name of the method corresponding to the permission diff --git a/src/background/controller/provider/index.ts b/apps/extension/src/background/controller/provider/index.ts similarity index 81% rename from src/background/controller/provider/index.ts rename to apps/extension/src/background/controller/provider/index.ts index 3f5eac8c6..f8010bd1f 100644 --- a/src/background/controller/provider/index.ts +++ b/apps/extension/src/background/controller/provider/index.ts @@ -1,7 +1,7 @@ import { ethErrors } from 'eth-rpc-errors'; -import { sessionService, keyringService, userWalletService } from 'background/service'; -import { tab } from 'background/webapi'; +import tab from '@/background/webapi/tab'; +import { keyringService, sessionService } from '@/core/service'; import internalMethod from './internalMethod'; import rpcFlow from './rpcFlow'; diff --git a/src/background/controller/provider/internalMethod.ts b/apps/extension/src/background/controller/provider/internalMethod.ts similarity index 93% rename from src/background/controller/provider/internalMethod.ts rename to apps/extension/src/background/controller/provider/internalMethod.ts index 827ad7a25..d117b4b00 100644 --- a/src/background/controller/provider/internalMethod.ts +++ b/apps/extension/src/background/controller/provider/internalMethod.ts @@ -1,4 +1,4 @@ -import { preferenceService, keyringService } from 'background/service'; +import { keyringService, preferenceService } from '@/core/service'; const tabCheckin = ({ data: { diff --git a/src/background/controller/provider/rpcFlow.ts b/apps/extension/src/background/controller/provider/rpcFlow.ts similarity index 93% rename from src/background/controller/provider/rpcFlow.ts rename to apps/extension/src/background/controller/provider/rpcFlow.ts index b13937fed..f251a2ba9 100644 --- a/src/background/controller/provider/rpcFlow.ts +++ b/apps/extension/src/background/controller/provider/rpcFlow.ts @@ -1,13 +1,14 @@ import { ethErrors } from 'eth-rpc-errors'; -import eventBus from '@/eventBus'; -import { consoleLog } from '@/shared/utils/console-log'; -import { notificationService, permissionService } from 'background/service'; -import { PromiseFlow, underline2Camelcase } from 'background/utils'; -import { EVENTS } from 'consts'; +import { EVENTS } from '@onflow/flow-wallet-shared/constant/events'; +import { consoleLog } from '@onflow/flow-wallet-shared/utils/console-log'; -import Wallet from '../wallet'; +import { permissionService } from '@/core/service'; +import { PromiseFlow, underline2Camelcase } from '@/core/utils'; +import eventBus from '@/extension-shared/utils/message/eventBus'; +import notificationService from '../notification'; +import Wallet from '../wallet'; import providerController from './controller'; const isSignApproval = (type: string) => { diff --git a/src/background/controller/serviceDefinition.ts b/apps/extension/src/background/controller/serviceDefinition.ts similarity index 100% rename from src/background/controller/serviceDefinition.ts rename to apps/extension/src/background/controller/serviceDefinition.ts diff --git a/src/background/controller/wallet.ts b/apps/extension/src/background/controller/wallet.ts similarity index 94% rename from src/background/controller/wallet.ts rename to apps/extension/src/background/controller/wallet.ts index 33e27d278..dcaf15c94 100644 --- a/src/background/controller/wallet.ts +++ b/apps/extension/src/background/controller/wallet.ts @@ -9,149 +9,158 @@ import { getAuth } from 'firebase/auth/web-extension'; import { encode } from 'rlp'; import web3, { TransactionError, Web3 } from 'web3'; +import { FLOW_BIP44_PATH } from '@onflow/flow-wallet-shared/constant/algo-constants'; import { - getAccountKey, - pubKeyAccountToAccountKey, - pubKeySignAlgoToAccountKey, -} from '@/background/utils/account-key'; + EVM_ENDPOINT, + HTTP_STATUS_CONFLICT, + HTTP_STATUS_TOO_MANY_REQUESTS, + INTERNAL_REQUEST_ORIGIN, +} from '@onflow/flow-wallet-shared/constant/domain-constants'; +import erc20ABI from '@onflow/flow-wallet-shared/constant/erc20.abi.json'; +import { type CustomFungibleTokenInfo } from '@onflow/flow-wallet-shared/types/coin-types'; import { - findAddressWithSeed, - findAddressWithPK, -} from '@/background/utils/modules/findAddressWithPK'; + type FeatureFlagKey, + type FeatureFlags, +} from '@onflow/flow-wallet-shared/types/feature-types'; import { - pk2PubKeyTuple, - jsonToKey, - seedWithPathAndPhrase2PublicPrivateKey, - formPubKeyTuple, -} from '@/background/utils/modules/publicPrivateKey'; -import { generateRandomId } from '@/background/utils/random-id'; -import eventBus from '@/eventBus'; -import { type CustomFungibleTokenInfo } from '@/shared/types/coin-types'; -import { type FeatureFlagKey, type FeatureFlags } from '@/shared/types/feature-types'; -import { type PublicPrivateKeyTuple, type PublicKeyTuple } from '@/shared/types/key-types'; -import { CURRENT_ID_KEY } from '@/shared/types/keyring-types'; -import { ContactType, MAINNET_CHAIN_ID, Period, PriceProvider } from '@/shared/types/network-types'; -import { type NFTCollections, type NFTCollectionData } from '@/shared/types/nft-types'; -import { type TokenInfo } from '@/shared/types/token-info'; -import { type TrackingEvents } from '@/shared/types/tracking-types'; -import { type TransferItem, type TransactionState } from '@/shared/types/transaction-types'; + type PublicKeyTuple, + type PublicPrivateKeyTuple, +} from '@onflow/flow-wallet-shared/types/key-types'; +import { CURRENT_ID_KEY } from '@onflow/flow-wallet-shared/types/keyring-types'; import { + type AccountKeyRequest, + type Contact, + ContactType, + type FlowNetwork, + MAINNET_CHAIN_ID, + type NFTModelV2, + Period, + PriceProvider, + type TokenPriceHistory, + type UserInfoResponse, +} from '@onflow/flow-wallet-shared/types/network-types'; +import { + type NFTCollectionData, + type NFTCollections, +} from '@onflow/flow-wallet-shared/types/nft-types'; +import { type CategoryScripts } from '@onflow/flow-wallet-shared/types/script-types'; +import { type TokenInfo } from '@onflow/flow-wallet-shared/types/token-info'; +import { type TrackingEvents } from '@onflow/flow-wallet-shared/types/tracking-types'; +import { + type TransactionState, + type TransferItem, +} from '@onflow/flow-wallet-shared/types/transaction-types'; +import { + type ActiveAccountType, type ActiveChildType_depreciated, - type LoggedInAccount, + type Currency, + type EvmAddress, type FlowAddress, - type PublicKeyAccount, + type LoggedInAccount, type MainAccount, + type ProfileBackupStatus, + type PublicKeyAccount, type WalletAccount, - type EvmAddress, type WalletAddress, - type Currency, - type ActiveAccountType, - type ProfileBackupStatus, -} from '@/shared/types/wallet-types'; +} from '@onflow/flow-wallet-shared/types/wallet-types'; import { ensureEvmAddressPrefix, isValidAddress, isValidEthereumAddress, isValidFlowAddress, withPrefix, -} from '@/shared/utils/address'; -import { getStringFromHashAlgo, getStringFromSignAlgo } from '@/shared/utils/algo'; -import { FLOW_BIP44_PATH } from '@/shared/utils/algo-constants'; +} from '@onflow/flow-wallet-shared/utils/address'; import { - getCachedScripts, - getCachedNftCollection, - nftCatalogCollectionsKey, - childAccountAllowTypesKey, - childAccountNftsKey, - type ChildAccountNFTsStore, - evmNftIdsKey, - type EvmNftIdsStore, - type EvmNftCollectionListStore, - evmNftCollectionListKey, - registerStatusKey, - registerStatusRefreshRegex, - coinListKey, - type ChildAccountFtStore, - accountBalanceKey, -} from '@/shared/utils/cache-data-keys'; -import { consoleError, consoleWarn } from '@/shared/utils/console-log'; -import { returnCurrentProfileId } from '@/shared/utils/current-id'; -import { getPeriodFrequency } from '@/shared/utils/getPeriodFrequency'; -import { convertToIntegerAmount, validateAmount } from '@/shared/utils/number'; -import { retryOperation } from '@/shared/utils/retryOperation'; -import { type CategoryScripts } from '@/shared/utils/script-types'; + getStringFromHashAlgo, + getStringFromSignAlgo, +} from '@onflow/flow-wallet-shared/utils/algo'; +import { consoleError, consoleWarn } from '@onflow/flow-wallet-shared/utils/console-log'; +import { getEmojiList } from '@onflow/flow-wallet-shared/utils/emoji-util'; +import { getPeriodFrequency } from '@onflow/flow-wallet-shared/utils/getPeriodFrequency'; +import { convertToIntegerAmount, validateAmount } from '@onflow/flow-wallet-shared/utils/number'; + +import notification from '@/background/webapi/notification'; +import { openIndexPage } from '@/background/webapi/tab'; import { + addressBookService, + coinListService, + evmNftService, + googleDriveService, keyringService, - preferenceService, - notificationService, + mixpanelTrack, + newsService, + nftService, + openapiService, permissionService, + preferenceService, + remoteConfigService, sessionService, - openapiService, - pageStateCacheService, + tokenListService, + transactionService, userInfoService, - coinListService, - addressBookService, userWalletService, - transactionService, - nftService, - googleDriveService, - newsService, - mixpanelTrack, - evmNftService, - tokenListService, - remoteConfigService, -} from 'background/service'; -import i18n from 'background/service/i18n'; -import { - type DisplayedKeryring, - type Keyring, - KEYRING_CLASS, - type KeyringType, -} from 'background/service/keyring'; -import type { CacheState } from 'background/service/pageStateCache'; -import { replaceNftKeywords } from 'background/utils'; -import { notification, storage } from 'background/webapi'; -import { openIndexPage } from 'background/webapi/tab'; -import { - INTERNAL_REQUEST_ORIGIN, - EVM_ENDPOINT, - HTTP_STATUS_CONFLICT, - HTTP_STATUS_TOO_MANY_REQUESTS, -} from 'consts'; - -import type { - AccountKeyRequest, - Contact, - FlowNetwork, - NFTModelV2, - TokenPriceHistory, - UserInfoResponse, -} from '../../shared/types/network-types'; -import DisplayKeyring from '../service/keyring/display'; -import { HDKeyring } from '../service/keyring/hdKeyring'; -import { getScripts } from '../service/openapi'; -import type { ConnectedSite } from '../service/permission'; -import type { PreferenceAccount } from '../service/preference'; +} from '@/core/service'; +import { type Keyring, KEYRING_CLASS, type KeyringType } from '@/core/service/keyring'; +import { HDKeyring } from '@/core/service/keyring/hdKeyring'; +import { getScripts } from '@/core/service/openapi'; +import type { ConnectedSite } from '@/core/service/permission'; +import type { PreferenceAccount } from '@/core/service/preference'; import { addPendingAccountCreationTransaction, addPlaceholderAccount, - getEvmAccountOfParent, loadAccountBalance, - loadEvmAccountOfParent, removePendingAccountCreationTransaction, -} from '../service/userWallet'; +} from '@/core/service/userWallet'; +import { replaceNftKeywords } from '@/core/utils'; +import { + getAccountKey, + pubKeyAccountToAccountKey, + pubKeySignAlgoToAccountKey, +} from '@/core/utils/account-key'; import { getValidData, registerRefreshListener, setCachedData, triggerRefresh, -} from '../utils/data-cache'; -import defaultConfig from '../utils/defaultConfig.json'; -import { getEmojiList } from '../utils/emoji-util'; -import erc20ABI from '../utils/erc20.abi.json'; -import { getOrCheckAccountsByPublicKeyTuple } from '../utils/modules/findAddressWithPubKey'; +} from '@/core/utils/data-cache'; +import { findAddressWithPK, findAddressWithSeed } from '@/core/utils/modules/findAddressWithPK'; +import { getOrCheckAccountsByPublicKeyTuple } from '@/core/utils/modules/findAddressWithPubKey'; +import { + formPubKeyTuple, + jsonToKey, + pk2PubKeyTuple, + seedWithPathAndPhrase2PublicPrivateKey, +} from '@/core/utils/modules/publicPrivateKey'; +import { generateRandomId } from '@/core/utils/random-id'; +import { + accountBalanceKey, + childAccountAllowTypesKey, + childAccountDescKey, + type ChildAccountFtStore, + childAccountNftsKey, + type ChildAccountNFTsStore, + coinListKey, + evmNftCollectionListKey, + type EvmNftCollectionListStore, + evmNftIdsKey, + type EvmNftIdsStore, + getCachedNftCollection, + getCachedScripts, + mainAccountsKey, + nftCatalogCollectionsKey, + registerStatusKey, + registerStatusRefreshRegex, + userMetadataKey, + walletLoadedKey, + walletLoadedRefreshRegex, +} from '@/data-model/cache-data-keys'; +import { returnCurrentProfileId } from '@/extension-shared/utils/current-id'; +import eventBus from '@/extension-shared/utils/message/eventBus'; +import { retryOperation } from '@/extension-shared/utils/retryOperation'; +import storage from '@/extension-shared/utils/storage'; import BaseController from './base'; +import notificationService from './notification'; import provider from './provider'; const stashKeyrings: Record = {}; @@ -174,6 +183,11 @@ export class WalletController extends BaseController { // The ttl is set to 2 minutes. After that we set the cache to false setCachedData(registerStatusKey(pubKey), false, 120_000); }); + + registerRefreshListener(walletLoadedRefreshRegex, async () => { + // This should never be called normally... + setCachedData(walletLoadedKey(), this.loaded, 1_000_000_000); // Really long ttl + }); } // Adding as tests load the extension really, really fast // It's possible to call the wallet controller before services are loaded @@ -181,6 +195,9 @@ export class WalletController extends BaseController { isLoaded = async () => this.loaded; setLoaded = async (loaded: boolean) => { this.loaded = loaded; + if (loaded) { + setCachedData(walletLoadedKey(), true, 1_000_000_000); // Really long ttl + } }; /* wallet */ @@ -300,10 +317,6 @@ export class WalletController extends BaseController { } }; - registerAccountImport = async (pubKey: string, account: FclAccount) => { - userWalletService.registerCurrentPubkey(pubKey, account); - }; - importAccountFromMobile = async (address: string, password: string, mnemonic: string) => { // Verify password await this.verifyPasswordIfBooted(password); @@ -718,14 +731,6 @@ export class WalletController extends BaseController { }; openIndexPage = openIndexPage; - hasPageStateCache = () => pageStateCacheService.has(); - getPageStateCache = () => { - if (!this.isUnlocked()) return null; - return pageStateCacheService.get(); - }; - clearPageStateCache = () => pageStateCacheService.clear(); - setPageStateCache = (cache: CacheState) => pageStateCacheService.set(cache); - getAddressCacheBalance = (address: string | undefined) => { if (!address) return null; return preferenceService.getAddressBalance(address); @@ -823,6 +828,11 @@ export class WalletController extends BaseController { return await keyringService.getCurrentPublicPrivateKeyTuple(); }; + getPrivateKey = async (password: string): Promise => { + await this.verifyPassword(password); + return await keyringService.getCurrentPrivateKey(); + }; + getPubKey = async (): Promise => { return await keyringService.getCurrentPublicKeyTuple(); }; @@ -831,7 +841,7 @@ export class WalletController extends BaseController { const privateKey = ethUtil.stripHexPrefix(pk); const buffer = Buffer.from(privateKey, 'hex'); - const error = new Error(i18n.t('the private key is invalid')); + const error = new Error('the private key is invalid'); try { if (!ethUtil.isValidPrivate(buffer)) { throw error; @@ -983,28 +993,6 @@ export class WalletController extends BaseController { return accounts; }; - getAllVisibleAccounts: () => Promise = async () => { - const typedAccounts = await keyringService.getAllTypedVisibleAccounts(); - - return typedAccounts.map((account) => ({ - ...account, - keyring: new DisplayKeyring(account.keyring), - })); - }; - - getAllVisibleAccountsArray: () => Promise = () => { - return keyringService.getAllVisibleAccountsArray(); - }; - - getAllClassAccounts: () => Promise = async () => { - const typedAccounts = await keyringService.getAllTypedAccounts(); - - return typedAccounts.map((account) => ({ - ...account, - keyring: new DisplayKeyring(account.keyring), - })); - }; - changeAccount = (account: PreferenceAccount) => { preferenceService.setCurrentAccount(account); }; @@ -1457,6 +1445,7 @@ export class WalletController extends BaseController { createCoaEmpty = async (): Promise => { const network = await this.getNetwork(); const parentAddress = await this.getMainAddress(); + const pubKey = userWalletService.getCurrentPubkey(); if (!parentAddress) { throw new Error('Parent address not found'); } @@ -1469,7 +1458,7 @@ export class WalletController extends BaseController { await fcl.tx(txID).onceSealed(); // Refresh the EVM address - await loadEvmAccountOfParent(network, parentAddress); + triggerRefresh(mainAccountsKey(network, pubKey)); // Track with success await this.trackCoaCreation(txID); @@ -1849,8 +1838,7 @@ export class WalletController extends BaseController { }; queryEvmAddress = async (address: string | FlowAddress): Promise => { - const network = await this.getNetwork(); - const evmAccount = await getEvmAccountOfParent(network, address); + const evmAccount = await userWalletService.getEvmAccountOfParent(address as string); return evmAccount?.address ?? null; }; @@ -3118,12 +3106,13 @@ export class WalletController extends BaseController { try { transactionService.setPending(network, address, txId, icon, title); const fclTx = fcl.tx(txId); - // Listen to the transaction until it's sealed. + // Wait for the transacton to be executed + // Listen to the transaction until it's executed. // This will throw an error if there is an error with the transaction - const txStatusFinalized = await fclTx.onceFinalized(); + const txStatusExecuted = await fclTx.onceExecuted(); // Update the pending transaction with the transaction status - txHash = await transactionService.updatePending(network, address, txId, txStatusFinalized); + txHash = await transactionService.updatePending(network, address, txId, txStatusExecuted); // Track the transaction result mixpanelTrack.track('transaction_result', { @@ -3138,7 +3127,7 @@ export class WalletController extends BaseController { if (baseURL.includes('evm')) { // It's an EVM transaction // Look through the events in txStatus - const evmEvent = txStatusFinalized.events.find( + const evmEvent = txStatusExecuted.events.find( (event) => event.type.includes('EVM') && !!event.data?.hash ); if (evmEvent) { @@ -3162,13 +3151,6 @@ export class WalletController extends BaseController { consoleError('listenTransaction notification error ', err); } - // Wait for the transacton to be executed - // Listen to the transaction until it's sealed. - // This will throw an error if there is an error with the transaction - const txStatusExecuted = await fclTx.onceExecuted(); - - // Update the pending transaction with the transaction status - txHash = await transactionService.updatePending(network, address, txId, txStatusExecuted); // Refresh the account balance triggerRefresh(accountBalanceKey(network, address)); // Refresh the coin list @@ -3398,28 +3380,11 @@ export class WalletController extends BaseController { }; getPayerAddressAndKeyId = async () => { - try { - const remoteConfig = await remoteConfigService.getRemoteConfig(); - const network = await this.getNetwork(); - return remoteConfig.config.payer[network]; - } catch { - const network = await this.getNetwork(); - return defaultConfig.payer[network]; - } + return userWalletService.getPayerAddressAndKeyId(); }; getBridgeFeePayerAddressAndKeyId = async () => { - try { - const remoteConfig = await remoteConfigService.getRemoteConfig(); - const network = await this.getNetwork(); - if (!remoteConfig.config.bridgeFeePayer) { - throw new Error('Bridge fee payer not found'); - } - return remoteConfig.config.bridgeFeePayer[network]; - } catch { - const network = await this.getNetwork(); - return defaultConfig.bridgeFeePayer[network]; - } + return userWalletService.getBridgeFeePayerAddressAndKeyId(); }; getFeatureFlags = async (): Promise => { @@ -3752,6 +3717,101 @@ export class WalletController extends BaseController { throw err; } }; + + /** + * Update account metadata (emoji, name, background color) via openapi API + */ + updateAccountMetadata = async ( + address: string, + icon: string, + name: string, + background: string + ) => { + const result = await openapiService.updateAccountMetadata(address, icon, name, background); + + // Update the metadata cache after successful update + try { + const currentPubKey = userWalletService.getCurrentPubkey(); + const cacheKey = userMetadataKey(currentPubKey); + + // Get existing metadata from cache + const existingMetadata = (await getValidData(cacheKey)) || {}; + const updatedMetadata = { + ...existingMetadata, + [address]: { + background, + icon, + name, + }, + }; + + // Update the cache with new metadata + await setCachedData(cacheKey, updatedMetadata, 300_000); + + // Update the specific account in the main accounts cache + try { + const network = await userWalletService.getNetwork(); + const accountsCacheKey = mainAccountsKey(network, currentPubKey); + const existingMainAccounts = await getValidData(accountsCacheKey); + + if (existingMainAccounts && Array.isArray(existingMainAccounts)) { + const updatedMainAccounts = existingMainAccounts.map((account) => { + if (account.address === address) { + return { + ...account, + name: name, + icon: icon, + color: background, + }; + } + //Update evmAccount if the address is a valid EVM address + if ( + account.evmAccount && + isValidEthereumAddress(address) && + account.evmAccount.address === address + ) { + return { + ...account, + evmAccount: { + ...account.evmAccount, + name: name, + icon: icon, + color: background, + }, + }; + } + return account; + }); + + await setCachedData(accountsCacheKey, updatedMainAccounts, 60_000); + } + } catch (updateError) { + consoleError('Failed to update main accounts cache:', updateError); + } + } catch (error) { + consoleError('Failed to update metadata cache:', error); + } + + return result; + }; + + /** + * Get user metadata from openapi API + */ + getUserMetadata = async () => { + return await openapiService.getUserMetadata(); + }; + + /** + * Set the description for a child account + * @param address - The address of the child account + * @param desc - The description to set + * @returns Promise - Success status + */ + setChildAccountDescription = async (address: string, desc: string): Promise => { + if (!address) return; + await setCachedData(childAccountDescKey(address), desc, 3600_000); + }; } export default new WalletController(); diff --git a/src/background/images/placeholder.png b/apps/extension/src/background/images/placeholder.png similarity index 100% rename from src/background/images/placeholder.png rename to apps/extension/src/background/images/placeholder.png diff --git a/src/background/index.ts b/apps/extension/src/background/index.ts similarity index 85% rename from src/background/index.ts rename to apps/extension/src/background/index.ts index 9e83dc36d..e59791263 100644 --- a/src/background/index.ts +++ b/apps/extension/src/background/index.ts @@ -1,49 +1,51 @@ -import 'reflect-metadata'; import { ethErrors } from 'eth-rpc-errors'; import { initializeApp } from 'firebase/app'; import { getAuth, - signInAnonymously, indexedDBLocalPersistence, - setPersistence, onAuthStateChanged, + setPersistence, + signInAnonymously, } from 'firebase/auth/web-extension'; +import 'reflect-metadata'; -import eventBus from '@/eventBus'; -import { type WalletAddress } from '@/shared/types/wallet-types'; -import { isValidFlowAddress } from '@/shared/utils/address'; -import { consoleError, consoleLog } from '@/shared/utils/console-log'; -import { Message } from '@/shared/utils/messaging'; -import type { WalletController } from 'background/controller/wallet'; -import { EVENTS } from 'consts'; +import { EVENTS } from '@onflow/flow-wallet-shared/constant/events'; +import { type WalletAddress } from '@onflow/flow-wallet-shared/types/wallet-types'; +import { isValidFlowAddress } from '@onflow/flow-wallet-shared/utils/address'; +import { consoleError, consoleLog } from '@onflow/flow-wallet-shared/utils/console-log'; + +import providerController from '@/background/controller/provider'; +import { preAuthzServiceDefinition } from '@/background/controller/serviceDefinition'; +import walletController, { type WalletController } from '@/background/controller/wallet'; +import { initializeChromeLogging } from '@/extension-shared/utils/chrome-logger'; +import eventBus from '@/extension-shared/utils/message/eventBus'; +import { Message } from '@/extension-shared/utils/messaging'; +import storage from '@/extension-shared/utils/storage'; -import { providerController, walletController } from './controller'; -import { preAuthzServiceDefinition } from './controller/serviceDefinition'; import { - permissionService, - preferenceService, - sessionService, - keyringService, - openapiService, - pageStateCacheService, - coinListService, - userInfoService, addressBookService, - userWalletService, - notificationService, - transactionService, - nftService, + coinListService, evmNftService, googleSafeHostService, - mixpanelTrack, + keyringService, logListener, - tokenListService, - remoteConfigService, + mixpanelTrack, newsService, -} from './service'; -import { getFirbaseConfig } from './utils/firebaseConfig'; -import { setEnvironmentBadge } from './utils/setEnvironmentBadge'; -import { storage } from './webapi'; + nftService, + openapiService, + permissionService, + preferenceService, + remoteConfigService, + sessionService, + tokenListService, + transactionService, + userInfoService, + userWalletService, +} from '../core/service'; +import notificationService from './controller/notification'; +import { getFirbaseConfig } from '../core/utils/firebaseConfig'; +import { setEnvironmentBadge } from '../core/utils/setEnvironmentBadge'; + const { PortMessage } = Message; const chromeWindow = await chrome.windows.getCurrent(); @@ -115,12 +117,10 @@ async function restoreAppState() { await permissionService.init(); await preferenceService.init(); - await pageStateCacheService.init(); await coinListService.init(); await userInfoService.init(); await addressBookService.init(); - // Set the wallet controller before initializing userWalletService - userWalletService.setWalletController(walletController); + await userWalletService.init(); await transactionService.init(); await nftService.init(); @@ -133,41 +133,15 @@ async function restoreAppState() { await newsService.init(); // rpcCache.start(); + // Initialize Chrome logging - has to be done after mixpanel is initialized + initializeChromeLogging(); + appStoreLoaded = true; await initAppMeta(); // Set the loaded flag to true so that the UI knows the app is ready - walletController.setLoaded(true); - chrome.runtime.sendMessage({ type: 'walletInitialized' }, (response) => { - if (chrome.runtime.lastError) { - consoleError( - 'chrome.runtime.sendMessage - Message delivery failed:', - chrome.runtime.lastError.message - ); - } - }); - chrome.tabs - .query({ - active: true, - lastFocusedWindow: true, - }) - .then((tabs) => { - tabs.forEach((tab) => { - const tabId = tab.id; - if (tabId && !tab.url?.match(/^chrome*/)) { - chrome.tabs.sendMessage(tabId, { type: 'walletInitialized' }, (response) => { - if (chrome.runtime.lastError) { - consoleLog( - 'chrome.tabs.sendMessage - Message delivery failed:', - chrome.runtime.lastError.message - ); - // You can implement retry logic or alternative actions here - } - }); - } - }); - }); + await walletController.setLoaded(true); } restoreAppState(); diff --git a/apps/extension/src/background/webapi/environment.ts b/apps/extension/src/background/webapi/environment.ts new file mode 100644 index 000000000..2d924e84e --- /dev/null +++ b/apps/extension/src/background/webapi/environment.ts @@ -0,0 +1,18 @@ +export const IS_CHROME = /Chrome\//i.test(navigator.userAgent); + +export const IS_FIREFOX = /Firefox\//i.test(navigator.userAgent); + +export const IS_LINUX = /linux/i.test(navigator.userAgent); + +let chromeVersion: number | null = null; + +if (IS_CHROME) { + const matches = navigator.userAgent.match(/Chrome\/(\d+[^.\s])/); + if (matches && matches.length >= 2) { + chromeVersion = Number(matches[1]); + } +} + +export const IS_AFTER_CHROME94 = IS_CHROME ? chromeVersion && chromeVersion >= 94 : false; + +export const IS_WINDOWS = /windows/i.test(navigator.userAgent); diff --git a/src/background/webapi/notification.ts b/apps/extension/src/background/webapi/notification.ts similarity index 100% rename from src/background/webapi/notification.ts rename to apps/extension/src/background/webapi/notification.ts diff --git a/src/background/webapi/tab.ts b/apps/extension/src/background/webapi/tab.ts similarity index 100% rename from src/background/webapi/tab.ts rename to apps/extension/src/background/webapi/tab.ts diff --git a/src/background/webapi/window.ts b/apps/extension/src/background/webapi/window.ts similarity index 96% rename from src/background/webapi/window.ts rename to apps/extension/src/background/webapi/window.ts index 3258c9924..8526867af 100644 --- a/src/background/webapi/window.ts +++ b/apps/extension/src/background/webapi/window.ts @@ -1,6 +1,6 @@ import { EventEmitter } from 'events'; -import { IS_WINDOWS } from 'consts'; +import { IS_WINDOWS } from '@/background/webapi/environment'; const event = new EventEmitter(); diff --git a/src/content-script/index.ts b/apps/extension/src/content-script/index.ts similarity index 98% rename from src/content-script/index.ts rename to apps/extension/src/content-script/index.ts index 883bd9fda..6971794b0 100644 --- a/src/content-script/index.ts +++ b/apps/extension/src/content-script/index.ts @@ -1,7 +1,7 @@ import { nanoid } from 'nanoid'; import { v4 as uuid } from 'uuid'; -import { Message } from '@/shared/utils/messaging'; +import { Message } from '@/extension-shared/utils/messaging'; const channelName = nanoid(); const extensionId = chrome.runtime.id; diff --git a/src/content-script/pageProvider/eth/assets/arrow.svg b/apps/extension/src/content-script/pageProvider/eth/assets/arrow.svg similarity index 100% rename from src/content-script/pageProvider/eth/assets/arrow.svg rename to apps/extension/src/content-script/pageProvider/eth/assets/arrow.svg diff --git a/src/content-script/pageProvider/eth/assets/close.svg b/apps/extension/src/content-script/pageProvider/eth/assets/close.svg similarity index 100% rename from src/content-script/pageProvider/eth/assets/close.svg rename to apps/extension/src/content-script/pageProvider/eth/assets/close.svg diff --git a/src/content-script/pageProvider/eth/assets/flow.svg b/apps/extension/src/content-script/pageProvider/eth/assets/flow.svg similarity index 100% rename from src/content-script/pageProvider/eth/assets/flow.svg rename to apps/extension/src/content-script/pageProvider/eth/assets/flow.svg diff --git a/src/content-script/pageProvider/eth/assets/metamask.svg b/apps/extension/src/content-script/pageProvider/eth/assets/metamask.svg similarity index 100% rename from src/content-script/pageProvider/eth/assets/metamask.svg rename to apps/extension/src/content-script/pageProvider/eth/assets/metamask.svg diff --git a/src/content-script/pageProvider/eth/assets/warning.svg b/apps/extension/src/content-script/pageProvider/eth/assets/warning.svg similarity index 100% rename from src/content-script/pageProvider/eth/assets/warning.svg rename to apps/extension/src/content-script/pageProvider/eth/assets/warning.svg diff --git a/src/content-script/pageProvider/eth/global.d.ts b/apps/extension/src/content-script/pageProvider/eth/global.d.ts similarity index 100% rename from src/content-script/pageProvider/eth/global.d.ts rename to apps/extension/src/content-script/pageProvider/eth/global.d.ts diff --git a/src/content-script/pageProvider/eth/index.ts b/apps/extension/src/content-script/pageProvider/eth/index.ts similarity index 99% rename from src/content-script/pageProvider/eth/index.ts rename to apps/extension/src/content-script/pageProvider/eth/index.ts index 09a438aac..1ec2d96df 100644 --- a/src/content-script/pageProvider/eth/index.ts +++ b/apps/extension/src/content-script/pageProvider/eth/index.ts @@ -1,19 +1,18 @@ // this script is injected into webpage's context -import { EventEmitter } from 'events'; - import { ethErrors, serializeError } from 'eth-rpc-errors'; +import { EventEmitter } from 'events'; -import { SAFE_RPC_METHODS } from '@/constant'; -import { consoleError, consoleLog } from '@/shared/utils/console-log'; +import { consoleError, consoleLog } from '@onflow/flow-wallet-shared/utils/console-log'; import DedupePromise from './pageProvider/dedupePromise'; import { switchChainNotice } from './pageProvider/interceptors/switchChain'; import { switchWalletNotice } from './pageProvider/interceptors/switchWallet'; import PushEventHandlers from './pageProvider/pushEventHandlers'; import ReadyPromise from './pageProvider/readyPromise'; -import { domReadyCall, $ } from './pageProvider/utils'; +import { $, domReadyCall } from './pageProvider/utils'; import BroadcastChannelMessage from './utils/message/broadcastChannelMessage'; import { patchProvider } from './utils/metamask'; +import { SAFE_RPC_METHODS } from './utils/safeRpcMethods'; declare const __frw__channelName; declare const __frw__isDefaultWallet; diff --git a/src/content-script/pageProvider/eth/pageProvider/dedupePromise.ts b/apps/extension/src/content-script/pageProvider/eth/pageProvider/dedupePromise.ts similarity index 100% rename from src/content-script/pageProvider/eth/pageProvider/dedupePromise.ts rename to apps/extension/src/content-script/pageProvider/eth/pageProvider/dedupePromise.ts diff --git a/src/content-script/pageProvider/eth/pageProvider/interceptors/switchChain.ts b/apps/extension/src/content-script/pageProvider/eth/pageProvider/interceptors/switchChain.ts similarity index 100% rename from src/content-script/pageProvider/eth/pageProvider/interceptors/switchChain.ts rename to apps/extension/src/content-script/pageProvider/eth/pageProvider/interceptors/switchChain.ts diff --git a/src/content-script/pageProvider/eth/pageProvider/interceptors/switchWallet.ts b/apps/extension/src/content-script/pageProvider/eth/pageProvider/interceptors/switchWallet.ts similarity index 100% rename from src/content-script/pageProvider/eth/pageProvider/interceptors/switchWallet.ts rename to apps/extension/src/content-script/pageProvider/eth/pageProvider/interceptors/switchWallet.ts diff --git a/src/content-script/pageProvider/eth/pageProvider/notice.ts b/apps/extension/src/content-script/pageProvider/eth/pageProvider/notice.ts similarity index 100% rename from src/content-script/pageProvider/eth/pageProvider/notice.ts rename to apps/extension/src/content-script/pageProvider/eth/pageProvider/notice.ts diff --git a/src/content-script/pageProvider/eth/pageProvider/pushEventHandlers.ts b/apps/extension/src/content-script/pageProvider/eth/pageProvider/pushEventHandlers.ts similarity index 100% rename from src/content-script/pageProvider/eth/pageProvider/pushEventHandlers.ts rename to apps/extension/src/content-script/pageProvider/eth/pageProvider/pushEventHandlers.ts diff --git a/src/content-script/pageProvider/eth/pageProvider/readyPromise.ts b/apps/extension/src/content-script/pageProvider/eth/pageProvider/readyPromise.ts similarity index 100% rename from src/content-script/pageProvider/eth/pageProvider/readyPromise.ts rename to apps/extension/src/content-script/pageProvider/eth/pageProvider/readyPromise.ts diff --git a/src/content-script/pageProvider/eth/pageProvider/utils.ts b/apps/extension/src/content-script/pageProvider/eth/pageProvider/utils.ts similarity index 100% rename from src/content-script/pageProvider/eth/pageProvider/utils.ts rename to apps/extension/src/content-script/pageProvider/eth/pageProvider/utils.ts diff --git a/src/content-script/pageProvider/eth/utils/iframe.ts b/apps/extension/src/content-script/pageProvider/eth/utils/iframe.ts similarity index 100% rename from src/content-script/pageProvider/eth/utils/iframe.ts rename to apps/extension/src/content-script/pageProvider/eth/utils/iframe.ts diff --git a/src/content-script/pageProvider/eth/utils/index.ts b/apps/extension/src/content-script/pageProvider/eth/utils/index.ts similarity index 100% rename from src/content-script/pageProvider/eth/utils/index.ts rename to apps/extension/src/content-script/pageProvider/eth/utils/index.ts diff --git a/src/content-script/pageProvider/eth/utils/message/broadcastChannelMessage.ts b/apps/extension/src/content-script/pageProvider/eth/utils/message/broadcastChannelMessage.ts similarity index 100% rename from src/content-script/pageProvider/eth/utils/message/broadcastChannelMessage.ts rename to apps/extension/src/content-script/pageProvider/eth/utils/message/broadcastChannelMessage.ts diff --git a/src/content-script/pageProvider/eth/utils/message/index.ts b/apps/extension/src/content-script/pageProvider/eth/utils/message/index.ts similarity index 99% rename from src/content-script/pageProvider/eth/utils/message/index.ts rename to apps/extension/src/content-script/pageProvider/eth/utils/message/index.ts index ffae8a4d8..16f922712 100644 --- a/src/content-script/pageProvider/eth/utils/message/index.ts +++ b/apps/extension/src/content-script/pageProvider/eth/utils/message/index.ts @@ -2,9 +2,8 @@ * this script is live in content-script / dapp's page */ -import { EventEmitter } from 'events'; - import { ethErrors } from 'eth-rpc-errors'; +import { EventEmitter } from 'events'; abstract class Message extends EventEmitter { // avaiable id list diff --git a/src/content-script/pageProvider/eth/utils/message/portMessage.ts b/apps/extension/src/content-script/pageProvider/eth/utils/message/portMessage.ts similarity index 100% rename from src/content-script/pageProvider/eth/utils/message/portMessage.ts rename to apps/extension/src/content-script/pageProvider/eth/utils/message/portMessage.ts diff --git a/src/content-script/pageProvider/eth/utils/metamask.ts b/apps/extension/src/content-script/pageProvider/eth/utils/metamask.ts similarity index 96% rename from src/content-script/pageProvider/eth/utils/metamask.ts rename to apps/extension/src/content-script/pageProvider/eth/utils/metamask.ts index 048a780c6..116337f8c 100644 --- a/src/content-script/pageProvider/eth/utils/metamask.ts +++ b/apps/extension/src/content-script/pageProvider/eth/utils/metamask.ts @@ -1,4 +1,4 @@ -import { consoleError } from '@/shared/utils/console-log'; +import { consoleError } from '@onflow/flow-wallet-shared/utils/console-log'; // keep isMetaMask and remove isFrw const impersonateMetamaskWhitelist = [ diff --git a/apps/extension/src/content-script/pageProvider/eth/utils/safeRpcMethods.ts b/apps/extension/src/content-script/pageProvider/eth/utils/safeRpcMethods.ts new file mode 100644 index 000000000..9db043f33 --- /dev/null +++ b/apps/extension/src/content-script/pageProvider/eth/utils/safeRpcMethods.ts @@ -0,0 +1,52 @@ +export const SAFE_RPC_METHODS = [ + 'eth_blockNumber', + 'eth_call', + 'eth_chainId', + 'eth_coinbase', + 'eth_decrypt', + 'eth_estimateGas', + 'eth_gasPrice', + 'eth_getBalance', + 'eth_getBlockByHash', + 'eth_getBlockByNumber', + 'eth_getBlockTransactionCountByHash', + 'eth_getBlockTransactionCountByNumber', + 'eth_getCode', + 'eth_getEncryptionPublicKey', + 'eth_getFilterChanges', + 'eth_getFilterLogs', + 'eth_getLogs', + 'eth_getProof', + 'eth_getStorageAt', + 'eth_getTransactionByBlockHashAndIndex', + 'eth_getTransactionByBlockNumberAndIndex', + 'eth_getTransactionByHash', + 'eth_getTransactionCount', + 'eth_getTransactionReceipt', + 'eth_getUncleByBlockHashAndIndex', + 'eth_getUncleByBlockNumberAndIndex', + 'eth_getUncleCountByBlockHash', + 'eth_getUncleCountByBlockNumber', + 'eth_getWork', + 'eth_hashrate', + 'eth_mining', + 'eth_newBlockFilter', + 'eth_newFilter', + 'eth_newPendingTransactionFilter', + 'eth_protocolVersion', + 'eth_sendRawTransaction', + 'eth_sendTransaction', + 'eth_submitHashrate', + 'eth_submitWork', + 'eth_syncing', + 'eth_uninstallFilter', + 'eth_signTypedData', + 'eth_signTypedData_v3', + 'eth_signTypedData_v4', + 'wallet_requestPermissions', + 'wallet_getPermissions', + 'wallet_revokePermissions', + 'wallet_switchEthereumChain', + 'wallet_watchAsset', + 'net_version', +]; diff --git a/src/content-script/script.js b/apps/extension/src/content-script/script.js similarity index 100% rename from src/content-script/script.js rename to apps/extension/src/content-script/script.js diff --git a/src/background/service/__tests__/keyring-boot-mnemonics.test.ts b/apps/extension/src/core/service/__tests__/keyring-boot-mnemonics.test.ts similarity index 87% rename from src/background/service/__tests__/keyring-boot-mnemonics.test.ts rename to apps/extension/src/core/service/__tests__/keyring-boot-mnemonics.test.ts index e70474cae..82fe2f2f5 100644 --- a/src/background/service/__tests__/keyring-boot-mnemonics.test.ts +++ b/apps/extension/src/core/service/__tests__/keyring-boot-mnemonics.test.ts @@ -1,45 +1,52 @@ // Testing imports -import * as bip39 from 'bip39'; import encryptor from 'browser-passworder'; -import { describe, it, expect, beforeEach, vi } from 'vitest'; +import { beforeEach, describe, expect, it, vi } from 'vitest'; + +import { FLOW_BIP44_PATH } from '@onflow/flow-wallet-shared/constant/algo-constants'; +import { + CURRENT_ID_KEY, + KEYRING_STATE_V2_KEY, +} from '@onflow/flow-wallet-shared/types/keyring-types'; // Internal imports -import { CURRENT_ID_KEY, KEYRING_STATE_V2_KEY } from '@/shared/types/keyring-types'; -import { FLOW_BIP44_PATH } from '@/shared/utils/algo-constants'; +import storage from '@/extension-shared/utils/storage'; + +import keyringService from '../keyring'; +import { MOCK_KEYS, MOCK_MNEMONIC, MOCK_PASSWORD } from './keyring-mock-data'; // Mock dependencies -vi.mock('../../../shared/utils/storage', () => ({ +vi.mock('@/extension-shared/utils/storage', () => ({ default: { get: vi.fn(), set: vi.fn(), }, })); -vi.mock('../../service/openapi', () => ({ +vi.mock('@/core/service/openapi', () => ({ default: { getAccountsWithPublicKey: vi.fn().mockResolvedValue([]), }, })); -vi.mock('../../service/userWallet', () => ({ +vi.mock('@/core/service/userWallet', () => ({ default: { setupFcl: vi.fn(), }, })); -vi.mock('../../service/i18n', () => ({ +vi.mock('@/core/service/i18n', () => ({ default: { t: (key) => key, }, })); -vi.mock('../../service/preference', () => ({ +vi.mock('@/core/service/preference', () => ({ default: { getHiddenAddresses: vi.fn().mockReturnValue([]), }, })); -vi.mock('@/shared/utils/current-id', () => ({ +vi.mock('@onflow/flow-wallet-shared/utils/current-id', () => ({ returnCurrentProfileId: vi.fn().mockResolvedValue('testId1'), })); @@ -53,10 +60,6 @@ vi.mock('bip39', () => ({ })); // Import the mocked modules after all mocks are defined -import storage from '../../../shared/utils/storage'; -import keyringService from '../keyring'; - -import { MOCK_KEYS, MOCK_MNEMONIC, MOCK_PASSWORD } from './keyring-mock-data'; describe('Keyring Boot and Mnemonics Test', () => { // Create in-memory storage diff --git a/src/background/service/__tests__/keyring-migration.test.ts b/apps/extension/src/core/service/__tests__/keyring-migration.test.ts similarity index 98% rename from src/background/service/__tests__/keyring-migration.test.ts rename to apps/extension/src/core/service/__tests__/keyring-migration.test.ts index 82ad6cd91..64bc12951 100644 --- a/src/background/service/__tests__/keyring-migration.test.ts +++ b/apps/extension/src/core/service/__tests__/keyring-migration.test.ts @@ -1,9 +1,9 @@ // Testing imports import encryptor from 'browser-passworder'; -import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest'; +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; // Mock dependencies at the beginning before any imports -vi.mock('../../../shared/utils/storage', () => ({ +vi.mock('@/extension-shared/utils/storage', () => ({ default: { get: vi.fn(), set: vi.fn(), @@ -44,26 +44,26 @@ vi.mock('bip39', () => ({ })); // Internal imports - after all mocks are defined +import { + FLOW_BIP44_PATH, + SIGN_ALGO_NUM_DEFAULT, + SIGN_ALGO_NUM_ECDSA_P256, + SIGN_ALGO_NUM_ECDSA_secp256k1, +} from '@onflow/flow-wallet-shared/constant/algo-constants'; import { CURRENT_ID_KEY, KEYRING_STATE_CURRENT_KEY, KEYRING_STATE_V1_KEY, KEYRING_STATE_V2_KEY, type KeyringStateV2, -} from '@/shared/types/keyring-types'; -import { - FLOW_BIP44_PATH, - SIGN_ALGO_NUM_DEFAULT, - SIGN_ALGO_NUM_ECDSA_P256, - SIGN_ALGO_NUM_ECDSA_secp256k1, -} from '@/shared/utils/algo-constants'; -import { returnCurrentProfileId } from '@/shared/utils/current-id'; +} from '@onflow/flow-wallet-shared/types/keyring-types'; -import storage from '../../../shared/utils/storage'; -import keyringService from '../keyring'; -import { SimpleKeyring } from '../keyring/simpleKeyring'; +import { returnCurrentProfileId } from '@/extension-shared/utils/current-id'; +import storage from '@/extension-shared/utils/storage'; +import keyringService from '../keyring'; import { MOCK_KEYS } from './keyring-mock-data'; +import { SimpleKeyring } from '../keyring/simpleKeyring'; // Test constants const TEST_PASSWORD = 'test_password_123'; diff --git a/src/background/service/__tests__/keyring-mock-data.ts b/apps/extension/src/core/service/__tests__/keyring-mock-data.ts similarity index 97% rename from src/background/service/__tests__/keyring-mock-data.ts rename to apps/extension/src/core/service/__tests__/keyring-mock-data.ts index 1463a8fff..4f842db6c 100644 --- a/src/background/service/__tests__/keyring-mock-data.ts +++ b/apps/extension/src/core/service/__tests__/keyring-mock-data.ts @@ -5,12 +5,11 @@ import encryptor from 'browser-passworder'; +import { SIGN_ALGO_NUM_ECDSA_P256 } from '@onflow/flow-wallet-shared/constant/algo-constants'; import { CURRENT_ID_KEY, - KEYRING_STATE_V2_KEY, KEYRING_STATE_V3_KEY, -} from '@/shared/types/keyring-types'; -import { SIGN_ALGO_NUM_ECDSA_P256 } from '@/shared/utils/algo-constants'; +} from '@onflow/flow-wallet-shared/types/keyring-types'; /** * Constants used for keyring testing diff --git a/src/background/service/__tests__/openapi.test.ts b/apps/extension/src/core/service/__tests__/openapi.test.ts similarity index 92% rename from src/background/service/__tests__/openapi.test.ts rename to apps/extension/src/core/service/__tests__/openapi.test.ts index 430324d3c..ba5c11d9a 100644 --- a/src/background/service/__tests__/openapi.test.ts +++ b/apps/extension/src/core/service/__tests__/openapi.test.ts @@ -1,7 +1,7 @@ -import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest'; +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; -vi.mock('@/background/service/userWallet', async () => { - const actual = await vi.importActual('@/background/service/userWallet'); +vi.mock('@/core/service/userWallet', async () => { + const actual = await vi.importActual('@/core/service/userWallet'); return { default: { ...actual, @@ -16,31 +16,31 @@ vi.mock('@/background/service/userWallet', async () => { }; }); -vi.mock('@/background/service/nft', () => ({ +vi.mock('@/core/service/nft', () => ({ default: { clear: vi.fn(), }, })); -vi.mock('@/background/service/userInfo', () => ({ +vi.mock('@/core/service/userInfo', () => ({ default: { removeUserInfo: vi.fn(), }, })); -vi.mock('@/background/service/coinList', () => ({ +vi.mock('@/core/service/coinList', () => ({ default: { clear: vi.fn(), }, })); -vi.mock('@/background/service/addressBook', () => ({ +vi.mock('@/core/service/addressBook', () => ({ default: { clear: vi.fn(), }, })); -vi.mock('@/background/service/transaction', () => ({ +vi.mock('@/core/service/transaction', () => ({ default: { clear: vi.fn(), }, @@ -101,14 +101,14 @@ const mockFetch = vi.fn(); vi.stubGlobal('fetch', mockFetch); // Then imports -import { API_TEST_RESULTS } from '@/shared/test-data/api-test-results'; +import { type FlowNetwork } from '@onflow/flow-wallet-shared/types/network-types'; + +import { API_TEST_RESULTS } from '@/extension-shared/utils/test-data/api-test-results'; import { type CommonParams, createTestGroups, updateTestParamsFromResults, -} from '@/shared/test-data/test-groups'; -//import walletController from '../../controller/wallet'; -import { type FlowNetwork } from '@/shared/types/network-types'; +} from '@/extension-shared/utils/test-data/test-groups'; import openApiService from '../openapi'; import userWalletService from '../userWallet'; diff --git a/apps/extension/src/core/service/__tests__/permission.test.ts b/apps/extension/src/core/service/__tests__/permission.test.ts new file mode 100644 index 000000000..3b999f430 --- /dev/null +++ b/apps/extension/src/core/service/__tests__/permission.test.ts @@ -0,0 +1,553 @@ +import { LRUCache } from 'lru-cache'; +import { describe, it, expect, beforeEach, vi } from 'vitest'; + +import { INTERNAL_REQUEST_ORIGIN } from '@onflow/flow-wallet-shared/constant/domain-constants'; +import { MAINNET_CHAIN_ID } from '@onflow/flow-wallet-shared/types/network-types'; + +import storage from '@/extension-shared/utils/storage'; + +import permissionService, { type ConnectedSite } from '../permission'; + +// Mock dependencies +vi.mock('@/extension-shared/utils/storage', () => ({ + default: { + get: vi.fn(), + set: vi.fn(), + remove: vi.fn(), + }, +})); + +vi.mock('../../utils/persistStore', () => ({ + default: vi.fn(), +})); + +vi.mock('@onflow/flow-wallet-shared/utils/console-log', () => ({ + consoleInfo: vi.fn(), + consoleWarn: vi.fn(), +})); + +describe('PermissionService', () => { + beforeEach(async () => { + vi.clearAllMocks(); + // Reset the service state + permissionService.lruCache = undefined; + permissionService.store = { dumpCache: [] }; + + // Import the mock here to get fresh instance + const { default: createPersistStore } = await import('../../utils/persistStore'); + + // Default mock implementation for persistStore - returns empty cache + vi.mocked(createPersistStore).mockImplementation(async ({ template }) => { + // Return template by default (empty cache) + return template || {}; + }); + }); + + describe('init', () => { + it('should initialize with empty cache when no data exists', async () => { + vi.mocked(storage.get).mockResolvedValue(null); + + await permissionService.init(); + + expect(permissionService.lruCache).toBeDefined(); + expect(permissionService.lruCache?.size).toBe(0); + expect(permissionService.store.dumpCache).toEqual([]); + }); + + it('should migrate from old cache format', async () => { + const oldCacheData = { + dumpCache: [ + { + k: 'https://example.com', + v: { + origin: 'https://example.com', + name: 'Example Site', + icon: 'icon.png', + chain: MAINNET_CHAIN_ID, + isSigned: false, + isTop: false, + }, + e: 0, + }, + ], + }; + + // Mock storage.get to return old cache data when asked for 'permission' key + vi.mocked(storage.get).mockImplementation(async (key) => { + if (key === 'permission') { + return oldCacheData; + } + return null; + }); + + await permissionService.init(); + + expect(permissionService.lruCache).toBeDefined(); + expect(permissionService.lruCache?.size).toBe(1); + expect(permissionService.lruCache?.get('https://example.com')).toEqual({ + origin: 'https://example.com', + name: 'Example Site', + icon: 'icon.png', + chain: MAINNET_CHAIN_ID, + isSigned: false, + isTop: false, + }); + }); + + it('should skip invalid entries during migration', async () => { + const oldCacheData = { + dumpCache: [ + { + k: 'valid-site.com', + v: { + origin: 'valid-site.com', + name: 'Valid Site', + icon: 'icon.png', + }, + e: 0, + }, + { + k: 'invalid-site', + v: null, // Invalid entry + }, + { + k: 'missing-fields', + v: { + origin: 'missing-fields', + // Missing required fields + }, + }, + ], + }; + + // Mock storage.get to return old cache data when asked for 'permission' key + vi.mocked(storage.get).mockImplementation(async (key) => { + if (key === 'permission') { + return oldCacheData; + } + return null; + }); + + await permissionService.init(); + + expect(permissionService.lruCache?.size).toBe(1); + expect(permissionService.lruCache?.has('valid-site.com')).toBe(true); + expect(permissionService.lruCache?.has('invalid-site')).toBe(false); + expect(permissionService.lruCache?.has('missing-fields')).toBe(false); + }); + + it('should handle LRUCache initialization with proper options', async () => { + await permissionService.init(); + + expect(permissionService.lruCache).toBeDefined(); + // Test that the cache was created with proper options + const cache = permissionService.lruCache as LRUCache; + expect(cache.max).toBe(1000); + expect(cache.ttl).toBe(1000 * 60 * 60 * 24 * 30); // 30 days + // This should be present to avoid the error + expect(cache.maxSize).toBeDefined(); + }); + + it('should load existing cache dump correctly', async () => { + const existingDump: [string, LRUCache.Entry][] = [ + [ + 'site1.com', + { + value: { + origin: 'site1.com', + name: 'Site 1', + icon: 'icon1.png', + chain: MAINNET_CHAIN_ID, + isSigned: true, + isTop: true, + }, + ttl: 1000 * 60 * 60 * 24 * 30, + size: 1, + }, + ], + ]; + + // Mock the persistStore to return our existing data + const { default: createPersistStore } = await import('../../utils/persistStore'); + vi.mocked(createPersistStore).mockResolvedValueOnce({ + dumpCache: existingDump, + }); + + await permissionService.init(); + + expect(permissionService.lruCache?.size).toBe(1); + // Check if the data is loaded correctly + const loadedSite = permissionService.lruCache?.get('site1.com'); + expect(loadedSite).toEqual({ + origin: 'site1.com', + name: 'Site 1', + icon: 'icon1.png', + chain: MAINNET_CHAIN_ID, + isSigned: true, + isTop: true, + }); + }); + }); + + describe('addConnectedSite', () => { + beforeEach(async () => { + await permissionService.init(); + }); + + it('should add a new connected site', () => { + permissionService.addConnectedSite( + 'https://test.com', + 'Test Site', + 'test-icon.png', + MAINNET_CHAIN_ID, + true + ); + + const site = permissionService.lruCache?.get('https://test.com'); + expect(site).toEqual({ + origin: 'https://test.com', + name: 'Test Site', + icon: 'test-icon.png', + chain: MAINNET_CHAIN_ID, + isSigned: true, + isTop: false, + }); + }); + + it('should use default values when not provided', () => { + permissionService.addConnectedSite('https://default.com', 'Default Site', 'icon.png'); + + const site = permissionService.lruCache?.get('https://default.com'); + expect(site).toEqual({ + origin: 'https://default.com', + name: 'Default Site', + icon: 'icon.png', + chain: MAINNET_CHAIN_ID, + isSigned: false, + isTop: false, + }); + }); + + it('should sync after adding', () => { + const syncSpy = vi.spyOn(permissionService, 'sync'); + + permissionService.addConnectedSite('https://sync.com', 'Sync Site', 'icon.png'); + + expect(syncSpy).toHaveBeenCalled(); + }); + }); + + describe('touchConnectedSite', () => { + beforeEach(async () => { + await permissionService.init(); + permissionService.addConnectedSite('https://touch.com', 'Touch Site', 'icon.png'); + }); + + it('should update LRU access time', () => { + const getSpy = vi.spyOn(permissionService.lruCache!, 'get'); + + permissionService.touchConnectedSite('https://touch.com'); + + expect(getSpy).toHaveBeenCalledWith('https://touch.com'); + }); + + it('should ignore internal origin', () => { + const getSpy = vi.spyOn(permissionService.lruCache!, 'get'); + + permissionService.touchConnectedSite(INTERNAL_REQUEST_ORIGIN); + + expect(getSpy).not.toHaveBeenCalled(); + }); + + it('should sync after touching', () => { + const syncSpy = vi.spyOn(permissionService, 'sync'); + + permissionService.touchConnectedSite('https://touch.com'); + + expect(syncSpy).toHaveBeenCalled(); + }); + }); + + describe('updateConnectSite', () => { + beforeEach(async () => { + await permissionService.init(); + permissionService.addConnectedSite('https://update.com', 'Update Site', 'icon.png'); + }); + + it('should perform partial update when specified', () => { + permissionService.updateConnectSite('https://update.com', { name: 'Updated Name' }, true); + + const site = permissionService.lruCache?.get('https://update.com'); + expect(site?.name).toBe('Updated Name'); + expect(site?.icon).toBe('icon.png'); // Original value preserved + }); + + it('should replace entire site when partial is false', () => { + permissionService.updateConnectSite( + 'https://update.com', + { + origin: 'https://update.com', + name: 'Completely New', + icon: 'new-icon.png', + isSigned: true, + isTop: true, + }, + false + ); + + const site = permissionService.lruCache?.get('https://update.com'); + expect(site).toEqual({ + origin: 'https://update.com', + name: 'Completely New', + icon: 'new-icon.png', + isSigned: true, + isTop: true, + }); + }); + + it('should ignore updates for internal origin', () => { + permissionService.addConnectedSite(INTERNAL_REQUEST_ORIGIN, 'Internal', 'icon.png'); + const setSpy = vi.spyOn(permissionService.lruCache!, 'set'); + + permissionService.updateConnectSite(INTERNAL_REQUEST_ORIGIN, { name: 'New Name' }); + + expect(setSpy).not.toHaveBeenCalled(); + }); + + it('should not update non-existent sites', () => { + const setSpy = vi.spyOn(permissionService.lruCache!, 'set'); + + permissionService.updateConnectSite('https://nonexistent.com', { name: 'New' }); + + expect(setSpy).not.toHaveBeenCalled(); + }); + }); + + describe('hasPermission', () => { + beforeEach(async () => { + await permissionService.init(); + permissionService.addConnectedSite('https://allowed.com', 'Allowed', 'icon.png'); + }); + + it('should return true for connected sites', () => { + expect(permissionService.hasPermission('https://allowed.com')).toBe(true); + }); + + it('should return false for non-connected sites', () => { + expect(permissionService.hasPermission('https://notallowed.com')).toBe(false); + }); + + it('should always return true for internal origin', () => { + expect(permissionService.hasPermission(INTERNAL_REQUEST_ORIGIN)).toBe(true); + }); + }); + + describe('topConnectedSite and unpinConnectedSite', () => { + beforeEach(async () => { + await permissionService.init(); + permissionService.addConnectedSite('https://site1.com', 'Site 1', 'icon1.png'); + permissionService.addConnectedSite('https://site2.com', 'Site 2', 'icon2.png'); + }); + + it('should pin a site to top', () => { + permissionService.topConnectedSite('https://site1.com'); + + const site = permissionService.lruCache?.get('https://site1.com'); + expect(site?.isTop).toBe(true); + expect(site?.order).toBe(1); + }); + + it('should handle multiple pinned sites with proper ordering', () => { + permissionService.topConnectedSite('https://site1.com'); + permissionService.topConnectedSite('https://site2.com'); + + const site1 = permissionService.lruCache?.get('https://site1.com'); + const site2 = permissionService.lruCache?.get('https://site2.com'); + + expect(site1?.order).toBe(1); + expect(site2?.order).toBe(2); + }); + + it('should unpin a site', () => { + permissionService.topConnectedSite('https://site1.com'); + permissionService.unpinConnectedSite('https://site1.com'); + + const site = permissionService.lruCache?.get('https://site1.com'); + expect(site?.isTop).toBe(false); + }); + + it('should respect custom order when pinning', () => { + permissionService.topConnectedSite('https://site1.com', 5); + + const site = permissionService.lruCache?.get('https://site1.com'); + expect(site?.order).toBe(5); + }); + }); + + describe('getRecentConnectedSites', () => { + beforeEach(async () => { + await permissionService.init(); + }); + + it('should return pinned sites first, then recent sites', () => { + permissionService.addConnectedSite('https://recent1.com', 'Recent 1', 'icon1.png'); + permissionService.addConnectedSite('https://pinned1.com', 'Pinned 1', 'icon2.png'); + permissionService.addConnectedSite('https://recent2.com', 'Recent 2', 'icon3.png'); + permissionService.addConnectedSite('https://pinned2.com', 'Pinned 2', 'icon4.png'); + + permissionService.topConnectedSite('https://pinned1.com', 2); + permissionService.topConnectedSite('https://pinned2.com', 1); + + const sites = permissionService.getRecentConnectedSites(); + + expect(sites[0].origin).toBe('https://pinned2.com'); // order 1 + expect(sites[1].origin).toBe('https://pinned1.com'); // order 2 + expect(sites[2].isTop).toBeFalsy(); + expect(sites[3].isTop).toBeFalsy(); + }); + }); + + describe('removeConnectedSite', () => { + beforeEach(async () => { + await permissionService.init(); + permissionService.addConnectedSite('https://remove.com', 'Remove', 'icon.png'); + }); + + it('should remove a connected site', () => { + expect(permissionService.hasPermission('https://remove.com')).toBe(true); + + permissionService.removeConnectedSite('https://remove.com'); + + expect(permissionService.hasPermission('https://remove.com')).toBe(false); + }); + + it('should sync after removing', () => { + const syncSpy = vi.spyOn(permissionService, 'sync'); + + permissionService.removeConnectedSite('https://remove.com'); + + expect(syncSpy).toHaveBeenCalled(); + }); + }); + + describe('setRecentConnectedSites', () => { + beforeEach(async () => { + await permissionService.init(); + }); + + it('should replace all sites with new list', () => { + const newSites: ConnectedSite[] = [ + { + origin: 'https://new1.com', + name: 'New 1', + icon: 'icon1.png', + chain: MAINNET_CHAIN_ID, + isSigned: true, + isTop: false, + }, + { + origin: 'https://new2.com', + name: 'New 2', + icon: 'icon2.png', + chain: MAINNET_CHAIN_ID, + isSigned: false, + isTop: true, + order: 1, + }, + ]; + + permissionService.setRecentConnectedSites(newSites); + + expect(permissionService.lruCache?.size).toBe(2); + expect(permissionService.getConnectedSite('https://new1.com')).toEqual(newSites[0]); + expect(permissionService.getConnectedSite('https://new2.com')).toEqual(newSites[1]); + }); + + it('should sync after setting sites', () => { + const syncSpy = vi.spyOn(permissionService, 'sync'); + + permissionService.setRecentConnectedSites([]); + + expect(syncSpy).toHaveBeenCalled(); + }); + }); + + describe('sync', () => { + beforeEach(async () => { + await permissionService.init(); + }); + + it('should dump cache to store', () => { + // Clear any existing cache first + permissionService.lruCache?.clear(); + + permissionService.addConnectedSite('https://sync1.com', 'Sync 1', 'icon1.png'); + permissionService.addConnectedSite('https://sync2.com', 'Sync 2', 'icon2.png'); + + permissionService.sync(); + + expect(permissionService.store.dumpCache).toHaveLength(2); + + // Check that our sites are in the dump (order might vary) + const dumpKeys = permissionService.store.dumpCache.map(([key]) => key); + expect(dumpKeys).toContain('https://sync1.com'); + expect(dumpKeys).toContain('https://sync2.com'); + }); + + it('should handle undefined cache gracefully', () => { + permissionService.lruCache = undefined; + + expect(() => permissionService.sync()).not.toThrow(); + }); + }); + + describe('edge cases and error handling', () => { + it('should handle operations when cache is not initialized', () => { + permissionService.lruCache = undefined; + + expect(() => { + permissionService.addConnectedSite('test.com', 'Test', 'icon.png'); + permissionService.touchConnectedSite('test.com'); + permissionService.updateConnectSite('test.com', { name: 'New' }); + permissionService.hasPermission('test.com'); + permissionService.removeConnectedSite('test.com'); + permissionService.getRecentConnectedSites(); + permissionService.getConnectedSites(); + permissionService.getConnectedSite('test.com'); + permissionService.setRecentConnectedSites([]); + permissionService.topConnectedSite('test.com'); + permissionService.unpinConnectedSite('test.com'); + }).not.toThrow(); + }); + + it('should handle getWithoutUpdate correctly', () => { + permissionService.lruCache = new LRUCache({ + max: 100, + ttl: 1000 * 60 * 60, + maxSize: 100, + sizeCalculation: () => 1, + }); + + const site: ConnectedSite = { + origin: 'test.com', + name: 'Test', + icon: 'icon.png', + isSigned: false, + isTop: false, + }; + + permissionService.lruCache.set('test.com', site); + + // peek should not update LRU order + const result = permissionService.getWithoutUpdate('test.com'); + expect(result).toEqual(site); + }); + }); + + describe('isInternalOrigin', () => { + it('should correctly identify internal origin', () => { + expect(permissionService.isInternalOrigin(INTERNAL_REQUEST_ORIGIN)).toBe(true); + expect(permissionService.isInternalOrigin('https://example.com')).toBe(false); + }); + }); +}); diff --git a/src/background/service/__tests__/transaction.test.ts b/apps/extension/src/core/service/__tests__/transaction.test.ts similarity index 96% rename from src/background/service/__tests__/transaction.test.ts rename to apps/extension/src/core/service/__tests__/transaction.test.ts index 8d7d30057..cdb263abf 100644 --- a/src/background/service/__tests__/transaction.test.ts +++ b/apps/extension/src/core/service/__tests__/transaction.test.ts @@ -1,16 +1,13 @@ -import type { TransactionStatus, TransactionExecutionStatus } from '@onflow/typedefs'; -import { describe, test, expect, beforeEach, vi, beforeAll } from 'vitest'; +import type { TransactionExecutionStatus, TransactionStatus } from '@onflow/typedefs'; +import { beforeAll, beforeEach, describe, expect, test, vi } from 'vitest'; -import openapiService from '@/background/service/openapi'; -import { getValidData, setCachedData } from '@/background/utils/data-cache'; -import { type FlowNetwork } from '@/shared/types/network-types'; -import { TransferItem } from '@/shared/types/transaction-types'; -import { transferListKey, type TransferListStore } from '@/shared/utils/cache-data-keys'; +import { type FlowNetwork } from '@onflow/flow-wallet-shared/types/network-types'; +import openapiService from '../openapi'; import transaction from '../transaction'; // Mock storage functions -vi.mock('@/shared/utils/storage', () => ({ +vi.mock('@onflow/flow-wallet-shared/utils/storage', () => ({ default: { getSession: vi.fn().mockImplementation((key) => { const now = Date.now(); @@ -127,7 +124,7 @@ describe('Transaction Service', () => { }); // Add the openapi service mock - vi.mock('@/background/service/openapi', () => { + vi.mock('@/core/service/openapi', () => { const mockData = { transactions: [ { @@ -497,7 +494,7 @@ describe('Transaction Service', () => { }); }); -vi.mock('@/shared/utils/cache-data-access', () => ({ +vi.mock('@onflow/flow-wallet-shared/utils/cache-data-access', () => ({ getCachedData: vi.fn().mockImplementation(async (key) => { return mockStorageState.session.get(key); }), @@ -512,7 +509,7 @@ vi.mock('@/shared/utils/cache-data-access', () => ({ }), })); -vi.mock('@/background/utils/data-cache', () => ({ +vi.mock('@/core/utils/data-cache', () => ({ getValidData: vi.fn().mockImplementation(async (key) => { return mockStorageState.session.get(key); }), diff --git a/src/background/service/addressBook.ts b/apps/extension/src/core/service/addressBook.ts similarity index 92% rename from src/background/service/addressBook.ts rename to apps/extension/src/core/service/addressBook.ts index 896307ffc..d963ba1bb 100644 --- a/src/background/service/addressBook.ts +++ b/apps/extension/src/core/service/addressBook.ts @@ -1,6 +1,6 @@ -import { createPersistStore } from 'background/utils'; +import { type Contact } from '@onflow/flow-wallet-shared/types/network-types'; -import { type Contact } from '../../shared/types/network-types'; +import createPersistStore from '../utils/persistStore'; interface AddressBookStore { addressBook: Record<'mainnet' | 'testnet', Contact[]>; diff --git a/src/background/service/coinList.ts b/apps/extension/src/core/service/coinList.ts similarity index 96% rename from src/background/service/coinList.ts rename to apps/extension/src/core/service/coinList.ts index 22c1d2f37..bc508ef53 100644 --- a/src/background/service/coinList.ts +++ b/apps/extension/src/core/service/coinList.ts @@ -1,26 +1,30 @@ -import openapiService from '@/background/service/openapi'; import { type CadenceTokenInfo, - type ExtendedTokenInfo, type EvmTokenInfo, -} from '@/shared/types/coin-types'; -import { isValidEthereumAddress, isValidFlowAddress } from '@/shared/utils/address'; + type ExtendedTokenInfo, +} from '@onflow/flow-wallet-shared/types/coin-types'; +import { + isValidEthereumAddress, + isValidFlowAddress, +} from '@onflow/flow-wallet-shared/utils/address'; +import { consoleError } from '@onflow/flow-wallet-shared/utils/console-log'; + import { cadenceTokenInfoKey, cadenceTokenInfoRefreshRegex, - type ChildAccountFtStore, childAccountFtKey, + childAccountFtRefreshRegex, coinListKey, coinListRefreshRegex, evmTokenInfoKey, evmTokenInfoRefreshRegex, supportedCurrenciesKey, supportedCurrenciesRefreshRegex, + type ChildAccountFtStore, type SupportedCurrenciesStore, - childAccountFtRefreshRegex, -} from '@/shared/utils/cache-data-keys'; -import { consoleError } from '@/shared/utils/console-log'; +} from '@/data-model/cache-data-keys'; +import openapiService from './openapi'; import { getValidData, registerRefreshListener, setCachedData } from '../utils/data-cache'; class CoinList { diff --git a/src/background/service/googleDrive.ts b/apps/extension/src/core/service/googleDrive.ts similarity index 99% rename from src/background/service/googleDrive.ts rename to apps/extension/src/core/service/googleDrive.ts index b65e2e9d3..956509fb6 100644 --- a/src/background/service/googleDrive.ts +++ b/apps/extension/src/core/service/googleDrive.ts @@ -1,7 +1,7 @@ import aesjs from 'aes-js'; import * as bip39 from 'bip39'; -import { consoleError, consoleWarn } from '@/shared/utils/console-log'; +import { consoleError, consoleWarn } from '@onflow/flow-wallet-shared/utils/console-log'; interface GoogleDriveFileModel { kind: string; diff --git a/src/background/service/googleSafeHost.ts b/apps/extension/src/core/service/googleSafeHost.ts similarity index 98% rename from src/background/service/googleSafeHost.ts rename to apps/extension/src/core/service/googleSafeHost.ts index d748bcf25..a573d4110 100644 --- a/src/background/service/googleSafeHost.ts +++ b/apps/extension/src/core/service/googleSafeHost.ts @@ -1,4 +1,4 @@ -import { createPersistStore } from 'background/utils'; +import createPersistStore from '../utils/persistStore'; interface GoogleHostModel { url: string; diff --git a/src/background/service/index.ts b/apps/extension/src/core/service/index.ts similarity index 86% rename from src/background/service/index.ts rename to apps/extension/src/core/service/index.ts index d44f81ac7..5edb7d264 100644 --- a/src/background/service/index.ts +++ b/apps/extension/src/core/service/index.ts @@ -1,10 +1,8 @@ -export { default as notificationService } from './notification'; export { default as keyringService } from './keyring'; export { default as permissionService } from './permission'; export { default as preferenceService } from './preference'; export { default as sessionService } from './session'; export { default as openapiService } from './openapi'; -export { default as pageStateCacheService } from './pageStateCache'; export { default as userInfoService } from './user'; export { default as coinListService } from './coinList'; export { default as addressBookService } from './addressBook'; @@ -15,7 +13,6 @@ export { default as evmNftService } from './nft-evm'; export { default as googleDriveService } from './googleDrive'; export { default as googleSafeHostService } from './googleSafeHost'; export { default as signTextHistoryService } from './signTextHistory'; -export { default as i18n } from './i18n'; export { default as newsService } from './news'; export { default as tokenListService } from './token-list'; export { default as remoteConfigService } from './remoteConfig'; diff --git a/src/background/service/keyring/README.md b/apps/extension/src/core/service/keyring/README.md similarity index 100% rename from src/background/service/keyring/README.md rename to apps/extension/src/core/service/keyring/README.md diff --git a/src/background/service/keyring/display.ts b/apps/extension/src/core/service/keyring/display.ts similarity index 100% rename from src/background/service/keyring/display.ts rename to apps/extension/src/core/service/keyring/display.ts diff --git a/src/background/service/keyring/hdKeyring.ts b/apps/extension/src/core/service/keyring/hdKeyring.ts similarity index 98% rename from src/background/service/keyring/hdKeyring.ts rename to apps/extension/src/core/service/keyring/hdKeyring.ts index b5a63a601..f8da189ac 100644 --- a/src/background/service/keyring/hdKeyring.ts +++ b/apps/extension/src/core/service/keyring/hdKeyring.ts @@ -1,6 +1,6 @@ import { ethers, HDNodeWallet } from 'ethers'; -import { FLOW_BIP44_PATH } from '@/shared/utils/algo-constants'; +import { FLOW_BIP44_PATH } from '@onflow/flow-wallet-shared/constant/algo-constants'; export type HDKeyringSerializedData = { mnemonic?: string; diff --git a/src/background/service/keyring/index.ts b/apps/extension/src/core/service/keyring/index.ts similarity index 98% rename from src/background/service/keyring/index.ts rename to apps/extension/src/core/service/keyring/index.ts index 6666c61ae..9d7bae7bf 100644 --- a/src/background/service/keyring/index.ts +++ b/apps/extension/src/core/service/keyring/index.ts @@ -1,56 +1,58 @@ /// fork from https://github.com/MetaMask/KeyringController/blob/master/index.js -import { EventEmitter } from 'events'; - import * as bip39 from 'bip39'; import encryptor from 'browser-passworder'; import * as ethUtil from 'ethereumjs-util'; +import { EventEmitter } from 'events'; -import { normalizeAddress } from '@/background/utils'; -import { pubKeyAccountToAccountKey, defaultAccountKey } from '@/background/utils/account-key'; -import { getAccountsByPublicKeyTuple } from '@/background/utils/modules/findAddressWithPubKey'; import { - pkTuple2PubKey, - formPubKeyTuple, - seedWithPathAndPhrase2PublicPrivateKey, - getPublicKeyFromPrivateKey, -} from '@/background/utils/modules/publicPrivateKey'; -import i18n from '@/i18n'; + FLOW_BIP44_PATH, + SIGN_ALGO_NUM_ECDSA_P256, + SIGN_ALGO_NUM_ECDSA_secp256k1, +} from '@onflow/flow-wallet-shared/constant/algo-constants'; import { combinePubPkTuple, - type PublicPrivateKeyTuple, type PrivateKeyTuple, type PublicKeyTuple, type PublicPrivateKey, -} from '@/shared/types/key-types'; + type PublicPrivateKeyTuple, +} from '@onflow/flow-wallet-shared/types/key-types'; import { + CURRENT_ID_KEY, KEYRING_DEEP_VAULT_KEY, KEYRING_STATE_CURRENT_KEY, + KEYRING_STATE_V1_KEY, + KEYRING_STATE_V2_KEY, + KEYRING_STATE_V3_KEY, KEYRING_STATE_VAULT_V1, KEYRING_STATE_VAULT_V2, - type VaultEntryV2, - type KeyringState, - KEYRING_STATE_V2_KEY, - KEYRING_STATE_V1_KEY, - CURRENT_ID_KEY, KEYRING_STATE_VAULT_V3, + KEYRING_TYPE, + type KeyringState, + type VaultEntryV2, type VaultEntryV3, - KEYRING_STATE_V3_KEY, -} from '@/shared/types/keyring-types'; -import { type LoggedInAccount } from '@/shared/types/wallet-types'; +} from '@onflow/flow-wallet-shared/types/keyring-types'; +import { type LoggedInAccount } from '@onflow/flow-wallet-shared/types/wallet-types'; import { - FLOW_BIP44_PATH, - SIGN_ALGO_NUM_ECDSA_P256, - SIGN_ALGO_NUM_ECDSA_secp256k1, -} from '@/shared/utils/algo-constants'; -import { consoleError, consoleInfo, consoleWarn } from '@/shared/utils/console-log'; -import { returnCurrentProfileId } from '@/shared/utils/current-id'; -import storage from '@/shared/utils/storage'; -import { KEYRING_TYPE } from 'consts'; + consoleError, + consoleInfo, + consoleWarn, +} from '@onflow/flow-wallet-shared/utils/console-log'; -import preference from '../preference'; +import { returnCurrentProfileId } from '@/extension-shared/utils/current-id'; +import storage from '@/extension-shared/utils/storage'; -import { HDKeyring, type HDKeyringType, type HDKeyringData } from './hdKeyring'; +import { normalizeAddress } from '../../utils'; +import { defaultAccountKey, pubKeyAccountToAccountKey } from '../../utils/account-key'; +import { getAccountsByPublicKeyTuple } from '../../utils/modules/findAddressWithPubKey'; +import { + formPubKeyTuple, + getPublicKeyFromPrivateKey, + pkTuple2PubKey, + seedWithPathAndPhrase2PublicPrivateKey, +} from '../../utils/modules/publicPrivateKey'; +import preference from '../preference'; +import { HDKeyring, type HDKeyringData, type HDKeyringType } from './hdKeyring'; import { type SimpleKeyPairType, SimpleKeyring, type SimpleKeyringData } from './simpleKeyring'; export const KEYRING_SDK_TYPES = { @@ -541,7 +543,7 @@ class KeyringService extends EventEmitter { await this.verifyOrBoot(password); // Validate mnemonic first if (!bip39.validateMnemonic(seed)) { - throw new Error(i18n.t('mnemonic phrase is invalid')); + throw new Error('mnemonic phrase is invalid'); } // Clear the current keyrings as the new keyring will replace it await this.clearCurrentKeyring(); @@ -645,7 +647,7 @@ class KeyringService extends EventEmitter { async verifyPassword(password: string): Promise { const encryptedBooted = this.store.getState().booted; if (!encryptedBooted) { - throw new Error(i18n.t('Cannot unlock without a previous vault')); + throw new Error('Cannot unlock without a previous vault'); } await this.encryptor.decrypt(password, encryptedBooted); } @@ -752,7 +754,7 @@ class KeyringService extends EventEmitter { }); return isIncluded - ? Promise.reject(new Error(i18n.t('duplicateAccount'))) + ? Promise.reject(new Error('duplicateAccount')) : Promise.resolve(newAccountArray); } diff --git a/src/background/service/keyring/simpleKeyring.ts b/apps/extension/src/core/service/keyring/simpleKeyring.ts similarity index 99% rename from src/background/service/keyring/simpleKeyring.ts rename to apps/extension/src/core/service/keyring/simpleKeyring.ts index 0d536e991..1b392a6ce 100644 --- a/src/background/service/keyring/simpleKeyring.ts +++ b/apps/extension/src/core/service/keyring/simpleKeyring.ts @@ -1,6 +1,6 @@ import { Wallet } from 'ethers'; -import { normalizeAddress } from 'background/utils'; +import { normalizeAddress } from '../../utils'; export type SimpleKeyringSerializedData = string[]; export type SimpleKeyPairType = 'Simple Key Pair'; diff --git a/src/background/service/log-listener.ts b/apps/extension/src/core/service/log-listener.ts similarity index 86% rename from src/background/service/log-listener.ts rename to apps/extension/src/core/service/log-listener.ts index 85ef7c8f6..a35b85304 100644 --- a/src/background/service/log-listener.ts +++ b/apps/extension/src/core/service/log-listener.ts @@ -1,4 +1,4 @@ -import { stripSensitive } from '@/shared/utils/strip-sensitive'; +import { stripSensitive } from '@onflow/flow-wallet-shared/utils/strip-sensitive'; import { mixpanelTrack } from './mixpanel'; diff --git a/src/background/service/mixpanel.ts b/apps/extension/src/core/service/mixpanel.ts similarity index 98% rename from src/background/service/mixpanel.ts rename to apps/extension/src/core/service/mixpanel.ts index aaa777ba3..d44b7e2e5 100644 --- a/src/background/service/mixpanel.ts +++ b/apps/extension/src/core/service/mixpanel.ts @@ -1,7 +1,6 @@ -import type { TrackingEvents } from '@/shared/types/tracking-types'; +import type { TrackingEvents } from '@onflow/flow-wallet-shared/types/tracking-types'; -import packageJson from '../../../package.json'; -const { version } = packageJson; +import { version } from '../utils/package-version'; const DISTINCT_ID_KEY = 't_distinct_id'; const DEVICE_ID_PREFIX = '$device:'; diff --git a/src/background/service/news.ts b/apps/extension/src/core/service/news.ts similarity index 89% rename from src/background/service/news.ts rename to apps/extension/src/core/service/news.ts index 71f3824c5..e879cc51e 100644 --- a/src/background/service/news.ts +++ b/apps/extension/src/core/service/news.ts @@ -1,16 +1,15 @@ -import { type NewsItem } from '@/shared/types/news-types'; -import { newsKey, newsRefreshRegex, type NewsStore } from '@/shared/utils/cache-data-keys'; -import { consoleError } from '@/shared/utils/console-log'; +import { type NewsItem } from '@onflow/flow-wallet-shared/types/news-types'; +import { consoleError } from '@onflow/flow-wallet-shared/utils/console-log'; + +import { newsKey, newsRefreshRegex, type NewsStore } from '@/data-model/cache-data-keys'; import { readAndDismissedNewsKey, type ReadAndDismissedNewsStore, -} from '@/shared/utils/user-data-keys'; -import { createPersistStore } from 'background/utils'; -import { storage } from 'background/webapi'; - -import { getValidData, registerRefreshListener, setCachedData } from '../utils/data-cache'; +} from '@/data-model/user-data-keys'; import openapi from './openapi'; +import { getValidData, registerRefreshListener, setCachedData } from '../utils/data-cache'; +import createPersistStore from '../utils/persistStore'; class NewsService { store!: ReadAndDismissedNewsStore; @@ -119,7 +118,6 @@ class NewsService { this.store.readIds = []; this.store.dismissedIds = []; } - storage.remove('newsService'); }; } diff --git a/src/background/service/nft-evm.ts b/apps/extension/src/core/service/nft-evm.ts similarity index 78% rename from src/background/service/nft-evm.ts rename to apps/extension/src/core/service/nft-evm.ts index 718eed2a9..18222122b 100644 --- a/src/background/service/nft-evm.ts +++ b/apps/extension/src/core/service/nft-evm.ts @@ -1,15 +1,15 @@ -import { isValidEthereumAddress } from '@/shared/utils/address'; +import { isValidEthereumAddress } from '@onflow/flow-wallet-shared/utils/address'; + import { evmNftCollectionListKey, evmNftCollectionListRefreshRegex, evmNftIdsKey, evmNftIdsRefreshRegex, -} from '@/shared/utils/cache-data-keys'; - -import { fclConfirmNetwork } from '../fclConfig'; -import { registerRefreshListener, setCachedData } from '../utils/data-cache'; +} from '@/data-model/cache-data-keys'; import { openapiService } from '.'; +import { registerRefreshListener, setCachedData } from '../utils/data-cache'; +import { fclConfirmNetwork } from '../utils/fclConfig'; class EvmNfts { init = async () => { @@ -45,11 +45,15 @@ class EvmNfts { return []; } + // For EVM, offset can be a JWT token string + // Don't convert to integer if it's a JWT token + const offsetParam = offset && !isNaN(Number(offset)) ? parseInt(offset) : offset; + const result = await openapiService.EvmNFTcollectionList( address, collectionIdentifier, 50, - parseInt(offset) || 0 + offsetParam as string | number ); setCachedData(evmNftCollectionListKey(network, address, collectionIdentifier, offset), result); diff --git a/src/background/service/nft.ts b/apps/extension/src/core/service/nft.ts similarity index 95% rename from src/background/service/nft.ts rename to apps/extension/src/core/service/nft.ts index 8395cb494..1352b9759 100644 --- a/src/background/service/nft.ts +++ b/apps/extension/src/core/service/nft.ts @@ -1,26 +1,32 @@ import * as fcl from '@onflow/fcl'; -import { type NFTModelV2, type NftCollection } from '@/shared/types/network-types'; import { - nftCatalogCollectionsKey, - nftCatalogCollectionsRefreshRegex, - nftCollectionKey, - nftCollectionRefreshRegex, + type NftCollection, + type NFTModelV2, +} from '@onflow/flow-wallet-shared/types/network-types'; +import { + type NFTCollectionData, + type NFTCollections, +} from '@onflow/flow-wallet-shared/types/nft-types'; + +import { childAccountAllowTypesKey, childAccountAllowTypesRefreshRegex, childAccountNftsKey, childAccountNFTsRefreshRegex, + nftCatalogCollectionsKey, + nftCatalogCollectionsRefreshRegex, + nftCollectionKey, nftCollectionListKey, nftCollectionListRefreshRegex, + nftCollectionRefreshRegex, nftListKey, nftListRefreshRegex, -} from '@/shared/utils/cache-data-keys'; -import { getValidData, registerRefreshListener, setCachedData } from 'background/utils/data-cache'; - -import { type NFTCollectionData, type NFTCollections } from '../../shared/types/nft-types'; -import { fclConfirmNetwork } from '../fclConfig'; +} from '@/data-model/cache-data-keys'; import openapiService, { getScripts } from './openapi'; +import { getValidData, registerRefreshListener, setCachedData } from '../utils/data-cache'; +import { fclConfirmNetwork } from '../utils/fclConfig'; class NFT { init = async () => { diff --git a/src/background/service/openapi.ts b/apps/extension/src/core/service/openapi.ts similarity index 96% rename from src/background/service/openapi.ts rename to apps/extension/src/core/service/openapi.ts index 989a4102b..c0779c4b5 100644 --- a/src/background/service/openapi.ts +++ b/apps/extension/src/core/service/openapi.ts @@ -2,86 +2,91 @@ import * as fcl from '@onflow/fcl'; import type { Account as FclAccount } from '@onflow/typedefs'; import BigNumber from 'bignumber.js'; import dayjs from 'dayjs'; -import { initializeApp, getApp } from 'firebase/app'; +import { getApp, initializeApp } from 'firebase/app'; import { getAuth, - signInWithCustomToken, - setPersistence, indexedDBLocalPersistence, - signInAnonymously, onAuthStateChanged, + setPersistence, + signInAnonymously, + signInWithCustomToken, type Unsubscribe, type User, } from 'firebase/auth/web-extension'; -import { getInstallations, getId } from 'firebase/installations'; - -import fetchConfig from '@/background/service/remoteConfig'; -import { findKeyAndInfo } from '@/background/utils'; -import { getValidData, setCachedData } from '@/background/utils/data-cache'; -import { getFirbaseConfig, getFirbaseFunctionUrl } from '@/background/utils/firebaseConfig'; -import { verifySignature } from '@/background/utils/modules/publicPrivateKey'; -import { storage } from '@/background/webapi'; +import { getId, getInstallations } from 'firebase/installations'; + +import { + INITIAL_OPENAPI_URL, + WEB_NEXT_URL, +} from '@onflow/flow-wallet-shared/constant/domain-constants'; import type { BalanceMap, - EvmTokenInfo, CadenceTokenInfo, - FungibleTokenListResponse, - FungibleTokenInfo, CustomFungibleTokenInfo, -} from '@/shared/types/coin-types'; -import { CURRENT_ID_KEY } from '@/shared/types/keyring-types'; + EvmTokenInfo, + FungibleTokenInfo, + FungibleTokenListResponse, +} from '@onflow/flow-wallet-shared/types/coin-types'; +import { CURRENT_ID_KEY } from '@onflow/flow-wallet-shared/types/keyring-types'; import { + type AccountBalanceInfo, type AccountKeyRequest, type CheckResponse, - type SignInResponse, - type UserInfoResponse, - type StorageInfo, - type NewsItem, - type NewsConditionType, - Period, - PriceProvider, - type AccountBalanceInfo, type Contact, - type NFTModelV2, type DeviceInfoRequest, + getPriceProvider, type KeyResponseItem, + type NewsConditionType, + type NewsItem, type NftCollection, - getPriceProvider, + type NFTModelV2, + Period, type PeriodFrequency, -} from '@/shared/types/network-types'; -import { type NFTCollections } from '@/shared/types/nft-types'; -import type { TokenInfo } from '@/shared/types/token-info'; + PriceProvider, + type SignInResponse, + type StorageInfo, + type UserInfoResponse, +} from '@onflow/flow-wallet-shared/types/network-types'; +import { type NFTCollections } from '@onflow/flow-wallet-shared/types/nft-types'; +import { type NetworkScripts } from '@onflow/flow-wallet-shared/types/script-types'; +import type { TokenInfo } from '@onflow/flow-wallet-shared/types/token-info'; import { - type LoggedInAccountWithIndex, - type LoggedInAccount, - type FlowAddress, - type PublicKeyAccount, type ActiveAccountType, type Currency, DEFAULT_CURRENCY, -} from '@/shared/types/wallet-types'; -import { isValidFlowAddress } from '@/shared/utils/address'; -import { getStringFromHashAlgo, getStringFromSignAlgo } from '@/shared/utils/algo'; -import { cadenceScriptsKey } from '@/shared/utils/cache-data-keys'; -import { consoleError, consoleLog } from '@/shared/utils/console-log'; -import { returnCurrentProfileId } from '@/shared/utils/current-id'; -import { getPeriodFrequency } from '@/shared/utils/getPeriodFrequency'; -import { type NetworkScripts } from '@/shared/utils/script-types'; -import { INITIAL_OPENAPI_URL, WEB_NEXT_URL } from 'consts'; - -import packageJson from '../../../package.json'; + type FlowAddress, + type LoggedInAccount, + type LoggedInAccountWithIndex, + type PublicKeyAccount, +} from '@onflow/flow-wallet-shared/types/wallet-types'; +import { isValidFlowAddress } from '@onflow/flow-wallet-shared/utils/address'; +import { + getStringFromHashAlgo, + getStringFromSignAlgo, +} from '@onflow/flow-wallet-shared/utils/algo'; +import { consoleError, consoleLog } from '@onflow/flow-wallet-shared/utils/console-log'; +import { getPeriodFrequency } from '@onflow/flow-wallet-shared/utils/getPeriodFrequency'; + +import { cadenceScriptsKey } from '@/data-model/cache-data-keys'; +import { returnCurrentProfileId } from '@/extension-shared/utils/current-id'; +import storage from '@/extension-shared/utils/storage'; +import { findKeyAndInfo } from '../utils'; import { - userWalletService, - coinListService, addressBookService, - userInfoService, - transactionService, - nftService, + coinListService, googleSafeHostService, mixpanelTrack, + nftService, + transactionService, + userInfoService, + userWalletService, } from './index'; -const { version } = packageJson; +import fetchConfig from './remoteConfig'; +import { getValidData, setCachedData } from '../utils/data-cache'; +import { getFirbaseConfig, getFirbaseFunctionUrl } from '../utils/firebaseConfig'; +import { verifySignature } from '../utils/modules/publicPrivateKey'; +import { version } from '../utils/package-version'; type CurrencyResponse = { data: { @@ -695,7 +700,8 @@ export class OpenApiService { * @param token - The custom token to login with */ private _loginWithToken = async (userId: string, token: string) => { - this.clearAllStorage(); + // we shouldn't need to clear storage here anymore + // this.clearAllStorage(); await setPersistence(auth, indexedDBLocalPersistence); await signInWithCustomToken(auth, token); await storage.set(CURRENT_ID_KEY, userId); @@ -1665,7 +1671,7 @@ export class OpenApiService { address: string, collectionIdentifier: string, limit = 24, - offset = 0 + offset: string | number = 0 ) => { const network = await userWalletService.getNetwork(); const { data } = await this.sendRequest( @@ -1969,6 +1975,29 @@ export class OpenApiService { } return userEvmTokenList?.data; } + + async updateAccountMetadata( + address: string, + icon: string, + name: string, + background: string + ): Promise { + return this.sendRequest( + 'POST', + `/api/metadata/user/${address}`, + {}, + { + icon, + name, + background, + }, + WEB_NEXT_URL + ); + } + + async getUserMetadata(): Promise { + return this.sendRequest('GET', '/api/metadata/user/metadatas', {}, {}, WEB_NEXT_URL); + } } const openApiService = new OpenApiService(); diff --git a/apps/extension/src/core/service/permission.ts b/apps/extension/src/core/service/permission.ts new file mode 100644 index 000000000..bea868421 --- /dev/null +++ b/apps/extension/src/core/service/permission.ts @@ -0,0 +1,239 @@ +import { LRUCache } from 'lru-cache'; + +import { INTERNAL_REQUEST_ORIGIN } from '@onflow/flow-wallet-shared/constant/domain-constants'; +import { MAINNET_CHAIN_ID } from '@onflow/flow-wallet-shared/types/network-types'; +import { consoleInfo, consoleWarn } from '@onflow/flow-wallet-shared/utils/console-log'; + +import { permissionKey, permissionKeyV1 } from '@/data-model/user-data-keys'; +import storage from '@/extension-shared/utils/storage'; // Import storage for direct access + +import createPersistStore from '../utils/persistStore'; + +export interface ConnectedSite { + origin: string; + icon: string; + name: string; + chain?: number; + e?: number; + isSigned: boolean; + isTop: boolean; + isConnected?: boolean; + order?: number; +} + +interface OldCacheEntry { + e: number; // Seems to be always 0, likely a legacy field + k: string; // The key of the cache entry + v: ConnectedSite; // The value (ConnectedSite object) +} + +export type PermissionStore = { + dumpCache: [string, LRUCache.Entry][]; // New key for the updated LRUCache +}; + +class PermissionService { + store: PermissionStore = { + dumpCache: [], + }; + lruCache: LRUCache | undefined; + + init = async () => { + // Attempt to load from the new cache key first + this.store = await createPersistStore({ + name: permissionKey, // New storage key + template: { + dumpCache: [], + }, + }); + + // If the new cache is empty, try to migrate from the old cache key + if (!this.store.dumpCache || this.store.dumpCache.length === 0) { + consoleInfo('New permission cache is empty. Checking for old cache data for migration...'); + const oldStoreData = await storage.get(permissionKeyV1); // Directly get old data from storage + + const migratedEntries: [string, LRUCache.Entry][] = []; + + // Migration logic: Handle the specific old data format: { dumpCache: Array } + if ( + oldStoreData && + typeof oldStoreData === 'object' && + Array.isArray(oldStoreData.dumpCache) + ) { + consoleInfo('Attempting migration from old LRUCache dump format (array of {k,v} objects).'); + const oldDumpCache: OldCacheEntry[] = oldStoreData.dumpCache; + + // Iterate through old entries and transform them + for (const item of oldDumpCache) { + // Check if item has the expected 'k' and 'v' properties and 'v' is a valid object + if ( + item && + typeof item.k === 'string' && + item.v && + typeof item.v === 'object' && + item.v.origin && + item.v.name && + item.v.icon + ) { + // Use the same TTL as the new cache's default (30 days) + const ttl = 1000 * 60 * 60 * 24 * 30; + migratedEntries.push([item.k, { value: item.v, ttl, size: 1 }]); + } else { + consoleWarn('Skipping invalid old cache entry during migration:', item); + } + } + } else { + consoleInfo( + 'No old permission cache data found or it is not in the expected format. Initializing empty cache.' + ); + } + + // If migration yielded entries, save them to the new key and remove the old one + if (migratedEntries.length > 0) { + this.store.dumpCache = migratedEntries; // This will trigger persistStore to save to 'permission_cache_v2' + consoleInfo('Permission cache migrated successfully. Old cache cleared.'); + } + } + + // Creating LRU cache with a reasonable size limit + this.lruCache = new LRUCache({ + max: 1000, // Maximum number of items to store + ttl: 1000 * 60 * 60 * 24 * 30, // 30 days TTL + maxSize: 1000, // Required when setting 'size' on individual entries + sizeCalculation: () => 1, // Each entry has size 1 + }); + + if ( + this.store.dumpCache && + Array.isArray(this.store.dumpCache) && + this.store.dumpCache.length > 0 + ) { + this.lruCache.load(this.store.dumpCache); + } + }; + + sync = () => { + if (!this.lruCache) return; + this.store.dumpCache = this.lruCache.dump(); + }; + + getWithoutUpdate = (key: string) => { + if (!this.lruCache) return; + + return this.lruCache.peek(key); + }; + + addConnectedSite = ( + origin: string, + name: string, + icon: string, + defaultChain = MAINNET_CHAIN_ID, + isSigned = false + ) => { + if (!this.lruCache) return; + this.lruCache.set(origin, { + origin, + name, + icon, + chain: defaultChain, + isSigned, + isTop: false, + }); + this.sync(); + }; + + touchConnectedSite = (origin: string) => { + if (!this.lruCache) return; + if (origin === INTERNAL_REQUEST_ORIGIN) return; + this.lruCache.get(origin); + this.sync(); + }; + + updateConnectSite = (origin: string, value: Partial, partialUpdate?: boolean) => { + if (!this.lruCache || !this.lruCache.has(origin)) return; + if (origin === INTERNAL_REQUEST_ORIGIN) return; + + if (partialUpdate) { + const _value = this.lruCache.get(origin); + this.lruCache.set(origin, { ..._value, ...value } as ConnectedSite); + } else { + this.lruCache.set(origin, value as ConnectedSite); + } + + this.sync(); + }; + + hasPermission = (origin: string) => { + if (!this.lruCache) return; + if (origin === INTERNAL_REQUEST_ORIGIN) return true; + + return this.lruCache.has(origin); + }; + + setRecentConnectedSites = (sites: ConnectedSite[]) => { + if (!this.lruCache) return; + const entries: [string, LRUCache.Entry][] = sites.map((item) => [ + item.origin, + { + value: item, + ttl: 1000 * 60 * 60 * 24 * 30, // 30 days + size: 1, + }, + ]); + this.lruCache.load(entries); + this.sync(); // This will save the new state to dumpCacheV2 + }; + + getRecentConnectedSites = () => { + const sites = this.lruCache ? Array.from(this.lruCache.values()) : []; + const pinnedSites = sites + .filter((item) => item?.isTop) + .sort((a, b) => (a.order || 0) - (b.order || 0)); + const recentSites = sites.filter((item) => !item.isTop); + return [...pinnedSites, ...recentSites]; + }; + + getConnectedSites = () => { + return this.lruCache ? Array.from(this.lruCache.values()) : []; + }; + + getConnectedSite = (key: string) => { + return this.lruCache?.get(key); + }; + + topConnectedSite = (origin: string, order?: number) => { + const site = this.getConnectedSite(origin); + if (!site || !this.lruCache) return; + const orders = this.getRecentConnectedSites() + .map((item) => item.order) + .filter((o): o is number => o !== undefined); + const maxOrder = orders.length > 0 ? Math.max(...orders) : 0; + order = order ?? maxOrder + 1; + this.updateConnectSite(origin, { + ...site, + order, + isTop: true, + }); + }; + + unpinConnectedSite = (origin: string) => { + const site = this.getConnectedSite(origin); + if (!site || !this.lruCache) return; + this.updateConnectSite(origin, { + ...site, + isTop: false, + }); + }; + + removeConnectedSite = (origin: string) => { + if (!this.lruCache) return; + + this.lruCache.delete(origin); + this.sync(); + }; + + isInternalOrigin = (origin: string) => { + return origin === INTERNAL_REQUEST_ORIGIN; + }; +} + +export default new PermissionService(); diff --git a/src/background/service/preference.ts b/apps/extension/src/core/service/preference.ts similarity index 95% rename from src/background/service/preference.ts rename to apps/extension/src/core/service/preference.ts index 2bcb10b36..a18e21250 100644 --- a/src/background/service/preference.ts +++ b/apps/extension/src/core/service/preference.ts @@ -1,12 +1,12 @@ import compareVersions from 'compare-versions'; -import { storage } from '@/background/webapi'; -import { type Currency, DEFAULT_CURRENCY } from '@/shared/types/wallet-types'; -import { createPersistStore } from 'background/utils'; +import { type FlowNetwork, MAINNET_NETWORK } from '@onflow/flow-wallet-shared/types/network-types'; +import { type Currency, DEFAULT_CURRENCY } from '@onflow/flow-wallet-shared/types/wallet-types'; -import { type FlowNetwork, MAINNET_NETWORK } from '../../shared/types/network-types'; +import storage from '@/extension-shared/utils/storage'; -import { keyringService, i18n } from './index'; +import keyringService from './keyring'; +import createPersistStore from '../utils/persistStore'; const version = process.env.release || '0'; export interface PreferenceAccount { @@ -33,6 +33,7 @@ interface PreferenceStore { currentAccount: PreferenceAccount | undefined | null; externalLinkAck: boolean; hiddenAddresses: PreferenceAccount[]; + hiddenAccounts: string[]; balanceMap: { [address: string]: any; }; @@ -73,6 +74,7 @@ class PreferenceService { currentAccount: undefined, externalLinkAck: false, hiddenAddresses: [], + hiddenAccounts: [], balanceMap: {}, useLedgerLive: false, locale: defaultLang, @@ -96,7 +98,6 @@ class PreferenceService { if (!this.store.locale || this.store.locale !== defaultLang) { this.store.locale = defaultLang; } - i18n.changeLanguage(this.store.locale); if (this.store.isDefaultWallet === undefined || this.store.isDefaultWallet === null) { this.store.isDefaultWallet = true; } @@ -128,6 +129,9 @@ class PreferenceService { if (!this.store.hiddenAddresses) { this.store.hiddenAddresses = []; } + if (!this.store.hiddenAccounts) { + this.store.hiddenAccounts = []; + } if (!this.store.balanceMap) { this.store.balanceMap = {}; } @@ -272,7 +276,6 @@ class PreferenceService { setLocale = (locale: string) => { this.store.locale = locale; - i18n.changeLanguage(locale); }; // updateUseLedgerLive = async (value: boolean) => { diff --git a/src/background/service/remoteConfig.ts b/apps/extension/src/core/service/remoteConfig.ts similarity index 89% rename from src/background/service/remoteConfig.ts rename to apps/extension/src/core/service/remoteConfig.ts index 20d5b521a..51d575c67 100644 --- a/src/background/service/remoteConfig.ts +++ b/apps/extension/src/core/service/remoteConfig.ts @@ -1,13 +1,16 @@ -import { type FeatureFlagKey, type FeatureFlags } from '@/shared/types/feature-types'; +import { + type FeatureFlagKey, + type FeatureFlags, +} from '@onflow/flow-wallet-shared/types/feature-types'; + import { type RemoteConfig, remoteConfigKey, remoteConfigRefreshRegex, -} from '@/shared/utils/cache-data-keys'; - -import { getValidData, registerRefreshListener, setCachedData } from '../utils/data-cache'; +} from '@/data-model/cache-data-keys'; import openapi from './openapi'; +import { getValidData, registerRefreshListener, setCachedData } from '../utils/data-cache'; class RemoteConfigService { init = async () => { diff --git a/src/background/service/session.ts b/apps/extension/src/core/service/session.ts similarity index 96% rename from src/background/service/session.ts rename to apps/extension/src/core/service/session.ts index 666249c39..5631bee65 100644 --- a/src/background/service/session.ts +++ b/apps/extension/src/core/service/session.ts @@ -1,4 +1,4 @@ -import { permissionService } from 'background/service'; +import permissionService from './permission'; export class Session { origin = ''; diff --git a/src/background/service/signTextHistory.ts b/apps/extension/src/core/service/signTextHistory.ts similarity index 94% rename from src/background/service/signTextHistory.ts rename to apps/extension/src/core/service/signTextHistory.ts index 6c0ded0cc..dd560ab07 100644 --- a/src/background/service/signTextHistory.ts +++ b/apps/extension/src/core/service/signTextHistory.ts @@ -1,9 +1,9 @@ import { sortBy } from 'lodash'; -import { CHAINS_ENUM, INTERNAL_REQUEST_ORIGIN } from '@/constant'; -import { createPersistStore } from 'background/utils'; +import { INTERNAL_REQUEST_ORIGIN } from '@onflow/flow-wallet-shared/constant/domain-constants'; import permissionService, { type ConnectedSite } from './permission'; +import createPersistStore from '../utils/persistStore'; export interface SignTextHistoryItem { site: ConnectedSite; diff --git a/src/background/service/token-list.ts b/apps/extension/src/core/service/token-list.ts similarity index 93% rename from src/background/service/token-list.ts rename to apps/extension/src/core/service/token-list.ts index b2b9d09bb..2faf212b2 100644 --- a/src/background/service/token-list.ts +++ b/apps/extension/src/core/service/token-list.ts @@ -1,18 +1,17 @@ import { - type FungibleTokenInfo, type CustomFungibleTokenInfo, type EvmCustomTokenInfo, -} from '@/shared/types/coin-types'; -import { MAINNET_CHAIN_ID } from '@/shared/types/network-types'; -import { tokenListKey, tokenListRefreshRegex } from '@/shared/utils/cache-data-keys'; -import { setUserData } from '@/shared/utils/user-data-access'; -import { evmCustomTokenKey, getEvmCustomTokenData } from '@/shared/utils/user-data-keys'; + type FungibleTokenInfo, +} from '@onflow/flow-wallet-shared/types/coin-types'; +import { MAINNET_CHAIN_ID } from '@onflow/flow-wallet-shared/types/network-types'; -import { getValidData, registerRefreshListener, setCachedData } from '../utils/data-cache'; - -import openapiService from './openapi'; +import { tokenListKey, tokenListRefreshRegex } from '@/data-model/cache-data-keys'; +import { setUserData } from '@/data-model/user-data-access'; +import { evmCustomTokenKey, getEvmCustomTokenData } from '@/data-model/user-data-keys'; import { userWalletService } from '.'; +import openapiService from './openapi'; +import { getValidData, registerRefreshListener, setCachedData } from '../utils/data-cache'; const defaultFlowToken = { name: 'Flow', diff --git a/src/background/service/transaction.ts b/apps/extension/src/core/service/transaction.ts similarity index 95% rename from src/background/service/transaction.ts rename to apps/extension/src/core/service/transaction.ts index 537803b17..24c148982 100644 --- a/src/background/service/transaction.ts +++ b/apps/extension/src/core/service/transaction.ts @@ -1,15 +1,19 @@ import type { TransactionStatus } from '@onflow/typedefs'; -import openapiService, { type FlowTransactionResponse } from '@/background/service/openapi'; -import { type TransferItem } from '@/shared/types/transaction-types'; -import { isValidEthereumAddress, isValidFlowAddress } from '@/shared/utils/address'; +import { type TransferItem } from '@onflow/flow-wallet-shared/types/transaction-types'; +import { + isValidEthereumAddress, + isValidFlowAddress, +} from '@onflow/flow-wallet-shared/utils/address'; +import { consoleError } from '@onflow/flow-wallet-shared/utils/console-log'; + import { transferListKey, - type TransferListStore, transferListRefreshRegex, -} from '@/shared/utils/cache-data-keys'; -import { consoleError } from '@/shared/utils/console-log'; + type TransferListStore, +} from '@/data-model/cache-data-keys'; +import openapiService, { type FlowTransactionResponse } from './openapi'; import { getInvalidData, getValidData, @@ -123,7 +127,9 @@ class Transaction { ); if (existingTxStore) { existingTxStore.list.unshift(txItem); - existingTxStore.pendingCount = existingTxStore.pendingCount + 1; + existingTxStore.pendingCount = existingTxStore.list.filter( + (item) => item.status.toUpperCase() === 'PENDING' + ).length; existingTxStore.count = existingTxStore.count + 1; await setCachedData(transferListKey(network, address), existingTxStore); } @@ -185,7 +191,7 @@ class Transaction { if (storeItemIndex !== -1) { existingTxStore.list[storeItemIndex] = txItem; existingTxStore.pendingCount = existingTxStore.list.filter( - (item) => item.status === 'PENDING' + (item) => item.status.toUpperCase() === 'PENDING' ).length; await setCachedData(transferListKey(network, address), existingTxStore); } @@ -296,7 +302,8 @@ class Transaction { const transferListStore: TransferListStore = { count: data.total + existingPendingList.length, // This is the number of transaction that are in progress - pendingCount: existingPendingList.filter((item) => item.status === 'PENDING').length, + pendingCount: existingPendingList.filter((item) => item.status.toUpperCase() === 'PENDING') + .length, list: [...existingPendingList, ...txList], }; await setCachedData(transferListKey(network, address, offset, limit), transferListStore); diff --git a/src/background/service/user.ts b/apps/extension/src/core/service/user.ts similarity index 91% rename from src/background/service/user.ts rename to apps/extension/src/core/service/user.ts index e7eef6d38..b77808aa0 100644 --- a/src/background/service/user.ts +++ b/apps/extension/src/core/service/user.ts @@ -1,18 +1,18 @@ -import { type UserInfoResponse } from '@/shared/types/network-types'; -import { type LoggedInAccount } from '@/shared/types/wallet-types'; +import { type UserInfoResponse } from '@onflow/flow-wallet-shared/types/network-types'; +import { type LoggedInAccount } from '@onflow/flow-wallet-shared/types/wallet-types'; +import { consoleError } from '@onflow/flow-wallet-shared/utils/console-log'; + import { userInfoCachekey, userInfoRefreshRegex, type UserInfoStore, -} from '@/shared/utils/cache-data-keys'; -import { consoleError } from '@/shared/utils/console-log'; -import { getCurrentProfileId, returnCurrentProfileId } from '@/shared/utils/current-id'; -import storage from '@/shared/utils/storage'; -import { createSessionStore } from 'background/utils'; - -import { getValidData, registerRefreshListener, setCachedData } from '../utils/data-cache'; +} from '@/data-model/cache-data-keys'; +import { getCurrentProfileId, returnCurrentProfileId } from '@/extension-shared/utils/current-id'; +import storage from '@/extension-shared/utils/storage'; import openapiService from './openapi'; +import { getValidData, registerRefreshListener, setCachedData } from '../utils/data-cache'; +import createSessionStore from '../utils/persistStore'; const storedUserListKey = 'stored-user-list'; const loggedInAccountsKey = 'loggedInAccounts'; diff --git a/src/background/service/userWallet.ts b/apps/extension/src/core/service/userWallet.ts similarity index 82% rename from src/background/service/userWallet.ts rename to apps/extension/src/core/service/userWallet.ts index cbe751291..5cce11f52 100644 --- a/src/background/service/userWallet.ts +++ b/apps/extension/src/core/service/userWallet.ts @@ -5,94 +5,94 @@ import * as ethUtil from 'ethereumjs-util'; import { getApp } from 'firebase/app'; import { getAuth, signInAnonymously } from 'firebase/auth/web-extension'; -import keyringService from '@/background/service/keyring'; -import { mixpanelTrack } from '@/background/service/mixpanel'; -import openapiService from '@/background/service/openapi'; import { - signWithKey, - seed2PublicPrivateKey, - seedWithPathAndPhrase2PublicPrivateKey, - formPubKeyTuple, - pk2PubKeyTuple, -} from '@/background/utils/modules/publicPrivateKey'; -import createPersistStore from '@/background/utils/persisitStore'; + DEFAULT_WEIGHT, + FLOW_BIP44_PATH, +} from '@onflow/flow-wallet-shared/constant/algo-constants'; import { - type PublicPrivateKeyTuple, combinePubPkString, + type PublicPrivateKeyTuple, tupleToPrivateKey, -} from '@/shared/types/key-types'; +} from '@onflow/flow-wallet-shared/types/key-types'; +import { + type AccountKeyRequest, + type DeviceInfoRequest, + type FlowNetwork, + networkToChainId, +} from '@onflow/flow-wallet-shared/types/network-types'; import { - type FlowAddress, - type EvmAddress, - type WalletAccount, - type ChildAccountMap, type ActiveAccountType, + type ChildAccountMap, + type EvmAddress, + type FlowAddress, getActiveAccountTypeForAddress, - type WalletAddress, + type MainAccount, type PendingTransaction, -} from '@/shared/types/wallet-types'; + type PublicKeyAccount, + type WalletAccount, + type WalletAddress, +} from '@onflow/flow-wallet-shared/types/wallet-types'; import { ensureEvmAddressPrefix, isValidEthereumAddress, isValidFlowAddress, withPrefix, -} from '@/shared/utils/address'; -import { DEFAULT_WEIGHT, FLOW_BIP44_PATH } from '@/shared/utils/algo-constants'; +} from '@onflow/flow-wallet-shared/utils/address'; +import { getCompatibleHashAlgo } from '@onflow/flow-wallet-shared/utils/algo'; +import { consoleError, consoleWarn } from '@onflow/flow-wallet-shared/utils/console-log'; +import { getEmojiByIndex } from '@onflow/flow-wallet-shared/utils/emoji-util'; + import { - mainAccountsKey, - evmAccountKey, - childAccountsKey, - mainAccountsRefreshRegex, - childAccountsRefreshRegex, - evmAccountRefreshRegex, - type EvmAccountStore, accountBalanceKey, accountBalanceRefreshRegex, + mainAccountsKey, + mainAccountsRefreshRegex, mainAccountStorageBalanceKey, mainAccountStorageBalanceRefreshRegex, type MainAccountStorageBalanceStore, pendingAccountCreationTransactionsKey, + pendingAccountCreationTransactionsRefreshRegex, placeholderAccountsKey, placeholderAccountsRefreshRegex, - pendingAccountCreationTransactionsRefreshRegex, -} from '@/shared/utils/cache-data-keys'; -import { consoleError, consoleWarn } from '@/shared/utils/console-log'; -import { retryOperation } from '@/shared/utils/retryOperation'; -import { setUserData } from '@/shared/utils/user-data-access'; + userMetadataKey, + type UserMetadataStore, +} from '@/data-model/cache-data-keys'; +import { removeUserData, setUserData } from '@/data-model/user-data-access'; import { - userWalletsKey, - type UserWalletStore, - type ActiveAccountsStore, activeAccountsKey, + type ActiveAccountsStore, getActiveAccountsData, -} from '@/shared/utils/user-data-keys'; + userWalletsKey, + type UserWalletStore, +} from '@/data-model/user-data-keys'; +import { retryOperation } from '@/extension-shared/utils/retryOperation'; +import storage from '@/extension-shared/utils/storage'; -import { - networkToChainId, - type AccountKeyRequest, - type DeviceInfoRequest, - type FlowNetwork, -} from '../../shared/types/network-types'; -import { type PublicKeyAccount, type MainAccount } from '../../shared/types/wallet-types'; -import { type WalletController } from '../controller/wallet'; -import { fclConfig, fclConfirmNetwork } from '../fclConfig'; +import keyringService from './keyring'; +import { mixpanelTrack } from './mixpanel'; +import openapiService, { getScripts } from './openapi'; +import remoteConfigService from './remoteConfig'; import { defaultAccountKey, pubKeyAccountToAccountKey } from '../utils/account-key'; import { clearCachedData, + getCachedData, getValidData, - registerRefreshListener, registerBatchRefreshListener, + registerRefreshListener, setCachedData, } from '../utils/data-cache'; -import { getEmojiByIndex } from '../utils/emoji-util'; +import { fclConfig, fclConfirmNetwork } from '../utils/fclConfig'; import { getAccountsByPublicKeyTuple, getAccountsWithPublicKey, } from '../utils/modules/findAddressWithPubKey'; -import { storage } from '../webapi'; - -import { getScripts } from './openapi'; -import remoteConfigService from './remoteConfig'; +import { + pk2PubKeyTuple, + seed2PublicPrivateKey, + seedWithPathAndPhrase2PublicPrivateKey, + signWithKey, +} from '../utils/modules/publicPrivateKey'; +import createPersistStore from '../utils/persistStore'; const USER_WALLET_TEMPLATE: UserWalletStore = { monitor: 'flowscan', @@ -106,20 +106,6 @@ class UserWallet { // The user settings - network and other global settings private store!: UserWalletStore; - // Reference to the wallet controller - private walletController: WalletController | undefined = undefined; - - setWalletController = (controller: WalletController) => { - this.walletController = controller; - }; - - getWalletController = (): WalletController => { - if (!this.walletController) { - throw new Error('Wallet controller not set'); - } - return this.walletController; - }; - init = async () => { this.store = await createPersistStore({ name: userWalletsKey, @@ -136,8 +122,6 @@ class UserWallet { } else { Object.assign(this.store, USER_WALLET_TEMPLATE); } - // clear all session storage - await storage.clearSession(); }; isLocked = () => { @@ -343,7 +327,17 @@ class UserWallet { pubkey, activeAccounts ); - if ( + if (validatedActiveAccounts.parentAddress === null) { + const mainAccounts = await this.getMainAccounts(); + if (mainAccounts.length === 0) { + // If the parent address is null, we need to reset to the first parent account + await removeUserData(activeAccountsKey(network, pubkey)); + return { + parentAddress: null, + currentAddress: null, + }; + } + } else if ( validatedActiveAccounts.parentAddress !== null && validatedActiveAccounts.currentAddress !== null && (validatedActiveAccounts.parentAddress !== activeAccounts?.parentAddress || @@ -587,24 +581,37 @@ class UserWallet { // Get the evm wallet of the current main account getEvmAccount = async (): Promise => { - const network = this.getNetwork(); - const parentAddress = await this.getParentAddress(); + return this.getEvmAccountOfParent((await this.getParentAddress()) ?? ''); + }; + + // Get the evm wallet of the current main account + getEvmAccountOfParent = async (parentAddress: string): Promise => { if (!parentAddress) { // There are no main accounts against the current pubkey return null; } - return getEvmAccountOfParent(network, parentAddress); + const mainAccounts = await this.getMainAccounts(); + const mainAccount = mainAccounts.find((account) => account.address === parentAddress); + if (!mainAccount) { + // The main account is not found - throw an error + throw new Error('Parent account not found'); + } + return mainAccount.evmAccount ?? null; }; - // Get the child accounts of the current main account getChildAccounts = async (): Promise => { - const network = this.getNetwork(); const parentAddress = await this.getParentAddress(); if (!parentAddress) { // There are no main accounts against the current pubkey return []; } - return getChildAccountsOfParent(network, parentAddress); + const mainAccounts = await this.getMainAccounts(); + const mainAccount = mainAccounts.find((account) => account.address === parentAddress); + if (!mainAccount) { + // The main account is not found - throw an error + throw new Error('Parent account not found'); + } + return mainAccount.childAccounts ?? []; }; private getChildAccount = async (): Promise => { @@ -830,9 +837,20 @@ class UserWallet { }; }; + getPayerAddressAndKeyId = async (): Promise<{ address: string; keyId: number }> => { + try { + const network = this.getNetwork(); + const remoteConfig = await remoteConfigService.getRemoteConfig(); + return remoteConfig.config.payer[network]; + } catch (err) { + consoleError(err); + throw new Error('Payer address and keyId not found'); + } + }; + payerAuthFunction = async (account) => { // authorization function need to return an account - const payer = await this.getWalletController().getPayerAddressAndKeyId(); + const payer = await this.getPayerAddressAndKeyId(); if (!payer) { throw new Error('Payer address and keyId not found'); } @@ -857,9 +875,24 @@ class UserWallet { }, }; }; + + getBridgeFeePayerAddressAndKeyId = async () => { + try { + const network = this.getNetwork(); + const remoteConfig = await remoteConfigService.getRemoteConfig(); + if (!remoteConfig.config.bridgeFeePayer) { + throw new Error('Bridge fee payer not found'); + } + return remoteConfig.config.bridgeFeePayer[network]; + } catch (err) { + consoleError(err); + throw new Error('Bridge fee payer address and keyId not found'); + } + }; + bridgeFeePayerAuthFunction = async (account) => { // authorization function need to return an account - const bridgeFeePayer = await this.getWalletController().getBridgeFeePayerAddressAndKeyId(); + const bridgeFeePayer = await this.getBridgeFeePayerAddressAndKeyId(); const address = fcl.withPrefix(bridgeFeePayer.address); const ADDRESS = fcl.withPrefix(address); // TODO: FIX THIS @@ -889,26 +922,21 @@ class UserWallet { */ /** - * Login with the current keyring - * This is called immediately after switching unlocking or creating a keyring - * That is - the keyring has been switched or created and we need to login with the new pubkey - * The problem with this function is that we don't know which pubkey is the one to use - * We have to query the indexer to find accounts for each pubkey in the tuple - * @param pubKey - The public key to login with + * Login with a specific public key and private key + * @param publicKey - The public key to login with + * @param privateKey - The private key to login with + * @param signAlgo - The signing algorithm to use + * @param hashAlgo - The hash algorithm to use * @param replaceUser - Whether to replace the current user * @returns void */ loginWithPublicPrivateKey = async ( - keyTuple: PublicPrivateKeyTuple, + publicKey: string, + privateKey: string, + signAlgo: number, replaceUser = true ): Promise => { - // Get the network and store before we do anything async - const network = this.getNetwork(); - // Get the public key tuple - const pubKeyTuple = formPubKeyTuple(keyTuple); - // Login anonymously if needed - // We'll need to do this before we get the accounts const app = getApp(process.env.NODE_ENV!); const auth = getAuth(app); let idToken = await getAuth(app).currentUser?.getIdToken(); @@ -920,26 +948,23 @@ class UserWallet { throw new Error('Failed to get idToken - even after signing in anonymously'); } } - - // Find any account with public key information - const accounts = await getAccountsByPublicKeyTuple(pubKeyTuple, network); - - // If no accounts are found, then the registration process may not have been completed - // Assume the default account key - const accountKeyRequest = - accounts.length === 0 - ? defaultAccountKey(pubKeyTuple) - : pubKeyAccountToAccountKey(accounts[0]); - - // Get the private key from the private key tuple - const privateKey = tupleToPrivateKey(keyTuple, accountKeyRequest.sign_algo); - // Add the user domain tag const rightPaddedHexBuffer = (value, pad) => Buffer.from(value.padEnd(pad * 2, 0), 'hex').toString('hex'); const USER_DOMAIN_TAG = rightPaddedHexBuffer(Buffer.from('FLOW-V0.0-user').toString('hex'), 32); const message = USER_DOMAIN_TAG + Buffer.from(idToken, 'utf8').toString('hex'); + // Determine hash algorithm based on signing algorithm (same logic as pubKeySignAlgoToAccountKey) + const hashAlgo = getCompatibleHashAlgo(signAlgo); + + // Create account key request directly from the provided key + const accountKeyRequest: AccountKeyRequest = { + public_key: publicKey, + sign_algo: signAlgo, + hash_algo: hashAlgo, + weight: DEFAULT_WEIGHT, + }; + // Sign the message const realSignature = await signWithKey( message, @@ -947,6 +972,7 @@ class UserWallet { accountKeyRequest.hash_algo, privateKey ); + // Get the device info const deviceInfo = await this.getDeviceInfo(); @@ -956,11 +982,47 @@ class UserWallet { // Set the current pubkey in userWallet provided we have been able to login this.setCurrentPubkey(accountKeyRequest.public_key); }; + /** - * Login with the current keyring + * Login with a public private key tuple (legacy method) * This is called immediately after switching unlocking or creating a keyring + * That is - the keyring has been switched or created and we need to login with the new pubkey + * The problem with this function is that we don't know which pubkey is the one to use + * We have to query the indexer to find accounts for each pubkey in the tuple + * @param keyTuple - The public private key tuple to login with + * @param replaceUser - Whether to replace the current user + * @returns void + */ + loginWithKeyTuple = async ( + keyTuple: PublicPrivateKeyTuple, + replaceUser = true + ): Promise => { + // Get the network and store before we do anything async + const network = this.getNetwork(); + + // Search for accounts with either of the public keys in the tuple + const accounts = await getAccountsByPublicKeyTuple(keyTuple, network); + + // Determine which public key, sign algo, and hash algo was used from the accounts returned + const accountKeyRequest = + accounts.length === 0 ? defaultAccountKey(keyTuple) : pubKeyAccountToAccountKey(accounts[0]); + + // Get the corresponding private key from the private key tuple + const privateKey = tupleToPrivateKey(keyTuple, accountKeyRequest.sign_algo); + + // Call the new method with the public private key tuple + await this.loginWithPublicPrivateKey( + accountKeyRequest.public_key, + privateKey, + accountKeyRequest.sign_algo, + replaceUser + ); + }; + + /** + * Login with the current keyring + * This is called immediately after switching unlocking, creating or importing keyring will use loginWithMnemonic or loginWithPk * We also call it if we've been logged out but the wallet is unlocked - * @param pubKey - The public key to login with * @param replaceUser - Whether to replace the current user * @returns The logged in account */ @@ -969,11 +1031,12 @@ class UserWallet { // If the wallet is locked, we can't sign in return; } - return this.loginWithPublicPrivateKey( - // Get the current public private key tuple - await keyringService.getCurrentPublicPrivateKeyTuple(), - replaceUser - ); + + const currentSignAlgo = keyringService.getCurrentSignAlgo(); + const publicKey = await keyringService.getCurrentPublicKey(); + const privateKey = await keyringService.getCurrentPrivateKey(); + + return this.loginWithPublicPrivateKey(publicKey, privateKey, currentSignAlgo, replaceUser); }; /** @@ -996,7 +1059,7 @@ class UserWallet { passphrase ); // Login with the public private key - return this.loginWithPublicPrivateKey(publicPrivateKey, replaceUser); + return this.loginWithKeyTuple(publicPrivateKey, replaceUser); }; /** @@ -1011,7 +1074,7 @@ class UserWallet { // Combine the public key tuple and the private key const publicPrivateKey = combinePubPkString(pubKeyTuple, privateKey); // Login with the public private key - return this.loginWithPublicPrivateKey(publicPrivateKey, replaceUser); + return this.loginWithKeyTuple(publicPrivateKey, replaceUser); }; /** @@ -1150,17 +1213,7 @@ const preloadAllAccountsWithPubKey = async ( return []; } - // Now for each main account load the evm address and child accounts - const childAndEvmAccounts = await Promise.all( - mainAccounts.flatMap((mainAccount) => { - return [ - getEvmAccountOfParent(network, mainAccount.address), - getChildAccountsOfParent(network, mainAccount.address), - ]; - }) - ); - - return [...mainAccounts, ...childAndEvmAccounts.filter((account) => account !== null).flat()]; + return mainAccounts; }; /** @@ -1291,6 +1344,61 @@ const getMainAccountsWithPubKey = async ( return mainAccounts; }; +// Cache for in-flight requests to prevent race conditions +const metadataRequestCache = new Map< + string, + Promise> +>(); + +/** + * Fetch user metadata from cache or API + * @param pubKey - The public key to fetch metadata for + * @returns Promise> + */ +const fetchUserMetadata = async ( + pubKey: string +): Promise> => { + let customMetadata: Record = {}; + + try { + // Try to get from cache first + const cachedMetadata = await getCachedData(userMetadataKey(pubKey)); + + if (cachedMetadata) { + customMetadata = cachedMetadata as UserMetadataStore; + } else { + // Check if there's already a request in progress for this pubKey + const cacheKey = userMetadataKey(pubKey); + if (metadataRequestCache.has(cacheKey)) { + customMetadata = await metadataRequestCache.get(cacheKey)!; + } else { + const requestPromise = (async () => { + const metadataResponse = await openapiService.getUserMetadata(); + let result: Record = {}; + + if (metadataResponse?.data) { + result = metadataResponse.data as UserMetadataStore; + } else if (metadataResponse && typeof metadataResponse === 'object') { + result = metadataResponse as UserMetadataStore; + } + + // Cache the result + await setCachedData(userMetadataKey(pubKey), result, 300_000); + return result; + })(); + + metadataRequestCache.set(cacheKey, requestPromise); + customMetadata = await requestPromise; + metadataRequestCache.delete(cacheKey); + } + } + } catch (error) { + consoleError('Failed to fetch user metadata:', error); + } + + return customMetadata; +}; + /** * Load the main accounts for a given public key * Store in the data cache @@ -1324,81 +1432,103 @@ const loadMainAccountsWithPubKey = async ( const mainPublicKeyAccounts: PublicKeyAccount[] = [...accounts, ...filteredPlaceholderAccounts]; + // Fetch custom metadata from cache or API + const customMetadata = await fetchUserMetadata(pubKey); + // Transform the address array into MainAccount objects const mainAccounts: MainAccount[] = mainPublicKeyAccounts.map( (publicKeyAccount, index): MainAccount => { - const emoji = getEmojiByIndex(index); + const defaultEmoji = getEmojiByIndex(index); + + // Check if there's custom metadata for this address + const customData = customMetadata[publicKeyAccount.address]; return { ...publicKeyAccount, chain: networkToChainId(network), id: index, - name: emoji.name, - icon: emoji.emoji, - color: emoji.bgcolor, + name: customData?.name || defaultEmoji.name, + icon: customData?.icon || defaultEmoji.emoji, + color: customData?.background || defaultEmoji.bgcolor, }; } ); - // Merge with pending accounts + // Load all accounts detail + const accountDetailMap = await loadAccountsDetail( + network, + mainAccounts.map((mainAccount) => mainAccount.address) + ); + + const mainAccountsWithDetail: MainAccount[] = mainAccounts.map((mainAccount) => { + const accountDetail = accountDetailMap[mainAccount.address]; + const evmAccount = !!accountDetail.COAs?.length + ? evmAddressToWalletAccount(network, accountDetail.COAs[0]) + : undefined; + + // Apply custom metadata to evmAccount if it exists + if (evmAccount && evmAccount.address) { + const evmCustomData = customMetadata[evmAccount.address]; + if (evmCustomData) { + evmAccount.name = evmCustomData.name || evmAccount.name; + evmAccount.icon = evmCustomData.icon || evmAccount.icon; + evmAccount.color = evmCustomData.background || evmAccount.color; + } + } + + return { + ...mainAccount, + evmAccount, + childAccounts: childAccountMapToWalletAccounts(network, accountDetail.childrens), + }; + }); // Save the merged accounts to the cache setCachedData( mainAccountsKey(network, pubKey), - mainAccounts, - mainAccounts.length > 0 ? 60_000 : 1_000 + mainAccountsWithDetail, + mainAccountsWithDetail.length > 0 ? 60_000 : 1_000 ); - return mainAccounts; + return mainAccountsWithDetail; }; -/** - * Get the child accounts of the given main account address - * @param network - The network to load the accounts for - * @param parentAddress - The parent address to load the accounts for - * @returns The child accounts for the given main account address or null if not found. Does not throw an error. - */ -const getChildAccountsOfParent = async ( - network: string, - parentAddress: string -): Promise => { - if (!parentAddress) { - // There is no parent address - return []; - } - const childAccounts = await getValidData( - childAccountsKey(network, parentAddress) - ); - if (childAccounts === undefined) { - // The child accounts are not loaded or needs to be refreshed - return await loadChildAccountsOfParent(network, parentAddress); - } - return childAccounts; +type AccountsDetail = { + flowBalance: string; + nftCounts: number; + childrens: ChildAccountMap; // terrible spelling, but it's the name of the field in the script + COAs: EvmAddress[]; +}; + +type AccountDetailMap = { + [key: string]: AccountsDetail; }; /** - * Load the child accounts for a given main account address - * Store in the data cache + * Load child and evm accounts for a list of main accounts * @param network - The network to load the accounts for - * @param mainAccountAddress - The main account address to load the accounts for - * @returns The child accounts for the given main account address or null if not found. Does not throw an error. + * @param mainAccounts - The main accounts to load the accounts for + * @returns The child and evm accounts for the given main accounts */ -export const loadChildAccountsOfParent = async ( +const loadAccountsDetail = async ( network: string, - mainAccountAddress: string -): Promise => { - const script = await getScripts(network, 'hybridCustody', 'getChildAccountMeta'); + mainAccountAddresses: string[] +): Promise => { + const script = await getScripts(network, 'basic', 'getAccountsDetail'); - if (!(await fclConfirmNetwork(network))) { - throw new Error('Network has been switched'); - } - - const childAccountMap: ChildAccountMap = await fcl.query({ + const accountsDetail: AccountDetailMap = await fcl.query({ cadence: script, - args: (arg, t) => [arg(mainAccountAddress, t.Address)], + args: (arg, t) => [arg(mainAccountAddresses, t.Array(t.Address))], }); + return accountsDetail; +}; + +const childAccountMapToWalletAccounts = ( + network: string, + childAccountMap: ChildAccountMap +): WalletAccount[] => { // Convert the child accounts to wallet accounts const childAccounts: WalletAccount[] = Object.entries(childAccountMap || {}).map( ([address, accountDetails], index) => { @@ -1413,85 +1543,46 @@ export const loadChildAccountsOfParent = async ( return childWallet; } ); - - // Save the child accounts to the cache - setCachedData(childAccountsKey(network, mainAccountAddress), childAccounts, 10_000); - return childAccounts; }; -// Get the evm wallet of the current main account -export const getEvmAccountOfParent = async ( - network: string, - parentAddress: string -): Promise => { - if (!parentAddress) { - // There are no main accounts against the current pubkey - return null; - } - // Get the evm account from the cache - const evmAccount = await getValidData(evmAccountKey(network, parentAddress)); - if (evmAccount === undefined) { - // The evm account is not loaded or needs to be refreshed - return await loadEvmAccountOfParent(network, parentAddress); +/** + * Convert an EVM address to a wallet account + * @param network - The network to load the accounts for + * @param evmAddress - The EVM address to convert to a wallet account + * @returns The wallet account for the given EVM address or null if not found. Does not throw an error. + */ +const evmAddressToWalletAccount = (network: string, evmAddress?: EvmAddress): WalletAccount => { + if (!evmAddress) { + const nullEvmAccount: WalletAccount = { + address: '', + name: '', + icon: '', + color: '', + chain: networkToChainId(network), + id: 0, + }; + return nullEvmAccount; } - return evmAccount; -}; -// Load the EVM account -export const loadEvmAccountOfParent = async ( - network: string, - mainAccountAddress: string -): Promise => { - // TODO: If there's no EVM address, we might want to store null in the cache - const nullEvmAccount: WalletAccount = { - address: '', - name: '', - icon: '', - color: '', + // This is the COA address we get straight from the script + // This is where we encode the address in ERC-55 format + const checksummedAddress = ethUtil.toChecksumAddress(ensureEvmAddressPrefix(evmAddress)); + + // The index of the evm wallet - always 0 as we only support one evm wallet + const index = 0; + // Add 9 to the index to get the evm emoji + const emoji = getEmojiByIndex(index + 9); + const evmAccount: WalletAccount = { + address: checksummedAddress, + name: emoji.name, + icon: emoji.emoji, + color: emoji.bgcolor, chain: networkToChainId(network), - id: 0, + id: index, }; - if (!(await fclConfirmNetwork(network))) { - // Do nothing if the network is switched - // Don't update the cache - throw new Error('Network has been switched'); - } - - // this will only be called if the user's main account is valid - const script = await getScripts(network as FlowNetwork, 'evm', 'getCoaAddr'); - - const result = await fcl.query({ - cadence: script, - args: (arg, t) => [arg(mainAccountAddress, t.Address)], - }); - if (result) { - // This is the COA address we get straight from the script - // This is where we encode the address in ERC-55 format - const checksummedAddress = ethUtil.toChecksumAddress(ensureEvmAddressPrefix(result)); - - // The index of the evm wallet - always 0 as we only support one evm wallet - const index = 0; - // Add 9 to the index to get the evm emoji - const emoji = getEmojiByIndex(index + 9); - const evmAccount: WalletAccount = { - address: checksummedAddress, - name: emoji.name, - icon: emoji.emoji, - color: emoji.bgcolor, - chain: networkToChainId(network), - id: index, - }; - // Save the EVM account to the cache - setCachedData(evmAccountKey(network, mainAccountAddress), evmAccount, 10_000); - - return evmAccount; - } else { - // If the script returns null, we need to clear the EVM account - setCachedData(evmAccountKey(network, mainAccountAddress), nullEvmAccount, 60_000); - return nullEvmAccount; - } + return evmAccount; }; /** @@ -1629,8 +1720,6 @@ const clearPendingAccountCreationTransactions = async (network: string, pubkey: const initAccountLoaders = () => { registerRefreshListener(mainAccountsRefreshRegex, loadMainAccountsWithPubKey); - registerRefreshListener(childAccountsRefreshRegex, loadChildAccountsOfParent); - registerRefreshListener(evmAccountRefreshRegex, loadEvmAccountOfParent); // Use batch refresh for account balances to avoid hitting the backend too hard registerBatchRefreshListener( diff --git a/src/background/utils/__tests__/promiseFlow.test.ts b/apps/extension/src/core/utils/__tests__/promiseFlow.test.ts similarity index 100% rename from src/background/utils/__tests__/promiseFlow.test.ts rename to apps/extension/src/core/utils/__tests__/promiseFlow.test.ts diff --git a/src/background/utils/account-key.ts b/apps/extension/src/core/utils/account-key.ts similarity index 85% rename from src/background/utils/account-key.ts rename to apps/extension/src/core/utils/account-key.ts index f48264782..e6cf95932 100644 --- a/src/background/utils/account-key.ts +++ b/apps/extension/src/core/utils/account-key.ts @@ -1,17 +1,16 @@ -import { type PublicKeyTuple, tupleToPubKey } from '@/shared/types/key-types'; -import { type PublicKeyAccount } from '@/shared/types/wallet-types'; - -import type { AccountKeyRequest } from '../../shared/types/network-types'; import { + DEFAULT_WEIGHT, FLOW_BIP44_PATH, HASH_ALGO_NUM_DEFAULT, - SIGN_ALGO_NUM_DEFAULT, - DEFAULT_WEIGHT, HASH_ALGO_NUM_SHA2_256, HASH_ALGO_NUM_SHA3_256, + SIGN_ALGO_NUM_DEFAULT, SIGN_ALGO_NUM_ECDSA_P256, SIGN_ALGO_NUM_ECDSA_secp256k1, -} from '../../shared/utils/algo-constants'; +} from '@onflow/flow-wallet-shared/constant/algo-constants'; +import { type PublicKeyTuple, tupleToPubKey } from '@onflow/flow-wallet-shared/types/key-types'; +import type { AccountKeyRequest } from '@onflow/flow-wallet-shared/types/network-types'; +import { type PublicKeyAccount } from '@onflow/flow-wallet-shared/types/wallet-types'; import { seedWithPathAndPhrase2PublicPrivateKey } from './modules/publicPrivateKey'; diff --git a/src/background/utils/batch-refresh-integration.test.ts b/apps/extension/src/core/utils/batch-refresh-integration.test.ts similarity index 89% rename from src/background/utils/batch-refresh-integration.test.ts rename to apps/extension/src/core/utils/batch-refresh-integration.test.ts index eed867464..c0bc53d84 100644 --- a/src/background/utils/batch-refresh-integration.test.ts +++ b/apps/extension/src/core/utils/batch-refresh-integration.test.ts @@ -1,11 +1,11 @@ -import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest'; +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; -import { getCachedData } from '@/shared/utils/cache-data-access'; -import { accountBalanceKey, accountBalanceRefreshRegex } from '@/shared/utils/cache-data-keys'; -import storage from '@/shared/utils/storage'; +import { getCachedData } from '@/data-model/cache-data-access'; +import { accountBalanceKey, accountBalanceRefreshRegex } from '@/data-model/cache-data-keys'; +import storage from '@/extension-shared/utils/storage'; // Mock the storage module -vi.mock('@/shared/utils/storage', () => ({ +vi.mock('@/extension-shared/utils/storage', () => ({ default: { setSession: vi.fn().mockResolvedValue(undefined), getSession: vi.fn().mockResolvedValue(undefined), @@ -14,7 +14,7 @@ vi.mock('@/shared/utils/storage', () => ({ })); // Mock getCachedData -vi.mock('@/shared/utils/cache-data-access', () => ({ +vi.mock('@/data-model/cache-data-access', () => ({ getCachedData: vi.fn(), })); diff --git a/src/background/utils/batch-refresh.test.ts b/apps/extension/src/core/utils/batch-refresh.test.ts similarity index 97% rename from src/background/utils/batch-refresh.test.ts rename to apps/extension/src/core/utils/batch-refresh.test.ts index 2f59970ea..09a06fbe3 100644 --- a/src/background/utils/batch-refresh.test.ts +++ b/apps/extension/src/core/utils/batch-refresh.test.ts @@ -1,10 +1,10 @@ -import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest'; +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; -import { registerBatchRefreshListener, batchRefreshManager } from './batch-refresh'; +import { batchRefreshManager, registerBatchRefreshListener } from './batch-refresh'; import { setCachedData } from './data-cache'; // Mock the storage module -vi.mock('@/shared/utils/storage', () => ({ +vi.mock('@onflow/flow-wallet-shared/utils/storage', () => ({ default: { setSession: vi.fn(), getSession: vi.fn(), @@ -147,7 +147,7 @@ describe('Batch Refresh Mechanism', () => { it('should handle errors gracefully', async () => { // Mock consoleError from shared utils - const consoleError = await import('@/shared/utils/console-log'); + const consoleError = await import('@onflow/flow-wallet-shared/utils/console-log'); const consoleErrorSpy = vi.spyOn(consoleError, 'consoleError').mockImplementation(() => {}); const batchLoader = vi.fn().mockRejectedValue(new Error('Network error')); diff --git a/src/background/utils/batch-refresh.ts b/apps/extension/src/core/utils/batch-refresh.ts similarity index 97% rename from src/background/utils/batch-refresh.ts rename to apps/extension/src/core/utils/batch-refresh.ts index 1ab5670fb..e54c7ef73 100644 --- a/src/background/utils/batch-refresh.ts +++ b/apps/extension/src/core/utils/batch-refresh.ts @@ -1,5 +1,6 @@ -import { consoleError } from '@/shared/utils/console-log'; -import storage from '@/shared/utils/storage'; +import { consoleError } from '@onflow/flow-wallet-shared/utils/console-log'; + +import storage from '@/extension-shared/utils/storage'; import { setCachedData } from './data-cache'; diff --git a/src/background/utils/data-cache.ts b/apps/extension/src/core/utils/data-cache.ts similarity index 93% rename from src/background/utils/data-cache.ts rename to apps/extension/src/core/utils/data-cache.ts index 9297b0c2e..9658695a2 100644 --- a/src/background/utils/data-cache.ts +++ b/apps/extension/src/core/utils/data-cache.ts @@ -1,6 +1,7 @@ -import { type CacheDataItem } from '@/shared/types/data-cache-types'; -import { consoleError } from '@/shared/utils/console-log'; -import storage from '@/shared/utils/storage'; +import { consoleError } from '@onflow/flow-wallet-shared/utils/console-log'; + +import { type CacheDataItem } from '@/data-model/data-cache-types'; +import storage from '@/extension-shared/utils/storage'; /** * Get valid data from session storage @@ -31,7 +32,7 @@ export const getInvalidData = async (key: string): Promise => return sessionData?.value as T | undefined; }; -export * from '@/shared/utils/cache-data-access'; +export * from '@/data-model/cache-data-access'; /** * BACKGROUND ONLY METHODS */ diff --git a/src/background/utils/defaultConfig.json b/apps/extension/src/core/utils/defaultConfig.json similarity index 100% rename from src/background/utils/defaultConfig.json rename to apps/extension/src/core/utils/defaultConfig.json diff --git a/src/background/utils/defaultNftList.mainnet.json b/apps/extension/src/core/utils/defaultNftList.mainnet.json similarity index 100% rename from src/background/utils/defaultNftList.mainnet.json rename to apps/extension/src/core/utils/defaultNftList.mainnet.json diff --git a/src/background/utils/defaultNftList.testnet.json b/apps/extension/src/core/utils/defaultNftList.testnet.json similarity index 100% rename from src/background/utils/defaultNftList.testnet.json rename to apps/extension/src/core/utils/defaultNftList.testnet.json diff --git a/src/background/utils/defaultTokenList.json b/apps/extension/src/core/utils/defaultTokenList.json similarity index 100% rename from src/background/utils/defaultTokenList.json rename to apps/extension/src/core/utils/defaultTokenList.json diff --git a/src/background/fclConfig.ts b/apps/extension/src/core/utils/fclConfig.ts similarity index 94% rename from src/background/fclConfig.ts rename to apps/extension/src/core/utils/fclConfig.ts index 1b0ecb692..7c4660747 100644 --- a/src/background/fclConfig.ts +++ b/apps/extension/src/core/utils/fclConfig.ts @@ -1,6 +1,6 @@ import * as fcl from '@onflow/fcl'; -import { isValidNetwork, type FlowNetwork } from '../shared/types/network-types'; +import { isValidNetwork, type FlowNetwork } from '@onflow/flow-wallet-shared/types/network-types'; const HOST_TESTNET = 'https://rest-testnet.onflow.org'; const HOST_MAINNET = 'https://rest-mainnet.onflow.org'; diff --git a/src/background/utils/firebaseConfig.ts b/apps/extension/src/core/utils/firebaseConfig.ts similarity index 100% rename from src/background/utils/firebaseConfig.ts rename to apps/extension/src/core/utils/firebaseConfig.ts diff --git a/src/background/utils/getLoggedInAccount.ts b/apps/extension/src/core/utils/getLoggedInAccount.ts similarity index 78% rename from src/background/utils/getLoggedInAccount.ts rename to apps/extension/src/core/utils/getLoggedInAccount.ts index 63cdeac1b..efa41dcc1 100644 --- a/src/background/utils/getLoggedInAccount.ts +++ b/apps/extension/src/core/utils/getLoggedInAccount.ts @@ -1,6 +1,7 @@ -import { storage } from '@/background/webapi'; -import { type LoggedInAccount } from '@/shared/types/wallet-types'; -import { getCurrentProfileId } from '@/shared/utils/current-id'; +import { type LoggedInAccount } from '@onflow/flow-wallet-shared/types/wallet-types'; + +import { getCurrentProfileId } from '@/extension-shared/utils/current-id'; +import storage from '@/extension-shared/utils/storage'; export const getLoggedInAccount = async (): Promise => { // Note that currentAccountIndex is only used in keyring for old accounts that don't have an id stored in the keyring diff --git a/src/background/utils/index.ts b/apps/extension/src/core/utils/index.ts similarity index 81% rename from src/background/utils/index.ts rename to apps/extension/src/core/utils/index.ts index 33daa4d35..ab333b1fc 100644 --- a/src/background/utils/index.ts +++ b/apps/extension/src/core/utils/index.ts @@ -1,13 +1,10 @@ import type { Account as FclAccount } from '@onflow/typedefs'; import * as ethUtil from 'ethereumjs-util'; -import { EMULATOR_HOST_TESTNET, EMULATOR_HOST_MAINNET } from '@/background/fclConfig'; -import pageStateCache from '@/background/service/pageStateCache'; -import { type FlowNetwork } from '@/shared/types/network-types'; -import { consoleError } from '@/shared/utils/console-log'; +import { type FlowNetwork } from '@onflow/flow-wallet-shared/types/network-types'; +import { consoleError } from '@onflow/flow-wallet-shared/utils/console-log'; -export { default as createPersistStore } from './persisitStore'; -export { default as createSessionStore } from './sessionStore'; +import { EMULATOR_HOST_MAINNET, EMULATOR_HOST_TESTNET } from '@/core/utils/fclConfig'; // {a:{b: string}} => {1: 'a.b'} // later same [source] value will override [result] key generated before @@ -40,8 +37,8 @@ export const underline2Camelcase = (str: string) => { return str.replace(/_(.)/g, (m, p1) => p1.toUpperCase()); }; -export { retrieveValuePath }; export { default as PromiseFlow } from './promiseFlow'; +export { retrieveValuePath }; export function normalizeAddress(input: number | string): string { if (!input) { @@ -71,27 +68,6 @@ export const wait = (fn: () => void, ms = 1000) => { }); }; -export const setPageStateCacheWhenPopupClose = (data) => { - const cache = pageStateCache.get(); - if (cache && cache.path === '/import/wallet-connect') { - pageStateCache.set({ - ...cache, - states: { - ...cache.states, - data, - }, - }); - } -}; - -export const hasWalletConnectPageStateCache = () => { - const cache = pageStateCache.get(); - if (cache && cache.path === '/import/wallet-connect') { - return true; - } - return false; -}; - export const isSameAddress = (a: string, b: string) => { return a.toLowerCase() === b.toLowerCase(); }; diff --git a/src/background/utils/modules/CborSimpleDecoder.ts b/apps/extension/src/core/utils/modules/CborSimpleDecoder.ts similarity index 100% rename from src/background/utils/modules/CborSimpleDecoder.ts rename to apps/extension/src/core/utils/modules/CborSimpleDecoder.ts diff --git a/src/background/utils/modules/Crypto.ts b/apps/extension/src/core/utils/modules/Crypto.ts similarity index 100% rename from src/background/utils/modules/Crypto.ts rename to apps/extension/src/core/utils/modules/Crypto.ts diff --git a/src/background/utils/modules/Signature.ts b/apps/extension/src/core/utils/modules/Signature.ts similarity index 100% rename from src/background/utils/modules/Signature.ts rename to apps/extension/src/core/utils/modules/Signature.ts diff --git a/src/background/utils/modules/WebAuthnDecoder.ts b/apps/extension/src/core/utils/modules/WebAuthnDecoder.ts similarity index 100% rename from src/background/utils/modules/WebAuthnDecoder.ts rename to apps/extension/src/core/utils/modules/WebAuthnDecoder.ts diff --git a/src/background/utils/modules/WebAuthnTypes.ts b/apps/extension/src/core/utils/modules/WebAuthnTypes.ts similarity index 100% rename from src/background/utils/modules/WebAuthnTypes.ts rename to apps/extension/src/core/utils/modules/WebAuthnTypes.ts diff --git a/src/background/utils/modules/__tests__/find-address-with-pk.test.ts b/apps/extension/src/core/utils/modules/__tests__/find-address-with-pk.test.ts similarity index 96% rename from src/background/utils/modules/__tests__/find-address-with-pk.test.ts rename to apps/extension/src/core/utils/modules/__tests__/find-address-with-pk.test.ts index f677a5026..459a5c556 100644 --- a/src/background/utils/modules/__tests__/find-address-with-pk.test.ts +++ b/apps/extension/src/core/utils/modules/__tests__/find-address-with-pk.test.ts @@ -1,11 +1,10 @@ -import { describe, it, expect, vi, beforeEach } from 'vitest'; +import { beforeEach, describe, expect, it, vi } from 'vitest'; -import { mixpanelTrack } from '@/background/service'; import { FLOW_BIP44_PATH, HASH_ALGO_NUM_SHA3_256, SIGN_ALGO_NUM_ECDSA_P256, -} from '@/shared/utils/algo-constants'; +} from '@onflow/flow-wallet-shared/constant/algo-constants'; import { findAddressWithPK, findAddressWithSeed } from '../findAddressWithPK'; import * as findAddressWithPubKeyModule from '../findAddressWithPubKey'; @@ -14,7 +13,7 @@ import * as publicPrivateKeyModule from '../publicPrivateKey'; // Mock the dependent modules vi.mock('../publicPrivateKey'); vi.mock('../findAddressWithPubKey'); -vi.mock('@/background/service', () => ({ +vi.mock('@/core/service', () => ({ userWalletService: { setupFcl: vi.fn(), }, diff --git a/src/background/utils/modules/__tests__/find-address-with-pub-key.test.ts b/apps/extension/src/core/utils/modules/__tests__/find-address-with-pub-key.test.ts similarity index 97% rename from src/background/utils/modules/__tests__/find-address-with-pub-key.test.ts rename to apps/extension/src/core/utils/modules/__tests__/find-address-with-pub-key.test.ts index 44adab0e6..f207576c6 100644 --- a/src/background/utils/modules/__tests__/find-address-with-pub-key.test.ts +++ b/apps/extension/src/core/utils/modules/__tests__/find-address-with-pub-key.test.ts @@ -1,23 +1,24 @@ import * as fcl from '@onflow/fcl'; -import { describe, it, expect, vi, beforeEach } from 'vitest'; +import { beforeEach, describe, expect, it, vi } from 'vitest'; -import openapiService from '@/background/service/openapi'; import { HASH_ALGO_NUM_SHA2_256, HASH_ALGO_NUM_SHA3_256, SIGN_ALGO_NUM_ECDSA_P256, SIGN_ALGO_NUM_ECDSA_secp256k1, -} from '@/shared/utils/algo-constants'; +} from '@onflow/flow-wallet-shared/constant/algo-constants'; + +import openapiService from '@/core/service/openapi'; import { - getOrCheckAccountsWithPublicKey, - getOrCheckAccountsByPublicKeyTuple, getAccountsByPublicKeyTuple, + getOrCheckAccountsByPublicKeyTuple, + getOrCheckAccountsWithPublicKey, } from '../findAddressWithPubKey'; // Mock FCL and userWalletService vi.mock('@onflow/fcl'); -vi.mock('@/background/service/userWallet', () => ({ +vi.mock('@/core/service/userWallet', () => ({ default: { setupFcl: vi.fn(), getNetwork: vi.fn().mockResolvedValue('testnet'), @@ -25,7 +26,7 @@ vi.mock('@/background/service/userWallet', () => ({ })); // Add the openapi service mock -vi.mock('@/background/service/openapi', () => ({ +vi.mock('@/core/service/openapi', () => ({ default: { getFeatureFlag: vi.fn().mockResolvedValue(false), getAccountsWithPublicKey: vi.fn().mockResolvedValue([]), diff --git a/src/background/utils/modules/base64.ts b/apps/extension/src/core/utils/modules/base64.ts similarity index 100% rename from src/background/utils/modules/base64.ts rename to apps/extension/src/core/utils/modules/base64.ts diff --git a/src/background/utils/modules/findAddressWithPK.ts b/apps/extension/src/core/utils/modules/findAddressWithPK.ts similarity index 79% rename from src/background/utils/modules/findAddressWithPK.ts rename to apps/extension/src/core/utils/modules/findAddressWithPK.ts index 37a12efcf..780f115a1 100644 --- a/src/background/utils/modules/findAddressWithPK.ts +++ b/apps/extension/src/core/utils/modules/findAddressWithPK.ts @@ -1,7 +1,7 @@ -import { type PublicPrivateKeyTuple } from '@/shared/types/key-types'; -import { type AccountKeyRequest, type AccountKey } from '@/shared/types/network-types'; -import { type PublicKeyAccount } from '@/shared/types/wallet-types'; -import { FLOW_BIP44_PATH } from '@/shared/utils/algo-constants'; +import { FLOW_BIP44_PATH } from '@onflow/flow-wallet-shared/constant/algo-constants'; +import { type PublicPrivateKeyTuple } from '@onflow/flow-wallet-shared/types/key-types'; +import { type AccountKeyRequest } from '@onflow/flow-wallet-shared/types/network-types'; +import { type PublicKeyAccount } from '@onflow/flow-wallet-shared/types/wallet-types'; import { accountKeyRequestForAccount, diff --git a/src/background/utils/modules/findAddressWithPubKey.ts b/apps/extension/src/core/utils/modules/findAddressWithPubKey.ts similarity index 91% rename from src/background/utils/modules/findAddressWithPubKey.ts rename to apps/extension/src/core/utils/modules/findAddressWithPubKey.ts index e36f33d89..a6251c4a1 100644 --- a/src/background/utils/modules/findAddressWithPubKey.ts +++ b/apps/extension/src/core/utils/modules/findAddressWithPubKey.ts @@ -1,11 +1,12 @@ import * as fcl from '@onflow/fcl'; import { type AccountKey } from '@onflow/typedefs'; -import openapiService from '@/background/service/openapi'; -import userWalletService from '@/background/service/userWallet'; -import type { PublicKeyTuple } from '@/shared/types/key-types'; -import { type AccountKeyRequest } from '@/shared/types/network-types'; -import { type PublicKeyAccount } from '@/shared/types/wallet-types'; +import type { PublicKeyTuple } from '@onflow/flow-wallet-shared/types/key-types'; +import { type AccountKeyRequest } from '@onflow/flow-wallet-shared/types/network-types'; +import { type PublicKeyAccount } from '@onflow/flow-wallet-shared/types/wallet-types'; + +import openapiService from '@/core/service/openapi'; +import userWalletService from '@/core/service/userWallet'; /** * Get accounts with public key tuple diff --git a/src/background/utils/modules/passkey.ts b/apps/extension/src/core/utils/modules/passkey.ts similarity index 98% rename from src/background/utils/modules/passkey.ts rename to apps/extension/src/core/utils/modules/passkey.ts index 33be1e0f6..1ed0e87a2 100644 --- a/src/background/utils/modules/passkey.ts +++ b/apps/extension/src/core/utils/modules/passkey.ts @@ -5,14 +5,14 @@ import { HASH_ALGO, KEY_TYPE, SIGN_ALGO, -} from '../../../shared/utils/algo-constants'; +} from '@onflow/flow-wallet-shared/constant/algo-constants'; import { decodeArray } from './base64'; import { addCredential, readSettings } from './settings'; import { + decodeAttestationObject, decodeAuthenticatorData, decodeClientDataJSON, - decodeAttestationObject, } from './WebAuthnDecoder'; function getRandomBytes(length) { diff --git a/src/background/utils/modules/publicPrivateKey.ts b/apps/extension/src/core/utils/modules/publicPrivateKey.ts similarity index 96% rename from src/background/utils/modules/publicPrivateKey.ts rename to apps/extension/src/core/utils/modules/publicPrivateKey.ts index 29752bffa..ae1d91cc4 100644 --- a/src/background/utils/modules/publicPrivateKey.ts +++ b/apps/extension/src/core/utils/modules/publicPrivateKey.ts @@ -1,21 +1,21 @@ import { initWasm } from '@trustwallet/wallet-core'; -import { - type PublicPrivateKeyTuple, - type PublicKeyTuple, - type PrivateKeyTuple, -} from '@/shared/types/key-types'; -import { CURRENT_ID_KEY } from '@/shared/types/keyring-types'; -import { consoleError } from '@/shared/utils/console-log'; - import { FLOW_BIP44_PATH, + HASH_ALGO_NUM_SHA2_256, HASH_ALGO_NUM_SHA3_256, SIGN_ALGO_NUM_ECDSA_P256, SIGN_ALGO_NUM_ECDSA_secp256k1, - HASH_ALGO_NUM_SHA2_256, -} from '../../../shared/utils/algo-constants'; -import storage from '../../../shared/utils/storage'; +} from '@onflow/flow-wallet-shared/constant/algo-constants'; +import { + type PrivateKeyTuple, + type PublicKeyTuple, + type PublicPrivateKeyTuple, +} from '@onflow/flow-wallet-shared/types/key-types'; +import { CURRENT_ID_KEY } from '@onflow/flow-wallet-shared/types/keyring-types'; +import { consoleError } from '@onflow/flow-wallet-shared/utils/console-log'; + +import storage from '@/extension-shared/utils/storage'; const jsonToKey = async (json: string, password: string) => { try { @@ -304,16 +304,16 @@ const verifySignature = async (signature: string, message: unknown) => { }; export { + formPubKey, + formPubKeyTuple, + getPublicKeyFromPrivateKey, jsonToKey, pk2PubKey as pk2PubKeyTuple, - getPublicKeyFromPrivateKey, pkTuple2PubKeyTuple as pkTuple2PubKey, seed2PublicPrivateKey_depreciated as seed2PublicPrivateKey, - signMessageHash, - signWithKey, seed2PublicPrivateKeyTemp, seedWithPathAndPhrase2PublicPrivateKey, - formPubKey, - formPubKeyTuple, + signMessageHash, + signWithKey, verifySignature, }; diff --git a/src/background/utils/modules/settings.ts b/apps/extension/src/core/utils/modules/settings.ts similarity index 93% rename from src/background/utils/modules/settings.ts rename to apps/extension/src/core/utils/modules/settings.ts index 9245e55d1..33af9e4b4 100644 --- a/src/background/utils/modules/settings.ts +++ b/apps/extension/src/core/utils/modules/settings.ts @@ -1,6 +1,6 @@ -import { consoleError } from '@/shared/utils/console-log'; +import { consoleError } from '@onflow/flow-wallet-shared/utils/console-log'; -import storage from '../../../shared/utils/storage'; +import storage from '@/extension-shared/utils/storage'; import { jsonToString } from './utils'; diff --git a/src/background/utils/modules/utils.ts b/apps/extension/src/core/utils/modules/utils.ts similarity index 100% rename from src/background/utils/modules/utils.ts rename to apps/extension/src/core/utils/modules/utils.ts diff --git a/apps/extension/src/core/utils/package-version.ts b/apps/extension/src/core/utils/package-version.ts new file mode 100644 index 000000000..5ebe65686 --- /dev/null +++ b/apps/extension/src/core/utils/package-version.ts @@ -0,0 +1,3 @@ +import packageJson from '../../../package.json'; + +export const version = packageJson.version; diff --git a/src/background/utils/persisitStore.ts b/apps/extension/src/core/utils/persistStore.ts similarity index 95% rename from src/background/utils/persisitStore.ts rename to apps/extension/src/core/utils/persistStore.ts index 49f61e99d..ebaa6d671 100644 --- a/src/background/utils/persisitStore.ts +++ b/apps/extension/src/core/utils/persistStore.ts @@ -1,4 +1,4 @@ -import { storage } from 'background/webapi'; +import storage from '@/extension-shared/utils/storage'; const persistStorage = (name: string, obj: object) => { storage.set(name, obj); diff --git a/src/background/utils/promiseFlow.ts b/apps/extension/src/core/utils/promiseFlow.ts similarity index 100% rename from src/background/utils/promiseFlow.ts rename to apps/extension/src/core/utils/promiseFlow.ts diff --git a/src/background/utils/random-id.ts b/apps/extension/src/core/utils/random-id.ts similarity index 100% rename from src/background/utils/random-id.ts rename to apps/extension/src/core/utils/random-id.ts diff --git a/src/background/utils/sessionStore.ts b/apps/extension/src/core/utils/sessionStore.ts similarity index 100% rename from src/background/utils/sessionStore.ts rename to apps/extension/src/core/utils/sessionStore.ts diff --git a/src/background/utils/setEnvironmentBadge.ts b/apps/extension/src/core/utils/setEnvironmentBadge.ts similarity index 100% rename from src/background/utils/setEnvironmentBadge.ts rename to apps/extension/src/core/utils/setEnvironmentBadge.ts diff --git a/apps/extension/src/data-model/cache-data-access.mock.ts b/apps/extension/src/data-model/cache-data-access.mock.ts new file mode 100644 index 000000000..005769802 --- /dev/null +++ b/apps/extension/src/data-model/cache-data-access.mock.ts @@ -0,0 +1,14 @@ +import { fn } from 'storybook/test'; + +import * as actual from './cache-data-access'; + +export const getCachedData = fn(actual.getCachedData).mockName('getCachedData'); + +export const addCachedDataListener = fn(actual.addCachedDataListener).mockName( + 'addCachedDataListener' +); +export const removeCachedDataListener = fn(actual.removeCachedDataListener).mockName( + 'removeCachedDataListener' +); + +export const triggerRefresh = fn(actual.triggerRefresh).mockName('triggerRefresh'); diff --git a/src/shared/utils/cache-data-access.ts b/apps/extension/src/data-model/cache-data-access.ts similarity index 92% rename from src/shared/utils/cache-data-access.ts rename to apps/extension/src/data-model/cache-data-access.ts index 2cefb3a2d..817fb95e3 100644 --- a/src/shared/utils/cache-data-access.ts +++ b/apps/extension/src/data-model/cache-data-access.ts @@ -1,8 +1,8 @@ -import storage, { type StorageChange } from '@/shared/utils/storage'; +import { consoleError } from '@onflow/flow-wallet-shared/utils/console-log'; -import { type CacheDataItem } from '../types/data-cache-types'; +import storage, { type StorageChange } from '@/extension-shared/utils/storage'; -import { consoleError } from './console-log'; +import { type CacheDataItem } from './data-cache-types'; /** * Get cached data from session storage diff --git a/src/shared/utils/cache-data-keys.ts b/apps/extension/src/data-model/cache-data-keys.ts similarity index 89% rename from src/shared/utils/cache-data-keys.ts rename to apps/extension/src/data-model/cache-data-keys.ts index 40cc13b9c..1664bc6b3 100644 --- a/src/shared/utils/cache-data-keys.ts +++ b/apps/extension/src/data-model/cache-data-keys.ts @@ -2,40 +2,37 @@ * Keys and types to access data in the UI from the background storage cache * This is the primary way to get cached data from network calls to the frontend */ -import { type TokenInfo } from '@/shared/types/token-info'; import { - type TokenFilter, - type ExtendedTokenInfo, - type EvmTokenInfo, type CadenceTokenInfo, type CustomFungibleTokenInfo, -} from '../types/coin-types'; -import { type FeatureFlags } from '../types/feature-types'; + type EvmTokenInfo, + type ExtendedTokenInfo, + type TokenFilter, +} from '@onflow/flow-wallet-shared/types/coin-types'; +import { type FeatureFlags } from '@onflow/flow-wallet-shared/types/feature-types'; import { + type AccountBalanceInfo, type NewsItem, - type NFTModelV2, type NftCollection, + type NFTModelV2, type UserInfoResponse, - type AccountBalanceInfo, -} from '../types/network-types'; +} from '@onflow/flow-wallet-shared/types/network-types'; import { - type NFTCollections, - type NFTCollectionData, - type EvmNFTIds, type EvmNFTCollectionList, -} from '../types/nft-types'; -import { type TransferItem } from '../types/transaction-types'; + type EvmNFTIds, + type NFTCollectionData, + type NFTCollections, +} from '@onflow/flow-wallet-shared/types/nft-types'; +import { type NetworkScripts } from '@onflow/flow-wallet-shared/types/script-types'; +import { type TransferItem } from '@onflow/flow-wallet-shared/types/transaction-types'; import { - type MainAccount, - type WalletAccount, type Currency, - type PendingTransaction, + type MainAccount, type PublicKeyAccount, -} from '../types/wallet-types'; +} from '@onflow/flow-wallet-shared/types/wallet-types'; import { getCachedData, triggerRefresh } from './cache-data-access'; -import { type NetworkScripts } from './script-types'; // Utiltiy function to create the refresh key for a given key function const refreshKey = (keyFunction: (...args: string[]) => string) => @@ -73,6 +70,10 @@ export type RemoteConfig = { >; }; }; + +export const walletLoadedKey = () => `wallet-loaded`; +export const walletLoadedRefreshRegex = refreshKey(walletLoadedKey); +export type WalletLoadedStore = boolean; /* * -------------------------------------------------------------------- * User level keys @@ -103,6 +104,10 @@ export const registerStatusKey = (pubKey: string) => `register-status-${pubKey}` export const registerStatusRefreshRegex = refreshKey(registerStatusKey); export type RegisterStatusStore = boolean; + +export const userMetadataKey = (pubKey: string) => `user-metadata-${pubKey}`; +export const userMetadataRefreshRegex = refreshKey(userMetadataKey); +export type UserMetadataStore = Record; /* * -------------------------------------------------------------------- * Network level keys (keyed by network & public key) @@ -141,29 +146,6 @@ export type PendingAccountCreationTransactionsStore = string[]; * -------------------------------------------------------------------- */ -// Child Accounts - the child accounts of a given main account on a given network -export const childAccountsKey = (network: string, mainAccountAddress: string) => - `child-accounts-${network}-${mainAccountAddress}`; -export const childAccountsRefreshRegex = refreshKey(childAccountsKey); - -export type ChildAccountStore = WalletAccount[]; - -export const getCachedChildAccounts = async (network: string, mainAccountAddress: string) => { - return getCachedData(childAccountsKey(network, mainAccountAddress)); -}; - -// EVM Account - the EVM account of a given main account on a given network -export const evmAccountKey = (network: string, mainAccountAddress: string) => - `evm-account-${network}-${mainAccountAddress}`; - -export const evmAccountRefreshRegex = refreshKey(evmAccountKey); - -export type EvmAccountStore = WalletAccount; - -export const getCachedEvmAccount = async (network: string, mainAccountAddress: string) => { - return getCachedData(evmAccountKey(network, mainAccountAddress)); -}; - export const accountBalanceKey = (network: string, address: string) => `account-balance-${network}-${address}`; export const accountBalanceRefreshRegex = refreshKey(accountBalanceKey); @@ -357,3 +339,5 @@ export const getCachedChildAccountFt = async ( childAccountFtKey(network, parentAddress, childAccount) ); }; + +export const childAccountDescKey = (address: string) => `childaccount-desc-${address}`; diff --git a/src/shared/types/data-cache-types.ts b/apps/extension/src/data-model/data-cache-types.ts similarity index 100% rename from src/shared/types/data-cache-types.ts rename to apps/extension/src/data-model/data-cache-types.ts diff --git a/apps/extension/src/data-model/user-data-access.mock.ts b/apps/extension/src/data-model/user-data-access.mock.ts new file mode 100644 index 000000000..ec811686e --- /dev/null +++ b/apps/extension/src/data-model/user-data-access.mock.ts @@ -0,0 +1,10 @@ +import { fn } from 'storybook/test'; + +import * as actual from './user-data-access'; + +export const getUserData = fn(actual.getUserData).mockName('getUserData'); +export const setUserData = fn(actual.setUserData).mockName('setUserData'); +export const addUserDataListener = fn(actual.addUserDataListener).mockName('addUserDataListener'); +export const removeUserDataListener = fn(actual.removeUserDataListener).mockName( + 'removeUserDataListener' +); diff --git a/src/shared/utils/user-data-access.ts b/apps/extension/src/data-model/user-data-access.ts similarity index 87% rename from src/shared/utils/user-data-access.ts rename to apps/extension/src/data-model/user-data-access.ts index 02700e167..b46bc8b08 100644 --- a/src/shared/utils/user-data-access.ts +++ b/apps/extension/src/data-model/user-data-access.ts @@ -1,4 +1,4 @@ -import storage from '@/shared/utils/storage'; +import storage from '@/extension-shared/utils/storage'; /** * Get user data from local storage @@ -19,6 +19,15 @@ export const setUserData = async (key: string, data: T) => { await storage.set(key, data); }; +/** + * Set user data in local storage + * @param key - The key to set the data to + * @param data - The data to set + */ +export const removeUserData = async (key: string) => { + await storage.remove(key); +}; + /** * Internal function to call the update callback * @param key - The key to listen for diff --git a/src/shared/utils/user-data-keys.ts b/apps/extension/src/data-model/user-data-keys.ts similarity index 86% rename from src/shared/utils/user-data-keys.ts rename to apps/extension/src/data-model/user-data-keys.ts index d3f20d514..a4b4d4416 100644 --- a/src/shared/utils/user-data-keys.ts +++ b/apps/extension/src/data-model/user-data-keys.ts @@ -2,11 +2,17 @@ * Keys and types to access persistant data in the UI from the background storage cache * Persistant data is data that is stored between sessions */ -import { type EvmCustomTokenInfo, type CustomFungibleTokenInfo } from '../types/coin-types'; -import { type FlowNetwork } from '../types/network-types'; -import { type Currency, type FlowAddress, type WalletAddress } from '../types/wallet-types'; + +import { type EvmCustomTokenInfo } from '@onflow/flow-wallet-shared/types/coin-types'; +import { type FlowNetwork } from '@onflow/flow-wallet-shared/types/network-types'; +import { + type Currency, + type FlowAddress, + type WalletAddress, +} from '@onflow/flow-wallet-shared/types/wallet-types'; import { getUserData } from './user-data-access'; + // Persistent storage keys export const userWalletsKey = 'userWalletsV2'; @@ -61,6 +67,7 @@ export const preferencesKey = 'preference'; export type PreferencesStore = { displayCurrency: Currency; + hiddenAccounts: string[]; }; export const getPreferencesData = async (): Promise => { @@ -84,3 +91,7 @@ export const getReadAndDismissedNewsData = async (): Promise< > => { return await getUserData(readAndDismissedNewsKey()); }; + +export const permissionKeyV1 = 'permission'; +export const permissionKeyV2 = 'permissionV2'; +export const permissionKey = permissionKeyV2; diff --git a/apps/extension/src/extension-shared/utils/chrome-logger.ts b/apps/extension/src/extension-shared/utils/chrome-logger.ts new file mode 100644 index 000000000..884253043 --- /dev/null +++ b/apps/extension/src/extension-shared/utils/chrome-logger.ts @@ -0,0 +1,39 @@ +import { + type ConsoleTracker, + setConsoleTracker, +} from '@onflow/flow-wallet-shared/utils/console-log'; + +const DEPLOYMENT_ENV = process.env.DEPLOYMENT_ENV; +const IS_BETA = process.env.IS_BETA === 'true'; + +const extensionId = + chrome?.runtime?.id || IS_BETA + ? 'lpgbokkinafiehohpkiccnlncmeonkfc' + : DEPLOYMENT_ENV === 'production' + ? 'hpclkefagolihohboafpheddmmgdffjm' + : 'cfiagdgiikmjgfjnlballglniejjgegi'; + +/** + * Chrome extension specific console tracker that sends messages via runtime messaging + */ +export const chromeConsoleTracker: ConsoleTracker = (type, message, stack, code) => { + try { + chrome?.runtime?.sendMessage(extensionId, { + type, + message, + stack, + code, + }); + } catch (error) { + // eslint-disable-next-line no-console + console.error('Could not track console error', error); + } +}; + +/** + * Initialize Chrome console tracking + * Call this once at extension startup + */ +export function initializeChromeLogging() { + setConsoleTracker(chromeConsoleTracker); +} diff --git a/src/shared/utils/contact-utils.ts b/apps/extension/src/extension-shared/utils/contact-utils.ts similarity index 87% rename from src/shared/utils/contact-utils.ts rename to apps/extension/src/extension-shared/utils/contact-utils.ts index 2c4aae694..0055a374b 100644 --- a/src/shared/utils/contact-utils.ts +++ b/apps/extension/src/extension-shared/utils/contact-utils.ts @@ -1,4 +1,4 @@ -import { ContactType, type Contact } from '@/shared/types/network-types'; +import { ContactType, type Contact } from '@onflow/flow-wallet-shared/types/network-types'; export const filterContacts = (keyword: string, contacts: Contact[]) => { // Look for the keyword in any of the contact properties diff --git a/src/shared/utils/current-id.ts b/apps/extension/src/extension-shared/utils/current-id.ts similarity index 74% rename from src/shared/utils/current-id.ts rename to apps/extension/src/extension-shared/utils/current-id.ts index 1a7b776ce..8d4c69211 100644 --- a/src/shared/utils/current-id.ts +++ b/apps/extension/src/extension-shared/utils/current-id.ts @@ -1,6 +1,6 @@ -import { storage } from '@/background/webapi'; +import { CURRENT_ID_KEY } from '@onflow/flow-wallet-shared/types/keyring-types'; -import { CURRENT_ID_KEY } from '../types/keyring-types'; +import storage from './storage'; export const returnCurrentProfileId = async (): Promise => { return await storage.get(CURRENT_ID_KEY); diff --git a/src/shared/utils/message/broadcastChannelMessage.ts b/apps/extension/src/extension-shared/utils/message/broadcastChannelMessage.ts similarity index 100% rename from src/shared/utils/message/broadcastChannelMessage.ts rename to apps/extension/src/extension-shared/utils/message/broadcastChannelMessage.ts diff --git a/src/eventBus.ts b/apps/extension/src/extension-shared/utils/message/eventBus.ts similarity index 100% rename from src/eventBus.ts rename to apps/extension/src/extension-shared/utils/message/eventBus.ts diff --git a/src/shared/utils/message/index.ts b/apps/extension/src/extension-shared/utils/message/index.ts similarity index 99% rename from src/shared/utils/message/index.ts rename to apps/extension/src/extension-shared/utils/message/index.ts index 643d208b5..bcc2433db 100644 --- a/src/shared/utils/message/index.ts +++ b/apps/extension/src/extension-shared/utils/message/index.ts @@ -2,9 +2,8 @@ * this script is live in content-script / dapp's page */ -import { EventEmitter } from 'events'; - import { ethErrors } from 'eth-rpc-errors'; +import { EventEmitter } from 'events'; abstract class Message extends EventEmitter { // avaiable id list diff --git a/src/shared/utils/message/portMessage.ts b/apps/extension/src/extension-shared/utils/message/portMessage.ts similarity index 94% rename from src/shared/utils/message/portMessage.ts rename to apps/extension/src/extension-shared/utils/message/portMessage.ts index c8d5923ec..19a6d215b 100644 --- a/src/shared/utils/message/portMessage.ts +++ b/apps/extension/src/extension-shared/utils/message/portMessage.ts @@ -1,6 +1,7 @@ -import { consoleError } from '../console-log'; +import { consoleError } from '@onflow/flow-wallet-shared/utils/console-log'; import Message from './index'; + class PortMessage extends Message { port: chrome.runtime.Port | null = null; diff --git a/src/shared/utils/messaging.ts b/apps/extension/src/extension-shared/utils/messaging.ts similarity index 100% rename from src/shared/utils/messaging.ts rename to apps/extension/src/extension-shared/utils/messaging.ts diff --git a/src/shared/utils/retryOperation.ts b/apps/extension/src/extension-shared/utils/retryOperation.ts similarity index 87% rename from src/shared/utils/retryOperation.ts rename to apps/extension/src/extension-shared/utils/retryOperation.ts index 6592eed7f..ec3567f05 100644 --- a/src/shared/utils/retryOperation.ts +++ b/apps/extension/src/extension-shared/utils/retryOperation.ts @@ -1,4 +1,4 @@ -import { consoleLog } from './console-log'; +import { consoleLog } from '@onflow/flow-wallet-shared/utils/console-log'; export const retryOperation = async ( operation: () => Promise, diff --git a/src/shared/utils/storage.ts b/apps/extension/src/extension-shared/utils/storage.ts similarity index 97% rename from src/shared/utils/storage.ts rename to apps/extension/src/extension-shared/utils/storage.ts index 873e501fb..d7e0fb952 100644 --- a/src/shared/utils/storage.ts +++ b/apps/extension/src/extension-shared/utils/storage.ts @@ -1,4 +1,4 @@ -import { consoleError } from './console-log'; +import { consoleError } from '@onflow/flow-wallet-shared/utils/console-log'; export type StorageChange = chrome.storage.StorageChange; export type AreaName = chrome.storage.AreaName; diff --git a/src/shared/test-data/api-test-results.ts b/apps/extension/src/extension-shared/utils/test-data/api-test-results.ts similarity index 99% rename from src/shared/test-data/api-test-results.ts rename to apps/extension/src/extension-shared/utils/test-data/api-test-results.ts index fa464c5e1..85bd43f00 100644 --- a/src/shared/test-data/api-test-results.ts +++ b/apps/extension/src/extension-shared/utils/test-data/api-test-results.ts @@ -1,6 +1,7 @@ -import { INITIAL_OPENAPI_URL, WEB_NEXT_URL } from '@/constant'; - -import { CommonParams } from './test-groups'; +import { + INITIAL_OPENAPI_URL, + WEB_NEXT_URL, +} from '@onflow/flow-wallet-shared/constant/domain-constants'; export type FetchDetail = { url: string; diff --git a/src/shared/test-data/test-groups.ts b/apps/extension/src/extension-shared/utils/test-data/test-groups.ts similarity index 99% rename from src/shared/test-data/test-groups.ts rename to apps/extension/src/extension-shared/utils/test-data/test-groups.ts index 37545892e..428e2185d 100644 --- a/src/shared/test-data/test-groups.ts +++ b/apps/extension/src/extension-shared/utils/test-data/test-groups.ts @@ -3,7 +3,7 @@ import HDWallet from 'ethereum-hdwallet'; import { HASH_ALGO_NUM_SHA2_256, SIGN_ALGO_NUM_ECDSA_secp256k1, -} from '@/ui/utils/modules/constants'; +} from '@onflow/flow-wallet-shared/constant/algo-constants'; import { type ApiTestResult, type ApiTestResults } from './api-test-results'; diff --git a/src/global.d.ts b/apps/extension/src/global.d.ts similarity index 100% rename from src/global.d.ts rename to apps/extension/src/global.d.ts diff --git a/_raw/_locales/en/messages.json b/apps/extension/src/messages.json similarity index 96% rename from _raw/_locales/en/messages.json rename to apps/extension/src/messages.json index 721e0367f..b0bb0d7ca 100644 --- a/_raw/_locales/en/messages.json +++ b/apps/extension/src/messages.json @@ -442,7 +442,20 @@ "message": "Domain creation complete" }, "STEP": { - "message": "STEP" + "message": "Step" + }, + "Step_X_of_Y": { + "message": "Step $step$ of $total$", + "placeholders": { + "step": { + "content": "$1", + "example": "2" + }, + "total": { + "content": "$2", + "example": "6" + } + } }, "No__backup__found": { "message": "No Backup found" @@ -1051,7 +1064,7 @@ "message": "Edit Linked Account" }, "Accessible": { - "message": "Accessible" + "message": "Accessible assets" }, "Collected": { "message": "Collected" @@ -1059,6 +1072,9 @@ "Hide_Empty_collection": { "message": "Hide Empty Collections" }, + "View_Empty": { + "message": "View empty" + }, "Inaccessible": { "message": "Inaccessible" }, @@ -1137,6 +1153,9 @@ "Support_Flow_Wallet_Blocto": { "message": "From Recovery Phrase, Keystore or Private Key" }, + "Import_Profile_Subtitle": { + "message": "Select from the following options to import your profile" + }, "A_crypto_wallet_on_Flow": { "message": "A crypto wallet on Flow built for" }, @@ -1535,5 +1554,32 @@ }, "Import_from_Mobile_Submit": { "message": "Get Started" + }, + "Add_Profile": { + "message": "Add new profile" + }, + "Unlink_account": { + "message": "Unlink account" + }, + "Show__in__account__sidebar": { + "message": "Show in account sidebar" + }, + "Contacts": { + "message": "Contacts" + }, + "I_already_have_an_account": { + "message": "I already have an account" + }, + "Get_Started_with_Flow_wallet": { + "message": "Get Started with Flow wallet" + }, + "Welcome_to_Flow_Wallet": { + "message": "Welcome to Flow Wallet!" + }, + "Create_an_account_to_get_started": { + "message": "Create an account to get started." + }, + "legal_text": { + "message": "By using Flow Wallet you agree to our Terms of Service and Privacy Policy" } } diff --git a/src/modules.ts b/apps/extension/src/modules.ts similarity index 100% rename from src/modules.ts rename to apps/extension/src/modules.ts diff --git a/src/stories/Configure.mdx b/apps/extension/src/stories/Configure.mdx similarity index 100% rename from src/stories/Configure.mdx rename to apps/extension/src/stories/Configure.mdx diff --git a/src/stories/assets/accessibility.png b/apps/extension/src/stories/assets/accessibility.png similarity index 100% rename from src/stories/assets/accessibility.png rename to apps/extension/src/stories/assets/accessibility.png diff --git a/src/stories/assets/accessibility.svg b/apps/extension/src/stories/assets/accessibility.svg similarity index 100% rename from src/stories/assets/accessibility.svg rename to apps/extension/src/stories/assets/accessibility.svg diff --git a/src/stories/assets/addon-library.png b/apps/extension/src/stories/assets/addon-library.png similarity index 100% rename from src/stories/assets/addon-library.png rename to apps/extension/src/stories/assets/addon-library.png diff --git a/src/stories/assets/assets.png b/apps/extension/src/stories/assets/assets.png similarity index 100% rename from src/stories/assets/assets.png rename to apps/extension/src/stories/assets/assets.png diff --git a/src/stories/assets/avif-test-image.avif b/apps/extension/src/stories/assets/avif-test-image.avif similarity index 100% rename from src/stories/assets/avif-test-image.avif rename to apps/extension/src/stories/assets/avif-test-image.avif diff --git a/src/stories/assets/context.png b/apps/extension/src/stories/assets/context.png similarity index 100% rename from src/stories/assets/context.png rename to apps/extension/src/stories/assets/context.png diff --git a/src/stories/assets/discord.svg b/apps/extension/src/stories/assets/discord.svg similarity index 100% rename from src/stories/assets/discord.svg rename to apps/extension/src/stories/assets/discord.svg diff --git a/src/stories/assets/docs.png b/apps/extension/src/stories/assets/docs.png similarity index 100% rename from src/stories/assets/docs.png rename to apps/extension/src/stories/assets/docs.png diff --git a/src/stories/assets/figma-plugin.png b/apps/extension/src/stories/assets/figma-plugin.png similarity index 100% rename from src/stories/assets/figma-plugin.png rename to apps/extension/src/stories/assets/figma-plugin.png diff --git a/src/stories/assets/github.svg b/apps/extension/src/stories/assets/github.svg similarity index 100% rename from src/stories/assets/github.svg rename to apps/extension/src/stories/assets/github.svg diff --git a/src/stories/assets/share.png b/apps/extension/src/stories/assets/share.png similarity index 100% rename from src/stories/assets/share.png rename to apps/extension/src/stories/assets/share.png diff --git a/src/stories/assets/styling.png b/apps/extension/src/stories/assets/styling.png similarity index 100% rename from src/stories/assets/styling.png rename to apps/extension/src/stories/assets/styling.png diff --git a/src/stories/assets/testing.png b/apps/extension/src/stories/assets/testing.png similarity index 100% rename from src/stories/assets/testing.png rename to apps/extension/src/stories/assets/testing.png diff --git a/src/stories/assets/theming.png b/apps/extension/src/stories/assets/theming.png similarity index 100% rename from src/stories/assets/theming.png rename to apps/extension/src/stories/assets/theming.png diff --git a/src/stories/assets/tutorials.svg b/apps/extension/src/stories/assets/tutorials.svg similarity index 100% rename from src/stories/assets/tutorials.svg rename to apps/extension/src/stories/assets/tutorials.svg diff --git a/src/stories/assets/youtube.svg b/apps/extension/src/stories/assets/youtube.svg similarity index 100% rename from src/stories/assets/youtube.svg rename to apps/extension/src/stories/assets/youtube.svg diff --git a/apps/extension/src/stories/preference-hooks.mock.ts b/apps/extension/src/stories/preference-hooks.mock.ts new file mode 100644 index 000000000..3546a0647 --- /dev/null +++ b/apps/extension/src/stories/preference-hooks.mock.ts @@ -0,0 +1,28 @@ +// Mock for preference-hooks that doesn't use Chrome APIs +import { DEFAULT_CURRENCY } from '@onflow/flow-wallet-shared/types/wallet-types'; + +export const useCurrency = () => { + return DEFAULT_CURRENCY; +}; + +export const useSupportedCurrencies = () => { + return { + currencies: [ + { code: 'USD', name: 'US Dollar', symbol: '$' }, + { code: 'EUR', name: 'Euro', symbol: '€' }, + { code: 'JPY', name: 'Japanese Yen', symbol: '¥' }, + ], + }; +}; + +export const useHiddenAddresses = () => { + return []; +}; + +export const useAddressHidden = (address: string) => { + return false; +}; + +export const toggleAddressHidden = async (address: string) => { + return false; +}; diff --git a/src/ui/assets/addAddress.png b/apps/extension/src/ui/assets/addAddress.png similarity index 100% rename from src/ui/assets/addAddress.png rename to apps/extension/src/ui/assets/addAddress.png diff --git a/src/ui/assets/addchain.png b/apps/extension/src/ui/assets/addchain.png similarity index 100% rename from src/ui/assets/addchain.png rename to apps/extension/src/ui/assets/addchain.png diff --git a/src/ui/assets/address-copy.png b/apps/extension/src/ui/assets/address-copy.png similarity index 100% rename from src/ui/assets/address-copy.png rename to apps/extension/src/ui/assets/address-copy.png diff --git a/src/ui/assets/address-management.svg b/apps/extension/src/ui/assets/address-management.svg similarity index 100% rename from src/ui/assets/address-management.svg rename to apps/extension/src/ui/assets/address-management.svg diff --git a/src/ui/assets/addtoken.png b/apps/extension/src/ui/assets/addtoken.png similarity index 100% rename from src/ui/assets/addtoken.png rename to apps/extension/src/ui/assets/addtoken.png diff --git a/src/ui/assets/addtokenplus.png b/apps/extension/src/ui/assets/addtokenplus.png similarity index 100% rename from src/ui/assets/addtokenplus.png rename to apps/extension/src/ui/assets/addtokenplus.png diff --git a/src/ui/assets/advance-option.svg b/apps/extension/src/ui/assets/advance-option.svg similarity index 100% rename from src/ui/assets/advance-option.svg rename to apps/extension/src/ui/assets/advance-option.svg diff --git a/src/ui/assets/alert.svg b/apps/extension/src/ui/assets/alert.svg similarity index 100% rename from src/ui/assets/alert.svg rename to apps/extension/src/ui/assets/alert.svg diff --git a/src/ui/assets/all-sites.svg b/apps/extension/src/ui/assets/all-sites.svg similarity index 100% rename from src/ui/assets/all-sites.svg rename to apps/extension/src/ui/assets/all-sites.svg diff --git a/src/ui/assets/alternate-email.svg b/apps/extension/src/ui/assets/alternate-email.svg similarity index 100% rename from src/ui/assets/alternate-email.svg rename to apps/extension/src/ui/assets/alternate-email.svg diff --git a/src/ui/assets/arrow-container-body.svg b/apps/extension/src/ui/assets/arrow-container-body.svg similarity index 100% rename from src/ui/assets/arrow-container-body.svg rename to apps/extension/src/ui/assets/arrow-container-body.svg diff --git a/src/ui/assets/arrow-container-header.svg b/apps/extension/src/ui/assets/arrow-container-header.svg similarity index 100% rename from src/ui/assets/arrow-container-header.svg rename to apps/extension/src/ui/assets/arrow-container-header.svg diff --git a/src/ui/assets/arrow-down-circle.svg b/apps/extension/src/ui/assets/arrow-down-circle.svg similarity index 100% rename from src/ui/assets/arrow-down-circle.svg rename to apps/extension/src/ui/assets/arrow-down-circle.svg diff --git a/src/ui/assets/arrow-down-gray.svg b/apps/extension/src/ui/assets/arrow-down-gray.svg similarity index 100% rename from src/ui/assets/arrow-down-gray.svg rename to apps/extension/src/ui/assets/arrow-down-gray.svg diff --git a/src/ui/assets/arrow-down-triangle.svg b/apps/extension/src/ui/assets/arrow-down-triangle.svg similarity index 100% rename from src/ui/assets/arrow-down-triangle.svg rename to apps/extension/src/ui/assets/arrow-down-triangle.svg diff --git a/src/ui/assets/arrow-down-white.svg b/apps/extension/src/ui/assets/arrow-down-white.svg similarity index 100% rename from src/ui/assets/arrow-down-white.svg rename to apps/extension/src/ui/assets/arrow-down-white.svg diff --git a/src/ui/assets/arrow-down.svg b/apps/extension/src/ui/assets/arrow-down.svg similarity index 100% rename from src/ui/assets/arrow-down.svg rename to apps/extension/src/ui/assets/arrow-down.svg diff --git a/src/ui/assets/arrow-left-circle.svg b/apps/extension/src/ui/assets/arrow-left-circle.svg similarity index 100% rename from src/ui/assets/arrow-left-circle.svg rename to apps/extension/src/ui/assets/arrow-left-circle.svg diff --git a/src/ui/assets/arrow-right-gray.svg b/apps/extension/src/ui/assets/arrow-right-gray.svg similarity index 100% rename from src/ui/assets/arrow-right-gray.svg rename to apps/extension/src/ui/assets/arrow-right-gray.svg diff --git a/src/ui/assets/arrow-right.svg b/apps/extension/src/ui/assets/arrow-right.svg similarity index 100% rename from src/ui/assets/arrow-right.svg rename to apps/extension/src/ui/assets/arrow-right.svg diff --git a/src/ui/assets/back-button.svg b/apps/extension/src/ui/assets/back-button.svg similarity index 100% rename from src/ui/assets/back-button.svg rename to apps/extension/src/ui/assets/back-button.svg diff --git a/src/ui/assets/back.svg b/apps/extension/src/ui/assets/back.svg similarity index 100% rename from src/ui/assets/back.svg rename to apps/extension/src/ui/assets/back.svg diff --git a/src/ui/assets/bg-watchtrade.png b/apps/extension/src/ui/assets/bg-watchtrade.png similarity index 100% rename from src/ui/assets/bg-watchtrade.png rename to apps/extension/src/ui/assets/bg-watchtrade.png diff --git a/src/ui/assets/big-arrow-down.svg b/apps/extension/src/ui/assets/big-arrow-down.svg similarity index 100% rename from src/ui/assets/big-arrow-down.svg rename to apps/extension/src/ui/assets/big-arrow-down.svg diff --git a/src/ui/assets/bookmark.svg b/apps/extension/src/ui/assets/bookmark.svg similarity index 100% rename from src/ui/assets/bookmark.svg rename to apps/extension/src/ui/assets/bookmark.svg diff --git a/src/ui/assets/bridgechange.svg b/apps/extension/src/ui/assets/bridgechange.svg similarity index 100% rename from src/ui/assets/bridgechange.svg rename to apps/extension/src/ui/assets/bridgechange.svg diff --git a/src/ui/assets/cancel-tx.svg b/apps/extension/src/ui/assets/cancel-tx.svg similarity index 100% rename from src/ui/assets/cancel-tx.svg rename to apps/extension/src/ui/assets/cancel-tx.svg diff --git a/src/ui/assets/cancel.svg b/apps/extension/src/ui/assets/cancel.svg similarity index 100% rename from src/ui/assets/cancel.svg rename to apps/extension/src/ui/assets/cancel.svg diff --git a/src/ui/assets/chain-delete.png b/apps/extension/src/ui/assets/chain-delete.png similarity index 100% rename from src/ui/assets/chain-delete.png rename to apps/extension/src/ui/assets/chain-delete.png diff --git a/src/ui/assets/chain-management.svg b/apps/extension/src/ui/assets/chain-management.svg similarity index 100% rename from src/ui/assets/chain-management.svg rename to apps/extension/src/ui/assets/chain-management.svg diff --git a/src/ui/assets/chain-more.svg b/apps/extension/src/ui/assets/chain-more.svg similarity index 100% rename from src/ui/assets/chain-more.svg rename to apps/extension/src/ui/assets/chain-more.svg diff --git a/src/ui/assets/check.svg b/apps/extension/src/ui/assets/check.svg similarity index 100% rename from src/ui/assets/check.svg rename to apps/extension/src/ui/assets/check.svg diff --git a/src/ui/assets/checked-1.svg b/apps/extension/src/ui/assets/checked-1.svg similarity index 100% rename from src/ui/assets/checked-1.svg rename to apps/extension/src/ui/assets/checked-1.svg diff --git a/src/ui/assets/checked.svg b/apps/extension/src/ui/assets/checked.svg similarity index 100% rename from src/ui/assets/checked.svg rename to apps/extension/src/ui/assets/checked.svg diff --git a/src/ui/assets/clear.svg b/apps/extension/src/ui/assets/clear.svg similarity index 100% rename from src/ui/assets/clear.svg rename to apps/extension/src/ui/assets/clear.svg diff --git a/src/ui/assets/close.svg b/apps/extension/src/ui/assets/close.svg similarity index 100% rename from src/ui/assets/close.svg rename to apps/extension/src/ui/assets/close.svg diff --git a/src/ui/assets/closex.svg b/apps/extension/src/ui/assets/closex.svg similarity index 100% rename from src/ui/assets/closex.svg rename to apps/extension/src/ui/assets/closex.svg diff --git a/src/ui/assets/connect-hardware.svg b/apps/extension/src/ui/assets/connect-hardware.svg similarity index 100% rename from src/ui/assets/connect-hardware.svg rename to apps/extension/src/ui/assets/connect-hardware.svg diff --git a/src/ui/assets/connect-sites-management.svg b/apps/extension/src/ui/assets/connect-sites-management.svg similarity index 100% rename from src/ui/assets/connect-sites-management.svg rename to apps/extension/src/ui/assets/connect-sites-management.svg diff --git a/src/ui/assets/contact.svg b/apps/extension/src/ui/assets/contact.svg similarity index 100% rename from src/ui/assets/contact.svg rename to apps/extension/src/ui/assets/contact.svg diff --git a/src/ui/assets/copy-no-border.svg b/apps/extension/src/ui/assets/copy-no-border.svg similarity index 100% rename from src/ui/assets/copy-no-border.svg rename to apps/extension/src/ui/assets/copy-no-border.svg diff --git a/src/ui/assets/copy.svg b/apps/extension/src/ui/assets/copy.svg similarity index 100% rename from src/ui/assets/copy.svg rename to apps/extension/src/ui/assets/copy.svg diff --git a/src/ui/assets/correct.svg b/apps/extension/src/ui/assets/correct.svg similarity index 100% rename from src/ui/assets/correct.svg rename to apps/extension/src/ui/assets/correct.svg diff --git a/src/ui/assets/create.svg b/apps/extension/src/ui/assets/create.svg similarity index 100% rename from src/ui/assets/create.svg rename to apps/extension/src/ui/assets/create.svg diff --git a/src/ui/assets/cross.svg b/apps/extension/src/ui/assets/cross.svg similarity index 100% rename from src/ui/assets/cross.svg rename to apps/extension/src/ui/assets/cross.svg diff --git a/src/ui/assets/danger.svg b/apps/extension/src/ui/assets/danger.svg similarity index 100% rename from src/ui/assets/danger.svg rename to apps/extension/src/ui/assets/danger.svg diff --git a/src/ui/assets/dashboard-plus.svg b/apps/extension/src/ui/assets/dashboard-plus.svg similarity index 100% rename from src/ui/assets/dashboard-plus.svg rename to apps/extension/src/ui/assets/dashboard-plus.svg diff --git a/src/ui/assets/dashboard/contacts.png b/apps/extension/src/ui/assets/dashboard/contacts.png similarity index 100% rename from src/ui/assets/dashboard/contacts.png rename to apps/extension/src/ui/assets/dashboard/contacts.png diff --git a/src/ui/assets/dashboard/eth.png b/apps/extension/src/ui/assets/dashboard/eth.png similarity index 100% rename from src/ui/assets/dashboard/eth.png rename to apps/extension/src/ui/assets/dashboard/eth.png diff --git a/src/ui/assets/dashboard/gas.svg b/apps/extension/src/ui/assets/dashboard/gas.svg similarity index 100% rename from src/ui/assets/dashboard/gas.svg rename to apps/extension/src/ui/assets/dashboard/gas.svg diff --git a/src/ui/assets/dashboard/hover-tokenlistsend.png b/apps/extension/src/ui/assets/dashboard/hover-tokenlistsend.png similarity index 100% rename from src/ui/assets/dashboard/hover-tokenlistsend.png rename to apps/extension/src/ui/assets/dashboard/hover-tokenlistsend.png diff --git a/src/ui/assets/dashboard/leftcorner.svg b/apps/extension/src/ui/assets/dashboard/leftcorner.svg similarity index 100% rename from src/ui/assets/dashboard/leftcorner.svg rename to apps/extension/src/ui/assets/dashboard/leftcorner.svg diff --git a/src/ui/assets/dashboard/opendefi.png b/apps/extension/src/ui/assets/dashboard/opendefi.png similarity index 100% rename from src/ui/assets/dashboard/opendefi.png rename to apps/extension/src/ui/assets/dashboard/opendefi.png diff --git a/src/ui/assets/dashboard/selectChain/arbitrum.svg b/apps/extension/src/ui/assets/dashboard/selectChain/arbitrum.svg similarity index 100% rename from src/ui/assets/dashboard/selectChain/arbitrum.svg rename to apps/extension/src/ui/assets/dashboard/selectChain/arbitrum.svg diff --git a/src/ui/assets/dashboard/selectChain/aurora.svg b/apps/extension/src/ui/assets/dashboard/selectChain/aurora.svg similarity index 100% rename from src/ui/assets/dashboard/selectChain/aurora.svg rename to apps/extension/src/ui/assets/dashboard/selectChain/aurora.svg diff --git a/src/ui/assets/dashboard/selectChain/avalanche.svg b/apps/extension/src/ui/assets/dashboard/selectChain/avalanche.svg similarity index 100% rename from src/ui/assets/dashboard/selectChain/avalanche.svg rename to apps/extension/src/ui/assets/dashboard/selectChain/avalanche.svg diff --git a/src/ui/assets/dashboard/selectChain/boba-chain.png b/apps/extension/src/ui/assets/dashboard/selectChain/boba-chain.png similarity index 100% rename from src/ui/assets/dashboard/selectChain/boba-chain.png rename to apps/extension/src/ui/assets/dashboard/selectChain/boba-chain.png diff --git a/src/ui/assets/dashboard/selectChain/bsc.svg b/apps/extension/src/ui/assets/dashboard/selectChain/bsc.svg similarity index 100% rename from src/ui/assets/dashboard/selectChain/bsc.svg rename to apps/extension/src/ui/assets/dashboard/selectChain/bsc.svg diff --git a/src/ui/assets/dashboard/selectChain/bttc.svg b/apps/extension/src/ui/assets/dashboard/selectChain/bttc.svg similarity index 100% rename from src/ui/assets/dashboard/selectChain/bttc.svg rename to apps/extension/src/ui/assets/dashboard/selectChain/bttc.svg diff --git a/src/ui/assets/dashboard/selectChain/celo.svg b/apps/extension/src/ui/assets/dashboard/selectChain/celo.svg similarity index 100% rename from src/ui/assets/dashboard/selectChain/celo.svg rename to apps/extension/src/ui/assets/dashboard/selectChain/celo.svg diff --git a/src/ui/assets/dashboard/selectChain/cronos.svg b/apps/extension/src/ui/assets/dashboard/selectChain/cronos.svg similarity index 100% rename from src/ui/assets/dashboard/selectChain/cronos.svg rename to apps/extension/src/ui/assets/dashboard/selectChain/cronos.svg diff --git a/src/ui/assets/dashboard/selectChain/dot.png b/apps/extension/src/ui/assets/dashboard/selectChain/dot.png similarity index 100% rename from src/ui/assets/dashboard/selectChain/dot.png rename to apps/extension/src/ui/assets/dashboard/selectChain/dot.png diff --git a/src/ui/assets/dashboard/selectChain/eth.svg b/apps/extension/src/ui/assets/dashboard/selectChain/eth.svg similarity index 100% rename from src/ui/assets/dashboard/selectChain/eth.svg rename to apps/extension/src/ui/assets/dashboard/selectChain/eth.svg diff --git a/src/ui/assets/dashboard/selectChain/fantom.svg b/apps/extension/src/ui/assets/dashboard/selectChain/fantom.svg similarity index 100% rename from src/ui/assets/dashboard/selectChain/fantom.svg rename to apps/extension/src/ui/assets/dashboard/selectChain/fantom.svg diff --git a/src/ui/assets/dashboard/selectChain/gnosis.svg b/apps/extension/src/ui/assets/dashboard/selectChain/gnosis.svg similarity index 100% rename from src/ui/assets/dashboard/selectChain/gnosis.svg rename to apps/extension/src/ui/assets/dashboard/selectChain/gnosis.svg diff --git a/src/ui/assets/dashboard/selectChain/heco.svg b/apps/extension/src/ui/assets/dashboard/selectChain/heco.svg similarity index 100% rename from src/ui/assets/dashboard/selectChain/heco.svg rename to apps/extension/src/ui/assets/dashboard/selectChain/heco.svg diff --git a/src/ui/assets/dashboard/selectChain/metis.svg b/apps/extension/src/ui/assets/dashboard/selectChain/metis.svg similarity index 100% rename from src/ui/assets/dashboard/selectChain/metis.svg rename to apps/extension/src/ui/assets/dashboard/selectChain/metis.svg diff --git a/src/ui/assets/dashboard/selectChain/moonriver.svg b/apps/extension/src/ui/assets/dashboard/selectChain/moonriver.svg similarity index 100% rename from src/ui/assets/dashboard/selectChain/moonriver.svg rename to apps/extension/src/ui/assets/dashboard/selectChain/moonriver.svg diff --git a/src/ui/assets/dashboard/selectChain/okex.svg b/apps/extension/src/ui/assets/dashboard/selectChain/okex.svg similarity index 100% rename from src/ui/assets/dashboard/selectChain/okex.svg rename to apps/extension/src/ui/assets/dashboard/selectChain/okex.svg diff --git a/src/ui/assets/dashboard/selectChain/optimism.svg b/apps/extension/src/ui/assets/dashboard/selectChain/optimism.svg similarity index 100% rename from src/ui/assets/dashboard/selectChain/optimism.svg rename to apps/extension/src/ui/assets/dashboard/selectChain/optimism.svg diff --git a/src/ui/assets/dashboard/selectChain/polygon.svg b/apps/extension/src/ui/assets/dashboard/selectChain/polygon.svg similarity index 100% rename from src/ui/assets/dashboard/selectChain/polygon.svg rename to apps/extension/src/ui/assets/dashboard/selectChain/polygon.svg diff --git a/src/ui/assets/dashboard/selectChain/rightgoto.svg b/apps/extension/src/ui/assets/dashboard/selectChain/rightgoto.svg similarity index 100% rename from src/ui/assets/dashboard/selectChain/rightgoto.svg rename to apps/extension/src/ui/assets/dashboard/selectChain/rightgoto.svg diff --git a/src/ui/assets/dashboard/selectChain/xdai.svg b/apps/extension/src/ui/assets/dashboard/selectChain/xdai.svg similarity index 100% rename from src/ui/assets/dashboard/selectChain/xdai.svg rename to apps/extension/src/ui/assets/dashboard/selectChain/xdai.svg diff --git a/src/ui/assets/dashboard/sendtoken.png b/apps/extension/src/ui/assets/dashboard/sendtoken.png similarity index 100% rename from src/ui/assets/dashboard/sendtoken.png rename to apps/extension/src/ui/assets/dashboard/sendtoken.png diff --git a/src/ui/assets/dashboard/setting.png b/apps/extension/src/ui/assets/dashboard/setting.png similarity index 100% rename from src/ui/assets/dashboard/setting.png rename to apps/extension/src/ui/assets/dashboard/setting.png diff --git a/src/ui/assets/dashboard/signedtext.png b/apps/extension/src/ui/assets/dashboard/signedtext.png similarity index 100% rename from src/ui/assets/dashboard/signedtext.png rename to apps/extension/src/ui/assets/dashboard/signedtext.png diff --git a/src/ui/assets/dashboard/signedtx.png b/apps/extension/src/ui/assets/dashboard/signedtx.png similarity index 100% rename from src/ui/assets/dashboard/signedtx.png rename to apps/extension/src/ui/assets/dashboard/signedtx.png diff --git a/src/ui/assets/dashboard/tokenlistsend.png b/apps/extension/src/ui/assets/dashboard/tokenlistsend.png similarity index 100% rename from src/ui/assets/dashboard/tokenlistsend.png rename to apps/extension/src/ui/assets/dashboard/tokenlistsend.png diff --git a/src/ui/assets/dashboard/transactions.png b/apps/extension/src/ui/assets/dashboard/transactions.png similarity index 100% rename from src/ui/assets/dashboard/transactions.png rename to apps/extension/src/ui/assets/dashboard/transactions.png diff --git a/src/ui/assets/dashboardMoney.png b/apps/extension/src/ui/assets/dashboardMoney.png similarity index 100% rename from src/ui/assets/dashboardMoney.png rename to apps/extension/src/ui/assets/dashboardMoney.png diff --git a/src/ui/assets/debank.svg b/apps/extension/src/ui/assets/debank.svg similarity index 100% rename from src/ui/assets/debank.svg rename to apps/extension/src/ui/assets/debank.svg diff --git a/src/ui/assets/deploy-contract.svg b/apps/extension/src/ui/assets/deploy-contract.svg similarity index 100% rename from src/ui/assets/deploy-contract.svg rename to apps/extension/src/ui/assets/deploy-contract.svg diff --git a/src/ui/assets/drawer.png b/apps/extension/src/ui/assets/drawer.png similarity index 100% rename from src/ui/assets/drawer.png rename to apps/extension/src/ui/assets/drawer.png diff --git a/src/ui/assets/edit-purple.svg b/apps/extension/src/ui/assets/edit-purple.svg similarity index 100% rename from src/ui/assets/edit-purple.svg rename to apps/extension/src/ui/assets/edit-purple.svg diff --git a/src/ui/assets/editpen.svg b/apps/extension/src/ui/assets/editpen.svg similarity index 100% rename from src/ui/assets/editpen.svg rename to apps/extension/src/ui/assets/editpen.svg diff --git a/src/ui/assets/emptyAddress.svg b/apps/extension/src/ui/assets/emptyAddress.svg similarity index 100% rename from src/ui/assets/emptyAddress.svg rename to apps/extension/src/ui/assets/emptyAddress.svg diff --git a/src/ui/assets/enter.svg b/apps/extension/src/ui/assets/enter.svg similarity index 100% rename from src/ui/assets/enter.svg rename to apps/extension/src/ui/assets/enter.svg diff --git a/src/ui/assets/file-json.svg b/apps/extension/src/ui/assets/file-json.svg similarity index 100% rename from src/ui/assets/file-json.svg rename to apps/extension/src/ui/assets/file-json.svg diff --git a/apps/extension/src/ui/assets/flow-background.svg b/apps/extension/src/ui/assets/flow-background.svg new file mode 100644 index 000000000..3768151bd --- /dev/null +++ b/apps/extension/src/ui/assets/flow-background.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/src/ui/assets/flow.svg b/apps/extension/src/ui/assets/flow.svg similarity index 100% rename from src/ui/assets/flow.svg rename to apps/extension/src/ui/assets/flow.svg diff --git a/src/ui/assets/fonts/e-Ukraine-Bold.otf b/apps/extension/src/ui/assets/fonts/e-Ukraine-Bold.otf similarity index 100% rename from src/ui/assets/fonts/e-Ukraine-Bold.otf rename to apps/extension/src/ui/assets/fonts/e-Ukraine-Bold.otf diff --git a/src/ui/assets/fonts/e-Ukraine-Light.otf b/apps/extension/src/ui/assets/fonts/e-Ukraine-Light.otf similarity index 100% rename from src/ui/assets/fonts/e-Ukraine-Light.otf rename to apps/extension/src/ui/assets/fonts/e-Ukraine-Light.otf diff --git a/src/ui/assets/fonts/e-Ukraine-Medium.otf b/apps/extension/src/ui/assets/fonts/e-Ukraine-Medium.otf similarity index 100% rename from src/ui/assets/fonts/e-Ukraine-Medium.otf rename to apps/extension/src/ui/assets/fonts/e-Ukraine-Medium.otf diff --git a/src/ui/assets/fonts/e-Ukraine-Regular.otf b/apps/extension/src/ui/assets/fonts/e-Ukraine-Regular.otf similarity index 100% rename from src/ui/assets/fonts/e-Ukraine-Regular.otf rename to apps/extension/src/ui/assets/fonts/e-Ukraine-Regular.otf diff --git a/src/ui/assets/fonts/e-Ukraine-Thin.otf b/apps/extension/src/ui/assets/fonts/e-Ukraine-Thin.otf similarity index 100% rename from src/ui/assets/fonts/e-Ukraine-Thin.otf rename to apps/extension/src/ui/assets/fonts/e-Ukraine-Thin.otf diff --git a/src/ui/assets/fonts/e-Ukraine-UltraLight.otf b/apps/extension/src/ui/assets/fonts/e-Ukraine-UltraLight.otf similarity index 100% rename from src/ui/assets/fonts/e-Ukraine-UltraLight.otf rename to apps/extension/src/ui/assets/fonts/e-Ukraine-UltraLight.otf diff --git a/src/ui/assets/forbidden.svg b/apps/extension/src/ui/assets/forbidden.svg similarity index 100% rename from src/ui/assets/forbidden.svg rename to apps/extension/src/ui/assets/forbidden.svg diff --git a/src/ui/assets/gas.svg b/apps/extension/src/ui/assets/gas.svg similarity index 100% rename from src/ui/assets/gas.svg rename to apps/extension/src/ui/assets/gas.svg diff --git a/src/ui/assets/gobackwhite.svg b/apps/extension/src/ui/assets/gobackwhite.svg similarity index 100% rename from src/ui/assets/gobackwhite.svg rename to apps/extension/src/ui/assets/gobackwhite.svg diff --git a/src/ui/assets/group.svg b/apps/extension/src/ui/assets/group.svg similarity index 100% rename from src/ui/assets/group.svg rename to apps/extension/src/ui/assets/group.svg diff --git a/src/ui/assets/hardware-purple.svg b/apps/extension/src/ui/assets/hardware-purple.svg similarity index 100% rename from src/ui/assets/hardware-purple.svg rename to apps/extension/src/ui/assets/hardware-purple.svg diff --git a/src/ui/assets/hardware-white.svg b/apps/extension/src/ui/assets/hardware-white.svg similarity index 100% rename from src/ui/assets/hardware-white.svg rename to apps/extension/src/ui/assets/hardware-white.svg diff --git a/src/ui/assets/hint.png b/apps/extension/src/ui/assets/hint.png similarity index 100% rename from src/ui/assets/hint.png rename to apps/extension/src/ui/assets/hint.png diff --git a/src/ui/assets/history.svg b/apps/extension/src/ui/assets/history.svg similarity index 100% rename from src/ui/assets/history.svg rename to apps/extension/src/ui/assets/history.svg diff --git a/src/ui/assets/icon-bitbox02.svg b/apps/extension/src/ui/assets/icon-bitbox02.svg similarity index 100% rename from src/ui/assets/icon-bitbox02.svg rename to apps/extension/src/ui/assets/icon-bitbox02.svg diff --git a/src/ui/assets/icon-ledger.svg b/apps/extension/src/ui/assets/icon-ledger.svg similarity index 100% rename from src/ui/assets/icon-ledger.svg rename to apps/extension/src/ui/assets/icon-ledger.svg diff --git a/src/ui/assets/icon-onekey.svg b/apps/extension/src/ui/assets/icon-onekey.svg similarity index 100% rename from src/ui/assets/icon-onekey.svg rename to apps/extension/src/ui/assets/icon-onekey.svg diff --git a/src/ui/assets/icon-queue.svg b/apps/extension/src/ui/assets/icon-queue.svg similarity index 100% rename from src/ui/assets/icon-queue.svg rename to apps/extension/src/ui/assets/icon-queue.svg diff --git a/src/ui/assets/icon-setting.svg b/apps/extension/src/ui/assets/icon-setting.svg similarity index 100% rename from src/ui/assets/icon-setting.svg rename to apps/extension/src/ui/assets/icon-setting.svg diff --git a/src/ui/assets/icon-trezor.svg b/apps/extension/src/ui/assets/icon-trezor.svg similarity index 100% rename from src/ui/assets/icon-trezor.svg rename to apps/extension/src/ui/assets/icon-trezor.svg diff --git a/src/ui/assets/icon-unknown.svg b/apps/extension/src/ui/assets/icon-unknown.svg similarity index 100% rename from src/ui/assets/icon-unknown.svg rename to apps/extension/src/ui/assets/icon-unknown.svg diff --git a/src/ui/assets/icon-user.svg b/apps/extension/src/ui/assets/icon-user.svg similarity index 100% rename from src/ui/assets/icon-user.svg rename to apps/extension/src/ui/assets/icon-user.svg diff --git a/src/ui/assets/icons/CheckSquareIcon.tsx b/apps/extension/src/ui/assets/icons/CheckSquareIcon.tsx similarity index 100% rename from src/ui/assets/icons/CheckSquareIcon.tsx rename to apps/extension/src/ui/assets/icons/CheckSquareIcon.tsx diff --git a/src/ui/assets/icons/CopyIcon.tsx b/apps/extension/src/ui/assets/icons/CopyIcon.tsx similarity index 100% rename from src/ui/assets/icons/CopyIcon.tsx rename to apps/extension/src/ui/assets/icons/CopyIcon.tsx diff --git a/src/ui/assets/icons/CustomCheckboxIcons.tsx b/apps/extension/src/ui/assets/icons/CustomCheckboxIcons.tsx similarity index 100% rename from src/ui/assets/icons/CustomCheckboxIcons.tsx rename to apps/extension/src/ui/assets/icons/CustomCheckboxIcons.tsx diff --git a/src/ui/assets/icons/FlowIcon.tsx b/apps/extension/src/ui/assets/icons/FlowIcon.tsx similarity index 100% rename from src/ui/assets/icons/FlowIcon.tsx rename to apps/extension/src/ui/assets/icons/FlowIcon.tsx diff --git a/apps/extension/src/ui/assets/icons/HiddenIcon.tsx b/apps/extension/src/ui/assets/icons/HiddenIcon.tsx new file mode 100644 index 000000000..0b07efdf7 --- /dev/null +++ b/apps/extension/src/ui/assets/icons/HiddenIcon.tsx @@ -0,0 +1,30 @@ +import React from 'react'; + +const HiddenIcon = (props: React.SVGProps) => ( + + + + + + + + + + +); + +export default HiddenIcon; diff --git a/src/ui/assets/icons/IconScan.tsx b/apps/extension/src/ui/assets/icons/IconScan.tsx similarity index 100% rename from src/ui/assets/icons/IconScan.tsx rename to apps/extension/src/ui/assets/icons/IconScan.tsx diff --git a/src/ui/assets/icons/KeyIcon.tsx b/apps/extension/src/ui/assets/icons/KeyIcon.tsx similarity index 100% rename from src/ui/assets/icons/KeyIcon.tsx rename to apps/extension/src/ui/assets/icons/KeyIcon.tsx diff --git a/src/ui/assets/icons/LinkIcon.tsx b/apps/extension/src/ui/assets/icons/LinkIcon.tsx similarity index 100% rename from src/ui/assets/icons/LinkIcon.tsx rename to apps/extension/src/ui/assets/icons/LinkIcon.tsx diff --git a/src/ui/assets/icons/LockIcon.tsx b/apps/extension/src/ui/assets/icons/LockIcon.tsx similarity index 100% rename from src/ui/assets/icons/LockIcon.tsx rename to apps/extension/src/ui/assets/icons/LockIcon.tsx diff --git a/src/ui/assets/icons/QrCodeIcon.tsx b/apps/extension/src/ui/assets/icons/QrCodeIcon.tsx similarity index 100% rename from src/ui/assets/icons/QrCodeIcon.tsx rename to apps/extension/src/ui/assets/icons/QrCodeIcon.tsx diff --git a/src/ui/assets/icons/UserPlus.tsx b/apps/extension/src/ui/assets/icons/UserPlus.tsx similarity index 100% rename from src/ui/assets/icons/UserPlus.tsx rename to apps/extension/src/ui/assets/icons/UserPlus.tsx diff --git a/apps/extension/src/ui/assets/icons/settings/About.tsx b/apps/extension/src/ui/assets/icons/settings/About.tsx new file mode 100644 index 000000000..f64b9a44f --- /dev/null +++ b/apps/extension/src/ui/assets/icons/settings/About.tsx @@ -0,0 +1,29 @@ +import React from 'react'; + +export const AboutIcon = ({ + color = '#00EF8B', + width = 24, + height = 25, +}: { + color?: string; + width?: number; + height?: number; +}) => { + return ( + + + + ); +}; diff --git a/apps/extension/src/ui/assets/icons/settings/AccountList.tsx b/apps/extension/src/ui/assets/icons/settings/AccountList.tsx new file mode 100644 index 000000000..87d5b7e22 --- /dev/null +++ b/apps/extension/src/ui/assets/icons/settings/AccountList.tsx @@ -0,0 +1,34 @@ +import React from 'react'; + +export const AccountListIcon = ({ + color = '#00EF8B', + width = 29, + height = 29, +}: { + color?: string; + width?: number; + height?: number; +}) => { + return ( + + + + + + + + ); +}; diff --git a/apps/extension/src/ui/assets/icons/settings/AddProfile.tsx b/apps/extension/src/ui/assets/icons/settings/AddProfile.tsx new file mode 100644 index 000000000..937f281c6 --- /dev/null +++ b/apps/extension/src/ui/assets/icons/settings/AddProfile.tsx @@ -0,0 +1,26 @@ +import React from 'react'; + +export const AddProfileIcon = ({ + color = '#00EF8B', + width = 24, + height = 25, +}: { + color?: string; + width?: number; + height?: number; +}) => { + return ( + + + + ); +}; diff --git a/apps/extension/src/ui/assets/icons/settings/Address.tsx b/apps/extension/src/ui/assets/icons/settings/Address.tsx new file mode 100644 index 000000000..d407a5ea9 --- /dev/null +++ b/apps/extension/src/ui/assets/icons/settings/Address.tsx @@ -0,0 +1,27 @@ +import React from 'react'; + +export const AddressIcon = ({ + color = '#00EF8B', + width = 29, + height = 29, +}: { + color?: string; + width?: number; + height?: number; +}) => { + return ( + + + + ); +}; diff --git a/apps/extension/src/ui/assets/icons/settings/Backup.tsx b/apps/extension/src/ui/assets/icons/settings/Backup.tsx new file mode 100644 index 000000000..dec071d3f --- /dev/null +++ b/apps/extension/src/ui/assets/icons/settings/Backup.tsx @@ -0,0 +1,26 @@ +import React from 'react'; + +export const BackupIcon = ({ + color = '#00EF8B', + width = 24, + height = 25, +}: { + color?: string; + width?: number; + height?: number; +}) => { + return ( + + + + ); +}; diff --git a/apps/extension/src/ui/assets/icons/settings/Bug.tsx b/apps/extension/src/ui/assets/icons/settings/Bug.tsx new file mode 100644 index 000000000..09cd062cd --- /dev/null +++ b/apps/extension/src/ui/assets/icons/settings/Bug.tsx @@ -0,0 +1,26 @@ +import React from 'react'; + +export const BugIcon = ({ + color = '#00EF8B', + width = 24, + height = 25, +}: { + color?: string; + width?: number; + height?: number; +}) => { + return ( + + + + ); +}; diff --git a/apps/extension/src/ui/assets/icons/settings/Currency.tsx b/apps/extension/src/ui/assets/icons/settings/Currency.tsx new file mode 100644 index 000000000..5b539c31e --- /dev/null +++ b/apps/extension/src/ui/assets/icons/settings/Currency.tsx @@ -0,0 +1,26 @@ +import React from 'react'; + +export const CurrencyIcon = ({ + color = '#00EF8B', + width = 25, + height = 25, +}: { + color?: string; + width?: number; + height?: number; +}) => { + return ( + + + + ); +}; diff --git a/apps/extension/src/ui/assets/icons/settings/Devices.tsx b/apps/extension/src/ui/assets/icons/settings/Devices.tsx new file mode 100644 index 000000000..d76156b18 --- /dev/null +++ b/apps/extension/src/ui/assets/icons/settings/Devices.tsx @@ -0,0 +1,26 @@ +import React from 'react'; + +export const DevicesIcon = ({ + color = '#00EF8B', + width = 24, + height = 25, +}: { + color?: string; + width?: number; + height?: number; +}) => { + return ( + + + + ); +}; diff --git a/apps/extension/src/ui/assets/icons/settings/Devmode.tsx b/apps/extension/src/ui/assets/icons/settings/Devmode.tsx new file mode 100644 index 000000000..0cc6aa13b --- /dev/null +++ b/apps/extension/src/ui/assets/icons/settings/Devmode.tsx @@ -0,0 +1,29 @@ +import React from 'react'; + +export const DevmodeIcon = ({ + color = '#00EF8B', + width = 24, + height = 25, +}: { + color?: string; + width?: number; + height?: number; +}) => { + return ( + + + + ); +}; diff --git a/apps/extension/src/ui/assets/icons/settings/Edit.tsx b/apps/extension/src/ui/assets/icons/settings/Edit.tsx new file mode 100644 index 000000000..e962fd983 --- /dev/null +++ b/apps/extension/src/ui/assets/icons/settings/Edit.tsx @@ -0,0 +1,31 @@ +import React from 'react'; + +interface EditIconProps { + color?: string; + width?: number; + height?: number; +} + +export const EditIcon: React.FC = ({ + color = '#767676', + width = 24, + height = 25, +}) => { + return ( + + + + ); +}; diff --git a/apps/extension/src/ui/assets/icons/settings/Mobile.tsx b/apps/extension/src/ui/assets/icons/settings/Mobile.tsx new file mode 100644 index 000000000..f435c5b18 --- /dev/null +++ b/apps/extension/src/ui/assets/icons/settings/Mobile.tsx @@ -0,0 +1,31 @@ +import React from 'react'; + +interface MobileIconProps { + color?: string; + width?: number; + height?: number; +} + +export const MobileIcon: React.FC = ({ + color = '#00EF8B', + width = 29, + height = 29, +}) => { + return ( + + + + ); +}; diff --git a/apps/extension/src/ui/assets/icons/settings/Notifications.tsx b/apps/extension/src/ui/assets/icons/settings/Notifications.tsx new file mode 100644 index 000000000..7c00e1503 --- /dev/null +++ b/apps/extension/src/ui/assets/icons/settings/Notifications.tsx @@ -0,0 +1,26 @@ +import React from 'react'; + +export const NotificationsIcon = ({ + color = '#00EF8B', + width = 24, + height = 25, +}: { + color?: string; + width?: number; + height?: number; +}) => { + return ( + + + + ); +}; diff --git a/apps/extension/src/ui/assets/icons/settings/Security.tsx b/apps/extension/src/ui/assets/icons/settings/Security.tsx new file mode 100644 index 000000000..0cf4f0376 --- /dev/null +++ b/apps/extension/src/ui/assets/icons/settings/Security.tsx @@ -0,0 +1,26 @@ +import React from 'react'; + +export const SecurityIcon = ({ + color = '#00EF8B', + width = 24, + height = 25, +}: { + color?: string; + width?: number; + height?: number; +}) => { + return ( + + + + ); +}; diff --git a/apps/extension/src/ui/assets/icons/settings/Theme.tsx b/apps/extension/src/ui/assets/icons/settings/Theme.tsx new file mode 100644 index 000000000..91026180f --- /dev/null +++ b/apps/extension/src/ui/assets/icons/settings/Theme.tsx @@ -0,0 +1,70 @@ +import React from 'react'; + +export const ThemeIcon = ({ + color = '#00EF8B', + width = 29, + height = 28, +}: { + color?: string; + width?: number; + height?: number; +}) => { + return ( + + + + + + + + + + + ); +}; diff --git a/apps/extension/src/ui/assets/icons/settings/WalletConnect.tsx b/apps/extension/src/ui/assets/icons/settings/WalletConnect.tsx new file mode 100644 index 000000000..447c0642d --- /dev/null +++ b/apps/extension/src/ui/assets/icons/settings/WalletConnect.tsx @@ -0,0 +1,27 @@ +import React from 'react'; + +export const WalletConnectIcon = ({ + color = '#00EF8B', + width = 23, + height = 15, +}: { + color?: string; + width?: number; + height?: number; +}) => { + return ( + + + + ); +}; diff --git a/src/ui/assets/image/Bitcoin3D.png b/apps/extension/src/ui/assets/image/Bitcoin3D.png similarity index 100% rename from src/ui/assets/image/Bitcoin3D.png rename to apps/extension/src/ui/assets/image/Bitcoin3D.png diff --git a/src/ui/assets/image/QR2.png b/apps/extension/src/ui/assets/image/QR2.png similarity index 100% rename from src/ui/assets/image/QR2.png rename to apps/extension/src/ui/assets/image/QR2.png diff --git a/src/ui/assets/image/appicon.png b/apps/extension/src/ui/assets/image/appicon.png similarity index 100% rename from src/ui/assets/image/appicon.png rename to apps/extension/src/ui/assets/image/appicon.png diff --git a/src/ui/assets/image/bag.png b/apps/extension/src/ui/assets/image/bag.png similarity index 100% rename from src/ui/assets/image/bag.png rename to apps/extension/src/ui/assets/image/bag.png diff --git a/src/ui/assets/image/circlecheck.png b/apps/extension/src/ui/assets/image/circlecheck.png similarity index 100% rename from src/ui/assets/image/circlecheck.png rename to apps/extension/src/ui/assets/image/circlecheck.png diff --git a/src/ui/assets/image/claim.png b/apps/extension/src/ui/assets/image/claim.png similarity index 100% rename from src/ui/assets/image/claim.png rename to apps/extension/src/ui/assets/image/claim.png diff --git a/src/ui/assets/image/claimDomain.png b/apps/extension/src/ui/assets/image/claimDomain.png similarity index 100% rename from src/ui/assets/image/claimDomain.png rename to apps/extension/src/ui/assets/image/claimDomain.png diff --git a/src/ui/assets/image/closeCircle.png b/apps/extension/src/ui/assets/image/closeCircle.png similarity index 100% rename from src/ui/assets/image/closeCircle.png rename to apps/extension/src/ui/assets/image/closeCircle.png diff --git a/src/ui/assets/image/create.png b/apps/extension/src/ui/assets/image/create.png similarity index 100% rename from src/ui/assets/image/create.png rename to apps/extension/src/ui/assets/image/create.png diff --git a/src/ui/assets/image/crown.png b/apps/extension/src/ui/assets/image/crown.png similarity index 100% rename from src/ui/assets/image/crown.png rename to apps/extension/src/ui/assets/image/crown.png diff --git a/src/ui/assets/image/curve.png b/apps/extension/src/ui/assets/image/curve.png similarity index 100% rename from src/ui/assets/image/curve.png rename to apps/extension/src/ui/assets/image/curve.png diff --git a/src/ui/assets/image/devices.png b/apps/extension/src/ui/assets/image/devices.png similarity index 100% rename from src/ui/assets/image/devices.png rename to apps/extension/src/ui/assets/image/devices.png diff --git a/src/ui/assets/image/dicon.png b/apps/extension/src/ui/assets/image/dicon.png similarity index 100% rename from src/ui/assets/image/dicon.png rename to apps/extension/src/ui/assets/image/dicon.png diff --git a/src/ui/assets/image/discord.png b/apps/extension/src/ui/assets/image/discord.png similarity index 100% rename from src/ui/assets/image/discord.png rename to apps/extension/src/ui/assets/image/discord.png diff --git a/src/ui/assets/image/email.png b/apps/extension/src/ui/assets/image/email.png similarity index 100% rename from src/ui/assets/image/email.png rename to apps/extension/src/ui/assets/image/email.png diff --git a/src/ui/assets/image/empty_status.svg b/apps/extension/src/ui/assets/image/empty_status.svg similarity index 100% rename from src/ui/assets/image/empty_status.svg rename to apps/extension/src/ui/assets/image/empty_status.svg diff --git a/src/ui/assets/image/empty_transfer.png b/apps/extension/src/ui/assets/image/empty_transfer.png similarity index 100% rename from src/ui/assets/image/empty_transfer.png rename to apps/extension/src/ui/assets/image/empty_transfer.png diff --git a/src/ui/assets/image/enableBg.png b/apps/extension/src/ui/assets/image/enableBg.png similarity index 100% rename from src/ui/assets/image/enableBg.png rename to apps/extension/src/ui/assets/image/enableBg.png diff --git a/src/ui/assets/image/errorImage.png b/apps/extension/src/ui/assets/image/errorImage.png similarity index 100% rename from src/ui/assets/image/errorImage.png rename to apps/extension/src/ui/assets/image/errorImage.png diff --git a/src/ui/assets/image/evmlogo.png b/apps/extension/src/ui/assets/image/evmlogo.png similarity index 100% rename from src/ui/assets/image/evmlogo.png rename to apps/extension/src/ui/assets/image/evmlogo.png diff --git a/src/ui/assets/image/flownsBg.png b/apps/extension/src/ui/assets/image/flownsBg.png similarity index 100% rename from src/ui/assets/image/flownsBg.png rename to apps/extension/src/ui/assets/image/flownsBg.png diff --git a/src/ui/assets/image/flownsLogo.png b/apps/extension/src/ui/assets/image/flownsLogo.png similarity index 100% rename from src/ui/assets/image/flownsLogo.png rename to apps/extension/src/ui/assets/image/flownsLogo.png diff --git a/src/ui/assets/image/goto.png b/apps/extension/src/ui/assets/image/goto.png similarity index 100% rename from src/ui/assets/image/goto.png rename to apps/extension/src/ui/assets/image/goto.png diff --git a/src/ui/assets/image/hash.png b/apps/extension/src/ui/assets/image/hash.png similarity index 100% rename from src/ui/assets/image/hash.png rename to apps/extension/src/ui/assets/image/hash.png diff --git a/src/ui/assets/image/import.png b/apps/extension/src/ui/assets/image/import.png similarity index 100% rename from src/ui/assets/image/import.png rename to apps/extension/src/ui/assets/image/import.png diff --git a/src/ui/assets/image/importoutside.png b/apps/extension/src/ui/assets/image/importoutside.png similarity index 100% rename from src/ui/assets/image/importoutside.png rename to apps/extension/src/ui/assets/image/importoutside.png diff --git a/src/ui/assets/image/key.png b/apps/extension/src/ui/assets/image/key.png similarity index 100% rename from src/ui/assets/image/key.png rename to apps/extension/src/ui/assets/image/key.png diff --git a/src/ui/assets/image/licon.png b/apps/extension/src/ui/assets/image/licon.png similarity index 100% rename from src/ui/assets/image/licon.png rename to apps/extension/src/ui/assets/image/licon.png diff --git a/src/ui/assets/image/lilo.png b/apps/extension/src/ui/assets/image/lilo.png similarity index 100% rename from src/ui/assets/image/lilo.png rename to apps/extension/src/ui/assets/image/lilo.png diff --git a/src/ui/assets/image/micone.png b/apps/extension/src/ui/assets/image/micone.png similarity index 100% rename from src/ui/assets/image/micone.png rename to apps/extension/src/ui/assets/image/micone.png diff --git a/src/ui/assets/image/mobile.png b/apps/extension/src/ui/assets/image/mobile.png similarity index 100% rename from src/ui/assets/image/mobile.png rename to apps/extension/src/ui/assets/image/mobile.png diff --git a/src/ui/assets/image/moveft.png b/apps/extension/src/ui/assets/image/moveft.png similarity index 100% rename from src/ui/assets/image/moveft.png rename to apps/extension/src/ui/assets/image/moveft.png diff --git a/src/ui/assets/image/movenft.png b/apps/extension/src/ui/assets/image/movenft.png similarity index 100% rename from src/ui/assets/image/movenft.png rename to apps/extension/src/ui/assets/image/movenft.png diff --git a/src/ui/assets/image/pc.png b/apps/extension/src/ui/assets/image/pc.png similarity index 100% rename from src/ui/assets/image/pc.png rename to apps/extension/src/ui/assets/image/pc.png diff --git a/src/ui/assets/image/placeholder.png b/apps/extension/src/ui/assets/image/placeholder.png similarity index 100% rename from src/ui/assets/image/placeholder.png rename to apps/extension/src/ui/assets/image/placeholder.png diff --git a/src/ui/assets/image/scanIcon.png b/apps/extension/src/ui/assets/image/scanIcon.png similarity index 100% rename from src/ui/assets/image/scanIcon.png rename to apps/extension/src/ui/assets/image/scanIcon.png diff --git a/src/ui/assets/image/search_user.png b/apps/extension/src/ui/assets/image/search_user.png similarity index 100% rename from src/ui/assets/image/search_user.png rename to apps/extension/src/ui/assets/image/search_user.png diff --git a/src/ui/assets/image/sequence.png b/apps/extension/src/ui/assets/image/sequence.png similarity index 100% rename from src/ui/assets/image/sequence.png rename to apps/extension/src/ui/assets/image/sequence.png diff --git a/src/ui/assets/image/tips.png b/apps/extension/src/ui/assets/image/tips.png similarity index 100% rename from src/ui/assets/image/tips.png rename to apps/extension/src/ui/assets/image/tips.png diff --git a/src/ui/assets/image/toggle.png b/apps/extension/src/ui/assets/image/toggle.png similarity index 100% rename from src/ui/assets/image/toggle.png rename to apps/extension/src/ui/assets/image/toggle.png diff --git a/src/ui/assets/image/twitter.png b/apps/extension/src/ui/assets/image/twitter.png similarity index 100% rename from src/ui/assets/image/twitter.png rename to apps/extension/src/ui/assets/image/twitter.png diff --git a/src/ui/assets/image/warning.png b/apps/extension/src/ui/assets/image/warning.png similarity index 100% rename from src/ui/assets/image/warning.png rename to apps/extension/src/ui/assets/image/warning.png diff --git a/src/ui/assets/image/weight.png b/apps/extension/src/ui/assets/image/weight.png similarity index 100% rename from src/ui/assets/image/weight.png rename to apps/extension/src/ui/assets/image/weight.png diff --git a/src/ui/assets/img-fail-1.svg b/apps/extension/src/ui/assets/img-fail-1.svg similarity index 100% rename from src/ui/assets/img-fail-1.svg rename to apps/extension/src/ui/assets/img-fail-1.svg diff --git a/src/ui/assets/img-fail.svg b/apps/extension/src/ui/assets/img-fail.svg similarity index 100% rename from src/ui/assets/img-fail.svg rename to apps/extension/src/ui/assets/img-fail.svg diff --git a/src/ui/assets/img-loading.svg b/apps/extension/src/ui/assets/img-loading.svg similarity index 100% rename from src/ui/assets/img-loading.svg rename to apps/extension/src/ui/assets/img-loading.svg diff --git a/src/ui/assets/import-icon.svg b/apps/extension/src/ui/assets/import-icon.svg similarity index 100% rename from src/ui/assets/import-icon.svg rename to apps/extension/src/ui/assets/import-icon.svg diff --git a/src/ui/assets/import-ledger.svg b/apps/extension/src/ui/assets/import-ledger.svg similarity index 100% rename from src/ui/assets/import-ledger.svg rename to apps/extension/src/ui/assets/import-ledger.svg diff --git a/src/ui/assets/import-mask.png b/apps/extension/src/ui/assets/import-mask.png similarity index 100% rename from src/ui/assets/import-mask.png rename to apps/extension/src/ui/assets/import-mask.png diff --git a/src/ui/assets/import-success.svg b/apps/extension/src/ui/assets/import-success.svg similarity index 100% rename from src/ui/assets/import-success.svg rename to apps/extension/src/ui/assets/import-success.svg diff --git a/src/ui/assets/import.svg b/apps/extension/src/ui/assets/import.svg similarity index 100% rename from src/ui/assets/import.svg rename to apps/extension/src/ui/assets/import.svg diff --git a/src/ui/assets/index.ts b/apps/extension/src/ui/assets/index.ts similarity index 100% rename from src/ui/assets/index.ts rename to apps/extension/src/ui/assets/index.ts diff --git a/src/ui/assets/infoicon.svg b/apps/extension/src/ui/assets/infoicon.svg similarity index 100% rename from src/ui/assets/infoicon.svg rename to apps/extension/src/ui/assets/infoicon.svg diff --git a/src/ui/assets/information.png b/apps/extension/src/ui/assets/information.png similarity index 100% rename from src/ui/assets/information.png rename to apps/extension/src/ui/assets/information.png diff --git a/src/ui/assets/internal-transaction.svg b/apps/extension/src/ui/assets/internal-transaction.svg similarity index 100% rename from src/ui/assets/internal-transaction.svg rename to apps/extension/src/ui/assets/internal-transaction.svg diff --git a/src/ui/assets/internet.svg b/apps/extension/src/ui/assets/internet.svg similarity index 100% rename from src/ui/assets/internet.svg rename to apps/extension/src/ui/assets/internet.svg diff --git a/src/ui/assets/keyring-normal-purple.svg b/apps/extension/src/ui/assets/keyring-normal-purple.svg similarity index 100% rename from src/ui/assets/keyring-normal-purple.svg rename to apps/extension/src/ui/assets/keyring-normal-purple.svg diff --git a/src/ui/assets/keyring-normal.svg b/apps/extension/src/ui/assets/keyring-normal.svg similarity index 100% rename from src/ui/assets/keyring-normal.svg rename to apps/extension/src/ui/assets/keyring-normal.svg diff --git a/src/ui/assets/langs/en.svg b/apps/extension/src/ui/assets/langs/en.svg similarity index 100% rename from src/ui/assets/langs/en.svg rename to apps/extension/src/ui/assets/langs/en.svg diff --git a/src/ui/assets/langs/zh_cn.svg b/apps/extension/src/ui/assets/langs/zh_cn.svg similarity index 100% rename from src/ui/assets/langs/zh_cn.svg rename to apps/extension/src/ui/assets/langs/zh_cn.svg diff --git a/src/ui/assets/ledger.svg b/apps/extension/src/ui/assets/ledger.svg similarity index 100% rename from src/ui/assets/ledger.svg rename to apps/extension/src/ui/assets/ledger.svg diff --git a/src/ui/assets/loading-big.svg b/apps/extension/src/ui/assets/loading-big.svg similarity index 100% rename from src/ui/assets/loading-big.svg rename to apps/extension/src/ui/assets/loading-big.svg diff --git a/src/ui/assets/loading-round.svg b/apps/extension/src/ui/assets/loading-round.svg similarity index 100% rename from src/ui/assets/loading-round.svg rename to apps/extension/src/ui/assets/loading-round.svg diff --git a/src/ui/assets/loading.svg b/apps/extension/src/ui/assets/loading.svg similarity index 100% rename from src/ui/assets/loading.svg rename to apps/extension/src/ui/assets/loading.svg diff --git a/src/ui/assets/lock.svg b/apps/extension/src/ui/assets/lock.svg similarity index 100% rename from src/ui/assets/lock.svg rename to apps/extension/src/ui/assets/lock.svg diff --git a/src/ui/assets/manage-address.svg b/apps/extension/src/ui/assets/manage-address.svg similarity index 100% rename from src/ui/assets/manage-address.svg rename to apps/extension/src/ui/assets/manage-address.svg diff --git a/src/ui/assets/metamask-warning.svg b/apps/extension/src/ui/assets/metamask-warning.svg similarity index 100% rename from src/ui/assets/metamask-warning.svg rename to apps/extension/src/ui/assets/metamask-warning.svg diff --git a/src/ui/assets/mnemonic-icon.svg b/apps/extension/src/ui/assets/mnemonic-icon.svg similarity index 100% rename from src/ui/assets/mnemonic-icon.svg rename to apps/extension/src/ui/assets/mnemonic-icon.svg diff --git a/src/ui/assets/more-chain-round-dark.svg b/apps/extension/src/ui/assets/more-chain-round-dark.svg similarity index 100% rename from src/ui/assets/more-chain-round-dark.svg rename to apps/extension/src/ui/assets/more-chain-round-dark.svg diff --git a/src/ui/assets/nft-default.svg b/apps/extension/src/ui/assets/nft-default.svg similarity index 100% rename from src/ui/assets/nft-default.svg rename to apps/extension/src/ui/assets/nft-default.svg diff --git a/src/ui/assets/no-data.svg b/apps/extension/src/ui/assets/no-data.svg similarity index 100% rename from src/ui/assets/no-data.svg rename to apps/extension/src/ui/assets/no-data.svg diff --git a/src/ui/assets/no-risk.svg b/apps/extension/src/ui/assets/no-risk.svg similarity index 100% rename from src/ui/assets/no-risk.svg rename to apps/extension/src/ui/assets/no-risk.svg diff --git a/src/ui/assets/not-checked.svg b/apps/extension/src/ui/assets/not-checked.svg similarity index 100% rename from src/ui/assets/not-checked.svg rename to apps/extension/src/ui/assets/not-checked.svg diff --git a/src/ui/assets/offline.svg b/apps/extension/src/ui/assets/offline.svg similarity index 100% rename from src/ui/assets/offline.svg rename to apps/extension/src/ui/assets/offline.svg diff --git a/src/ui/assets/onekey.svg b/apps/extension/src/ui/assets/onekey.svg similarity index 100% rename from src/ui/assets/onekey.svg rename to apps/extension/src/ui/assets/onekey.svg diff --git a/src/ui/assets/onekey28.svg b/apps/extension/src/ui/assets/onekey28.svg similarity index 100% rename from src/ui/assets/onekey28.svg rename to apps/extension/src/ui/assets/onekey28.svg diff --git a/src/ui/assets/open-external-gray.svg b/apps/extension/src/ui/assets/open-external-gray.svg similarity index 100% rename from src/ui/assets/open-external-gray.svg rename to apps/extension/src/ui/assets/open-external-gray.svg diff --git a/src/ui/assets/open-external.svg b/apps/extension/src/ui/assets/open-external.svg similarity index 100% rename from src/ui/assets/open-external.svg rename to apps/extension/src/ui/assets/open-external.svg diff --git a/src/ui/assets/openapi-management.svg b/apps/extension/src/ui/assets/openapi-management.svg similarity index 100% rename from src/ui/assets/openapi-management.svg rename to apps/extension/src/ui/assets/openapi-management.svg diff --git a/src/ui/assets/operation-card.png b/apps/extension/src/ui/assets/operation-card.png similarity index 100% rename from src/ui/assets/operation-card.png rename to apps/extension/src/ui/assets/operation-card.png diff --git a/src/ui/assets/other-wallet-warning.svg b/apps/extension/src/ui/assets/other-wallet-warning.svg similarity index 100% rename from src/ui/assets/other-wallet-warning.svg rename to apps/extension/src/ui/assets/other-wallet-warning.svg diff --git a/src/ui/assets/pending-spin.svg b/apps/extension/src/ui/assets/pending-spin.svg similarity index 100% rename from src/ui/assets/pending-spin.svg rename to apps/extension/src/ui/assets/pending-spin.svg diff --git a/src/ui/assets/pending.svg b/apps/extension/src/ui/assets/pending.svg similarity index 100% rename from src/ui/assets/pending.svg rename to apps/extension/src/ui/assets/pending.svg diff --git a/src/ui/assets/pin.svg b/apps/extension/src/ui/assets/pin.svg similarity index 100% rename from src/ui/assets/pin.svg rename to apps/extension/src/ui/assets/pin.svg diff --git a/src/ui/assets/plus-primary.svg b/apps/extension/src/ui/assets/plus-primary.svg similarity index 100% rename from src/ui/assets/plus-primary.svg rename to apps/extension/src/ui/assets/plus-primary.svg diff --git a/src/ui/assets/privatekey-icon.svg b/apps/extension/src/ui/assets/privatekey-icon.svg similarity index 100% rename from src/ui/assets/privatekey-icon.svg rename to apps/extension/src/ui/assets/privatekey-icon.svg diff --git a/src/ui/assets/privatekey.svg b/apps/extension/src/ui/assets/privatekey.svg similarity index 100% rename from src/ui/assets/privatekey.svg rename to apps/extension/src/ui/assets/privatekey.svg diff --git a/src/ui/assets/profile.svg b/apps/extension/src/ui/assets/profile.svg similarity index 100% rename from src/ui/assets/profile.svg rename to apps/extension/src/ui/assets/profile.svg diff --git a/src/ui/assets/qr-scan.svg b/apps/extension/src/ui/assets/qr-scan.svg similarity index 100% rename from src/ui/assets/qr-scan.svg rename to apps/extension/src/ui/assets/qr-scan.svg diff --git a/src/ui/assets/qrcode.svg b/apps/extension/src/ui/assets/qrcode.svg similarity index 100% rename from src/ui/assets/qrcode.svg rename to apps/extension/src/ui/assets/qrcode.svg diff --git a/src/ui/assets/qrcoderefresh.svg b/apps/extension/src/ui/assets/qrcoderefresh.svg similarity index 100% rename from src/ui/assets/qrcoderefresh.svg rename to apps/extension/src/ui/assets/qrcoderefresh.svg diff --git a/src/ui/assets/question-mark-black.svg b/apps/extension/src/ui/assets/question-mark-black.svg similarity index 100% rename from src/ui/assets/question-mark-black.svg rename to apps/extension/src/ui/assets/question-mark-black.svg diff --git a/src/ui/assets/question-mark-gray.svg b/apps/extension/src/ui/assets/question-mark-gray.svg similarity index 100% rename from src/ui/assets/question-mark-gray.svg rename to apps/extension/src/ui/assets/question-mark-gray.svg diff --git a/src/ui/assets/question-mark.svg b/apps/extension/src/ui/assets/question-mark.svg similarity index 100% rename from src/ui/assets/question-mark.svg rename to apps/extension/src/ui/assets/question-mark.svg diff --git a/src/ui/assets/rabby-white.svg b/apps/extension/src/ui/assets/rabby-white.svg similarity index 100% rename from src/ui/assets/rabby-white.svg rename to apps/extension/src/ui/assets/rabby-white.svg diff --git a/src/ui/assets/refresh.svg b/apps/extension/src/ui/assets/refresh.svg similarity index 100% rename from src/ui/assets/refresh.svg rename to apps/extension/src/ui/assets/refresh.svg diff --git a/src/ui/assets/refreshcontainer.svg b/apps/extension/src/ui/assets/refreshcontainer.svg similarity index 100% rename from src/ui/assets/refreshcontainer.svg rename to apps/extension/src/ui/assets/refreshcontainer.svg diff --git a/src/ui/assets/removetoken.png b/apps/extension/src/ui/assets/removetoken.png similarity index 100% rename from src/ui/assets/removetoken.png rename to apps/extension/src/ui/assets/removetoken.png diff --git a/src/ui/assets/scan.svg b/apps/extension/src/ui/assets/scan.svg similarity index 100% rename from src/ui/assets/scan.svg rename to apps/extension/src/ui/assets/scan.svg diff --git a/src/ui/assets/search.svg b/apps/extension/src/ui/assets/search.svg similarity index 100% rename from src/ui/assets/search.svg rename to apps/extension/src/ui/assets/search.svg diff --git a/src/ui/assets/searchIconClose.png b/apps/extension/src/ui/assets/searchIconClose.png similarity index 100% rename from src/ui/assets/searchIconClose.png rename to apps/extension/src/ui/assets/searchIconClose.png diff --git a/src/ui/assets/send.svg b/apps/extension/src/ui/assets/send.svg similarity index 100% rename from src/ui/assets/send.svg rename to apps/extension/src/ui/assets/send.svg diff --git a/src/ui/assets/setting-gray.svg b/apps/extension/src/ui/assets/setting-gray.svg similarity index 100% rename from src/ui/assets/setting-gray.svg rename to apps/extension/src/ui/assets/setting-gray.svg diff --git a/src/ui/assets/settings.svg b/apps/extension/src/ui/assets/settings.svg similarity index 100% rename from src/ui/assets/settings.svg rename to apps/extension/src/ui/assets/settings.svg diff --git a/src/ui/assets/slogon.svg b/apps/extension/src/ui/assets/slogon.svg similarity index 100% rename from src/ui/assets/slogon.svg rename to apps/extension/src/ui/assets/slogon.svg diff --git a/src/ui/assets/speedup-corner.svg b/apps/extension/src/ui/assets/speedup-corner.svg similarity index 100% rename from src/ui/assets/speedup-corner.svg rename to apps/extension/src/ui/assets/speedup-corner.svg diff --git a/src/ui/assets/speedup.svg b/apps/extension/src/ui/assets/speedup.svg similarity index 100% rename from src/ui/assets/speedup.svg rename to apps/extension/src/ui/assets/speedup.svg diff --git a/src/ui/assets/spin.svg b/apps/extension/src/ui/assets/spin.svg similarity index 100% rename from src/ui/assets/spin.svg rename to apps/extension/src/ui/assets/spin.svg diff --git a/src/ui/assets/star-1.svg b/apps/extension/src/ui/assets/star-1.svg similarity index 100% rename from src/ui/assets/star-1.svg rename to apps/extension/src/ui/assets/star-1.svg diff --git a/src/ui/assets/star.svg b/apps/extension/src/ui/assets/star.svg similarity index 100% rename from src/ui/assets/star.svg rename to apps/extension/src/ui/assets/star.svg diff --git a/src/ui/assets/success-logo.svg b/apps/extension/src/ui/assets/success-logo.svg similarity index 100% rename from src/ui/assets/success-logo.svg rename to apps/extension/src/ui/assets/success-logo.svg diff --git a/src/ui/assets/success.svg b/apps/extension/src/ui/assets/success.svg similarity index 100% rename from src/ui/assets/success.svg rename to apps/extension/src/ui/assets/success.svg diff --git a/src/ui/assets/svg/Certificate.svg b/apps/extension/src/ui/assets/svg/Certificate.svg similarity index 100% rename from src/ui/assets/svg/Certificate.svg rename to apps/extension/src/ui/assets/svg/Certificate.svg diff --git a/src/ui/assets/svg/Dashboard.svg b/apps/extension/src/ui/assets/svg/Dashboard.svg similarity index 100% rename from src/ui/assets/svg/Dashboard.svg rename to apps/extension/src/ui/assets/svg/Dashboard.svg diff --git a/src/ui/assets/svg/EyeOff.svg b/apps/extension/src/ui/assets/svg/EyeOff.svg similarity index 100% rename from src/ui/assets/svg/EyeOff.svg rename to apps/extension/src/ui/assets/svg/EyeOff.svg diff --git a/src/ui/assets/svg/Iconlink.svg b/apps/extension/src/ui/assets/svg/Iconlink.svg similarity index 100% rename from src/ui/assets/svg/Iconlink.svg rename to apps/extension/src/ui/assets/svg/Iconlink.svg diff --git a/src/ui/assets/svg/Synchronize.svg b/apps/extension/src/ui/assets/svg/Synchronize.svg similarity index 100% rename from src/ui/assets/svg/Synchronize.svg rename to apps/extension/src/ui/assets/svg/Synchronize.svg diff --git a/src/ui/assets/svg/TimeClock.svg b/apps/extension/src/ui/assets/svg/TimeClock.svg similarity index 100% rename from src/ui/assets/svg/TimeClock.svg rename to apps/extension/src/ui/assets/svg/TimeClock.svg diff --git a/src/ui/assets/svg/accountMove.svg b/apps/extension/src/ui/assets/svg/accountMove.svg similarity index 100% rename from src/ui/assets/svg/accountMove.svg rename to apps/extension/src/ui/assets/svg/accountMove.svg diff --git a/src/ui/assets/svg/activity.svg b/apps/extension/src/ui/assets/svg/activity.svg similarity index 100% rename from src/ui/assets/svg/activity.svg rename to apps/extension/src/ui/assets/svg/activity.svg diff --git a/src/ui/assets/svg/alert.svg b/apps/extension/src/ui/assets/svg/alert.svg similarity index 100% rename from src/ui/assets/svg/alert.svg rename to apps/extension/src/ui/assets/svg/alert.svg diff --git a/src/ui/assets/svg/alertMark.svg b/apps/extension/src/ui/assets/svg/alertMark.svg similarity index 100% rename from src/ui/assets/svg/alertMark.svg rename to apps/extension/src/ui/assets/svg/alertMark.svg diff --git a/src/ui/assets/svg/allset.svg b/apps/extension/src/ui/assets/svg/allset.svg similarity index 100% rename from src/ui/assets/svg/allset.svg rename to apps/extension/src/ui/assets/svg/allset.svg diff --git a/src/ui/assets/svg/banner-background.svg b/apps/extension/src/ui/assets/svg/banner-background.svg similarity index 100% rename from src/ui/assets/svg/banner-background.svg rename to apps/extension/src/ui/assets/svg/banner-background.svg diff --git a/src/ui/assets/svg/buyIcon.svg b/apps/extension/src/ui/assets/svg/buyIcon.svg similarity index 100% rename from src/ui/assets/svg/buyIcon.svg rename to apps/extension/src/ui/assets/svg/buyIcon.svg diff --git a/src/ui/assets/svg/check-circle-fill.svg b/apps/extension/src/ui/assets/svg/check-circle-fill.svg similarity index 100% rename from src/ui/assets/svg/check-circle-fill.svg rename to apps/extension/src/ui/assets/svg/check-circle-fill.svg diff --git a/src/ui/assets/svg/check-circle-unfill.svg b/apps/extension/src/ui/assets/svg/check-circle-unfill.svg similarity index 100% rename from src/ui/assets/svg/check-circle-unfill.svg rename to apps/extension/src/ui/assets/svg/check-circle-unfill.svg diff --git a/src/ui/assets/svg/close-icon.svg b/apps/extension/src/ui/assets/svg/close-icon.svg similarity index 100% rename from src/ui/assets/svg/close-icon.svg rename to apps/extension/src/ui/assets/svg/close-icon.svg diff --git a/src/ui/assets/svg/coinbase-pay.svg b/apps/extension/src/ui/assets/svg/coinbase-pay.svg similarity index 100% rename from src/ui/assets/svg/coinbase-pay.svg rename to apps/extension/src/ui/assets/svg/coinbase-pay.svg diff --git a/src/ui/assets/svg/coinbasepay-txt.svg b/apps/extension/src/ui/assets/svg/coinbasepay-txt.svg similarity index 100% rename from src/ui/assets/svg/coinbasepay-txt.svg rename to apps/extension/src/ui/assets/svg/coinbasepay-txt.svg diff --git a/src/ui/assets/svg/coinsIcon.svg b/apps/extension/src/ui/assets/svg/coinsIcon.svg similarity index 100% rename from src/ui/assets/svg/coinsIcon.svg rename to apps/extension/src/ui/assets/svg/coinsIcon.svg diff --git a/src/ui/assets/svg/create-new.svg b/apps/extension/src/ui/assets/svg/create-new.svg similarity index 100% rename from src/ui/assets/svg/create-new.svg rename to apps/extension/src/ui/assets/svg/create-new.svg diff --git a/src/ui/assets/svg/create.svg b/apps/extension/src/ui/assets/svg/create.svg similarity index 100% rename from src/ui/assets/svg/create.svg rename to apps/extension/src/ui/assets/svg/create.svg diff --git a/src/ui/assets/svg/detailMove.svg b/apps/extension/src/ui/assets/svg/detailMove.svg similarity index 100% rename from src/ui/assets/svg/detailMove.svg rename to apps/extension/src/ui/assets/svg/detailMove.svg diff --git a/src/ui/assets/svg/detailSend.svg b/apps/extension/src/ui/assets/svg/detailSend.svg similarity index 100% rename from src/ui/assets/svg/detailSend.svg rename to apps/extension/src/ui/assets/svg/detailSend.svg diff --git a/src/ui/assets/svg/device.svg b/apps/extension/src/ui/assets/svg/device.svg similarity index 100% rename from src/ui/assets/svg/device.svg rename to apps/extension/src/ui/assets/svg/device.svg diff --git a/src/ui/assets/svg/editEmoji.svg b/apps/extension/src/ui/assets/svg/editEmoji.svg similarity index 100% rename from src/ui/assets/svg/editEmoji.svg rename to apps/extension/src/ui/assets/svg/editEmoji.svg diff --git a/src/ui/assets/svg/email.svg b/apps/extension/src/ui/assets/svg/email.svg similarity index 100% rename from src/ui/assets/svg/email.svg rename to apps/extension/src/ui/assets/svg/email.svg diff --git a/src/ui/assets/svg/enableBg.svg b/apps/extension/src/ui/assets/svg/enableBg.svg similarity index 100% rename from src/ui/assets/svg/enableBg.svg rename to apps/extension/src/ui/assets/svg/enableBg.svg diff --git a/src/ui/assets/svg/expand.svg b/apps/extension/src/ui/assets/svg/expand.svg similarity index 100% rename from src/ui/assets/svg/expand.svg rename to apps/extension/src/ui/assets/svg/expand.svg diff --git a/src/ui/assets/svg/flow-grey.svg b/apps/extension/src/ui/assets/svg/flow-grey.svg similarity index 100% rename from src/ui/assets/svg/flow-grey.svg rename to apps/extension/src/ui/assets/svg/flow-grey.svg diff --git a/src/ui/assets/svg/flownsBanner.svg b/apps/extension/src/ui/assets/svg/flownsBanner.svg similarity index 100% rename from src/ui/assets/svg/flownsBanner.svg rename to apps/extension/src/ui/assets/svg/flownsBanner.svg diff --git a/src/ui/assets/svg/flownsPBanner.svg b/apps/extension/src/ui/assets/svg/flownsPBanner.svg similarity index 100% rename from src/ui/assets/svg/flownsPBanner.svg rename to apps/extension/src/ui/assets/svg/flownsPBanner.svg diff --git a/src/ui/assets/svg/hide.svg b/apps/extension/src/ui/assets/svg/hide.svg similarity index 100% rename from src/ui/assets/svg/hide.svg rename to apps/extension/src/ui/assets/svg/hide.svg diff --git a/src/ui/assets/svg/homeMove.svg b/apps/extension/src/ui/assets/svg/homeMove.svg similarity index 100% rename from src/ui/assets/svg/homeMove.svg rename to apps/extension/src/ui/assets/svg/homeMove.svg diff --git a/src/ui/assets/svg/homeMoveFt.svg b/apps/extension/src/ui/assets/svg/homeMoveFt.svg similarity index 100% rename from src/ui/assets/svg/homeMoveFt.svg rename to apps/extension/src/ui/assets/svg/homeMoveFt.svg diff --git a/src/ui/assets/svg/iconCheck.svg b/apps/extension/src/ui/assets/svg/iconCheck.svg similarity index 100% rename from src/ui/assets/svg/iconCheck.svg rename to apps/extension/src/ui/assets/svg/iconCheck.svg diff --git a/src/ui/assets/svg/import-existing.svg b/apps/extension/src/ui/assets/svg/import-existing.svg similarity index 100% rename from src/ui/assets/svg/import-existing.svg rename to apps/extension/src/ui/assets/svg/import-existing.svg diff --git a/src/ui/assets/svg/import.svg b/apps/extension/src/ui/assets/svg/import.svg similarity index 100% rename from src/ui/assets/svg/import.svg rename to apps/extension/src/ui/assets/svg/import.svg diff --git a/src/ui/assets/svg/importIcon.svg b/apps/extension/src/ui/assets/svg/importIcon.svg similarity index 100% rename from src/ui/assets/svg/importIcon.svg rename to apps/extension/src/ui/assets/svg/importIcon.svg diff --git a/src/ui/assets/svg/importoutside.svg b/apps/extension/src/ui/assets/svg/importoutside.svg similarity index 100% rename from src/ui/assets/svg/importoutside.svg rename to apps/extension/src/ui/assets/svg/importoutside.svg diff --git a/src/ui/assets/svg/increment.svg b/apps/extension/src/ui/assets/svg/increment.svg similarity index 100% rename from src/ui/assets/svg/increment.svg rename to apps/extension/src/ui/assets/svg/increment.svg diff --git a/src/ui/assets/svg/link.svg b/apps/extension/src/ui/assets/svg/link.svg similarity index 100% rename from src/ui/assets/svg/link.svg rename to apps/extension/src/ui/assets/svg/link.svg diff --git a/src/ui/assets/svg/linkGlobe.svg b/apps/extension/src/ui/assets/svg/linkGlobe.svg similarity index 100% rename from src/ui/assets/svg/linkGlobe.svg rename to apps/extension/src/ui/assets/svg/linkGlobe.svg diff --git a/src/ui/assets/svg/lowStorage.svg b/apps/extension/src/ui/assets/svg/lowStorage.svg similarity index 100% rename from src/ui/assets/svg/lowStorage.svg rename to apps/extension/src/ui/assets/svg/lowStorage.svg diff --git a/src/ui/assets/svg/mainnet.svg b/apps/extension/src/ui/assets/svg/mainnet.svg similarity index 100% rename from src/ui/assets/svg/mainnet.svg rename to apps/extension/src/ui/assets/svg/mainnet.svg diff --git a/src/ui/assets/svg/mainnetArrow.svg b/apps/extension/src/ui/assets/svg/mainnetArrow.svg similarity index 100% rename from src/ui/assets/svg/mainnetArrow.svg rename to apps/extension/src/ui/assets/svg/mainnetArrow.svg diff --git a/src/ui/assets/svg/moonpay-logo.svg b/apps/extension/src/ui/assets/svg/moonpay-logo.svg similarity index 100% rename from src/ui/assets/svg/moonpay-logo.svg rename to apps/extension/src/ui/assets/svg/moonpay-logo.svg diff --git a/src/ui/assets/svg/moonpay-text.svg b/apps/extension/src/ui/assets/svg/moonpay-text.svg similarity index 100% rename from src/ui/assets/svg/moonpay-text.svg rename to apps/extension/src/ui/assets/svg/moonpay-text.svg diff --git a/src/ui/assets/svg/moonpay.svg b/apps/extension/src/ui/assets/svg/moonpay.svg similarity index 100% rename from src/ui/assets/svg/moonpay.svg rename to apps/extension/src/ui/assets/svg/moonpay.svg diff --git a/src/ui/assets/svg/move.svg b/apps/extension/src/ui/assets/svg/move.svg similarity index 100% rename from src/ui/assets/svg/move.svg rename to apps/extension/src/ui/assets/svg/move.svg diff --git a/src/ui/assets/svg/moveIcon.svg b/apps/extension/src/ui/assets/svg/moveIcon.svg similarity index 100% rename from src/ui/assets/svg/moveIcon.svg rename to apps/extension/src/ui/assets/svg/moveIcon.svg diff --git a/src/ui/assets/svg/moveSelectDrop.svg b/apps/extension/src/ui/assets/svg/moveSelectDrop.svg similarity index 100% rename from src/ui/assets/svg/moveSelectDrop.svg rename to apps/extension/src/ui/assets/svg/moveSelectDrop.svg diff --git a/src/ui/assets/svg/moveSvg.svg b/apps/extension/src/ui/assets/svg/moveSvg.svg similarity index 100% rename from src/ui/assets/svg/moveSvg.svg rename to apps/extension/src/ui/assets/svg/moveSvg.svg diff --git a/src/ui/assets/svg/moveftbg.svg b/apps/extension/src/ui/assets/svg/moveftbg.svg similarity index 100% rename from src/ui/assets/svg/moveftbg.svg rename to apps/extension/src/ui/assets/svg/moveftbg.svg diff --git a/src/ui/assets/svg/movenftbg.svg b/apps/extension/src/ui/assets/svg/movenftbg.svg similarity index 100% rename from src/ui/assets/svg/movenftbg.svg rename to apps/extension/src/ui/assets/svg/movenftbg.svg diff --git a/src/ui/assets/svg/networkIndicator.svg b/apps/extension/src/ui/assets/svg/networkIndicator.svg similarity index 100% rename from src/ui/assets/svg/networkIndicator.svg rename to apps/extension/src/ui/assets/svg/networkIndicator.svg diff --git a/src/ui/assets/svg/networkIndicatorPreviewnet.svg b/apps/extension/src/ui/assets/svg/networkIndicatorPreviewnet.svg similarity index 100% rename from src/ui/assets/svg/networkIndicatorPreviewnet.svg rename to apps/extension/src/ui/assets/svg/networkIndicatorPreviewnet.svg diff --git a/src/ui/assets/svg/networkIndicatorTestnet.svg b/apps/extension/src/ui/assets/svg/networkIndicatorTestnet.svg similarity index 100% rename from src/ui/assets/svg/networkIndicatorTestnet.svg rename to apps/extension/src/ui/assets/svg/networkIndicatorTestnet.svg diff --git a/src/ui/assets/svg/networkLink.svg b/apps/extension/src/ui/assets/svg/networkLink.svg similarity index 100% rename from src/ui/assets/svg/networkLink.svg rename to apps/extension/src/ui/assets/svg/networkLink.svg diff --git a/src/ui/assets/svg/next.svg b/apps/extension/src/ui/assets/svg/next.svg similarity index 100% rename from src/ui/assets/svg/next.svg rename to apps/extension/src/ui/assets/svg/next.svg diff --git a/src/ui/assets/svg/nextgray.svg b/apps/extension/src/ui/assets/svg/nextgray.svg similarity index 100% rename from src/ui/assets/svg/nextgray.svg rename to apps/extension/src/ui/assets/svg/nextgray.svg diff --git a/src/ui/assets/svg/notfound.svg b/apps/extension/src/ui/assets/svg/notfound.svg similarity index 100% rename from src/ui/assets/svg/notfound.svg rename to apps/extension/src/ui/assets/svg/notfound.svg diff --git a/src/ui/assets/svg/plus.svg b/apps/extension/src/ui/assets/svg/plus.svg similarity index 100% rename from src/ui/assets/svg/plus.svg rename to apps/extension/src/ui/assets/svg/plus.svg diff --git a/src/ui/assets/svg/plusIcon.svg b/apps/extension/src/ui/assets/svg/plusIcon.svg similarity index 100% rename from src/ui/assets/svg/plusIcon.svg rename to apps/extension/src/ui/assets/svg/plusIcon.svg diff --git a/src/ui/assets/svg/popAdd.svg b/apps/extension/src/ui/assets/svg/popAdd.svg similarity index 100% rename from src/ui/assets/svg/popAdd.svg rename to apps/extension/src/ui/assets/svg/popAdd.svg diff --git a/src/ui/assets/svg/popImport.svg b/apps/extension/src/ui/assets/svg/popImport.svg similarity index 100% rename from src/ui/assets/svg/popImport.svg rename to apps/extension/src/ui/assets/svg/popImport.svg diff --git a/src/ui/assets/svg/popLock.svg b/apps/extension/src/ui/assets/svg/popLock.svg similarity index 100% rename from src/ui/assets/svg/popLock.svg rename to apps/extension/src/ui/assets/svg/popLock.svg diff --git a/src/ui/assets/svg/previewnetArrow.svg b/apps/extension/src/ui/assets/svg/previewnetArrow.svg similarity index 100% rename from src/ui/assets/svg/previewnetArrow.svg rename to apps/extension/src/ui/assets/svg/previewnetArrow.svg diff --git a/src/ui/assets/svg/receiveIcon.svg b/apps/extension/src/ui/assets/svg/receiveIcon.svg similarity index 100% rename from src/ui/assets/svg/receiveIcon.svg rename to apps/extension/src/ui/assets/svg/receiveIcon.svg diff --git a/src/ui/assets/svg/recover.svg b/apps/extension/src/ui/assets/svg/recover.svg similarity index 100% rename from src/ui/assets/svg/recover.svg rename to apps/extension/src/ui/assets/svg/recover.svg diff --git a/src/ui/assets/svg/reset.svg b/apps/extension/src/ui/assets/svg/reset.svg similarity index 100% rename from src/ui/assets/svg/reset.svg rename to apps/extension/src/ui/assets/svg/reset.svg diff --git a/src/ui/assets/svg/resetarrow.svg b/apps/extension/src/ui/assets/svg/resetarrow.svg similarity index 100% rename from src/ui/assets/svg/resetarrow.svg rename to apps/extension/src/ui/assets/svg/resetarrow.svg diff --git a/src/ui/assets/svg/rightarrow.svg b/apps/extension/src/ui/assets/svg/rightarrow.svg similarity index 100% rename from src/ui/assets/svg/rightarrow.svg rename to apps/extension/src/ui/assets/svg/rightarrow.svg diff --git a/src/ui/assets/svg/scanIcon.svg b/apps/extension/src/ui/assets/svg/scanIcon.svg similarity index 100% rename from src/ui/assets/svg/scanIcon.svg rename to apps/extension/src/ui/assets/svg/scanIcon.svg diff --git a/src/ui/assets/svg/searchIcon.svg b/apps/extension/src/ui/assets/svg/searchIcon.svg similarity index 100% rename from src/ui/assets/svg/searchIcon.svg rename to apps/extension/src/ui/assets/svg/searchIcon.svg diff --git a/src/ui/assets/svg/selected.svg b/apps/extension/src/ui/assets/svg/selected.svg similarity index 100% rename from src/ui/assets/svg/selected.svg rename to apps/extension/src/ui/assets/svg/selected.svg diff --git a/src/ui/assets/svg/selectedCover.svg b/apps/extension/src/ui/assets/svg/selectedCover.svg similarity index 100% rename from src/ui/assets/svg/selectedCover.svg rename to apps/extension/src/ui/assets/svg/selectedCover.svg diff --git a/src/ui/assets/svg/send.svg b/apps/extension/src/ui/assets/svg/send.svg similarity index 100% rename from src/ui/assets/svg/send.svg rename to apps/extension/src/ui/assets/svg/send.svg diff --git a/src/ui/assets/svg/sendIcon.svg b/apps/extension/src/ui/assets/svg/sendIcon.svg similarity index 100% rename from src/ui/assets/svg/sendIcon.svg rename to apps/extension/src/ui/assets/svg/sendIcon.svg diff --git a/src/ui/assets/svg/sideMore.svg b/apps/extension/src/ui/assets/svg/sideMore.svg similarity index 100% rename from src/ui/assets/svg/sideMore.svg rename to apps/extension/src/ui/assets/svg/sideMore.svg diff --git a/src/ui/assets/svg/sidebar-lock.svg b/apps/extension/src/ui/assets/svg/sidebar-lock.svg similarity index 100% rename from src/ui/assets/svg/sidebar-lock.svg rename to apps/extension/src/ui/assets/svg/sidebar-lock.svg diff --git a/src/ui/assets/svg/sidebar-plus.svg b/apps/extension/src/ui/assets/svg/sidebar-plus.svg similarity index 100% rename from src/ui/assets/svg/sidebar-plus.svg rename to apps/extension/src/ui/assets/svg/sidebar-plus.svg diff --git a/src/ui/assets/svg/slider.svg b/apps/extension/src/ui/assets/svg/slider.svg similarity index 100% rename from src/ui/assets/svg/slider.svg rename to apps/extension/src/ui/assets/svg/slider.svg diff --git a/src/ui/assets/svg/stakeIcon.svg b/apps/extension/src/ui/assets/svg/stakeIcon.svg similarity index 100% rename from src/ui/assets/svg/stakeIcon.svg rename to apps/extension/src/ui/assets/svg/stakeIcon.svg diff --git a/src/ui/assets/svg/staking.svg b/apps/extension/src/ui/assets/svg/staking.svg similarity index 100% rename from src/ui/assets/svg/staking.svg rename to apps/extension/src/ui/assets/svg/staking.svg diff --git a/src/ui/assets/svg/swapIcon.svg b/apps/extension/src/ui/assets/svg/swapIcon.svg similarity index 100% rename from src/ui/assets/svg/swapIcon.svg rename to apps/extension/src/ui/assets/svg/swapIcon.svg diff --git a/src/ui/assets/svg/tabler.svg b/apps/extension/src/ui/assets/svg/tabler.svg similarity index 100% rename from src/ui/assets/svg/tabler.svg rename to apps/extension/src/ui/assets/svg/tabler.svg diff --git a/src/ui/assets/svg/testnet.svg b/apps/extension/src/ui/assets/svg/testnet.svg similarity index 100% rename from src/ui/assets/svg/testnet.svg rename to apps/extension/src/ui/assets/svg/testnet.svg diff --git a/src/ui/assets/svg/testnetArrow.svg b/apps/extension/src/ui/assets/svg/testnetArrow.svg similarity index 100% rename from src/ui/assets/svg/testnetArrow.svg rename to apps/extension/src/ui/assets/svg/testnetArrow.svg diff --git a/src/ui/assets/svg/testnetMigrationArrow.svg b/apps/extension/src/ui/assets/svg/testnetMigrationArrow.svg similarity index 100% rename from src/ui/assets/svg/testnetMigrationArrow.svg rename to apps/extension/src/ui/assets/svg/testnetMigrationArrow.svg diff --git a/src/ui/assets/svg/tips.svg b/apps/extension/src/ui/assets/svg/tips.svg similarity index 100% rename from src/ui/assets/svg/tips.svg rename to apps/extension/src/ui/assets/svg/tips.svg diff --git a/src/ui/assets/svg/transactionFeeIcon.svg b/apps/extension/src/ui/assets/svg/transactionFeeIcon.svg similarity index 100% rename from src/ui/assets/svg/transactionFeeIcon.svg rename to apps/extension/src/ui/assets/svg/transactionFeeIcon.svg diff --git a/src/ui/assets/svg/unlink.svg b/apps/extension/src/ui/assets/svg/unlink.svg similarity index 100% rename from src/ui/assets/svg/unlink.svg rename to apps/extension/src/ui/assets/svg/unlink.svg diff --git a/src/ui/assets/svg/user-circle-check.svg b/apps/extension/src/ui/assets/svg/user-circle-check.svg similarity index 100% rename from src/ui/assets/svg/user-circle-check.svg rename to apps/extension/src/ui/assets/svg/user-circle-check.svg diff --git a/src/ui/assets/svg/user-circle-gear.svg b/apps/extension/src/ui/assets/svg/user-circle-gear.svg similarity index 100% rename from src/ui/assets/svg/user-circle-gear.svg rename to apps/extension/src/ui/assets/svg/user-circle-gear.svg diff --git a/src/ui/assets/svg/user-circle-plus.svg b/apps/extension/src/ui/assets/svg/user-circle-plus.svg similarity index 100% rename from src/ui/assets/svg/user-circle-plus.svg rename to apps/extension/src/ui/assets/svg/user-circle-plus.svg diff --git a/src/ui/assets/svg/verfied-check.svg b/apps/extension/src/ui/assets/svg/verfied-check.svg similarity index 100% rename from src/ui/assets/svg/verfied-check.svg rename to apps/extension/src/ui/assets/svg/verfied-check.svg diff --git a/src/ui/assets/svg/viewmore.svg b/apps/extension/src/ui/assets/svg/viewmore.svg similarity index 100% rename from src/ui/assets/svg/viewmore.svg rename to apps/extension/src/ui/assets/svg/viewmore.svg diff --git a/src/ui/assets/svg/warning.svg b/apps/extension/src/ui/assets/svg/warning.svg similarity index 100% rename from src/ui/assets/svg/warning.svg rename to apps/extension/src/ui/assets/svg/warning.svg diff --git a/apps/extension/src/ui/assets/svg/welcomeWallet.svg b/apps/extension/src/ui/assets/svg/welcomeWallet.svg new file mode 100644 index 000000000..cdbcea85a --- /dev/null +++ b/apps/extension/src/ui/assets/svg/welcomeWallet.svg @@ -0,0 +1,15 @@ + +
+ + + + + +
+
+ + + + + +
diff --git a/src/ui/assets/svg/xLogo.svg b/apps/extension/src/ui/assets/svg/xLogo.svg similarity index 100% rename from src/ui/assets/svg/xLogo.svg rename to apps/extension/src/ui/assets/svg/xLogo.svg diff --git a/src/ui/assets/swap.svg b/apps/extension/src/ui/assets/swap.svg similarity index 100% rename from src/ui/assets/swap.svg rename to apps/extension/src/ui/assets/swap.svg diff --git a/src/ui/assets/switch-lang.svg b/apps/extension/src/ui/assets/switch-lang.svg similarity index 100% rename from src/ui/assets/switch-lang.svg rename to apps/extension/src/ui/assets/switch-lang.svg diff --git a/src/ui/assets/tag-notyou.svg b/apps/extension/src/ui/assets/tag-notyou.svg similarity index 100% rename from src/ui/assets/tag-notyou.svg rename to apps/extension/src/ui/assets/tag-notyou.svg diff --git a/src/ui/assets/tag-you.svg b/apps/extension/src/ui/assets/tag-you.svg similarity index 100% rename from src/ui/assets/tag-you.svg rename to apps/extension/src/ui/assets/tag-you.svg diff --git a/src/ui/assets/time.svg b/apps/extension/src/ui/assets/time.svg similarity index 100% rename from src/ui/assets/time.svg rename to apps/extension/src/ui/assets/time.svg diff --git a/src/ui/assets/token-default.svg b/apps/extension/src/ui/assets/token-default.svg similarity index 100% rename from src/ui/assets/token-default.svg rename to apps/extension/src/ui/assets/token-default.svg diff --git a/src/ui/assets/tokenSearch.png b/apps/extension/src/ui/assets/tokenSearch.png similarity index 100% rename from src/ui/assets/tokenSearch.png rename to apps/extension/src/ui/assets/tokenSearch.png diff --git a/src/ui/assets/trezor.svg b/apps/extension/src/ui/assets/trezor.svg similarity index 100% rename from src/ui/assets/trezor.svg rename to apps/extension/src/ui/assets/trezor.svg diff --git a/src/ui/assets/uncheck.svg b/apps/extension/src/ui/assets/uncheck.svg similarity index 100% rename from src/ui/assets/uncheck.svg rename to apps/extension/src/ui/assets/uncheck.svg diff --git a/src/ui/assets/unchecked.svg b/apps/extension/src/ui/assets/unchecked.svg similarity index 100% rename from src/ui/assets/unchecked.svg rename to apps/extension/src/ui/assets/unchecked.svg diff --git a/src/ui/assets/unknown-protocol.svg b/apps/extension/src/ui/assets/unknown-protocol.svg similarity index 100% rename from src/ui/assets/unknown-protocol.svg rename to apps/extension/src/ui/assets/unknown-protocol.svg diff --git a/src/ui/assets/unlink.svg b/apps/extension/src/ui/assets/unlink.svg similarity index 100% rename from src/ui/assets/unlink.svg rename to apps/extension/src/ui/assets/unlink.svg diff --git a/src/ui/assets/unlock-logo.svg b/apps/extension/src/ui/assets/unlock-logo.svg similarity index 100% rename from src/ui/assets/unlock-logo.svg rename to apps/extension/src/ui/assets/unlock-logo.svg diff --git a/src/ui/assets/unlock-mask.svg b/apps/extension/src/ui/assets/unlock-mask.svg similarity index 100% rename from src/ui/assets/unlock-mask.svg rename to apps/extension/src/ui/assets/unlock-mask.svg diff --git a/src/ui/assets/up-and-down.svg b/apps/extension/src/ui/assets/up-and-down.svg similarity index 100% rename from src/ui/assets/up-and-down.svg rename to apps/extension/src/ui/assets/up-and-down.svg diff --git a/src/ui/assets/uploader.svg b/apps/extension/src/ui/assets/uploader.svg similarity index 100% rename from src/ui/assets/uploader.svg rename to apps/extension/src/ui/assets/uploader.svg diff --git a/src/ui/assets/urlcopy.svg b/apps/extension/src/ui/assets/urlcopy.svg similarity index 100% rename from src/ui/assets/urlcopy.svg rename to apps/extension/src/ui/assets/urlcopy.svg diff --git a/src/ui/assets/urlrefresh.svg b/apps/extension/src/ui/assets/urlrefresh.svg similarity index 100% rename from src/ui/assets/urlrefresh.svg rename to apps/extension/src/ui/assets/urlrefresh.svg diff --git a/src/ui/assets/waitcup.svg b/apps/extension/src/ui/assets/waitcup.svg similarity index 100% rename from src/ui/assets/waitcup.svg rename to apps/extension/src/ui/assets/waitcup.svg diff --git a/src/ui/assets/walletconnect-corner.png b/apps/extension/src/ui/assets/walletconnect-corner.png similarity index 100% rename from src/ui/assets/walletconnect-corner.png rename to apps/extension/src/ui/assets/walletconnect-corner.png diff --git a/src/ui/assets/walletconnect.svg b/apps/extension/src/ui/assets/walletconnect.svg similarity index 100% rename from src/ui/assets/walletconnect.svg rename to apps/extension/src/ui/assets/walletconnect.svg diff --git a/src/ui/assets/warning.svg b/apps/extension/src/ui/assets/warning.svg similarity index 100% rename from src/ui/assets/warning.svg rename to apps/extension/src/ui/assets/warning.svg diff --git a/src/ui/assets/watch-address.svg b/apps/extension/src/ui/assets/watch-address.svg similarity index 100% rename from src/ui/assets/watch-address.svg rename to apps/extension/src/ui/assets/watch-address.svg diff --git a/src/ui/assets/watch-logo.svg b/apps/extension/src/ui/assets/watch-logo.svg similarity index 100% rename from src/ui/assets/watch-logo.svg rename to apps/extension/src/ui/assets/watch-logo.svg diff --git a/src/ui/assets/watch-purple.svg b/apps/extension/src/ui/assets/watch-purple.svg similarity index 100% rename from src/ui/assets/watch-purple.svg rename to apps/extension/src/ui/assets/watch-purple.svg diff --git a/src/ui/assets/watch-white.svg b/apps/extension/src/ui/assets/watch-white.svg similarity index 100% rename from src/ui/assets/watch-white.svg rename to apps/extension/src/ui/assets/watch-white.svg diff --git a/src/ui/assets/wcbg.svg b/apps/extension/src/ui/assets/wcbg.svg similarity index 100% rename from src/ui/assets/wcbg.svg rename to apps/extension/src/ui/assets/wcbg.svg diff --git a/src/ui/assets/zoom.svg b/apps/extension/src/ui/assets/zoom.svg similarity index 100% rename from src/ui/assets/zoom.svg rename to apps/extension/src/ui/assets/zoom.svg diff --git a/src/ui/components/AddressLists/AccountsList.tsx b/apps/extension/src/ui/components/AddressLists/AccountsList.tsx similarity index 100% rename from src/ui/components/AddressLists/AccountsList.tsx rename to apps/extension/src/ui/components/AddressLists/AccountsList.tsx diff --git a/src/ui/components/AddressLists/AddressBookList.tsx b/apps/extension/src/ui/components/AddressLists/AddressBookList.tsx similarity index 94% rename from src/ui/components/AddressLists/AddressBookList.tsx rename to apps/extension/src/ui/components/AddressLists/AddressBookList.tsx index e7aacf1d4..d019a34a9 100644 --- a/src/ui/components/AddressLists/AddressBookList.tsx +++ b/apps/extension/src/ui/components/AddressLists/AddressBookList.tsx @@ -1,9 +1,9 @@ -import { List, ListSubheader, CardMedia, Typography, ButtonBase, Box } from '@mui/material'; +import { Box, ButtonBase, CardMedia, List, ListSubheader, Typography } from '@mui/material'; import { groupBy } from 'lodash'; import React, { useEffect, useState } from 'react'; +import emptyAddress from '@/ui/assets/emptyAddress.svg'; import { LLContactCard } from '@/ui/components'; -import emptyAddress from 'ui/assets/emptyAddress.svg'; const AddressBookList = ({ filteredContacts, isLoading, handleClick }) => { const [grouped, setGrouped] = useState([]); diff --git a/src/ui/components/AddressLists/RecentList.tsx b/apps/extension/src/ui/components/AddressLists/RecentList.tsx similarity index 87% rename from src/ui/components/AddressLists/RecentList.tsx rename to apps/extension/src/ui/components/AddressLists/RecentList.tsx index 7ed7628e8..5d6b342ad 100644 --- a/src/ui/components/AddressLists/RecentList.tsx +++ b/apps/extension/src/ui/components/AddressLists/RecentList.tsx @@ -1,11 +1,10 @@ -import { List, CardMedia, Typography, ButtonBase, Box } from '@mui/material'; -import { isEmpty } from 'lodash'; +import { Box, ButtonBase, CardMedia, List, Typography } from '@mui/material'; import React from 'react'; -import emptyAddress from 'ui/assets/emptyAddress.svg'; -import { isEmoji } from 'ui/utils'; +import emptyAddress from '@/ui/assets/emptyAddress.svg'; +import { isEmoji } from '@/ui/utils'; -import { LLContactCard, FWContactCard } from '..'; +import { FWContactCard, LLContactCard } from '..'; const RecentList = ({ filteredContacts, isLoading, handleClick }) => { return ( diff --git a/src/ui/components/AddressLists/SearchList.tsx b/apps/extension/src/ui/components/AddressLists/SearchList.tsx similarity index 90% rename from src/ui/components/AddressLists/SearchList.tsx rename to apps/extension/src/ui/components/AddressLists/SearchList.tsx index 0b4346c3a..439b7598a 100644 --- a/src/ui/components/AddressLists/SearchList.tsx +++ b/apps/extension/src/ui/components/AddressLists/SearchList.tsx @@ -1,9 +1,10 @@ -import { List, ListSubheader, CardMedia, Typography, ButtonBase, Box } from '@mui/material'; -import { groupBy, isEmpty } from 'lodash'; +import { Box, ButtonBase, CardMedia, List, ListSubheader, Typography } from '@mui/material'; +import { groupBy } from 'lodash'; import React, { useEffect, useState } from 'react'; -import { type Contact } from '@/shared/types/network-types'; -import emptyAddress from 'ui/assets/emptyAddress.svg'; +import { type Contact } from '@onflow/flow-wallet-shared/types/network-types'; + +import emptyAddress from '@/ui/assets/emptyAddress.svg'; import { LLContactCard } from '..'; diff --git a/src/ui/components/Approval/SignHeader.tsx b/apps/extension/src/ui/components/Approval/SignHeader.tsx similarity index 94% rename from src/ui/components/Approval/SignHeader.tsx rename to apps/extension/src/ui/components/Approval/SignHeader.tsx index ba341e1df..a48d36231 100644 --- a/src/ui/components/Approval/SignHeader.tsx +++ b/apps/extension/src/ui/components/Approval/SignHeader.tsx @@ -1,13 +1,12 @@ -import { Box, CardMedia, Typography } from '@mui/material'; -import Avatar from '@mui/material/Avatar'; -import React, { useState, useEffect } from 'react'; -import { useHistory } from 'react-router-dom'; +import { Box, Typography } from '@mui/material'; +import React, { useEffect, useState } from 'react'; +import { useNavigate } from 'react-router'; -import IconCheck from 'ui/assets/check.svg'; -import { LLPrimaryButton } from 'ui/components'; +import IconCheck from '@/ui/assets/check.svg'; +import { LLPrimaryButton } from '@/ui/components'; export const SignHeader = ({ linkingDone, image, accountTitle, userInfo }) => { - const history = useHistory(); + const navigate = useNavigate(); const [count, setCount] = useState(0); const colorArray = [ 'rgba(94,94,94,0.3)', @@ -32,7 +31,7 @@ export const SignHeader = ({ linkingDone, image, accountTitle, userInfo }) => { const startUsing = () => { setTimeout(() => { - history.replace('/'); + navigate('/'); }); }; diff --git a/src/ui/components/Approval/index.tsx b/apps/extension/src/ui/components/Approval/index.tsx similarity index 100% rename from src/ui/components/Approval/index.tsx rename to apps/extension/src/ui/components/Approval/index.tsx diff --git a/src/ui/components/BrowserWarning.tsx b/apps/extension/src/ui/components/BrowserWarning.tsx similarity index 94% rename from src/ui/components/BrowserWarning.tsx rename to apps/extension/src/ui/components/BrowserWarning.tsx index 490994eab..ea60583fb 100644 --- a/src/ui/components/BrowserWarning.tsx +++ b/apps/extension/src/ui/components/BrowserWarning.tsx @@ -1,7 +1,7 @@ import { Alert, AlertTitle, Box } from '@mui/material'; import React, { useEffect, useState } from 'react'; -import { isChrome } from '../utils/browser'; +import { isChrome } from '@/ui/utils/browser'; const BrowserWarning = () => { const [isVisible, setIsVisible] = useState(false); // assume Chrome until checked diff --git a/src/ui/components/ButtonRow.tsx b/apps/extension/src/ui/components/ButtonRow.tsx similarity index 100% rename from src/ui/components/ButtonRow.tsx rename to apps/extension/src/ui/components/ButtonRow.tsx diff --git a/src/ui/components/CoinsIcon.tsx b/apps/extension/src/ui/components/CoinsIcon.tsx similarity index 100% rename from src/ui/components/CoinsIcon.tsx rename to apps/extension/src/ui/components/CoinsIcon.tsx diff --git a/src/ui/components/Confetti.tsx b/apps/extension/src/ui/components/Confetti.tsx similarity index 92% rename from src/ui/components/Confetti.tsx rename to apps/extension/src/ui/components/Confetti.tsx index 2e413a7f9..5b7dd2177 100644 --- a/src/ui/components/Confetti.tsx +++ b/apps/extension/src/ui/components/Confetti.tsx @@ -1,10 +1,13 @@ import Particles, { initParticlesEngine, type IParticlesProps } from '@tsparticles/react'; -import React, { useEffect, useRef } from 'react'; +import React, { useEffect, useRef, useState } from 'react'; import { loadFull } from 'tsparticles'; const CONFETTI_OPTIONS: IParticlesProps['options'] = { + backgroundMode: { + enable: true, + }, fullScreen: { - zIndex: 1, + zIndex: -1, }, emitters: [ { @@ -140,6 +143,8 @@ const CONFETTI_OPTIONS: IParticlesProps['options'] = { }; export const useParticlesInit = () => { + const [isInitialized, setIsInitialized] = useState(false); + const initRef = useRef | null | boolean>(false); useEffect(() => { @@ -147,12 +152,14 @@ export const useParticlesInit = () => { initRef.current = initParticlesEngine(async (engine) => { await loadFull(engine); }).then(() => { + setIsInitialized(true); + return true; }); } }, []); - return !!initRef.current; + return isInitialized; }; // Confetti component @@ -160,7 +167,6 @@ export const useParticlesInit = () => { // It would be a good idea to replace it with react-confetti const Confetti = () => { const isInitialized = useParticlesInit(); - if (!isInitialized) { return null; } diff --git a/src/ui/components/CopyButton.tsx b/apps/extension/src/ui/components/CopyButton.tsx similarity index 100% rename from src/ui/components/CopyButton.tsx rename to apps/extension/src/ui/components/CopyButton.tsx diff --git a/src/ui/components/CredentialBox.tsx b/apps/extension/src/ui/components/CredentialBox.tsx similarity index 96% rename from src/ui/components/CredentialBox.tsx rename to apps/extension/src/ui/components/CredentialBox.tsx index 51e60c4b2..f41d7c581 100644 --- a/src/ui/components/CredentialBox.tsx +++ b/apps/extension/src/ui/components/CredentialBox.tsx @@ -1,6 +1,5 @@ import { Box, IconButton, Typography } from '@mui/material'; import Grid from '@mui/material/Grid'; -import { styled } from '@mui/material/styles'; import React from 'react'; import IconCopy from '@/ui/components/iconfont/IconCopy'; diff --git a/src/ui/components/EnableEvm.tsx b/apps/extension/src/ui/components/EnableEvm.tsx similarity index 94% rename from src/ui/components/EnableEvm.tsx rename to apps/extension/src/ui/components/EnableEvm.tsx index 2e26b1f1d..f8a1ea9a0 100644 --- a/src/ui/components/EnableEvm.tsx +++ b/apps/extension/src/ui/components/EnableEvm.tsx @@ -1,7 +1,7 @@ import { Box, CardMedia, Typography } from '@mui/material'; import React from 'react'; -import enableBg from 'ui/assets/image/enableBg.png'; +import enableBg from '@/ui/assets/image/enableBg.png'; export const EnableEvm = () => { return ( diff --git a/src/ui/components/FRWChildProfile.tsx b/apps/extension/src/ui/components/FRWChildProfile.tsx similarity index 84% rename from src/ui/components/FRWChildProfile.tsx rename to apps/extension/src/ui/components/FRWChildProfile.tsx index df9aa9286..cee45ccd4 100644 --- a/src/ui/components/FRWChildProfile.tsx +++ b/apps/extension/src/ui/components/FRWChildProfile.tsx @@ -1,8 +1,7 @@ -import { Box, Typography, Avatar } from '@mui/material'; -import React, { useState, useEffect, useCallback } from 'react'; +import { Avatar, Box, Typography } from '@mui/material'; +import React from 'react'; -import { isValidEthereumAddress } from '@/shared/utils/address'; -import { useWallet } from 'ui/utils'; +import { useWallet } from '@/ui/hooks/use-wallet'; export const FRWChildProfile = ({ contact, address, isLoading = false }) => { const usewallet = useWallet(); diff --git a/src/ui/components/FRWDropdownProfileCard.tsx b/apps/extension/src/ui/components/FRWDropdownProfileCard.tsx similarity index 97% rename from src/ui/components/FRWDropdownProfileCard.tsx rename to apps/extension/src/ui/components/FRWDropdownProfileCard.tsx index cf94d361a..c873d63e1 100644 --- a/src/ui/components/FRWDropdownProfileCard.tsx +++ b/apps/extension/src/ui/components/FRWDropdownProfileCard.tsx @@ -1,17 +1,18 @@ import { - Box, - Typography, Avatar, - Skeleton, - Select, - MenuItem, + Box, FormControl, + MenuItem, + Select, + Skeleton, + Typography, type SelectChangeEvent, } from '@mui/material'; import React, { useEffect } from 'react'; -import { type Contact } from '@/shared/types/network-types'; -import { formatAddress, isEmoji } from 'ui/utils'; +import { type Contact } from '@onflow/flow-wallet-shared/types/network-types'; + +import { formatAddress, isEmoji } from '@/ui/utils'; export const FRWDropdownProfileCard = ({ contacts, diff --git a/src/ui/components/FRWHoldButton.tsx b/apps/extension/src/ui/components/FRWHoldButton.tsx similarity index 100% rename from src/ui/components/FRWHoldButton.tsx rename to apps/extension/src/ui/components/FRWHoldButton.tsx diff --git a/src/ui/components/FRWProfile.tsx b/apps/extension/src/ui/components/FRWProfile.tsx similarity index 92% rename from src/ui/components/FRWProfile.tsx rename to apps/extension/src/ui/components/FRWProfile.tsx index ba39479b2..26bbc5b01 100644 --- a/src/ui/components/FRWProfile.tsx +++ b/apps/extension/src/ui/components/FRWProfile.tsx @@ -1,8 +1,9 @@ -import { Box, Typography, Avatar, Skeleton } from '@mui/material'; -import React, { useState, useEffect, useCallback } from 'react'; +import { Box, Skeleton, Typography } from '@mui/material'; +import React, { useCallback, useEffect, useState } from 'react'; +import { useWallet } from '@/ui/hooks/use-wallet'; import { useProfiles } from '@/ui/hooks/useProfileHook'; -import { useWallet, formatAddress, isEmoji } from 'ui/utils'; +import { formatAddress, isEmoji } from '@/ui/utils'; const tempEmoji = { emoji: '🥥', diff --git a/src/ui/components/FRWProfileCard.tsx b/apps/extension/src/ui/components/FRWProfileCard.tsx similarity index 92% rename from src/ui/components/FRWProfileCard.tsx rename to apps/extension/src/ui/components/FRWProfileCard.tsx index b438e3a23..3bd1b03bd 100644 --- a/src/ui/components/FRWProfileCard.tsx +++ b/apps/extension/src/ui/components/FRWProfileCard.tsx @@ -1,9 +1,10 @@ -import { Box, Typography, Skeleton } from '@mui/material'; -import React, { useState, useEffect, useCallback } from 'react'; +import { Box, Skeleton, Typography } from '@mui/material'; +import React, { useCallback, useEffect, useState } from 'react'; + +import { isValidEthereumAddress } from '@onflow/flow-wallet-shared/utils/address'; -import { isValidEthereumAddress } from '@/shared/utils/address'; import { useProfiles } from '@/ui/hooks/useProfileHook'; -import { formatAddress } from 'ui/utils'; +import { formatAddress } from '@/ui/utils'; const tempEmoji = { emoji: '🥥', diff --git a/src/ui/components/FRWTargetProfile.tsx b/apps/extension/src/ui/components/FRWTargetProfile.tsx similarity index 90% rename from src/ui/components/FRWTargetProfile.tsx rename to apps/extension/src/ui/components/FRWTargetProfile.tsx index 96c8024bc..e67cf03d6 100644 --- a/src/ui/components/FRWTargetProfile.tsx +++ b/apps/extension/src/ui/components/FRWTargetProfile.tsx @@ -1,11 +1,11 @@ -import { Box, Typography, Avatar, Skeleton } from '@mui/material'; +import { Box, Skeleton, Typography } from '@mui/material'; import { ThemeProvider } from '@mui/material/styles'; -import React, { useState, useEffect, useCallback } from 'react'; +import React, { useCallback, useEffect, useState } from 'react'; +import { useWallet } from '@/ui/hooks/use-wallet'; import { useProfiles } from '@/ui/hooks/useProfileHook'; -import { useWallet, formatAddress, isEmoji } from 'ui/utils'; - -import theme from '../style/LLTheme'; +import theme from '@/ui/style/LLTheme'; +import { formatAddress, isEmoji } from '@/ui/utils'; const tempEmoji = { emoji: '🥥', diff --git a/src/ui/components/FWContactCard.tsx b/apps/extension/src/ui/components/FWContactCard.tsx similarity index 90% rename from src/ui/components/FWContactCard.tsx rename to apps/extension/src/ui/components/FWContactCard.tsx index a3e253d96..535c4a5ec 100644 --- a/src/ui/components/FWContactCard.tsx +++ b/apps/extension/src/ui/components/FWContactCard.tsx @@ -1,16 +1,18 @@ import PersonAddAltIcon from '@mui/icons-material/PersonAddAlt'; -import { Box, Typography, Avatar, IconButton, CardMedia, Skeleton } from '@mui/material'; +import { Box, CardMedia, IconButton, Skeleton, Typography } from '@mui/material'; import React, { useState } from 'react'; -import { useHistory } from 'react-router-dom'; +import { useNavigate } from 'react-router'; -import { ContactType } from '@/shared/types/network-types'; -import closex from 'ui/assets/closex.svg'; -import { useWallet, formatAddress } from 'ui/utils'; +import { ContactType } from '@onflow/flow-wallet-shared/types/network-types'; + +import closex from '@/ui/assets/closex.svg'; +import { useWallet } from '@/ui/hooks/use-wallet'; +import { formatAddress } from '@/ui/utils'; export const FWContactCard = ({ contact, hideCloseButton, isSend = false, isLoading = false }) => { const wallet = useWallet(); - const history = useHistory(); + const navigate = useNavigate(); const [contactAdd, setContactAdd] = useState(false); const DomainLogo = () => { @@ -128,7 +130,7 @@ export const FWContactCard = ({ contact, hideCloseButton, isSend = false, isLoad { e.stopPropagation(); - history.push(`/dashboard/token/flow/send/${contact.address}`); + navigate(`/dashboard/token/flow/send/${contact.address}`); }} > diff --git a/src/ui/components/FWDropDownProfile.tsx b/apps/extension/src/ui/components/FWDropDownProfile.tsx similarity index 92% rename from src/ui/components/FWDropDownProfile.tsx rename to apps/extension/src/ui/components/FWDropDownProfile.tsx index 6125783e0..181d9b076 100644 --- a/src/ui/components/FWDropDownProfile.tsx +++ b/apps/extension/src/ui/components/FWDropDownProfile.tsx @@ -1,17 +1,8 @@ -import { - Box, - Typography, - Avatar, - Skeleton, - Select, - MenuItem, - FormControl, - InputLabel, -} from '@mui/material'; -import React, { useState, useEffect, useCallback } from 'react'; +import { Avatar, Box, FormControl, MenuItem, Select, Typography } from '@mui/material'; +import React, { useEffect } from 'react'; -import { isValidEthereumAddress } from '@/shared/utils/address'; -import { useWallet, isEmoji, formatAddress } from 'ui/utils'; +import { useWallet } from '@/ui/hooks/use-wallet'; +import { formatAddress, isEmoji } from '@/ui/utils'; export const FWDropDownProfile = ({ contact, diff --git a/src/ui/components/FWMoveDropdown.tsx b/apps/extension/src/ui/components/FWMoveDropdown.tsx similarity index 92% rename from src/ui/components/FWMoveDropdown.tsx rename to apps/extension/src/ui/components/FWMoveDropdown.tsx index 8e34133c7..a5edb8627 100644 --- a/src/ui/components/FWMoveDropdown.tsx +++ b/apps/extension/src/ui/components/FWMoveDropdown.tsx @@ -1,19 +1,17 @@ import { - Box, - Typography, Avatar, - Skeleton, - Select, - MenuItem, + Box, FormControl, - InputLabel, + MenuItem, + Select, + Typography, type SelectChangeEvent, } from '@mui/material'; -import React, { useState, useEffect, useCallback } from 'react'; +import React, { useEffect } from 'react'; + +import { type Contact } from '@onflow/flow-wallet-shared/types/network-types'; -import { type Contact } from '@/shared/types/network-types'; -import { isValidEthereumAddress } from '@/shared/utils/address'; -import { useWallet, isEmoji, formatAddress } from 'ui/utils'; +import { formatAddress, isEmoji } from '@/ui/utils'; interface FWMoveDropdownProps { contacts: Contact[]; diff --git a/src/ui/components/GeneralPages/NFTDrawer.tsx b/apps/extension/src/ui/components/GeneralPages/NFTDrawer.tsx similarity index 97% rename from src/ui/components/GeneralPages/NFTDrawer.tsx rename to apps/extension/src/ui/components/GeneralPages/NFTDrawer.tsx index 287797d8e..1a3a1f89a 100644 --- a/src/ui/components/GeneralPages/NFTDrawer.tsx +++ b/apps/extension/src/ui/components/GeneralPages/NFTDrawer.tsx @@ -1,12 +1,12 @@ // src/ui/views/MoveBoard/components/NFTMoveDrawer.tsx import CloseIcon from '@mui/icons-material/Close'; -import { Box, Button, Typography, Drawer, IconButton, CardMedia, Skeleton } from '@mui/material'; +import { Box, Button, CardMedia, Drawer, IconButton, Skeleton, Typography } from '@mui/material'; import React, { useState } from 'react'; +import moveSelectDrop from '@/ui/assets/svg/moveSelectDrop.svg'; +import selected from '@/ui/assets/svg/selected.svg'; +import { LLSpinner } from '@/ui/components'; import NftSearch from '@/ui/components/NFTs/NftSearch'; -import moveSelectDrop from 'ui/assets/svg/moveSelectDrop.svg'; -import selected from 'ui/assets/svg/selected.svg'; -import { LLSpinner } from 'ui/components'; interface NFTMoveDrawerProps { showMoveBoard: boolean; diff --git a/src/ui/components/GeneralPages/index.tsx b/apps/extension/src/ui/components/GeneralPages/index.tsx similarity index 100% rename from src/ui/components/GeneralPages/index.tsx rename to apps/extension/src/ui/components/GeneralPages/index.tsx diff --git a/src/ui/components/IconButton.tsx b/apps/extension/src/ui/components/IconButton.tsx similarity index 100% rename from src/ui/components/IconButton.tsx rename to apps/extension/src/ui/components/IconButton.tsx diff --git a/src/ui/components/KeyPathInputs.tsx b/apps/extension/src/ui/components/KeyPathInputs.tsx similarity index 92% rename from src/ui/components/KeyPathInputs.tsx rename to apps/extension/src/ui/components/KeyPathInputs.tsx index 0ec1441d6..40a7c3440 100644 --- a/src/ui/components/KeyPathInputs.tsx +++ b/apps/extension/src/ui/components/KeyPathInputs.tsx @@ -1,17 +1,18 @@ import { + Accordion, + AccordionDetails, + AccordionSummary, Box, - Typography, CardMedia, TextareaAutosize, - Accordion, - AccordionSummary, - AccordionDetails, + Typography, } from '@mui/material'; import { styled } from '@mui/material/styles'; import React, { useState } from 'react'; -import Expand from '../assets/svg/expand.svg'; -import Hide from '../assets/svg/hide.svg'; +import Expand from '@/ui/assets/svg/expand.svg'; +import Hide from '@/ui/assets/svg/hide.svg'; +import { COLOR_DARKMODE_WHITE_3pc } from '@/ui/style/color'; const StyledAccordionSummary = styled(AccordionSummary)(({ theme }) => ({ flexDirection: 'row-reverse', @@ -60,7 +61,7 @@ const KeyPathInput = ({ aria-controls="additional-options-content" id="additional-options-header" > - Advance + Advanced { const wallet = useWallet(); - const history = useHistory(); + const navigate = useNavigate(); const [contactAdd, setContactAdd] = useState(false); const getName = (name: string) => { @@ -132,7 +134,7 @@ export const LLContactCard = ({ contact, hideCloseButton, isSend = false, isLoad { e.stopPropagation(); - history.push(`/dashboard/token/flow/send/${contact.address}`); + navigate(`/dashboard/token/flow/send/${contact.address}`); }} > diff --git a/src/ui/components/LLContactEth.tsx b/apps/extension/src/ui/components/LLContactEth.tsx similarity index 89% rename from src/ui/components/LLContactEth.tsx rename to apps/extension/src/ui/components/LLContactEth.tsx index 80db823c2..e2983e756 100644 --- a/src/ui/components/LLContactEth.tsx +++ b/apps/extension/src/ui/components/LLContactEth.tsx @@ -1,16 +1,18 @@ import PersonAddAltIcon from '@mui/icons-material/PersonAddAlt'; -import { Box, Typography, Avatar, IconButton, CardMedia, Skeleton } from '@mui/material'; +import { Box, CardMedia, IconButton, Skeleton, Typography } from '@mui/material'; import React, { useState } from 'react'; -import { useHistory } from 'react-router-dom'; +import { useNavigate } from 'react-router'; -import { ContactType } from '@/shared/types/network-types'; -import closex from 'ui/assets/closex.svg'; -import { useWallet, formatAddress } from 'ui/utils'; +import { ContactType } from '@onflow/flow-wallet-shared/types/network-types'; + +import closex from '@/ui/assets/closex.svg'; +import { useWallet } from '@/ui/hooks/use-wallet'; +import { formatAddress } from '@/ui/utils'; export const LLContactEth = ({ contact, hideCloseButton, isSend = false, isLoading = false }) => { const wallet = useWallet(); - const history = useHistory(); + const navigate = useNavigate(); const [contactAdd, setContactAdd] = useState(false); const DomainLogo = () => { @@ -118,7 +120,7 @@ export const LLContactEth = ({ contact, hideCloseButton, isSend = false, isLoadi { e.stopPropagation(); - history.push(`/dashboard/token/flow/send/${contact.address}`); + navigate(`/dashboard/token/flow/send/${contact.address}`); }} > diff --git a/src/ui/components/LLDeleteBackupPopup.tsx b/apps/extension/src/ui/components/LLDeleteBackupPopup.tsx similarity index 94% rename from src/ui/components/LLDeleteBackupPopup.tsx rename to apps/extension/src/ui/components/LLDeleteBackupPopup.tsx index db1e13b0c..cc6846b65 100644 --- a/src/ui/components/LLDeleteBackupPopup.tsx +++ b/apps/extension/src/ui/components/LLDeleteBackupPopup.tsx @@ -1,8 +1,8 @@ -import { Typography, Box, Drawer, Stack } from '@mui/material'; +import { Box, Drawer, Stack, Typography } from '@mui/material'; import React from 'react'; +import { LLPrimaryButton, LLSecondaryButton } from '@/ui/components'; import IconSubtract from '@/ui/components/iconfont/IconSubtract'; -import { LLPrimaryButton, LLSecondaryButton } from 'ui/components'; interface DeleteBackupProps { deleteBackupPop: boolean; diff --git a/src/ui/components/LLFormHelperText.tsx b/apps/extension/src/ui/components/LLFormHelperText.tsx similarity index 100% rename from src/ui/components/LLFormHelperText.tsx rename to apps/extension/src/ui/components/LLFormHelperText.tsx diff --git a/apps/extension/src/ui/components/LLHeader.tsx b/apps/extension/src/ui/components/LLHeader.tsx new file mode 100644 index 000000000..fdf412768 --- /dev/null +++ b/apps/extension/src/ui/components/LLHeader.tsx @@ -0,0 +1,65 @@ +import ArrowBackIcon from '@mui/icons-material/ArrowBack'; +import HelpOutlineRoundedIcon from '@mui/icons-material/HelpOutlineRounded'; +import { IconButton, Typography, Tooltip } from '@mui/material'; +import Grid from '@mui/material/Grid'; +import React from 'react'; +import { useNavigate } from 'react-router'; + +interface LLHeaderProps { + title: string | JSX.Element; + help: boolean | JSX.Element; + goBackLink?: string; // Optional link + right?: React.ReactNode; +} + +export const LLHeader = (props: LLHeaderProps) => { + // const { label, ...inherentProps } = props; + const navigate = useNavigate(); + const handleGoBack = () => { + if (props.goBackLink) { + navigate(props.goBackLink); + } else { + // Fall back to browser history + navigate(-1); + } + }; + + return ( + + + + + + + + + {props.title} + + + {props.right ? ( + + {props.right} + + ) : ( + props.help && ( + + + + + + + + + + ) + )} + + ); +}; diff --git a/src/ui/components/LLLinkingLoading.tsx b/apps/extension/src/ui/components/LLLinkingLoading.tsx similarity index 94% rename from src/ui/components/LLLinkingLoading.tsx rename to apps/extension/src/ui/components/LLLinkingLoading.tsx index eb3687e0e..cb35d0b25 100644 --- a/src/ui/components/LLLinkingLoading.tsx +++ b/apps/extension/src/ui/components/LLLinkingLoading.tsx @@ -1,13 +1,12 @@ -import { Box, CardMedia, Typography } from '@mui/material'; -import Avatar from '@mui/material/Avatar'; -import React, { useState, useEffect } from 'react'; -import { useHistory } from 'react-router-dom'; +import { Box, Typography } from '@mui/material'; +import React, { useEffect, useState } from 'react'; +import { useNavigate } from 'react-router'; -import IconCheck from 'ui/assets/check.svg'; -import { LLPrimaryButton } from 'ui/components'; +import IconCheck from '@/ui/assets/check.svg'; +import { LLPrimaryButton } from '@/ui/components'; export const LLLinkingLoading = ({ linkingDone, image, accountTitle, userInfo }) => { - const history = useHistory(); + const navigate = useNavigate(); const [count, setCount] = useState(0); const colorArray = [ 'rgba(94,94,94,0.3)', @@ -32,7 +31,7 @@ export const LLLinkingLoading = ({ linkingDone, image, accountTitle, userInfo }) const startUsing = () => { setTimeout(() => { - history.replace('/'); + navigate('/'); }); }; diff --git a/src/ui/components/LLNotFound.tsx b/apps/extension/src/ui/components/LLNotFound.tsx similarity index 89% rename from src/ui/components/LLNotFound.tsx rename to apps/extension/src/ui/components/LLNotFound.tsx index 266ecd3ca..8f83b7455 100644 --- a/src/ui/components/LLNotFound.tsx +++ b/apps/extension/src/ui/components/LLNotFound.tsx @@ -1,11 +1,11 @@ -import { Box, Button, Typography, CardMedia, Stack } from '@mui/material'; +import { Box, Button, CardMedia, Stack, Typography } from '@mui/material'; import React from 'react'; -import { useHistory } from 'react-router-dom'; +import { useNavigate } from 'react-router'; -import NotFoundIcon from 'ui/assets/svg/notfound.svg'; +import NotFoundIcon from '@/ui/assets/svg/notfound.svg'; export const LLNotFound = ({ setShowDialog }) => { - const history = useHistory(); + const navigate = useNavigate(); return ( <> @@ -51,7 +51,7 @@ export const LLNotFound = ({ setShowDialog }) => { +); + +export default SetPassword; diff --git a/src/ui/components/LandingPages/WelcomePage.tsx b/apps/extension/src/ui/components/LandingPages/WelcomePage.tsx similarity index 99% rename from src/ui/components/LandingPages/WelcomePage.tsx rename to apps/extension/src/ui/components/LandingPages/WelcomePage.tsx index 55d758a24..fa6ac15be 100644 --- a/src/ui/components/LandingPages/WelcomePage.tsx +++ b/apps/extension/src/ui/components/LandingPages/WelcomePage.tsx @@ -1,7 +1,7 @@ import { Typography, Button, CardMedia } from '@mui/material'; import { Box } from '@mui/system'; import React from 'react'; -import { Link } from 'react-router-dom'; +import { Link } from 'react-router'; import appicon from '@/ui/assets/image/appicon.png'; import create from '@/ui/assets/svg/create.svg'; diff --git a/apps/extension/src/ui/components/LandingPages/stories/LandingComponents.stories.tsx b/apps/extension/src/ui/components/LandingPages/stories/LandingComponents.stories.tsx new file mode 100644 index 000000000..6b0acf73a --- /dev/null +++ b/apps/extension/src/ui/components/LandingPages/stories/LandingComponents.stories.tsx @@ -0,0 +1,28 @@ +import type { StoryObj } from '@storybook/react-webpack5'; +import React from 'react'; +import { fn } from 'storybook/test'; + +import LandingComponents from '../LandingComponents'; + +const meta = { + title: 'components/LandingPages/LandingComponents', + component: LandingComponents, + decorators: [ + (Story) => { + return ; + }, + ], +}; +export default meta; + +type Story = StoryObj; + +export const Default: Story = { + args: { + activeIndex: 1, + direction: 'left', + showBackButton: true, + onBack: fn(), + children:
, + }, +}; diff --git a/apps/extension/src/ui/components/LandingPages/stories/SetPassword.stories.tsx b/apps/extension/src/ui/components/LandingPages/stories/SetPassword.stories.tsx new file mode 100644 index 000000000..059c2a139 --- /dev/null +++ b/apps/extension/src/ui/components/LandingPages/stories/SetPassword.stories.tsx @@ -0,0 +1,32 @@ +import { type Meta, type StoryObj } from '@storybook/react-webpack5'; +import { fn } from 'storybook/test'; + +import SetPassword from '@/ui/components/LandingPages/SetPassword'; + +const meta: Meta = { + title: 'Components/LandingPages/SetPassword', + tags: ['autodocs'], + component: SetPassword, + args: { + onSubmit: fn(), + isLogin: false, + }, +}; + +export default meta; + +type Story = StoryObj; + +export const RegisterSetPassword: Story = { + args: { + onSubmit: fn(), + isLogin: false, + }, +}; + +export const LoginSetPassword: Story = { + args: { + onSubmit: fn(), + isLogin: true, + }, +}; diff --git a/src/ui/components/NFTs/CollectionDetailGrid.tsx b/apps/extension/src/ui/components/NFTs/CollectionDetailGrid.tsx similarity index 98% rename from src/ui/components/NFTs/CollectionDetailGrid.tsx rename to apps/extension/src/ui/components/NFTs/CollectionDetailGrid.tsx index f7fb1329f..b7289c750 100644 --- a/src/ui/components/NFTs/CollectionDetailGrid.tsx +++ b/apps/extension/src/ui/components/NFTs/CollectionDetailGrid.tsx @@ -16,7 +16,7 @@ import { } from '@mui/material'; import Grid from '@mui/material/Grid'; import React, { useState } from 'react'; -import { useHistory } from 'react-router-dom'; +import { useNavigate } from 'react-router'; import { ReactComponent as SearchIcon } from '@/ui/assets/svg/searchIcon.svg'; import { truncate } from '@/ui/utils'; @@ -50,7 +50,7 @@ const CollectionDetailGrid: React.FC = ({ setSearchTerm, loadingMore, }) => { - const history = useHistory(); + const navigate = useNavigate(); const [filteredList, setFilteredList] = useState([]); const [searchOpen, setSearchOpen] = useState(false); @@ -65,7 +65,7 @@ const CollectionDetailGrid: React.FC = ({ }} > history.push('/dashboard')} + onClick={() => navigate('/dashboard')} sx={{ padding: '0', borderRadius: '12px', diff --git a/src/ui/components/NFTs/GridView.tsx b/apps/extension/src/ui/components/NFTs/GridView.tsx similarity index 94% rename from src/ui/components/NFTs/GridView.tsx rename to apps/extension/src/ui/components/NFTs/GridView.tsx index 3d63e0f66..c8280ee4b 100644 --- a/src/ui/components/NFTs/GridView.tsx +++ b/apps/extension/src/ui/components/NFTs/GridView.tsx @@ -1,9 +1,9 @@ -import { Typography, Card, CardActionArea, CardMedia, CardContent, Box } from '@mui/material'; -import React, { useState, useEffect, useCallback } from 'react'; -import { Link } from 'react-router-dom'; +import { Box, Card, CardActionArea, CardContent, CardMedia, Typography } from '@mui/material'; +import React, { useCallback, useEffect, useState } from 'react'; +import { Link } from 'react-router'; +import fallback from '@/ui/assets/image/errorImage.png'; import type { PostMedia } from '@/ui/utils/url'; -import fallback from 'ui/assets/image/errorImage.png'; interface GridViewProps { data: any; @@ -203,10 +203,7 @@ const GridView = (props: GridViewProps) => { backgroundColor: '#222222', }, }} - to={{ - pathname: detailPath, - state: navigateState, - }} + to={detailPath} onClick={navigateWithState} > { - const history = useHistory(); + const navigate = useNavigate(); const handleSubmit = () => { - history.goBack(); + navigate(-1); }; return ( diff --git a/src/ui/components/PopupModal/importAddressModal.tsx b/apps/extension/src/ui/components/PopupModal/importAddressModal.tsx similarity index 100% rename from src/ui/components/PopupModal/importAddressModal.tsx rename to apps/extension/src/ui/components/PopupModal/importAddressModal.tsx diff --git a/apps/extension/src/ui/components/PopupModal/remove-profile-modal.tsx b/apps/extension/src/ui/components/PopupModal/remove-profile-modal.tsx new file mode 100644 index 000000000..014bf988b --- /dev/null +++ b/apps/extension/src/ui/components/PopupModal/remove-profile-modal.tsx @@ -0,0 +1,191 @@ +import CheckCircleOutlineIcon from '@mui/icons-material/CheckCircleOutline'; +import WarningAmberRoundedIcon from '@mui/icons-material/WarningAmberRounded'; +import { Box, Button, CircularProgress, DialogActions, Skeleton, Typography } from '@mui/material'; +import React, { useCallback, useEffect, useState } from 'react'; + +import { consoleError } from '@onflow/flow-wallet-shared/utils/console-log'; +import { DEFAULT_PASSWORD } from '@onflow/flow-wallet-shared/utils/default'; + +import { useWallet } from '@/ui/hooks/use-wallet'; + +import { CustomDialog } from '../custom-dialog'; // Reuse the styled dialog base +import { PasswordInput } from '../password/PasswordInput'; + +interface RemoveProfileModalProps { + isOpen: boolean; + onClose: () => void; + onConfirm: (password: string) => void; // Callback with the entered password + isRemoving: boolean; + error: string; // Error specifically from the removal attempt + profileName?: string; // Optional profile name + profileUsername?: string; // Optional profile username +} + +const RemoveProfileModal: React.FC = ({ + isOpen, + onClose, + onConfirm, + isRemoving, + error: removalError, // Rename prop to avoid conflict + profileName, + profileUsername, +}) => { + const [password, setPassword] = useState(DEFAULT_PASSWORD); + const [isPasswordVisible, setIsPasswordVisible] = useState(false); + const [isCheckingBackup, setIsCheckingBackup] = useState(true); // Added loading state + const [backupCheckError, setBackupCheckError] = useState(''); + const [hasBackup, setHasBackup] = useState(false); + const wallet = useWallet(); + + const checkBackup = useCallback(async () => { + setIsCheckingBackup(true); // Set loading true + setBackupCheckError(''); // Clear previous errors + try { + const backupResult = await wallet.hasCurrentUserBackup(); // Renamed variable for clarity + setHasBackup(backupResult); + } catch (err) { + consoleError('An error occurred while checking the backup:', err); + setBackupCheckError('Failed to check backup status.'); // Keep error state + setHasBackup(false); // Assume no backup on error + } finally { + setIsCheckingBackup(false); // Set loading false + } + }, [setHasBackup, wallet]); + + useEffect(() => { + if (isOpen) { + setPassword(''); // Clear password on open + setHasBackup(false); // Reset backup state on open + checkBackup(); + } + }, [isOpen, checkBackup]); + + const handleConfirmClick = () => { + if (password) { + onConfirm(password); + } + }; + + return ( + + + + {chrome.i18n.getMessage('Remove__Profile')} + + + {profileName && profileUsername && ( + + {profileName} + @{profileUsername} + + )} + + + {isCheckingBackup && } + {!isCheckingBackup && hasBackup && ( + + )} + {!isCheckingBackup && !hasBackup && ( + + )} + + {isCheckingBackup && } + {!isCheckingBackup && hasBackup && chrome.i18n.getMessage('Backup__Found')} + {!isCheckingBackup && backupCheckError && backupCheckError} + + + + + {chrome.i18n.getMessage('Remove_profile_warning_simplified')} + + + { + if (e.key === 'Enter' && password && !isRemoving) { + handleConfirmClick(); + } + }} + /> + + + + + + + + ); +}; + +export default RemoveProfileModal; diff --git a/src/ui/components/PopupModal/resetModal.tsx b/apps/extension/src/ui/components/PopupModal/resetModal.tsx similarity index 100% rename from src/ui/components/PopupModal/resetModal.tsx rename to apps/extension/src/ui/components/PopupModal/resetModal.tsx diff --git a/apps/extension/src/ui/components/PrivateRoute.tsx b/apps/extension/src/ui/components/PrivateRoute.tsx new file mode 100644 index 000000000..45e93496d --- /dev/null +++ b/apps/extension/src/ui/components/PrivateRoute.tsx @@ -0,0 +1,57 @@ +import React, { useEffect, useState } from 'react'; +import { Navigate } from 'react-router'; + +import { useWallet } from '@/ui/hooks/use-wallet'; + +const PrivateRoute = ({ children }) => { + const wallet = useWallet(); + + const [booted, setBooted] = useState(false); + const [unlocked, setUnlocked] = useState(false); + const [loading, setLoading] = useState(true); + + // Everything through the wallet controller is async, so we need to check if the wallet is booted and unlocked in a useEffect + useEffect(() => { + let mounted = true; + + const fetchLockState = async () => { + const booted = await wallet.isBooted(); + + if (!booted) { + return { booted, unlocked: false }; + } else { + const unlocked = await wallet.isUnlocked(); + return { booted, unlocked }; + } + }; + + // Initial check + fetchLockState().then(({ booted, unlocked }) => { + if (mounted) { + setBooted(booted); + setUnlocked(unlocked); + setLoading(false); + } + }); + + return () => { + mounted = false; + }; + }, [wallet]); + + if (loading) { + return null; + } + + if (!booted) { + return ; + } + + if (!unlocked) { + return ; + } + + return <>{children}; +}; + +export default PrivateRoute; diff --git a/src/ui/components/SecurityCard.tsx b/apps/extension/src/ui/components/SecurityCard.tsx similarity index 92% rename from src/ui/components/SecurityCard.tsx rename to apps/extension/src/ui/components/SecurityCard.tsx index a7ebc8b9c..40f69f9bd 100644 --- a/src/ui/components/SecurityCard.tsx +++ b/apps/extension/src/ui/components/SecurityCard.tsx @@ -1,14 +1,14 @@ 'use client'; -import { Box, Typography, Tooltip } from '@mui/material'; +import { Box, Tooltip, Typography } from '@mui/material'; import React from 'react'; import type { CoinItem, CustomFungibleTokenInfo, EvmCustomTokenInfo, -} from '@/shared/types/coin-types'; -import { isValidFlowAddress } from '@/shared/utils/address'; +} from '@onflow/flow-wallet-shared/types/coin-types'; +import { isValidFlowAddress } from '@onflow/flow-wallet-shared/utils/address'; export const SecurityCard: React.FC<{ tokenInfo: CoinItem | CustomFungibleTokenInfo | EvmCustomTokenInfo; diff --git a/src/ui/components/Send/ContactCard.tsx b/apps/extension/src/ui/components/Send/ContactCard.tsx similarity index 86% rename from src/ui/components/Send/ContactCard.tsx rename to apps/extension/src/ui/components/Send/ContactCard.tsx index 8373cf883..e6f65d19f 100644 --- a/src/ui/components/Send/ContactCard.tsx +++ b/apps/extension/src/ui/components/Send/ContactCard.tsx @@ -1,13 +1,12 @@ -import PersonAddAltIcon from '@mui/icons-material/PersonAddAlt'; -import { Box, Typography, Avatar, IconButton, CardMedia, Skeleton } from '@mui/material'; -import React, { useState } from 'react'; -import { useHistory } from 'react-router-dom'; +import { Avatar, Box, CardMedia, IconButton, Skeleton, Typography } from '@mui/material'; +import React from 'react'; +import { useNavigate } from 'react-router'; -import closex from 'ui/assets/closex.svg'; -import { useWallet, formatAddress, isEmoji } from 'ui/utils'; +import closex from '@/ui/assets/closex.svg'; +import { formatAddress, isEmoji } from '@/ui/utils'; export const ContactCard = ({ contact, tokenInfo, isLoading = false }) => { - const history = useHistory(); + const navigate = useNavigate(); const getName = (name: string) => { if (name.startsWith('0')) { @@ -99,7 +98,7 @@ export const ContactCard = ({ contact, tokenInfo, isLoading = false }) => { { e.stopPropagation(); - history.push(`/dashboard/token/${tokenInfo.unit}/send`); + navigate(`/dashboard/token/${tokenInfo.unit}/send`); }} > diff --git a/src/ui/components/Send/Profile.tsx b/apps/extension/src/ui/components/Send/Profile.tsx similarity index 94% rename from src/ui/components/Send/Profile.tsx rename to apps/extension/src/ui/components/Send/Profile.tsx index cfabca8ed..7646dc21d 100644 --- a/src/ui/components/Send/Profile.tsx +++ b/apps/extension/src/ui/components/Send/Profile.tsx @@ -1,7 +1,7 @@ -import { Box, Typography, Avatar, Skeleton } from '@mui/material'; +import { Avatar, Box, Skeleton, Typography } from '@mui/material'; import React from 'react'; -import { formatAddress, isEmoji } from 'ui/utils'; +import { formatAddress, isEmoji } from '@/ui/utils'; export const Profile = ({ contact, isLoading = false }) => { const getName = (name: string) => { diff --git a/src/ui/components/SlideDown.tsx b/apps/extension/src/ui/components/SlideDown.tsx similarity index 100% rename from src/ui/components/SlideDown.tsx rename to apps/extension/src/ui/components/SlideDown.tsx diff --git a/src/ui/components/SlideLeftRight.tsx b/apps/extension/src/ui/components/SlideLeftRight.tsx similarity index 82% rename from src/ui/components/SlideLeftRight.tsx rename to apps/extension/src/ui/components/SlideLeftRight.tsx index ee2b54f1f..074c341ad 100644 --- a/src/ui/components/SlideLeftRight.tsx +++ b/apps/extension/src/ui/components/SlideLeftRight.tsx @@ -1,4 +1,3 @@ -import { Box, Slide } from '@mui/material'; import React from 'react'; const SlideLeftRight = React.forwardRef( @@ -10,7 +9,7 @@ const SlideLeftRight = React.forwardRef( }: { show: boolean; direction: 'left' | 'right'; - children: React.ReactElement; + children: React.ReactNode; }, ref ) => { diff --git a/src/ui/components/SlideRelative.tsx b/apps/extension/src/ui/components/SlideRelative.tsx similarity index 100% rename from src/ui/components/SlideRelative.tsx rename to apps/extension/src/ui/components/SlideRelative.tsx diff --git a/src/ui/components/Spin.tsx b/apps/extension/src/ui/components/Spin.tsx similarity index 95% rename from src/ui/components/Spin.tsx rename to apps/extension/src/ui/components/Spin.tsx index 302fc39e1..dd3170667 100644 --- a/src/ui/components/Spin.tsx +++ b/apps/extension/src/ui/components/Spin.tsx @@ -1,5 +1,5 @@ import { Box, Typography } from '@mui/material'; -import React, { ReactNode } from 'react'; +import React from 'react'; import { LLSpinner } from './LLSpinner'; diff --git a/src/ui/components/StorageExceededAlert.tsx b/apps/extension/src/ui/components/StorageExceededAlert.tsx similarity index 92% rename from src/ui/components/StorageExceededAlert.tsx rename to apps/extension/src/ui/components/StorageExceededAlert.tsx index e9a60c954..10ab14842 100644 --- a/src/ui/components/StorageExceededAlert.tsx +++ b/apps/extension/src/ui/components/StorageExceededAlert.tsx @@ -1,9 +1,9 @@ import CloseIcon from '@mui/icons-material/Close'; -import { Box, Typography, Button, IconButton } from '@mui/material'; +import { Box, Button, IconButton, Typography } from '@mui/material'; import React from 'react'; -import { useHistory } from 'react-router-dom'; +import { useNavigate } from 'react-router'; -import eventBus from '@/eventBus'; +import eventBus from '@/extension-shared/utils/message/eventBus'; interface StorageExceededAlertProps { open: boolean; @@ -11,7 +11,7 @@ interface StorageExceededAlertProps { } const StorageExceededAlert: React.FC = ({ open, onClose }) => { - const history = useHistory(); + const navigate = useNavigate(); const handleBuyFlow = () => { onClose(); @@ -118,7 +118,7 @@ const StorageExceededAlert: React.FC = ({ open, onClo color="inherit" onClick={() => { onClose(); - history.push('/dashboard/wallet/deposit'); + navigate('/dashboard/wallet/deposit'); }} sx={{ height: '48px', diff --git a/src/ui/components/StorageUsageCard.tsx b/apps/extension/src/ui/components/StorageUsageCard.tsx similarity index 95% rename from src/ui/components/StorageUsageCard.tsx rename to apps/extension/src/ui/components/StorageUsageCard.tsx index 8c8094111..d1e62c4ef 100644 --- a/src/ui/components/StorageUsageCard.tsx +++ b/apps/extension/src/ui/components/StorageUsageCard.tsx @@ -1,15 +1,15 @@ 'use client'; -import { Box, Typography, LinearProgress, Skeleton } from '@mui/material'; +import { Box, LinearProgress, Skeleton, Typography } from '@mui/material'; import BigNumber from 'bignumber.js'; import React from 'react'; -import { useMainAccountStorageBalance } from '../hooks/use-account-hooks'; +import { useMainAccountStorageBalance } from '@/ui/hooks/use-account-hooks'; import { COLOR_CHARCOAL_GRAY_4C4C4C, COLOR_DARKMODE_BACKGROUND_CARDS_1A1A1A, COLOR_GREEN_FLOW_DARKMODE_00EF8B, -} from '../style/color'; +} from '@/ui/style/color'; import { TokenBalance } from './TokenLists/TokenBalance'; diff --git a/src/ui/components/TokenLists/CurrencyValue.tsx b/apps/extension/src/ui/components/TokenLists/CurrencyValue.tsx similarity index 100% rename from src/ui/components/TokenLists/CurrencyValue.tsx rename to apps/extension/src/ui/components/TokenLists/CurrencyValue.tsx diff --git a/src/ui/components/TokenLists/PriceCard.tsx b/apps/extension/src/ui/components/TokenLists/PriceCard.tsx similarity index 97% rename from src/ui/components/TokenLists/PriceCard.tsx rename to apps/extension/src/ui/components/TokenLists/PriceCard.tsx index 60d3fc37d..69b0d44c8 100644 --- a/src/ui/components/TokenLists/PriceCard.tsx +++ b/apps/extension/src/ui/components/TokenLists/PriceCard.tsx @@ -2,34 +2,35 @@ import ArrowDropDownRoundedIcon from '@mui/icons-material/ArrowDropDownRounded'; import ArrowDropUpRoundedIcon from '@mui/icons-material/ArrowDropUpRounded'; import KeyboardArrowDownRoundedIcon from '@mui/icons-material/KeyboardArrowDownRounded'; import { - ToggleButtonGroup, - ToggleButton, + Box, + ButtonBase, Menu, MenuItem, + ToggleButton, + ToggleButtonGroup, Typography, - Box, - ButtonBase, } from '@mui/material'; import { styled } from '@mui/material/styles'; import dayjs from 'dayjs'; -import React, { useEffect, useState, useRef, useCallback, useMemo } from 'react'; -import { AreaChart, Area, YAxis, Tooltip, ResponsiveContainer } from 'recharts'; +import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'; +import { Area, AreaChart, ResponsiveContainer, Tooltip, YAxis } from 'recharts'; import { getPriceProvider, Period, - type TokenPriceHistory, type PriceProvider, -} from '@/shared/types/network-types'; -import { consoleWarn } from '@/shared/utils/console-log'; + type TokenPriceHistory, +} from '@onflow/flow-wallet-shared/types/network-types'; +import { consoleWarn } from '@onflow/flow-wallet-shared/utils/console-log'; + import { - IconKraken, IconBinance, IconCoinbase, - IconKucoin, IconHuobi, + IconKraken, + IconKucoin, } from '@/ui/components/iconfont'; -import { useWallet } from 'ui/utils'; +import { useWallet } from '@/ui/hooks/use-wallet'; const StyledToggleButtonGroup = styled(ToggleButtonGroup)(({ theme }) => ({ '& .MuiToggleButtonGroup-grouped': { diff --git a/apps/extension/src/ui/components/TokenLists/TokenAvatar.tsx b/apps/extension/src/ui/components/TokenLists/TokenAvatar.tsx new file mode 100644 index 000000000..d26495996 --- /dev/null +++ b/apps/extension/src/ui/components/TokenLists/TokenAvatar.tsx @@ -0,0 +1,29 @@ +import { Avatar, Skeleton, type AvatarProps } from '@mui/material'; +import React from 'react'; + +type TokenAvatarProps = AvatarProps & { + symbol?: string; // The token symbol - if undefined, the avatar is loading + width?: number; + height?: number; +}; + +const TokenAvatar: React.FC = ({ symbol, width = 36, height = 36, ...props }) => { + if (!symbol) { + return ; + } + return ( + + {symbol.charAt(0)} + + ); +}; + +export default TokenAvatar; diff --git a/src/ui/components/TokenLists/TokenBalance.tsx b/apps/extension/src/ui/components/TokenLists/TokenBalance.tsx similarity index 90% rename from src/ui/components/TokenLists/TokenBalance.tsx rename to apps/extension/src/ui/components/TokenLists/TokenBalance.tsx index fde1534e2..4063cbc88 100644 --- a/src/ui/components/TokenLists/TokenBalance.tsx +++ b/apps/extension/src/ui/components/TokenLists/TokenBalance.tsx @@ -1,7 +1,7 @@ import React from 'react'; -import { formatTokenValueOrPrice } from '@/shared/utils/formatTokenValue'; -import { trimDecimalAmount } from '@/shared/utils/number'; +import { formatTokenValueOrPrice } from '@onflow/flow-wallet-shared/utils/formatTokenValue'; +import { trimDecimalAmount } from '@onflow/flow-wallet-shared/utils/number'; interface TokenBalanceProps { value: string; diff --git a/src/ui/components/TokenLists/TokenItem.tsx b/apps/extension/src/ui/components/TokenLists/TokenItem.tsx similarity index 73% rename from src/ui/components/TokenLists/TokenItem.tsx rename to apps/extension/src/ui/components/TokenLists/TokenItem.tsx index a767715f7..8a62fab35 100644 --- a/src/ui/components/TokenLists/TokenItem.tsx +++ b/apps/extension/src/ui/components/TokenLists/TokenItem.tsx @@ -1,24 +1,29 @@ import { - ListItemText, + Box, + CircularProgress, + IconButton, ListItem, - Avatar, ListItemAvatar, - IconButton, - CircularProgress, ListItemButton, + ListItemText, Switch, - Box, Typography, } from '@mui/material'; import { styled } from '@mui/material/styles'; import React from 'react'; +import { + type ExtendedTokenInfo, + type TokenFilter, +} from '@onflow/flow-wallet-shared/types/coin-types'; + +import VerifiedIcon from '@/ui/assets/svg/verfied-check.svg'; import IconCheckmark from '@/ui/components/iconfont/IconCheckmark'; import IconPlus from '@/ui/components/iconfont/IconPlus'; import { CurrencyValue } from '@/ui/components/TokenLists/CurrencyValue'; import { useCurrency } from '@/ui/hooks/preference-hooks'; -import VerifiedIcon from '../../assets/svg/verfied-check.svg'; +import TokenAvatar from './TokenAvatar'; // Custom styled ListItem to override default secondaryAction styles const CustomListItem = styled(ListItem)({ @@ -28,13 +33,22 @@ const CustomListItem = styled(ListItem)({ transform: 'translateY(-50%)', // Adjust for vertical centering }, }); +type TokenItemProps = { + token: ExtendedTokenInfo; + isLoading?: boolean; + enabled?: boolean; + onClick?: (token: ExtendedTokenInfo, enabled: boolean) => void; + tokenFilter?: TokenFilter; + updateTokenFilter?: (tokenFilter: TokenFilter) => void; + showSwitch?: boolean; +}; -const TokenItem = ({ +const TokenItem: React.FC = ({ token, - isLoading, - enabled, - onClick, - tokenFilter, + isLoading = false, + enabled = false, + onClick = undefined, + tokenFilter = undefined, updateTokenFilter, showSwitch = false, }) => { @@ -45,14 +59,19 @@ const TokenItem = ({ } }; - const handleSwitchChange = (event) => { + const handleSwitchChange = (event: React.ChangeEvent) => { if (updateTokenFilter) { const isChecked = event.target.checked; const newFilteredIds = isChecked - ? tokenFilter.filteredIds.filter((id) => id !== token.id) - : [...tokenFilter.filteredIds, token.id]; + ? tokenFilter?.filteredIds.filter((id) => id !== token.id) + : [...(tokenFilter?.filteredIds ?? []), token.id]; - updateTokenFilter({ ...tokenFilter, filteredIds: newFilteredIds }); + updateTokenFilter({ + ...(tokenFilter ?? {}), + filteredIds: newFilteredIds ?? [], + hideDust: tokenFilter?.hideDust ?? false, + hideUnverified: tokenFilter?.hideUnverified ?? false, + }); } }; @@ -66,15 +85,16 @@ const TokenItem = ({ borderRadius: '12px', border: '1px solid #2A2A2A', }} + onClick={showSwitch ? undefined : handleClick} + disableRipple={showSwitch} > {showSwitch ? ( @@ -93,7 +113,7 @@ const TokenItem = ({ } > - + = { + title: 'Components/TokenLists/TokenAvatar', + component: TokenAvatar, + tags: ['autodocs'], +}; + +export default meta; + +type Story = StoryObj; + +export const Default: Story = { + args: { + symbol: flowToken.symbol, + src: flowToken.logoURI, + }, +}; +export const MediumSize: Story = { + args: { + symbol: flowToken.symbol, + src: flowToken.logoURI, + width: 24, + height: 24, + }, +}; +export const SmallSize: Story = { + args: { + symbol: flowToken.symbol, + src: flowToken.logoURI, + width: 18, + height: 18, + }, +}; + +export const Loading: Story = { + args: { + symbol: undefined, + }, +}; + +export const NoLogo: Story = { + args: { + symbol: ducatToken.symbol, + src: ducatToken.logoURI, + }, +}; + +export const NoLogoMediumSize: Story = { + args: { + symbol: ducatToken.symbol, + src: ducatToken.logoURI, + width: 24, + height: 24, + }, +}; + +export const NoLogoSmallSize: Story = { + args: { + symbol: ducatToken.symbol, + src: ducatToken.logoURI, + width: 18, + height: 18, + }, +}; diff --git a/apps/extension/src/ui/components/TokenLists/stories/TokenItem.stories.tsx b/apps/extension/src/ui/components/TokenLists/stories/TokenItem.stories.tsx new file mode 100644 index 000000000..5e1c12065 --- /dev/null +++ b/apps/extension/src/ui/components/TokenLists/stories/TokenItem.stories.tsx @@ -0,0 +1,73 @@ +import { type Meta, type StoryObj } from '@storybook/react-webpack5'; +import React, { useState } from 'react'; + +import { type TokenFilter } from '@onflow/flow-wallet-shared/types/coin-types'; + +import TokenItem from '@/ui/components/TokenLists/TokenItem'; + +import { flowToken, usdcToken, ducatToken } from './token-item-data'; + +const meta: Meta = { + title: 'Components/TokenLists/TokenItem', + tags: ['autodocs'], + component: TokenItem, +}; + +export default meta; + +type Story = StoryObj; + +export const Default: Story = { + args: { + token: flowToken, + }, +}; + +export const USDC: Story = { + args: { + token: usdcToken, + }, +}; + +export const DUCATNoLogo: Story = { + args: { + token: ducatToken, + }, +}; + +export const Enabled: Story = { + args: { + token: flowToken, + enabled: true, + }, +}; + +export const Loading: Story = { + args: { + token: flowToken, + enabled: true, + isLoading: true, + }, +}; + +export const ShowSwitch: Story = { + args: { + token: flowToken, + isLoading: false, + showSwitch: true, + updateTokenFilter: () => {}, + }, + decorators: [ + (Story, context) => { + const [tokenFilter, setTokenFilter] = useState({ + filteredIds: [], + hideDust: false, + hideUnverified: false, + }); + + const args = context.args; + + return ; + }, + ], +}; diff --git a/src/ui/components/TokenLists/stories/price-card.stories.tsx b/apps/extension/src/ui/components/TokenLists/stories/price-card.stories.tsx similarity index 98% rename from src/ui/components/TokenLists/stories/price-card.stories.tsx rename to apps/extension/src/ui/components/TokenLists/stories/price-card.stories.tsx index 57490d3fb..1d748a60e 100644 --- a/src/ui/components/TokenLists/stories/price-card.stories.tsx +++ b/apps/extension/src/ui/components/TokenLists/stories/price-card.stories.tsx @@ -2,8 +2,8 @@ import { type Meta, type StoryObj } from '@storybook/react-webpack5'; import React from 'react'; import { fn } from 'storybook/test'; -import { useWallet as useWalletMock } from '@/stories/wallet-context.mock'; import PriceCard from '@/ui/components/TokenLists/PriceCard'; +import { useWallet as useWalletMock } from '@/ui/hooks/use-wallet.mock'; const meta: Meta = { title: 'Components/TokenLists/PriceCard', diff --git a/apps/extension/src/ui/components/TokenLists/stories/token-item-data.ts b/apps/extension/src/ui/components/TokenLists/stories/token-item-data.ts new file mode 100644 index 000000000..311b7ad0e --- /dev/null +++ b/apps/extension/src/ui/components/TokenLists/stories/token-item-data.ts @@ -0,0 +1,91 @@ +import { type ExtendedTokenInfo } from '@onflow/flow-wallet-shared/types/coin-types'; + +export const flowToken: ExtendedTokenInfo = { + address: '', + balance: '0.338238330806331771', + balanceInFLOW: '0.338238330806331771', + balanceInUSD: '0.118739918982885993536634', + change24h: 0, + coin: 'FLOW', + contractName: 'FLOW', + custom: false, + decimals: 18, + extensions: {}, + flowIdentifier: 'A.1654653399040a61.FlowToken', + icon: 'https://cdn.jsdelivr.net/gh/FlowFans/flow-token-list@main/token-registry/A.1654653399040a61.FlowToken/logo.svg', + id: 'A.1654653399040a61.FlowToken', + isVerified: true, + logoURI: + 'https://cdn.jsdelivr.net/gh/FlowFans/flow-token-list@main/token-registry/A.1654653399040a61.FlowToken/logo.svg', + name: 'FLOW', + path: { + balance: '', + receiver: '', + vault: '', + }, + price: '0.351054', + priceInFLOW: '1', + priceInUSD: '0.351054', + symbol: 'FLOW', + total: '0.118739918982885993536634', + unit: 'FLOW', +}; + +export const usdcToken: ExtendedTokenInfo = { + address: '0x7f27352d5f83db87a5a3e00f4b07cc2138d8ee52', + balance: '0.039896', + balanceInFLOW: '0.11357865769296739003548864', + balanceInUSD: '0.0400803181986404904', + change24h: 0, + coin: 'Bridged USDC (Celer)', + contractName: 'Bridged USDC (Celer)', + custom: false, + decimals: 6, + extensions: {}, + flowIdentifier: 'A.f1ab99c82dee3526.USDCFlow.Vault', + icon: 'https://cdn.jsdelivr.net/gh/FlowFans/flow-token-list@main/token-registry/A.b19436aae4d94622.FiatToken/logo.png', + id: 'A.f1ab99c82dee3526.USDCFlow.Vault', + isVerified: true, + logoURI: + 'https://cdn.jsdelivr.net/gh/FlowFans/flow-token-list@main/token-registry/A.b19436aae4d94622.FiatToken/logo.png', + name: 'Bridged USDC (Celer)', + path: { + balance: '', + receiver: '', + vault: '', + }, + price: '1.0046199668799', + priceInFLOW: '2.84686829990393498184', + priceInUSD: '1.0046199668799', + symbol: 'USDC.e', + total: '0.0400803181986404904', + unit: 'USDC.e', +}; +export const ducatToken: ExtendedTokenInfo = { + address: '0x8b2f3a6e7ad5f971ff5d4e597a4ebc58b2d2758e', + balance: '107.202073910627596604', + balanceInFLOW: '0.00029285884528860736508598482469673292', + balanceInUSD: '0.0001033457864785153523284864091016', + change24h: 0, + coin: 'DUCAT', + contractName: 'DUCAT', + custom: false, + decimals: 18, + extensions: {}, + icon: '', + id: '0x8b2f3a6e7ad5f971ff5d4e597a4ebc58b2d2758e', + isVerified: false, + logoURI: '', + name: 'DUCAT', + path: { + balance: '', + receiver: '', + vault: '', + }, + price: '0.0000009640278654', + priceInFLOW: '0.00000273183936285373', + priceInUSD: '0.0000009640278654', + symbol: 'DUCAT', + total: '0.0001033457864785153523284864091016', + unit: 'DUCAT', +}; diff --git a/src/ui/components/WarningNFTNotOnboardedSnackbar.tsx b/apps/extension/src/ui/components/WarningNFTNotOnboardedSnackbar.tsx similarity index 94% rename from src/ui/components/WarningNFTNotOnboardedSnackbar.tsx rename to apps/extension/src/ui/components/WarningNFTNotOnboardedSnackbar.tsx index 123fd42ce..50baabe64 100644 --- a/src/ui/components/WarningNFTNotOnboardedSnackbar.tsx +++ b/apps/extension/src/ui/components/WarningNFTNotOnboardedSnackbar.tsx @@ -1,7 +1,7 @@ import { Link } from '@mui/material'; import React from 'react'; -import warningIcon from '../assets/svg/lowStorage.svg'; +import warningIcon from '@/ui/assets/svg/lowStorage.svg'; import WarningSnackbar from './WarningSnackbar'; diff --git a/src/ui/components/WarningSnackbar.tsx b/apps/extension/src/ui/components/WarningSnackbar.tsx similarity index 100% rename from src/ui/components/WarningSnackbar.tsx rename to apps/extension/src/ui/components/WarningSnackbar.tsx diff --git a/src/ui/components/WarningStorageLowSnackbar.tsx b/apps/extension/src/ui/components/WarningStorageLowSnackbar.tsx similarity index 92% rename from src/ui/components/WarningStorageLowSnackbar.tsx rename to apps/extension/src/ui/components/WarningStorageLowSnackbar.tsx index 490434516..cdf4ec5af 100644 --- a/src/ui/components/WarningStorageLowSnackbar.tsx +++ b/apps/extension/src/ui/components/WarningStorageLowSnackbar.tsx @@ -1,6 +1,6 @@ import React from 'react'; -import warningIcon from '../assets/svg/lowStorage.svg'; +import warningIcon from '@/ui/assets/svg/lowStorage.svg'; import WarningSnackbar from './WarningSnackbar'; interface WarningStorageLowSnackbarProps { diff --git a/src/ui/components/account/account-avatar.tsx b/apps/extension/src/ui/components/account/account-avatar.tsx similarity index 95% rename from src/ui/components/account/account-avatar.tsx rename to apps/extension/src/ui/components/account/account-avatar.tsx index d47c6f39d..465ebe498 100644 --- a/src/ui/components/account/account-avatar.tsx +++ b/apps/extension/src/ui/components/account/account-avatar.tsx @@ -1,6 +1,5 @@ -import { Avatar, Box, CircularProgress, IconButton, Skeleton, Typography } from '@mui/material'; -import { useTheme, alpha } from '@mui/material/styles'; -import { margin } from '@mui/system'; +import { Box, CircularProgress, IconButton, Skeleton, Typography } from '@mui/material'; +import { alpha } from '@mui/material/styles'; import React from 'react'; import { FlowIcon } from '@/ui/assets/icons/FlowIcon'; diff --git a/src/ui/components/account/account-card.tsx b/apps/extension/src/ui/components/account/account-card.tsx similarity index 96% rename from src/ui/components/account/account-card.tsx rename to apps/extension/src/ui/components/account/account-card.tsx index b4c567d9a..99d3f18c4 100644 --- a/src/ui/components/account/account-card.tsx +++ b/apps/extension/src/ui/components/account/account-card.tsx @@ -10,24 +10,24 @@ import { } from '@mui/material'; import React from 'react'; -import { type WalletAccount } from '@/shared/types/wallet-types'; -import { isValidEthereumAddress } from '@/shared/utils/address'; +import { type WalletAccount } from '@onflow/flow-wallet-shared/types/wallet-types'; +import { isValidEthereumAddress } from '@onflow/flow-wallet-shared/utils/address'; + import { CopyIcon } from '@/ui/assets/icons/CopyIcon'; import { LinkIcon } from '@/ui/assets/icons/LinkIcon'; import { useAccountBalance } from '@/ui/hooks/use-account-hooks'; import { useNftCatalogCollections } from '@/ui/hooks/useNftHook'; import { + COLOR_ACCENT_EVM_627EEA, COLOR_DARKMODE_BACKGROUND_CARDS_1A1A1A, COLOR_DARKMODE_TEXT_PRIMARY_FFFFFF, COLOR_DARKMODE_TEXT_SECONDARY_B3B3B3, - COLOR_ACCENT_EVM_627EEA, COLOR_GREY_ICONS_767676, } from '@/ui/style/color'; import { formatAddress } from '@/ui/utils'; -import { TokenBalance } from '../TokenLists/TokenBalance'; - import { AccountAvatar } from './account-avatar'; +import { TokenBalance } from '../TokenLists/TokenBalance'; type AccountCardWithCopyProps = { network?: string; @@ -85,7 +85,8 @@ export const AccountCard = ({ const accountBalance = useAccountBalance(network, address); const balance = accountBalance === undefined ? account?.balance : accountBalance; - const nftCount = nfts || nftCatalogCollections?.reduce((acc, curr) => acc + curr.count, 0); + const nftCount = nfts ?? nftCatalogCollections?.reduce((acc, curr) => acc + curr.count, 0) ?? 0; + return ( {name || } - {isValidEthereumAddress(address) && ( void; - onAccountClickSecondary?: (address: string, parentAddress?: string) => void; + onAccountClick?: (address: WalletAccount, parentAddress?: WalletAccount) => void; + onAccountClickSecondary?: (address: WalletAccount, parentAddress?: WalletAccount) => void; secondaryIcon?: React.ReactNode; }; + const AccountHierarchy = ({ network, account, @@ -26,9 +31,10 @@ const AccountHierarchy = ({ onAccountClickSecondary, secondaryIcon, }: AccountHierarchyProps) => { - const childAccounts = useChildAccounts(network, account?.address); - const evmAccount = useEvmAccount(network, account?.address); + const childAccounts = account?.childAccounts; + const evmAccount = account?.evmAccount; const loading = network === undefined || account === undefined; + if (loading) { return ( @@ -41,83 +47,74 @@ const AccountHierarchy = ({ return ( + {/* Main account */} onAccountClick(account.address, account.address) : undefined - } + onClick={onAccountClick ? () => onAccountClick(account) : undefined} onClickSecondary={ - onAccountClickSecondary - ? () => onAccountClickSecondary(account.address, account.address) - : undefined + onAccountClickSecondary ? () => onAccountClickSecondary(account) : undefined } secondaryIcon={secondaryIcon} showCard={false} /> - {/* If the EVM account is valid, show the EVM account card */} - {evmAccount && isValidEthereumAddress(evmAccount.address) && ( + {/* EVM account */} + {evmAccount && evmAccount.address && isValidEthereumAddress(evmAccount.address) && ( onAccountClick(evmAccount.address, account.address) : undefined - } + onClick={onAccountClick ? () => onAccountClick(evmAccount, account) : undefined} onClickSecondary={ - onAccountClickSecondary - ? () => onAccountClickSecondary(evmAccount.address, account.address) - : undefined + onAccountClickSecondary ? () => onAccountClickSecondary(evmAccount, account) : undefined } secondaryIcon={secondaryIcon} showLink={true} showCard={false} /> )} + + {/* Child accounts */} {childAccounts && - childAccounts.map((linkedAccount) => { - return ( - onAccountClick(linkedAccount.address, account.address) - : undefined - } - onClickSecondary={ - onAccountClickSecondary - ? () => onAccountClickSecondary(linkedAccount.address, account.address) - : undefined - } - secondaryIcon={secondaryIcon} - showLink={true} - showCard={false} - /> - ); - })} + childAccounts.map((linkedAccount) => ( + onAccountClick(linkedAccount, account) : undefined} + onClickSecondary={ + onAccountClickSecondary + ? () => onAccountClickSecondary(linkedAccount, account) + : undefined + } + secondaryIcon={secondaryIcon} + showLink={true} + showCard={false} + /> + ))} ); }; type AccountListingProps = { network?: string; - accountList?: WalletAccount[]; + accountList?: MainAccount[]; activeAccount?: WalletAccount; - activeParentAccount?: WalletAccount; - onAccountClick?: (address: string, parentAddress?: string) => void; - onAccountClickSecondary?: (address: string, parentAddress?: string) => void; + activeParentAccount?: MainAccount; + onAccountClick?: (address: WalletAccount, parentAddress?: WalletAccount) => void; + onAccountClickSecondary?: (address: WalletAccount, parentAddress?: WalletAccount) => void; onEnableEvmClick?: (parentAddress: string) => void; secondaryIcon?: React.ReactNode; showActiveAccount?: boolean; + itemSx?: any; + ignoreHidden?: boolean; }; export const AccountListing = ({ @@ -130,18 +127,16 @@ export const AccountListing = ({ onEnableEvmClick, secondaryIcon, showActiveAccount = false, + itemSx, + ignoreHidden = false, }: AccountListingProps) => { // Get the EVM account for the active account provided it's a main account - const evmAccount = useEvmAccount( - network, - activeParentAccount === undefined || activeAccount?.address === activeParentAccount?.address - ? activeAccount?.address - : undefined - ); + const evmAccount = activeParentAccount?.evmAccount; // Check if the EVM account is not valid const noEvmAccount = evmAccount && !isValidEthereumAddress(evmAccount.address); - //const pendingAccountTransactions = []; const { pendingAccountTransactions } = useProfiles(); + const hiddenAccounts = useHiddenAccounts(); + return ( {/* Active account */} @@ -169,12 +164,12 @@ export const AccountListing = ({ parentAccount={activeParentAccount} onClick={ onAccountClick && activeAccount?.address - ? () => onAccountClick(activeAccount.address, activeAccount.address) + ? () => onAccountClick(activeAccount, activeAccount) : undefined } onClickSecondary={ onAccountClickSecondary && activeAccount?.address - ? () => onAccountClickSecondary(activeAccount.address, activeAccount.address) + ? () => onAccountClickSecondary(activeAccount, activeAccount) : undefined } secondaryIcon={secondaryIcon} @@ -217,19 +212,27 @@ export const AccountListing = ({ {accountList === undefined && ( )} - {accountList?.map((account) => { - return ( - - ); - })} + {accountList && + accountList + .filter((account) => ignoreHidden || !hiddenAccounts.includes(account.address)) + .map((account, idx, arr) => ( + + + + ))} {pendingAccountTransactions && pendingAccountTransactions.map((transaction) => { return ( diff --git a/src/ui/components/account/enable-evm-account-card.tsx b/apps/extension/src/ui/components/account/enable-evm-account-card.tsx similarity index 92% rename from src/ui/components/account/enable-evm-account-card.tsx rename to apps/extension/src/ui/components/account/enable-evm-account-card.tsx index f24f14a40..3c5bb166c 100644 --- a/src/ui/components/account/enable-evm-account-card.tsx +++ b/apps/extension/src/ui/components/account/enable-evm-account-card.tsx @@ -1,14 +1,6 @@ -import { - Typography, - Box, - Card, - CardActionArea, - CardMedia, - CardActions, - IconButton, -} from '@mui/material'; +import { Typography, Box, Card, CardActionArea, CardMedia } from '@mui/material'; import React from 'react'; -import { useHistory } from 'react-router-dom'; +import { useNavigate } from 'react-router'; import rightarrow from '@/ui/assets/svg/rightarrow.svg'; import { @@ -25,7 +17,7 @@ export const EnableEvmAccountCard = ({ onEnableEvmClick: () => void; showCard: boolean; }) => { - const history = useHistory(); + const navigate = useNavigate(); const gradientStyle: React.CSSProperties = { background: `linear-gradient(92deg, ${COLOR_GREEN_FLOW_DARKMODE_00EF8B} 63.42%, ${COLOR_ACCENT_EVM_627EEA} 91.99%)`, diff --git a/src/ui/components/account/stories/account-avatar.stories.tsx b/apps/extension/src/ui/components/account/stories/account-avatar.stories.tsx similarity index 99% rename from src/ui/components/account/stories/account-avatar.stories.tsx rename to apps/extension/src/ui/components/account/stories/account-avatar.stories.tsx index be84dea9a..33e4bbede 100644 --- a/src/ui/components/account/stories/account-avatar.stories.tsx +++ b/apps/extension/src/ui/components/account/stories/account-avatar.stories.tsx @@ -1,10 +1,12 @@ import { type Meta, type StoryObj } from '@storybook/react-webpack5'; import React from 'react'; -import emojisJson from '@/background/utils/emoji.json'; -const { emojis } = emojisJson; +import emojisJson from '@onflow/flow-wallet-shared/constant/emoji.json'; + import AccountAvatar from '@/ui/components/account/account-avatar'; +const { emojis } = emojisJson; + const meta: Meta = { title: 'Components/account/AccountAvatar', tags: ['autodocs'], diff --git a/src/ui/components/account/stories/account-card.stories.tsx b/apps/extension/src/ui/components/account/stories/account-card.stories.tsx similarity index 83% rename from src/ui/components/account/stories/account-card.stories.tsx rename to apps/extension/src/ui/components/account/stories/account-card.stories.tsx index de67f5e9c..552e77228 100644 --- a/src/ui/components/account/stories/account-card.stories.tsx +++ b/apps/extension/src/ui/components/account/stories/account-card.stories.tsx @@ -1,12 +1,12 @@ import { type Meta, type StoryObj } from '@storybook/react-webpack5'; -import emojisJson from '@/background/utils/emoji.json'; +import emojisJson from '@onflow/flow-wallet-shared/constant/emoji.json'; +import { MAINNET_CHAIN_ID } from '@onflow/flow-wallet-shared/types/network-types'; +import { type WalletAccount } from '@onflow/flow-wallet-shared/types/wallet-types'; const { emojis } = emojisJson; -import { MAINNET_CHAIN_ID } from '@/shared/types/network-types'; -import { type WalletAccount } from '@/shared/types/wallet-types'; -import { useAccountBalance } from '../../../../stories/use-account-hooks.mock'; -import { useNftCatalogCollections } from '../../../../stories/use-nft-hooks.mock'; +import { useAccountBalance } from '../../../hooks/use-account-hooks.mock'; +import { useNftCatalogCollections } from '../../../hooks/useNftHook.mock'; import { AccountCard } from '../account-card'; const mainWalletAccount: WalletAccount = { @@ -80,7 +80,24 @@ export const SmallFlow: Story = { count: 12, collection: { name: 'Test Collection', + id: 'test', + contract_name: 'test', + address: 'test', + logo: 'test', + description: 'test', + banner: 'test', + path: { + storage_path: 'test', + public_path: 'test', + private_path: 'test', + }, + nftTypeId: 'test', + socials: { + twitter: { url: 'test' }, + discord: { url: 'test' }, + }, }, + ids: ['test'], }, ]); }, diff --git a/src/ui/components/account/stories/account-listing.stories.tsx b/apps/extension/src/ui/components/account/stories/account-listing.stories.tsx similarity index 72% rename from src/ui/components/account/stories/account-listing.stories.tsx rename to apps/extension/src/ui/components/account/stories/account-listing.stories.tsx index 740158162..8d2aa877c 100644 --- a/src/ui/components/account/stories/account-listing.stories.tsx +++ b/apps/extension/src/ui/components/account/stories/account-listing.stories.tsx @@ -1,21 +1,28 @@ import { type Meta, type StoryObj } from '@storybook/react-webpack5'; import React from 'react'; +import { withRouter } from 'storybook-addon-remix-react-router'; -import emojisJson from '@/background/utils/emoji.json'; -const { emojis } = emojisJson as { emojis: Emoji[] }; -import { MAINNET_CHAIN_ID } from '@/shared/types/network-types'; -import { type Emoji, type WalletAccount } from '@/shared/types/wallet-types'; -import { useProfiles as importedMockUseProfiles } from '@/stories/ui-hooks.mock'; +import emojisJson from '@onflow/flow-wallet-shared/constant/emoji.json'; +import { MAINNET_CHAIN_ID } from '@onflow/flow-wallet-shared/types/network-types'; +import { type NFTCollections } from '@onflow/flow-wallet-shared/types/nft-types'; import { - useChildAccounts as importedMockUseChildAccounts, // Aliased import from the mock file - useEvmAccount as importedMockUseEvmAccount, // Aliased import from the mock file -} from '@/stories/use-account-hooks.mock'; + type Emoji, + type MainAccount, + type WalletAccount, +} from '@onflow/flow-wallet-shared/types/wallet-types'; + +import { AccountListing } from '@/ui/components/account/account-listing'; import { useNftCatalogCollections as importedMockUseNftCatalogCollections, // Aliased import from the mock file -} from '@/stories/use-nft-hooks.mock'; -import { AccountListing } from '@/ui/components/account/account-listing'; +} from '@/ui/hooks/useNftHook.mock'; +import { + USE_PROFILES_MOCK, + useProfiles as importedMockUseProfiles, +} from '@/ui/hooks/useProfileHook.mock'; + +const { emojis } = emojisJson as { emojis: Emoji[] }; -const mainWalletAccount: WalletAccount = { +const mainWalletAccount: MainAccount = { name: emojis[2].name, icon: emojis[2].emoji, color: emojis[2].bgcolor, @@ -24,8 +31,15 @@ const mainWalletAccount: WalletAccount = { id: 1, balance: '550.66005012', nfts: 12, + publicKey: '0x0000000000000000000000000000000000000000000000000000000000000000', + keyIndex: 0, + weight: 1000, + signAlgo: 0, + signAlgoString: 'ECDSA', + hashAlgo: 0, + hashAlgoString: 'SHA256', }; -const mainWalletAccount2: WalletAccount = { +const mainWalletAccount2: MainAccount = { name: emojis[3].name, icon: emojis[3].emoji, color: emojis[3].bgcolor, @@ -34,6 +48,13 @@ const mainWalletAccount2: WalletAccount = { id: 1, // Differentiate ID if it matters for keying or logic balance: '0.00000077', nfts: 4, + publicKey: '0x0000000000000000000000000000000000000000000000000000000000000000', + keyIndex: 0, + weight: 1000, + signAlgo: 0, + signAlgoString: 'ECDSA', + hashAlgo: 0, + hashAlgoString: 'SHA256', }; const evmWalletAccount: WalletAccount = { @@ -124,41 +145,30 @@ const meta: Meta = { network: { control: 'text' }, }, decorators: [ + withRouter, (Story, context) => { - importedMockUseChildAccounts.mockReset(); - importedMockUseEvmAccount.mockReset(); importedMockUseNftCatalogCollections.mockReset(); importedMockUseProfiles.mockReset(); const { mockData } = context.parameters; if (mockData) { - importedMockUseEvmAccount.mockImplementation((_network, address) => { - if (typeof address === 'string' && mockData.evmAccounts) { - return mockData.evmAccounts[address]; - } - return undefined; - }); - importedMockUseChildAccounts.mockImplementation((_network, address) => { - if (typeof address === 'string' && mockData.childAccounts) { - return mockData.childAccounts[address] || []; + importedMockUseNftCatalogCollections.mockImplementation( + (network?: string, address?: string) => { + if (typeof address === 'string' && mockData.nfts) { + return [ + { collection: { name: 'test' }, ids: ['test'], count: mockData.nfts[address] }, + ] as NFTCollections[]; + } + return []; } - return []; - }); - importedMockUseNftCatalogCollections.mockImplementation((_network, address) => { - if (typeof address === 'string' && mockData.nfts) { - return [{ count: mockData.nfts[address] }]; - } - return []; - }); - importedMockUseProfiles.mockImplementation(() => { - return { - pendingAccountTransactions: mockData.pendingAccountTransactions || [], - }; + ); + importedMockUseProfiles.mockReturnValue({ + ...USE_PROFILES_MOCK, + pendingAccountTransactions: mockData.pendingAccountTransactions || [], }); } else { - importedMockUseProfiles.mockImplementation(() => { - return { - pendingAccountTransactions: [], - }; + importedMockUseProfiles.mockReturnValue({ + ...USE_PROFILES_MOCK, + pendingAccountTransactions: [], }); } return ; @@ -173,7 +183,18 @@ type Story = StoryObj; export const Default: Story = { args: { network: 'mainnet', - accountList: [mainWalletAccount, mainWalletAccount2], + accountList: [ + { + ...mainWalletAccount, + evmAccount: evmWalletAccount, + childAccounts: [childWallet1, childWallet2], + }, + { + ...mainWalletAccount2, + evmAccount: evmWalletAccount2, + childAccounts: [], + }, + ], activeAccount: undefined, }, parameters: { @@ -204,7 +225,12 @@ export const Default: Story = { export const Active: Story = { args: { network: 'mainnet', - accountList: [mainWalletAccount], + accountList: [ + { + ...mainWalletAccount, + childAccounts: [childWallet1, childWallet2], + }, + ], activeAccount: mainWalletAccount, activeParentAccount: mainWalletAccount, // not necessary if activeAccount is a main account showActiveAccount: true, @@ -227,7 +253,13 @@ export const Active: Story = { export const EVMActive: Story = { args: { network: 'mainnet', - accountList: [mainWalletAccount], + accountList: [ + { + ...mainWalletAccount, + evmAccount: evmWalletAccount, + childAccounts: [childWallet2], + }, + ], activeAccount: evmWalletAccount, activeParentAccount: mainWalletAccount, showActiveAccount: true, @@ -251,9 +283,19 @@ export const EVMActive: Story = { export const NoEVM: Story = { args: { network: 'mainnet', - accountList: [mainWalletAccount], + accountList: [ + { + ...mainWalletAccount, + evmAccount: noEvmWalletAccount, + childAccounts: [childWallet1, childWallet2], + }, + ], activeAccount: mainWalletAccount, - activeParentAccount: mainWalletAccount, + activeParentAccount: { + ...mainWalletAccount, + evmAccount: noEvmWalletAccount, + childAccounts: [childWallet1, childWallet2], + }, showActiveAccount: true, }, parameters: { @@ -292,9 +334,19 @@ export const LoadingActive: Story = { export const PendingAccountTransaction: Story = { args: { network: 'mainnet', - accountList: [mainWalletAccount], + accountList: [ + { + ...mainWalletAccount, + evmAccount: noEvmWalletAccount, + childAccounts: [childWallet2], + }, + ], activeAccount: mainWalletAccount, - activeParentAccount: mainWalletAccount, + activeParentAccount: { + ...mainWalletAccount, + evmAccount: noEvmWalletAccount, + childAccounts: [childWallet1, childWallet2], + }, showActiveAccount: true, }, parameters: { @@ -319,7 +371,13 @@ export const PendingAccountTransaction: Story = { export const MultiplePendingAccountTransaction: Story = { args: { network: 'mainnet', - accountList: [mainWalletAccount], + accountList: [ + { + ...mainWalletAccount, + evmAccount: evmWalletAccount2, + childAccounts: [childWallet1, childWallet2], + }, + ], activeAccount: mainWalletAccount, activeParentAccount: mainWalletAccount, showActiveAccount: true, diff --git a/src/ui/components/account/stories/enable-evm-account-card.stories.tsx b/apps/extension/src/ui/components/account/stories/enable-evm-account-card.stories.tsx similarity index 65% rename from src/ui/components/account/stories/enable-evm-account-card.stories.tsx rename to apps/extension/src/ui/components/account/stories/enable-evm-account-card.stories.tsx index 2283affac..ad0909229 100644 --- a/src/ui/components/account/stories/enable-evm-account-card.stories.tsx +++ b/apps/extension/src/ui/components/account/stories/enable-evm-account-card.stories.tsx @@ -1,17 +1,13 @@ import { type Meta, type StoryObj } from '@storybook/react-webpack5'; - -import emojisJson from '@/background/utils/emoji.json'; -const { emojis } = emojisJson; -import { MAINNET_CHAIN_ID } from '@/shared/types/network-types'; -import { type WalletAccount } from '@/shared/types/wallet-types'; +import { withRouter } from 'storybook-addon-remix-react-router'; import { EnableEvmAccountCard } from '../enable-evm-account-card'; - const meta: Meta = { title: 'Components/account/EnableEvmAccountCard', tags: ['autodocs'], component: EnableEvmAccountCard, + decorators: [withRouter], }; export default meta; diff --git a/src/ui/components/build-indicator.tsx b/apps/extension/src/ui/components/build-indicator.tsx similarity index 96% rename from src/ui/components/build-indicator.tsx rename to apps/extension/src/ui/components/build-indicator.tsx index f42ff8ef9..1362562a0 100644 --- a/src/ui/components/build-indicator.tsx +++ b/apps/extension/src/ui/components/build-indicator.tsx @@ -1,9 +1,10 @@ -import { Box, Chip, Tooltip, Typography } from '@mui/material'; +import { Box, Tooltip, Typography } from '@mui/material'; import React, { useCallback } from 'react'; +import { COLOR_PRIMARY_TEXT_282828 } from '@/ui/style/color'; + import packageJson from '../../../package.json' assert { type: 'json' }; const { version } = packageJson; -import { COLOR_PRIMARY_TEXT_282828 } from '../style/color'; const deploymentEnv = process.env.DEPLOYMENT_ENV || 'local'; const isBeta = process.env.IS_BETA === 'true'; diff --git a/src/ui/components/custom-dialog.tsx b/apps/extension/src/ui/components/custom-dialog.tsx similarity index 100% rename from src/ui/components/custom-dialog.tsx rename to apps/extension/src/ui/components/custom-dialog.tsx diff --git a/apps/extension/src/ui/components/google-import/DecryptWallet.tsx b/apps/extension/src/ui/components/google-import/DecryptWallet.tsx new file mode 100644 index 000000000..0d3068c22 --- /dev/null +++ b/apps/extension/src/ui/components/google-import/DecryptWallet.tsx @@ -0,0 +1,90 @@ +import { Button, Typography } from '@mui/material'; +import { Box } from '@mui/system'; +import React, { useState } from 'react'; + +import { DEFAULT_PASSWORD } from '@onflow/flow-wallet-shared/utils/default'; + +import { PasswordInput } from '@/ui/components/password/PasswordInput'; +import { useWallet } from '@/ui/hooks/use-wallet'; + +const DecryptWallet = ({ handleSwitchTab, setMnemonic, username }) => { + const usewallet = useWallet(); + + const [isPasswordVisible, setPasswordVisible] = useState(false); + const [password, setPassword] = useState(DEFAULT_PASSWORD); + const [isLoading, setLoading] = useState(false); + + const [errorText, setErrorText] = useState(undefined); + const decryptWallet = async () => { + setLoading(true); + + try { + const mnemonic = await usewallet.restoreAccount(username, password); + setLoading(false); + setMnemonic(mnemonic); + handleSwitchTab(); + } catch (e) { + setLoading(false); + // Error will be shown by PasswordValidationText + setErrorText(chrome.i18n.getMessage('Incorrect__decrypt__password__please__try__again')); + } + }; + + return ( + <> + + + {chrome.i18n.getMessage('Welcome__Back')} + + {username} + {' '} + + + {chrome.i18n.getMessage('Please__enter__your__password__to__decrypt')} + + + + + + + + + + + ); +}; + +export default DecryptWallet; diff --git a/src/ui/views/Welcome/AccountImport/Google/GoogleAccounts.tsx b/apps/extension/src/ui/components/google-import/GoogleAccounts.tsx similarity index 96% rename from src/ui/views/Welcome/AccountImport/Google/GoogleAccounts.tsx rename to apps/extension/src/ui/components/google-import/GoogleAccounts.tsx index b2d5b3a6d..0d1d11d0d 100644 --- a/src/ui/views/Welcome/AccountImport/Google/GoogleAccounts.tsx +++ b/apps/extension/src/ui/components/google-import/GoogleAccounts.tsx @@ -1,18 +1,18 @@ import ArrowForwardRoundedIcon from '@mui/icons-material/ArrowForwardRounded'; import { - Typography, Avatar, Box, + IconButton, List, - ListItemIcon, + ListItem, ListItemButton, + ListItemIcon, ListItemText, - IconButton, - ListItem, + Typography, } from '@mui/material'; -import React, { useState, useEffect, useCallback } from 'react'; +import React, { useCallback, useEffect, useState } from 'react'; -import { useWallet } from 'ui/utils'; +import { useWallet } from '@/ui/hooks/use-wallet'; const FetchAvatar = ({ username }) => { const [avatar, setAvatar] = useState( diff --git a/src/ui/views/Welcome/AccountImport/Google/GoogleRecoverPassword.tsx b/apps/extension/src/ui/components/google-import/GoogleRecoverPassword.tsx similarity index 68% rename from src/ui/views/Welcome/AccountImport/Google/GoogleRecoverPassword.tsx rename to apps/extension/src/ui/components/google-import/GoogleRecoverPassword.tsx index b09eb1497..f8227259e 100644 --- a/src/ui/views/Welcome/AccountImport/Google/GoogleRecoverPassword.tsx +++ b/apps/extension/src/ui/components/google-import/GoogleRecoverPassword.tsx @@ -1,27 +1,15 @@ -import VisibilityIcon from '@mui/icons-material/Visibility'; -import VisibilityOffIcon from '@mui/icons-material/VisibilityOff'; -import { - Button, - Typography, - IconButton, - Input, - InputAdornment, - FormGroup, - LinearProgress, - Alert, - Snackbar, -} from '@mui/material'; +import { Alert, Button, FormGroup, Snackbar, Typography } from '@mui/material'; import Checkbox from '@mui/material/Checkbox'; import FormControlLabel from '@mui/material/FormControlLabel'; import { styled } from '@mui/material/styles'; import { Box } from '@mui/system'; import React, { useEffect, useState } from 'react'; -import zxcvbn from 'zxcvbn'; -import { LLSpinner, LLNotFound } from '@/ui/components'; +import { LLNotFound, LLSpinner } from '@/ui/components'; import CheckCircleIcon from '@/ui/components/iconfont/IconCheckmark'; import CancelIcon from '@/ui/components/iconfont/IconClose'; -import { useWallet } from 'ui/utils'; +import { PasswordInput } from '@/ui/components/password/PasswordInput'; +import { useWallet } from '@/ui/hooks/use-wallet'; const BpIcon = styled('span')(() => ({ borderRadius: 8, @@ -49,46 +37,6 @@ const BpCheckedIcon = styled(BpIcon)({ }, }); -const PasswordIndicator = (props) => { - const score = zxcvbn(props.value).score; - const precentage = ((score + 1) / 5) * 100; - - const level = (score) => { - switch (score) { - case 0: - case 1: - return { text: chrome.i18n.getMessage('Weak'), color: 'error' }; - case 2: - return { text: chrome.i18n.getMessage('Good'), color: 'testnet' }; - case 3: - return { text: chrome.i18n.getMessage('Great'), color: 'success' }; - case 4: - return { text: chrome.i18n.getMessage('Strong'), color: 'success' }; - default: - return { text: chrome.i18n.getMessage('Unknown'), color: 'error' }; - } - }; - - return ( - - - - - - - {level(score).text} - - - - ); -}; - const GoogleRecoverPassword = ({ handleSwitchTab, mnemonic, username, lastPassword }) => { const usewallet = useWallet(); @@ -210,38 +158,13 @@ const GoogleRecoverPassword = ({ handleSwitchTab, mnemonic, username, lastPasswo }} > - { - setPassword(event.target.value); - }} - endAdornment={ - - {password && } - setPasswordVisible(!isPasswordVisible)}> - {isPasswordVisible ? : } - - - } + onChange={setPassword} + showPassword={isPasswordVisible} + setShowPassword={setPasswordVisible} + autoFocus={true} + placeholder={chrome.i18n.getMessage('Enter__Your__Password')} /> diff --git a/src/ui/views/Welcome/AccountImport/Google/index.tsx b/apps/extension/src/ui/components/google-import/index.tsx similarity index 92% rename from src/ui/views/Welcome/AccountImport/Google/index.tsx rename to apps/extension/src/ui/components/google-import/index.tsx index 2af9ac60d..ed619d9ad 100644 --- a/src/ui/views/Welcome/AccountImport/Google/index.tsx +++ b/apps/extension/src/ui/components/google-import/index.tsx @@ -1,12 +1,11 @@ import { Box } from '@mui/material'; -import React, { useCallback, useEffect, useState } from 'react'; -import { useHistory, useLocation } from 'react-router-dom'; +import React, { useState } from 'react'; + +import { DEFAULT_PASSWORD } from '@onflow/flow-wallet-shared/utils/default'; -import { DEFAULT_PASSWORD } from '@/shared/utils/default'; import AllSet from '@/ui/components/LandingPages/AllSet'; import LandingComponents from '@/ui/components/LandingPages/LandingComponents'; import RecoveryPhrase from '@/ui/components/LandingPages/RecoveryPhrase'; -import { storage } from 'background/webapi'; import DecryptWallet from './DecryptWallet'; import GoogleAccounts from './GoogleAccounts'; diff --git a/src/ui/components/iconfont/IconAClose.tsx b/apps/extension/src/ui/components/iconfont/IconAClose.tsx similarity index 100% rename from src/ui/components/iconfont/IconAClose.tsx rename to apps/extension/src/ui/components/iconfont/IconAClose.tsx diff --git a/src/ui/components/iconfont/IconAGroup762.tsx b/apps/extension/src/ui/components/iconfont/IconAGroup762.tsx similarity index 100% rename from src/ui/components/iconfont/IconAGroup762.tsx rename to apps/extension/src/ui/components/iconfont/IconAGroup762.tsx diff --git a/src/ui/components/iconfont/IconAHamburgermenu.tsx b/apps/extension/src/ui/components/iconfont/IconAHamburgermenu.tsx similarity index 100% rename from src/ui/components/iconfont/IconAHamburgermenu.tsx rename to apps/extension/src/ui/components/iconfont/IconAHamburgermenu.tsx diff --git a/src/ui/components/iconfont/IconAVector11Stroke.tsx b/apps/extension/src/ui/components/iconfont/IconAVector11Stroke.tsx similarity index 100% rename from src/ui/components/iconfont/IconAVector11Stroke.tsx rename to apps/extension/src/ui/components/iconfont/IconAVector11Stroke.tsx diff --git a/src/ui/components/iconfont/IconAbout.tsx b/apps/extension/src/ui/components/iconfont/IconAbout.tsx similarity index 100% rename from src/ui/components/iconfont/IconAbout.tsx rename to apps/extension/src/ui/components/iconfont/IconAbout.tsx diff --git a/src/ui/components/iconfont/IconAccount.tsx b/apps/extension/src/ui/components/iconfont/IconAccount.tsx similarity index 100% rename from src/ui/components/iconfont/IconAccount.tsx rename to apps/extension/src/ui/components/iconfont/IconAccount.tsx diff --git a/src/ui/components/iconfont/IconActivity.tsx b/apps/extension/src/ui/components/iconfont/IconActivity.tsx similarity index 100% rename from src/ui/components/iconfont/IconActivity.tsx rename to apps/extension/src/ui/components/iconfont/IconActivity.tsx diff --git a/src/ui/components/iconfont/IconAddressbook.tsx b/apps/extension/src/ui/components/iconfont/IconAddressbook.tsx similarity index 100% rename from src/ui/components/iconfont/IconAddressbook.tsx rename to apps/extension/src/ui/components/iconfont/IconAddressbook.tsx diff --git a/src/ui/components/iconfont/IconAppStore.tsx b/apps/extension/src/ui/components/iconfont/IconAppStore.tsx similarity index 100% rename from src/ui/components/iconfont/IconAppStore.tsx rename to apps/extension/src/ui/components/iconfont/IconAppStore.tsx diff --git a/src/ui/components/iconfont/IconBack.tsx b/apps/extension/src/ui/components/iconfont/IconBack.tsx similarity index 100% rename from src/ui/components/iconfont/IconBack.tsx rename to apps/extension/src/ui/components/iconfont/IconBack.tsx diff --git a/src/ui/components/iconfont/IconBackButton.tsx b/apps/extension/src/ui/components/iconfont/IconBackButton.tsx similarity index 100% rename from src/ui/components/iconfont/IconBackButton.tsx rename to apps/extension/src/ui/components/iconfont/IconBackButton.tsx diff --git a/src/ui/components/iconfont/IconBackup.tsx b/apps/extension/src/ui/components/iconfont/IconBackup.tsx similarity index 100% rename from src/ui/components/iconfont/IconBackup.tsx rename to apps/extension/src/ui/components/iconfont/IconBackup.tsx diff --git a/src/ui/components/iconfont/IconBinance.tsx b/apps/extension/src/ui/components/iconfont/IconBinance.tsx similarity index 100% rename from src/ui/components/iconfont/IconBinance.tsx rename to apps/extension/src/ui/components/iconfont/IconBinance.tsx diff --git a/src/ui/components/iconfont/IconCheckmark.tsx b/apps/extension/src/ui/components/iconfont/IconCheckmark.tsx similarity index 100% rename from src/ui/components/iconfont/IconCheckmark.tsx rename to apps/extension/src/ui/components/iconfont/IconCheckmark.tsx diff --git a/src/ui/components/iconfont/IconChevronRight.tsx b/apps/extension/src/ui/components/iconfont/IconChevronRight.tsx similarity index 100% rename from src/ui/components/iconfont/IconChevronRight.tsx rename to apps/extension/src/ui/components/iconfont/IconChevronRight.tsx diff --git a/src/ui/components/iconfont/IconClose.tsx b/apps/extension/src/ui/components/iconfont/IconClose.tsx similarity index 100% rename from src/ui/components/iconfont/IconClose.tsx rename to apps/extension/src/ui/components/iconfont/IconClose.tsx diff --git a/src/ui/components/iconfont/IconCoinbase.tsx b/apps/extension/src/ui/components/iconfont/IconCoinbase.tsx similarity index 100% rename from src/ui/components/iconfont/IconCoinbase.tsx rename to apps/extension/src/ui/components/iconfont/IconCoinbase.tsx diff --git a/src/ui/components/iconfont/IconCopy.tsx b/apps/extension/src/ui/components/iconfont/IconCopy.tsx similarity index 100% rename from src/ui/components/iconfont/IconCopy.tsx rename to apps/extension/src/ui/components/iconfont/IconCopy.tsx diff --git a/src/ui/components/iconfont/IconCreate.tsx b/apps/extension/src/ui/components/iconfont/IconCreate.tsx similarity index 100% rename from src/ui/components/iconfont/IconCreate.tsx rename to apps/extension/src/ui/components/iconfont/IconCreate.tsx diff --git a/src/ui/components/iconfont/IconCurrency.tsx b/apps/extension/src/ui/components/iconfont/IconCurrency.tsx similarity index 100% rename from src/ui/components/iconfont/IconCurrency.tsx rename to apps/extension/src/ui/components/iconfont/IconCurrency.tsx diff --git a/src/ui/components/iconfont/IconDeveloper.tsx b/apps/extension/src/ui/components/iconfont/IconDeveloper.tsx similarity index 100% rename from src/ui/components/iconfont/IconDeveloper.tsx rename to apps/extension/src/ui/components/iconfont/IconDeveloper.tsx diff --git a/src/ui/components/iconfont/IconDevices.tsx b/apps/extension/src/ui/components/iconfont/IconDevices.tsx similarity index 100% rename from src/ui/components/iconfont/IconDevices.tsx rename to apps/extension/src/ui/components/iconfont/IconDevices.tsx diff --git a/src/ui/components/iconfont/IconDollar.tsx b/apps/extension/src/ui/components/iconfont/IconDollar.tsx similarity index 100% rename from src/ui/components/iconfont/IconDollar.tsx rename to apps/extension/src/ui/components/iconfont/IconDollar.tsx diff --git a/src/ui/components/iconfont/IconDropdown.tsx b/apps/extension/src/ui/components/iconfont/IconDropdown.tsx similarity index 100% rename from src/ui/components/iconfont/IconDropdown.tsx rename to apps/extension/src/ui/components/iconfont/IconDropdown.tsx diff --git a/src/ui/components/iconfont/IconExec.tsx b/apps/extension/src/ui/components/iconfont/IconExec.tsx similarity index 100% rename from src/ui/components/iconfont/IconExec.tsx rename to apps/extension/src/ui/components/iconfont/IconExec.tsx diff --git a/src/ui/components/iconfont/IconEye.tsx b/apps/extension/src/ui/components/iconfont/IconEye.tsx similarity index 100% rename from src/ui/components/iconfont/IconEye.tsx rename to apps/extension/src/ui/components/iconfont/IconEye.tsx diff --git a/src/ui/components/iconfont/IconFlow.tsx b/apps/extension/src/ui/components/iconfont/IconFlow.tsx similarity index 100% rename from src/ui/components/iconfont/IconFlow.tsx rename to apps/extension/src/ui/components/iconfont/IconFlow.tsx diff --git a/src/ui/components/iconfont/IconFlowns.tsx b/apps/extension/src/ui/components/iconfont/IconFlowns.tsx similarity index 100% rename from src/ui/components/iconfont/IconFlowns.tsx rename to apps/extension/src/ui/components/iconfont/IconFlowns.tsx diff --git a/src/ui/components/iconfont/IconFusd.tsx b/apps/extension/src/ui/components/iconfont/IconFusd.tsx similarity index 100% rename from src/ui/components/iconfont/IconFusd.tsx rename to apps/extension/src/ui/components/iconfont/IconFusd.tsx diff --git a/src/ui/components/iconfont/IconGoogleDrive.tsx b/apps/extension/src/ui/components/iconfont/IconGoogleDrive.tsx similarity index 100% rename from src/ui/components/iconfont/IconGoogleDrive.tsx rename to apps/extension/src/ui/components/iconfont/IconGoogleDrive.tsx diff --git a/src/ui/components/iconfont/IconHuobi.tsx b/apps/extension/src/ui/components/iconfont/IconHuobi.tsx similarity index 100% rename from src/ui/components/iconfont/IconHuobi.tsx rename to apps/extension/src/ui/components/iconfont/IconHuobi.tsx diff --git a/src/ui/components/iconfont/IconImport.tsx b/apps/extension/src/ui/components/iconfont/IconImport.tsx similarity index 100% rename from src/ui/components/iconfont/IconImport.tsx rename to apps/extension/src/ui/components/iconfont/IconImport.tsx diff --git a/src/ui/components/iconfont/IconInbox.tsx b/apps/extension/src/ui/components/iconfont/IconInbox.tsx similarity index 100% rename from src/ui/components/iconfont/IconInbox.tsx rename to apps/extension/src/ui/components/iconfont/IconInbox.tsx diff --git a/src/ui/components/iconfont/IconKraken.tsx b/apps/extension/src/ui/components/iconfont/IconKraken.tsx similarity index 100% rename from src/ui/components/iconfont/IconKraken.tsx rename to apps/extension/src/ui/components/iconfont/IconKraken.tsx diff --git a/src/ui/components/iconfont/IconKucoin.tsx b/apps/extension/src/ui/components/iconfont/IconKucoin.tsx similarity index 100% rename from src/ui/components/iconfont/IconKucoin.tsx rename to apps/extension/src/ui/components/iconfont/IconKucoin.tsx diff --git a/src/ui/components/iconfont/IconLock.tsx b/apps/extension/src/ui/components/iconfont/IconLock.tsx similarity index 100% rename from src/ui/components/iconfont/IconLock.tsx rename to apps/extension/src/ui/components/iconfont/IconLock.tsx diff --git a/src/ui/components/iconfont/IconLogo.tsx b/apps/extension/src/ui/components/iconfont/IconLogo.tsx similarity index 100% rename from src/ui/components/iconfont/IconLogo.tsx rename to apps/extension/src/ui/components/iconfont/IconLogo.tsx diff --git a/src/ui/components/iconfont/IconMax.tsx b/apps/extension/src/ui/components/iconfont/IconMax.tsx similarity index 100% rename from src/ui/components/iconfont/IconMax.tsx rename to apps/extension/src/ui/components/iconfont/IconMax.tsx diff --git a/src/ui/components/iconfont/IconNfts.tsx b/apps/extension/src/ui/components/iconfont/IconNfts.tsx similarity index 100% rename from src/ui/components/iconfont/IconNfts.tsx rename to apps/extension/src/ui/components/iconfont/IconNfts.tsx diff --git a/src/ui/components/iconfont/IconNotification.tsx b/apps/extension/src/ui/components/iconfont/IconNotification.tsx similarity index 100% rename from src/ui/components/iconfont/IconNotification.tsx rename to apps/extension/src/ui/components/iconfont/IconNotification.tsx diff --git a/src/ui/components/iconfont/IconPlayStore.tsx b/apps/extension/src/ui/components/iconfont/IconPlayStore.tsx similarity index 100% rename from src/ui/components/iconfont/IconPlayStore.tsx rename to apps/extension/src/ui/components/iconfont/IconPlayStore.tsx diff --git a/src/ui/components/iconfont/IconPlus.tsx b/apps/extension/src/ui/components/iconfont/IconPlus.tsx similarity index 100% rename from src/ui/components/iconfont/IconPlus.tsx rename to apps/extension/src/ui/components/iconfont/IconPlus.tsx diff --git a/src/ui/components/iconfont/IconSearch.tsx b/apps/extension/src/ui/components/iconfont/IconSearch.tsx similarity index 100% rename from src/ui/components/iconfont/IconSearch.tsx rename to apps/extension/src/ui/components/iconfont/IconSearch.tsx diff --git a/src/ui/components/iconfont/IconSecurity.tsx b/apps/extension/src/ui/components/iconfont/IconSecurity.tsx similarity index 100% rename from src/ui/components/iconfont/IconSecurity.tsx rename to apps/extension/src/ui/components/iconfont/IconSecurity.tsx diff --git a/src/ui/components/iconfont/IconSetting.tsx b/apps/extension/src/ui/components/iconfont/IconSetting.tsx similarity index 100% rename from src/ui/components/iconfont/IconSetting.tsx rename to apps/extension/src/ui/components/iconfont/IconSetting.tsx diff --git a/src/ui/components/iconfont/IconSubtract.tsx b/apps/extension/src/ui/components/iconfont/IconSubtract.tsx similarity index 100% rename from src/ui/components/iconfont/IconSubtract.tsx rename to apps/extension/src/ui/components/iconfont/IconSubtract.tsx diff --git a/src/ui/components/iconfont/IconSwitch.tsx b/apps/extension/src/ui/components/iconfont/IconSwitch.tsx similarity index 100% rename from src/ui/components/iconfont/IconSwitch.tsx rename to apps/extension/src/ui/components/iconfont/IconSwitch.tsx diff --git a/src/ui/components/iconfont/IconTheme.tsx b/apps/extension/src/ui/components/iconfont/IconTheme.tsx similarity index 100% rename from src/ui/components/iconfont/IconTheme.tsx rename to apps/extension/src/ui/components/iconfont/IconTheme.tsx diff --git a/src/ui/components/iconfont/IconUserSwitch.tsx b/apps/extension/src/ui/components/iconfont/IconUserSwitch.tsx similarity index 100% rename from src/ui/components/iconfont/IconUserSwitch.tsx rename to apps/extension/src/ui/components/iconfont/IconUserSwitch.tsx diff --git a/src/ui/components/iconfont/IconVector.tsx b/apps/extension/src/ui/components/iconfont/IconVector.tsx similarity index 100% rename from src/ui/components/iconfont/IconVector.tsx rename to apps/extension/src/ui/components/iconfont/IconVector.tsx diff --git a/src/ui/components/iconfont/IconVector2.tsx b/apps/extension/src/ui/components/iconfont/IconVector2.tsx similarity index 100% rename from src/ui/components/iconfont/IconVector2.tsx rename to apps/extension/src/ui/components/iconfont/IconVector2.tsx diff --git a/src/ui/components/iconfont/helper.ts b/apps/extension/src/ui/components/iconfont/helper.ts similarity index 100% rename from src/ui/components/iconfont/helper.ts rename to apps/extension/src/ui/components/iconfont/helper.ts diff --git a/src/ui/components/iconfont/index.tsx b/apps/extension/src/ui/components/iconfont/index.tsx similarity index 100% rename from src/ui/components/iconfont/index.tsx rename to apps/extension/src/ui/components/iconfont/index.tsx diff --git a/src/ui/views/Welcome/AccountImport/ImportComponents/Googledrive.tsx b/apps/extension/src/ui/components/import-components/Googledrive.tsx similarity index 91% rename from src/ui/views/Welcome/AccountImport/ImportComponents/Googledrive.tsx rename to apps/extension/src/ui/components/import-components/Googledrive.tsx index bfce33fad..edb2b9a5e 100644 --- a/src/ui/views/Welcome/AccountImport/ImportComponents/Googledrive.tsx +++ b/apps/extension/src/ui/components/import-components/Googledrive.tsx @@ -1,11 +1,13 @@ import { Box, Button, Typography } from '@mui/material'; import React, { useState } from 'react'; -import { consoleError } from '@/shared/utils/console-log'; +import { consoleError } from '@onflow/flow-wallet-shared/utils/console-log'; + import { LLSpinner } from '@/ui/components'; import BrowserWarning from '@/ui/components/BrowserWarning'; import IconGoogleDrive from '@/ui/components/iconfont/IconGoogleDrive'; -import { useWallet } from '@/ui/utils/WalletContext'; +import { useWallet } from '@/ui/hooks/use-wallet'; +import { COLOR_DARKMODE_WHITE_3pc } from '@/ui/style/color'; const Googledrive = ({ setErrorMessage, setShowError, handleGoogleAccountsFound }) => { const wallets = useWallet(); @@ -43,7 +45,7 @@ const Googledrive = ({ setErrorMessage, setShowError, handleGoogleAccountsFound flexDirection: 'column', justifyContent: 'space-between', alignItems: 'center', - backgroundColor: '#2C2C2C', + backgroundColor: COLOR_DARKMODE_WHITE_3pc, borderRadius: '16px', py: '40px', }} diff --git a/src/ui/views/Welcome/AccountImport/ImportTabs.tsx b/apps/extension/src/ui/components/import-components/ImportTabs.tsx similarity index 89% rename from src/ui/views/Welcome/AccountImport/ImportTabs.tsx rename to apps/extension/src/ui/components/import-components/ImportTabs.tsx index 4382d8c3c..1be401203 100644 --- a/src/ui/views/Welcome/AccountImport/ImportTabs.tsx +++ b/apps/extension/src/ui/components/import-components/ImportTabs.tsx @@ -1,20 +1,21 @@ -import { Box, Tabs, Tab, Typography } from '@mui/material'; +import { Box, Tab, Tabs, Typography } from '@mui/material'; import React, { useEffect, useState } from 'react'; -import { type PublicKeyAccount } from '@/shared/types/wallet-types'; +import { type PublicKeyAccount } from '@onflow/flow-wallet-shared/types/wallet-types'; + import { QrCodeIcon } from '@/ui/assets/icons/QrCodeIcon'; +import Googledrive from '@/ui/components/import-components/Googledrive'; +import JsonImport from '@/ui/components/import-components/JsonImport'; +import KeyImport from '@/ui/components/import-components/KeyImport'; +import MobileAppImportSteps from '@/ui/components/import-components/mobile-app-import-steps'; +import SeedPhraseImport from '@/ui/components/import-components/SeedPhraseImport'; import ErrorModel from '@/ui/components/PopupModal/errorModel'; +import { useWallet } from '@/ui/hooks/use-wallet'; import { COLOR_GREEN_FLOW_DARKMODE_00EF8B, COLOR_GREEN_FLOW_DARKMODE_00EF8B_10pc, } from '@/ui/style/color'; -import { useWallet } from '@/ui/utils/WalletContext'; -import Googledrive from '@/ui/views/Welcome/AccountImport/ImportComponents/Googledrive'; -import JsonImport from '@/ui/views/Welcome/AccountImport/ImportComponents/JsonImport'; -import KeyImport from '@/ui/views/Welcome/AccountImport/ImportComponents/KeyImport'; -import SeedPhraseImport from '@/ui/views/Welcome/AccountImport/ImportComponents/SeedPhraseImport'; -import MobileAppImportSteps from './ImportComponents/mobile-app-import-steps'; function TabPanel(props) { const { children, value, index, ...other } = props; @@ -113,7 +114,7 @@ const ImportTabs = ({ {chrome.i18n.getMessage('Import__Profile')} - {chrome.i18n.getMessage('Support_Flow_Wallet_Blocto')} + {chrome.i18n.getMessage('Import_Profile_Subtitle')} @@ -136,6 +137,9 @@ const ImportTabs = ({ '& .MuiTabs-indicator': { background: 'transparent', }, + '& .MuiTabs-flexContainer': { + gap: '12px', + }, }} textColor="primary" > diff --git a/src/ui/views/Welcome/AccountImport/ImportComponents/JsonImport.tsx b/apps/extension/src/ui/components/import-components/JsonImport.tsx similarity index 90% rename from src/ui/views/Welcome/AccountImport/ImportComponents/JsonImport.tsx rename to apps/extension/src/ui/components/import-components/JsonImport.tsx index 51c4de666..b10917d16 100644 --- a/src/ui/views/Welcome/AccountImport/ImportComponents/JsonImport.tsx +++ b/apps/extension/src/ui/components/import-components/JsonImport.tsx @@ -2,22 +2,23 @@ import { Visibility, VisibilityOff } from '@mui/icons-material'; import { Box, Button, - Typography, - TextField, IconButton, - TextareaAutosize, InputAdornment, + TextareaAutosize, + TextField, + Typography, } from '@mui/material'; import React, { useState } from 'react'; -import { type PublicKeyAccount } from '@/shared/types/wallet-types'; -import { consoleError } from '@/shared/utils/console-log'; -import PasswordTextarea from '@/ui/components/PasswordTextarea'; -import { useWallet } from '@/ui/utils/WalletContext'; -import { LLSpinner } from 'ui/components'; +import { KEY_TYPE } from '@onflow/flow-wallet-shared/constant/algo-constants'; +import { type PublicKeyAccount } from '@onflow/flow-wallet-shared/types/wallet-types'; +import { consoleError } from '@onflow/flow-wallet-shared/utils/console-log'; -import ErrorModel from '../../../../components/PopupModal/errorModel'; -import { KEY_TYPE } from '../../../../utils/modules/constants'; +import { LLSpinner } from '@/ui/components/LLSpinner'; +import PasswordTextarea from '@/ui/components/password/PasswordTextarea'; +import ErrorModel from '@/ui/components/PopupModal/errorModel'; +import { useWallet } from '@/ui/hooks/use-wallet'; +import { COLOR_DARKMODE_WHITE_3pc } from '@/ui/style/color'; const JsonImport = ({ onOpen, @@ -147,7 +148,7 @@ const JsonImport = ({ sx: { width: '100%', borderRadius: '16px', - backgroundColor: '#2C2C2C', + backgroundColor: COLOR_DARKMODE_WHITE_3pc, padding: '20px 0', color: '#fff', marginBottom: '16px', @@ -171,7 +172,7 @@ const JsonImport = ({ style={{ width: '100%', borderRadius: '16px', - backgroundColor: '#2C2C2C', + backgroundColor: COLOR_DARKMODE_WHITE_3pc, padding: '20px', color: '#fff', marginBottom: '16px', diff --git a/src/ui/views/Welcome/AccountImport/ImportComponents/KeyImport.tsx b/apps/extension/src/ui/components/import-components/KeyImport.tsx similarity index 83% rename from src/ui/views/Welcome/AccountImport/ImportComponents/KeyImport.tsx rename to apps/extension/src/ui/components/import-components/KeyImport.tsx index 22172b852..cd8d67553 100644 --- a/src/ui/views/Welcome/AccountImport/ImportComponents/KeyImport.tsx +++ b/apps/extension/src/ui/components/import-components/KeyImport.tsx @@ -1,12 +1,13 @@ -import { Box, Button, Typography, TextField, TextareaAutosize } from '@mui/material'; +import { Box, Button, TextareaAutosize, Typography } from '@mui/material'; import React, { useState } from 'react'; -import { type PublicKeyAccount } from '@/shared/types/wallet-types'; -import PasswordTextarea from '@/ui/components/PasswordTextarea'; -import { useWallet } from '@/ui/utils/WalletContext'; -import { LLSpinner } from 'ui/components'; +import { KEY_TYPE } from '@onflow/flow-wallet-shared/constant/algo-constants'; +import { type PublicKeyAccount } from '@onflow/flow-wallet-shared/types/wallet-types'; -import { KEY_TYPE } from '../../../../utils/modules/constants'; +import { LLSpinner } from '@/ui/components/LLSpinner'; +import PasswordTextarea from '@/ui/components/password/PasswordTextarea'; +import { useWallet } from '@/ui/hooks/use-wallet'; +import { COLOR_DARKMODE_WHITE_3pc } from '@/ui/style/color'; const KeyImport = ({ onOpen, @@ -66,7 +67,7 @@ const KeyImport = ({ style={{ width: '100%', borderRadius: '16px', - backgroundColor: '#2C2C2C', + backgroundColor: COLOR_DARKMODE_WHITE_3pc, padding: '20px', color: '#fff', marginBottom: '16px', diff --git a/src/ui/views/Welcome/AccountImport/ImportComponents/SeedPhraseImport.tsx b/apps/extension/src/ui/components/import-components/SeedPhraseImport.tsx similarity index 86% rename from src/ui/views/Welcome/AccountImport/ImportComponents/SeedPhraseImport.tsx rename to apps/extension/src/ui/components/import-components/SeedPhraseImport.tsx index b41b8e7fa..fd5af736c 100644 --- a/src/ui/views/Welcome/AccountImport/ImportComponents/SeedPhraseImport.tsx +++ b/apps/extension/src/ui/components/import-components/SeedPhraseImport.tsx @@ -1,13 +1,14 @@ -import { Box, Button, Typography, TextareaAutosize } from '@mui/material'; +import { Box, Button, TextareaAutosize, Typography } from '@mui/material'; import React, { useState } from 'react'; -import { type PublicKeyAccount } from '@/shared/types/wallet-types'; -import { useWallet } from '@/ui/utils/WalletContext'; -import { LLSpinner } from 'ui/components'; +import { KEY_TYPE } from '@onflow/flow-wallet-shared/constant/algo-constants'; +import { type PublicKeyAccount } from '@onflow/flow-wallet-shared/types/wallet-types'; -import KeyPathInput from '../../../../components/KeyPathInputs'; -import PasswordTextarea from '../../../../components/PasswordTextarea'; -import { KEY_TYPE } from '../../../../utils/modules/constants'; +import KeyPathInput from '@/ui/components/KeyPathInputs'; +import { LLSpinner } from '@/ui/components/LLSpinner'; +import PasswordTextarea from '@/ui/components/password/PasswordTextarea'; +import { useWallet } from '@/ui/hooks/use-wallet'; +import { COLOR_DARKMODE_WHITE_3pc } from '@/ui/style/color'; const SeedPhraseImport = ({ onOpen, @@ -84,7 +85,7 @@ const SeedPhraseImport = ({ style={{ width: '100%', borderRadius: '16px', - backgroundColor: '#2C2C2C', + backgroundColor: COLOR_DARKMODE_WHITE_3pc, padding: '20px', color: '#fff', marginBottom: '16px', diff --git a/src/ui/views/Welcome/AccountImport/ImportComponents/mobile-app-import-steps.tsx b/apps/extension/src/ui/components/import-components/mobile-app-import-steps.tsx similarity index 98% rename from src/ui/views/Welcome/AccountImport/ImportComponents/mobile-app-import-steps.tsx rename to apps/extension/src/ui/components/import-components/mobile-app-import-steps.tsx index 4e95c4a0f..1d0880927 100644 --- a/src/ui/views/Welcome/AccountImport/ImportComponents/mobile-app-import-steps.tsx +++ b/apps/extension/src/ui/components/import-components/mobile-app-import-steps.tsx @@ -1,6 +1,6 @@ import { Box, Button, Typography } from '@mui/material'; import React from 'react'; -import { Link } from 'react-router-dom'; +import { Link } from 'react-router'; import { IconScan } from '@/ui/assets/icons/IconScan'; import { KeyIcon } from '@/ui/assets/icons/KeyIcon'; @@ -27,6 +27,7 @@ const ImportStep = ({ sx={{ width: '142px', padding: '16px 4px', + display: 'flex', flexDirection: 'column', alignItems: 'center', justifyItems: 'center', diff --git a/src/ui/views/Welcome/AccountImport/stories/ImportTabs.stories.tsx b/apps/extension/src/ui/components/import-components/stories/ImportTabs.stories.tsx similarity index 78% rename from src/ui/views/Welcome/AccountImport/stories/ImportTabs.stories.tsx rename to apps/extension/src/ui/components/import-components/stories/ImportTabs.stories.tsx index 02b322a48..8faf3a25f 100644 --- a/src/ui/views/Welcome/AccountImport/stories/ImportTabs.stories.tsx +++ b/apps/extension/src/ui/components/import-components/stories/ImportTabs.stories.tsx @@ -1,23 +1,23 @@ import { Box } from '@mui/material'; import type { Meta, StoryObj } from '@storybook/react-webpack5'; import React from 'react'; +// eslint-disable-next-line import/order +import { withRouter } from 'storybook-addon-remix-react-router'; import { action } from 'storybook/actions'; import { fn } from 'storybook/test'; -import { FLOW_BIP44_PATH } from '@/shared/utils/algo-constants'; -import { Link as LinkMock } from '@/stories/react-router-dom.mock'; -import { useWallet as useWalletMock } from '@/stories/wallet-context.mock'; +import { FLOW_BIP44_PATH } from '@onflow/flow-wallet-shared/constant/algo-constants'; + +import { useWallet as useWalletMock } from '@/ui/hooks/use-wallet.mock'; import ImportTabs from '../ImportTabs'; const meta = { - title: 'View/Welcome/AccountImport/ImportTabs', + title: 'components/import-components/ImportTabs', component: ImportTabs, decorators: [ + withRouter, (Story) => { - LinkMock.mockReset(); - LinkMock.mockImplementation((props: any) => ); - useWalletMock.mockReset(); useWalletMock.mockImplementation(() => ({ openapi: { @@ -27,7 +27,7 @@ const meta = { isBooted: fn().mockResolvedValue(false), })); return ( - + ); diff --git a/src/ui/views/Welcome/AccountImport/stories/mobile-app-import-steps.stories.tsx b/apps/extension/src/ui/components/import-components/stories/mobile-app-import-steps.stories.tsx similarity index 51% rename from src/ui/views/Welcome/AccountImport/stories/mobile-app-import-steps.stories.tsx rename to apps/extension/src/ui/components/import-components/stories/mobile-app-import-steps.stories.tsx index 70aafea41..697e4360d 100644 --- a/src/ui/views/Welcome/AccountImport/stories/mobile-app-import-steps.stories.tsx +++ b/apps/extension/src/ui/components/import-components/stories/mobile-app-import-steps.stories.tsx @@ -1,12 +1,15 @@ import React from 'react'; +import { withRouter } from 'storybook-addon-remix-react-router'; -import MobileAppImportSteps from '../ImportComponents/mobile-app-import-steps'; +import MobileAppImportSteps from '@/ui/components/import-components/mobile-app-import-steps'; export default { - title: 'View/Welcome/AccountImport/MobileAppImportSteps', + title: 'components/import-components/MobileAppImportSteps', tags: ['autodocs'], component: MobileAppImportSteps, + decorators: [withRouter], + argTypes: { isLogin: { control: 'boolean', diff --git a/src/ui/components/index.tsx b/apps/extension/src/ui/components/index.tsx similarity index 100% rename from src/ui/components/index.tsx rename to apps/extension/src/ui/components/index.tsx diff --git a/apps/extension/src/ui/components/password/PasswordHelperText.tsx b/apps/extension/src/ui/components/password/PasswordHelperText.tsx new file mode 100644 index 000000000..7fe87cd51 --- /dev/null +++ b/apps/extension/src/ui/components/password/PasswordHelperText.tsx @@ -0,0 +1,43 @@ +import CancelIcon from '@mui/icons-material/Cancel'; +import CheckCircleOutlineIcon from '@mui/icons-material/CheckCircleOutline'; +import { Box, Typography } from '@mui/material'; +import React from 'react'; + +import { COLOR_SUCCESS_GREEN_41CC5D, COLOR_ERROR_RED_E54040 } from '@/ui/style/color'; + +interface PasswordHelperTextProps { + variant: 'success' | 'error'; + message: string; +} + +export const PasswordHelperText: React.FC = ({ + message, + variant, +}: PasswordHelperTextProps) => ( + + {variant === 'success' ? ( + + ) : ( + + )} + + {message} + + +); diff --git a/apps/extension/src/ui/components/password/PasswordInput.tsx b/apps/extension/src/ui/components/password/PasswordInput.tsx new file mode 100644 index 000000000..fa585d28a --- /dev/null +++ b/apps/extension/src/ui/components/password/PasswordInput.tsx @@ -0,0 +1,168 @@ +import VisibilityIcon from '@mui/icons-material/Visibility'; +import VisibilityOffIcon from '@mui/icons-material/VisibilityOff'; +import { + Box, + LinearProgress, + Typography, + Input, + InputAdornment, + IconButton, + useMediaQuery, + useTheme, + Collapse, +} from '@mui/material'; +import React, { useCallback, useState } from 'react'; +import zxcvbn from 'zxcvbn'; + +import { PasswordHelperText } from './PasswordHelperText'; +// Password Indicator Component +interface PasswordIndicatorProps { + value: string; +} + +const PasswordIndicator = ({ value }: PasswordIndicatorProps) => { + const score = value ? zxcvbn(value).score : 0; + const percentage = ((score + 1) / 5) * 100; + + const level = (score: number) => { + switch (score) { + case 0: + case 1: + return { text: chrome.i18n.getMessage('Weak'), color: 'error' }; + case 2: + return { text: chrome.i18n.getMessage('Good'), color: 'testnet' }; + case 3: + return { text: chrome.i18n.getMessage('Great'), color: 'success' }; + case 4: + return { text: chrome.i18n.getMessage('Strong'), color: 'success' }; + default: + return { text: chrome.i18n.getMessage('Unknown'), color: 'error' }; + } + }; + + return ( + + {value && ( + + + + )} + + + {level(score).text} + + + + ); +}; + +// Password Input Component +interface PasswordInputProps { + value: string; + onChange: (value: string) => void; + onKeyDown?: (event: React.KeyboardEvent) => void; + readOnly?: boolean; + placeholder?: string; + helperText?: string; + errorText?: string; + autoFocus?: boolean; + showIndicator?: boolean; + showPassword?: boolean; + setShowPassword?: (func: (prev: boolean) => boolean) => void; + sx?: object; + endAdornment?: React.ReactNode; +} + +export const PasswordInput = ({ + value, + onChange, + onKeyDown, + readOnly = false, + placeholder = chrome.i18n.getMessage('Create__a__password'), + helperText = undefined, + errorText = undefined, + autoFocus = false, + showPassword, + setShowPassword, + showIndicator = false, + sx, + endAdornment, +}: PasswordInputProps) => { + const theme = useTheme(); + const isSmallScreen = useMediaQuery(theme.breakpoints.down('sm')); + const [showPasswordState, setShowPasswordState] = useState(false); + const isVisible = showPassword === undefined ? showPasswordState : showPassword; + + const handleSetShowPassword = useCallback(() => { + if (setShowPassword) { + setShowPassword((prev) => !prev); + } else { + setShowPasswordState((prev) => !prev); + } + }, [setShowPassword, setShowPasswordState]); + + const defaultEndAdornment = ( + + {!isSmallScreen && value && showIndicator && } + + {isVisible ? : } + + + ); + + return ( + + {isSmallScreen && showIndicator && ( + + + + )} + onChange(e.target.value)} + onKeyDown={onKeyDown} + endAdornment={endAdornment || defaultEndAdornment} + /> + + + + + + + ); +}; diff --git a/src/ui/components/PasswordTextarea.tsx b/apps/extension/src/ui/components/password/PasswordTextarea.tsx similarity index 96% rename from src/ui/components/PasswordTextarea.tsx rename to apps/extension/src/ui/components/password/PasswordTextarea.tsx index b8f5cee7b..24fcfeecb 100644 --- a/src/ui/components/PasswordTextarea.tsx +++ b/apps/extension/src/ui/components/password/PasswordTextarea.tsx @@ -2,6 +2,8 @@ import { Visibility, VisibilityOff } from '@mui/icons-material'; import { TextField, InputAdornment, IconButton, type TextFieldProps } from '@mui/material'; import React, { useState } from 'react'; +import { COLOR_DARKMODE_WHITE_3pc } from '@/ui/style/color'; + type PasswordTextareaProps = Omit< TextFieldProps, 'type' | 'InputProps' | 'multiline' | 'rows' // Keep these omitted as we add them back below @@ -48,7 +50,7 @@ const PasswordTextarea = ({ // Main input container styling '& .MuiInputBase-root': { borderRadius: '16px', - backgroundColor: '#2C2C2C', + backgroundColor: COLOR_DARKMODE_WHITE_3pc, color: '#fff', fontFamily: 'Inter', fontSize: '16px', @@ -102,7 +104,6 @@ const PasswordTextarea = ({ sx={{ ...defaultSx, ...sx }} fullWidth multiline - rows={minRows} minRows={minRows} maxRows={maxRows} InputProps={{ diff --git a/src/ui/components/SettingsPassword.tsx b/apps/extension/src/ui/components/password/SettingsPassword.tsx similarity index 59% rename from src/ui/components/SettingsPassword.tsx rename to apps/extension/src/ui/components/password/SettingsPassword.tsx index 4191b6794..78374e8b8 100644 --- a/src/ui/components/SettingsPassword.tsx +++ b/apps/extension/src/ui/components/password/SettingsPassword.tsx @@ -1,14 +1,12 @@ -import { Typography, Button, Input, FormControl } from '@mui/material'; -import Box from '@mui/material/Box'; +import { Box, Button, FormControl, Typography } from '@mui/material'; import React, { type ReactNode, useCallback, useEffect, useState } from 'react'; -import { Link, useHistory } from 'react-router-dom'; +import { useNavigate } from 'react-router'; -import { DEFAULT_PASSWORD } from '@/shared/utils/default'; -import { LLHeader } from '@/ui/components'; -import CancelIcon from '@/ui/components/iconfont/IconClose'; -import SlideRelative from '@/ui/components/SlideRelative'; +import { DEFAULT_PASSWORD } from '@onflow/flow-wallet-shared/utils/default'; -import { useWallet } from '../utils'; +import { LLHeader } from '@/ui/components/LLHeader'; +import { PasswordInput } from '@/ui/components/password/PasswordInput'; +import { useWallet } from '@/ui/hooks/use-wallet'; type PassMatch = 'match' | 'no-match' | 'unverified'; const SettingsPassword = ({ @@ -19,8 +17,9 @@ const SettingsPassword = ({ children?: ReactNode; }) => { const wallet = useWallet(); - const history = useHistory(); + const navigate = useNavigate(); const [password, setPassword] = useState(DEFAULT_PASSWORD); + const [isPasswordVisible, setPasswordVisible] = useState(false); const [passMatch, setPassMatch] = useState('unverified'); const verify = useCallback(() => { @@ -38,34 +37,20 @@ const SettingsPassword = ({ } }, [password, wallet]); - const navigate = useCallback(async () => { - history.replace({ - pathname: verifiedUrl, - state: { - password: password, - }, + const handleNavigate = useCallback(async () => { + navigate(verifiedUrl, { state: { password } }); + }, [navigate, verifiedUrl, password]); + + const goBack = useCallback(async () => { + navigate({ + pathname: '/dashboard', }); - }, [history, verifiedUrl, password]); + }, [navigate]); useEffect(() => { verify(); }, [password, verify]); - const passwordError = () => ( - - - - {chrome.i18n.getMessage('Incorrect__Password')} - - - ); - return (
- { - setPassword(event.target.value); + onChange={(value) => { + setPassword(value); }} + showPassword={isPasswordVisible} + setShowPassword={setPasswordVisible} + errorText={ + !!password && passMatch === 'no-match' + ? chrome.i18n.getMessage('Incorrect__Password') + : undefined + } + autoFocus={true} + placeholder={chrome.i18n.getMessage('Enter__Your__Password')} /> - - - - {passwordError()} - - {children} @@ -143,8 +105,7 @@ const SettingsPassword = ({ > @@ -264,4 +340,4 @@ const EditProfile = (props: MoveBoardProps) => { ); }; -export default EditProfile; +export default EditAccount; diff --git a/src/ui/views/Setting/Linked/EditAccount.tsx b/apps/extension/src/ui/views/Setting/AccountList/Linked/EditAccount.tsx similarity index 83% rename from src/ui/views/Setting/Linked/EditAccount.tsx rename to apps/extension/src/ui/views/Setting/AccountList/Linked/EditAccount.tsx index eab78e9e2..3a861c78a 100644 --- a/src/ui/views/Setting/Linked/EditAccount.tsx +++ b/apps/extension/src/ui/views/Setting/AccountList/Linked/EditAccount.tsx @@ -1,14 +1,10 @@ import CloseIcon from '@mui/icons-material/Close'; -import { Box, Drawer, Typography, Stack, InputBase } from '@mui/material'; +import { Box, Drawer, InputBase, Stack, Typography } from '@mui/material'; import Grid from '@mui/material/Grid'; import { styled } from '@mui/material/styles'; -import React, { useState, useEffect } from 'react'; -import { useHistory } from 'react-router-dom'; +import React, { useState } from 'react'; -import { consoleError } from '@/shared/utils/console-log'; -import { useWallet } from 'ui/utils'; - -import { LLPrimaryButton, LLSpinner } from '../../../components'; +import { LLPrimaryButton, LLSpinner } from '@/ui/components'; const StyledInput = styled(InputBase)(({ theme }) => ({ zIndex: 1, @@ -27,7 +23,7 @@ interface EditAccountProps { isAddAddressOpen: boolean; handleCloseIconClicked: () => void; handleCancelBtnClicked: () => void; - handleAddBtnClicked: () => void; + handleAddBtnClicked: (desc: string) => void; childAccount?: any; address?: string; userInfo?: any; @@ -42,12 +38,10 @@ const EditAccount = ({ isAddAddressOpen, handleCloseIconClicked, handleCancelBtnClicked, + handleAddBtnClicked, childAccount, address, }: EditAccountProps) => { - const wallet = useWallet(); - const history = useHistory(); - const [isLoading, setIsLoading] = useState(false); const [failed, setFailed] = useState(false); const [name, setName] = useState(childAccount?.name || ''); @@ -55,26 +49,9 @@ const EditAccount = ({ const onSubmit = async () => { setIsLoading(true); - wallet - .editChildAccount(address!, name, desc, childAccount.thumbnail.url) - .then(async (txId) => { - setIsLoading(false); - handleCancelBtnClicked(); - wallet.listenTransaction( - txId, - true, - `${address} unlinked`, - `You have unlinked the child account ${address} from your account. \nClick to view this transaction.` - ); - await wallet.setDashIndex(0); - history.push(`/dashboard?activity=1&txId=${txId}`); - }) - .catch((error) => { - consoleError('EditAccount - failed to edit child account', error); + handleAddBtnClicked(desc); - setIsLoading(false); - setFailed(false); - }); + handleCancelBtnClicked(); }; const renderContent = () => ( @@ -167,7 +144,7 @@ const EditAccount = ({ /> - + {isLoading ? ( { - const history = useHistory(); + const navigate = useNavigate(); const wallet = useWallet(); const { @@ -57,7 +56,7 @@ const UnlinkAccount = (props: UnlinkAccountProps) => { `You have unlinked the child account ${props.address} from your account. \nClick to view this transaction.` ); await wallet.setDashIndex(0); - history.push(`/dashboard?activity=1&txId=${txId}`); + navigate(`/dashboard?activity=1&txId=${txId}`); }) .catch((err) => { setIsLoading(false); diff --git a/apps/extension/src/ui/views/Setting/AccountList/LinkedDetail.tsx b/apps/extension/src/ui/views/Setting/AccountList/LinkedDetail.tsx new file mode 100644 index 000000000..094ffe24e --- /dev/null +++ b/apps/extension/src/ui/views/Setting/AccountList/LinkedDetail.tsx @@ -0,0 +1,497 @@ +import { + Box, + Card, + CardActionArea, + CardContent, + CardMedia, + Divider, + FormControlLabel, + List, + Skeleton, + Switch, + Typography, +} from '@mui/material'; +import React, { useMemo, useState } from 'react'; +import { useLocation, useNavigate, useParams } from 'react-router'; + +import { type NFTCollections } from '@onflow/flow-wallet-shared/types/nft-types'; + +import { EditIcon } from '@/ui/assets/icons/settings/Edit'; +import { LLHeader, LLSecondaryButton } from '@/ui/components'; +import { AccountCard } from '@/ui/components/account/account-card'; +import SettingsListCard from '@/ui/components/settings/settings-list-card'; +import SlidingTabSwitch from '@/ui/components/settings/sliding-tab-switch'; +import { + useChildAccountAllowTypes, + useChildAccountDescription, + useCurrentId, + useMainAccount, + useUserInfo, +} from '@/ui/hooks/use-account-hooks'; +import { useChildAccountFt } from '@/ui/hooks/use-coin-hooks'; +import { useWallet } from '@/ui/hooks/use-wallet'; +import { useNftCatalogCollections, useNftCollectionList } from '@/ui/hooks/useNftHook'; +import { useProfiles } from '@/ui/hooks/useProfileHook'; +import { + COLOR_GRAY_808080, + COLOR_WHITE_ALPHA_40_FFFFFF66, + COLOR_WHITE_ALPHA_80_FFFFFFCC, +} from '@/ui/style/color'; + +import EditAccount from './Linked/EditAccount'; +import UnlinkAccount from './Linked/UnlinkAccount'; + +interface TicketToken { + id: string; + balance: string; +} + +const NftContent = ({ + availableNftCollection, + hideEmpty, + navigateWithState, +}: { + availableNftCollection: NFTCollections[]; + hideEmpty: boolean; + navigateWithState: (data: NFTCollections) => void; +}) => { + const filteredNftCollection = hideEmpty + ? availableNftCollection.filter((item) => item.count > 0) + : availableNftCollection; + const items = filteredNftCollection.map((item) => ({ + iconColor: '#292929', + iconUrl: item.collection.logo, + iconText: '', + title: item.collection.name, + subtitle: `${item.count} ${chrome.i18n.getMessage('Collected')}`, + onClick: () => navigateWithState(item), + })); + + if (!items.length) { + return ( + + + No accessible NFT + + + ); + } + + return ; +}; + +const FtContent = ({ availableFt }: { availableFt: TicketToken[] | undefined }) => { + const items = (availableFt || []).map((item) => ({ + iconColor: '#333', + iconText: '', + title: item.id, + subtitle: item.balance, + onClick: () => {}, + })); + + if (!items.length) { + return ( + + + No accessible Coin + + + ); + } + + return ; +}; + +const LinkedDetail = () => { + const wallet = useWallet(); + const location = useParams(); + const locationState = useLocation(); + + const navigate = useNavigate(); + const [unlinking, setUnlinking] = useState(false); + const [isEdit, setEdit] = useState(false); + const [hideEmpty, setHide] = useState(true); + const [value, setValue] = useState('one'); + + const { currentWallet, network } = useProfiles(); + // Extract parentName and parentAddress from URL query parameters + const urlParams = new URLSearchParams(locationState.search); + const parentName = urlParams.get('parentName') || ''; + const parentAddress = urlParams.get('parentAddress') || ''; + + const childAccountAddress: string | undefined = location['key']; + const childAccounts = useMainAccount(network, parentAddress)?.childAccounts; + const childAccount = childAccounts?.find((account) => account.address === childAccountAddress); + + //Can only make unlink action if the current wallet is the parent wallet of the linked account + const active = currentWallet.address === parentAddress; + + const childAccountAllowTypes = useChildAccountAllowTypes( + network, + parentAddress, + childAccountAddress + ); + + const allCollectionList = useNftCollectionList(network); + const nftCollectionsList = useNftCatalogCollections(network, childAccountAddress); + + const availableFt = useChildAccountFt(network, parentAddress, childAccountAddress); + const description = useChildAccountDescription(childAccountAddress || ''); + + const availableNftCollection: NFTCollections[] | undefined = useMemo(() => { + if (!nftCollectionsList || !childAccountAllowTypes) { + return undefined; + } + + // Start with collections that have NFTs + const result = [...nftCollectionsList]; + + // Create a set of existing collection keys to avoid duplicates + const existingCollectionKeys = new Set(); + nftCollectionsList.forEach((item) => { + const key = `${item.collection.address}.${item.collection.contract_name}`; + existingCollectionKeys.add(key); + }); + + // Add empty collections for allowed types that don't have NFTs + childAccountAllowTypes.forEach((allowType) => { + const parts = allowType.split('.'); + const address = parts[1]; + const contractName = parts[2]; + const key = `${address}.${contractName}`; + + // Only add if this collection doesn't already exist + if (!existingCollectionKeys.has(key)) { + // Find the collection details in allCollectionList + // logo is missing from the collection api + const collectionDetails = allCollectionList?.find((collection) => { + return collection.address === `0x${address}` && collection.id === contractName; + }); + + const emptyCollection = { + collection: { + id: collectionDetails?.id || `${contractName}Collection`, + contract_name: contractName, + address: `0x${address}`, + name: collectionDetails?.name || contractName, + logo: collectionDetails?.logo || '', + banner: collectionDetails?.banner || '', + description: collectionDetails?.description || '', + path: { + storage_path: `/storage/${contractName}Collection`, + public_path: `/public/${contractName}Collection`, + private_path: 'deprecated/private_path', + }, + socials: {}, + nftTypeId: allowType, + }, + ids: [], + count: 0, + }; + result.push(emptyCollection); + } + }); + + return result; + }, [nftCollectionsList, childAccountAllowTypes, allCollectionList]); + + const loading = availableNftCollection === undefined; + + const currentId = useCurrentId(); + const userInfo = useUserInfo(currentId); + + const showUnlink = async (condition) => { + await setUnlinking(condition); + }; + + const toggleEdit = () => setEdit((prev) => !prev); + + const toggleHide = (event) => { + event.stopPropagation(); + const prevEmpty = hideEmpty; + setHide(!prevEmpty); + }; + + const navigateWithState = (data: NFTCollections) => { + const state = { nft: data }; + localStorage.setItem('nftLinkedState', JSON.stringify(state)); + const storagePath = data.collection.path.storage_path.split('/')[2]; + if (data.count) { + navigate( + `/dashboard/nested/linked/collectiondetail/${childAccountAddress + '.' + storagePath + '.' + data.count + '.linked'}`, + { + state: { + collection: data, + ownerAddress: childAccountAddress, + }, + } + ); + } + }; + + return ( +
+ + + + + + {childAccount && ( + } + showLink={true} + parentAccount={{ + address: parentAddress, + name: parentName, + icon: '👤', + color: '#000000', + chain: network === 'mainnet' ? 747 : 545, + id: 1, + }} + /> + )} + + + + {chrome.i18n.getMessage('Description')} + + + {description || 'No Description'} + + + + + + + + {chrome.i18n.getMessage('Accessible')} + + + + + {chrome.i18n.getMessage('View_Empty')} + + } + control={} + sx={{ + marginLeft: 'auto', + marginRight: 0, + }} + /> + + + + {loading ? ( + + {[...Array(2).keys()].map((key) => ( + + + + + + + + + + + ))} + + ) : ( + + {value === 'one' ? ( + availableNftCollection && ( + + ) + ) : ( + + )} + + )} + + {active && ( + showUnlink(true)} + sx={{ + background: '#F04438CC', + color: '#fff', + borderRadius: '16px', + textTransform: 'capitalize', + padding: '16px', + fontSize: '16px', + fontWeight: '600', + '&:hover': { + background: '#A93226', + }, + }} + /> + )} + + showUnlink(false)} + handleCancelBtnClicked={() => showUnlink(false)} + handleAddBtnClicked={() => { + showUnlink(false); + }} + childAccount={childAccount} + address={childAccountAddress} + userInfo={userInfo} + /> + {isEdit && childAccount && ( + setEdit(false)} + handleCancelBtnClicked={() => setEdit(false)} + handleAddBtnClicked={async (desc) => { + await wallet.setChildAccountDescription(childAccount.address, desc); + setEdit(false); + }} + childAccount={childAccount} + address={childAccountAddress} + userInfo={userInfo} + /> + )} + +
+ ); +}; + +export default LinkedDetail; diff --git a/src/ui/views/Setting/Wallet/RemoveWallet.tsx b/apps/extension/src/ui/views/Setting/AccountList/RemoveWallet.tsx similarity index 89% rename from src/ui/views/Setting/Wallet/RemoveWallet.tsx rename to apps/extension/src/ui/views/Setting/AccountList/RemoveWallet.tsx index 4efe3864a..ef9c2ce11 100644 --- a/src/ui/views/Setting/Wallet/RemoveWallet.tsx +++ b/apps/extension/src/ui/views/Setting/AccountList/RemoveWallet.tsx @@ -1,18 +1,17 @@ import ArrowBackIcon from '@mui/icons-material/ArrowBack'; -import { Typography, Box, IconButton, Skeleton, Button } from '@mui/material'; -import React, { useState, useEffect, useCallback } from 'react'; -import { useHistory } from 'react-router-dom'; +import { Box, Button, IconButton, Skeleton, Typography } from '@mui/material'; +import React, { useCallback, useEffect, useState } from 'react'; +import { useNavigate } from 'react-router'; -import { type UserInfoResponse } from '@/shared/types/network-types'; -import { withPrefix } from '@/shared/utils/address'; -import { LLSecondaryButton } from '@/ui/components'; -import { useWallet } from 'ui/utils'; -import { openInternalPageInTab } from 'ui/utils/webapi'; +import { type UserInfoResponse } from '@onflow/flow-wallet-shared/types/network-types'; +import { withPrefix } from '@onflow/flow-wallet-shared/utils/address'; -import reset from '../../../assets/svg/reset.svg'; +import reset from '@/ui/assets/svg/reset.svg'; +import { LLSecondaryButton } from '@/ui/components'; +import { useWallet } from '@/ui/hooks/use-wallet'; const RemoveWallet = ({ hideBackButton = false }) => { - const history = useHistory(); + const navigate = useNavigate(); const restPass = () => { usewallet.resetPwd(); @@ -83,7 +82,7 @@ const RemoveWallet = ({ hideBackButton = false }) => { }} > navigate(-1)} sx={{ borderRadius: '100%', margin: '8px', @@ -166,7 +165,7 @@ const RemoveWallet = ({ hideBackButton = false }) => { navigate(-1)} /> +
+ + setErrorMessage('')} + anchorOrigin={{ vertical: 'bottom', horizontal: 'center' }} + > + setErrorMessage('')} severity="error" sx={{ width: '100%' }}> + {errorMessage} + + + + {/* Simple success message with better visibility */} + {isResetting && !errorMessage && ( + + + + {chrome.i18n.getMessage('Password__Change__Success')} + + + )} + + changePassword(true)} + onError={setErrorMessage} + /> + + setShowProfileBackupDialog(false)} + onConfirm={handleProfileSelection} + currentPassword={confirmCurrentPassword} + /> + + {statusMessage && ( + + + + {statusMessage} + + + )} + + ); +}; + +export default ChangePassword; diff --git a/src/ui/views/Setting/change-password/profile-backup-selection.tsx b/apps/extension/src/ui/views/Setting/change-password/profile-backup-selection.tsx similarity index 96% rename from src/ui/views/Setting/change-password/profile-backup-selection.tsx rename to apps/extension/src/ui/views/Setting/change-password/profile-backup-selection.tsx index f93e35d5a..bb9a80e10 100644 --- a/src/ui/views/Setting/change-password/profile-backup-selection.tsx +++ b/apps/extension/src/ui/views/Setting/change-password/profile-backup-selection.tsx @@ -1,22 +1,23 @@ import { + Box, Checkbox, + CircularProgress, + DialogActions, + DialogContent, + DialogTitle, List, ListItem, Typography, - Box, - CircularProgress, - DialogTitle, - DialogContent, - DialogActions, } from '@mui/material'; -import React, { useState, useEffect, useCallback } from 'react'; +import React, { useCallback, useEffect, useState } from 'react'; + +import { type ProfileBackupStatus } from '@onflow/flow-wallet-shared/types/wallet-types'; +import { consoleError } from '@onflow/flow-wallet-shared/utils/console-log'; -import { type ProfileBackupStatus } from '@/shared/types/wallet-types'; -import { consoleError } from '@/shared/utils/console-log'; import { CustomDialog } from '@/ui/components/custom-dialog'; import { LLPrimaryButton } from '@/ui/components/LLPrimaryButton'; import { LLSecondaryButton } from '@/ui/components/LLSecondaryButton'; -import { useWallet } from '@/ui/utils'; +import { useWallet } from '@/ui/hooks/use-wallet'; interface ProfileBackupSelectionDialogProps { open: boolean; diff --git a/apps/extension/src/ui/views/Setting/index.tsx b/apps/extension/src/ui/views/Setting/index.tsx new file mode 100644 index 000000000..861d213b7 --- /dev/null +++ b/apps/extension/src/ui/views/Setting/index.tsx @@ -0,0 +1,239 @@ +import AndroidIcon from '@mui/icons-material/Android'; +import AppleIcon from '@mui/icons-material/Apple'; +import { Box, Divider, IconButton, List } from '@mui/material'; +import React, { useCallback, useEffect, useState } from 'react'; +import { Link } from 'react-router'; + +import { AboutIcon } from '@/ui/assets/icons/settings/About'; +import { AccountListIcon } from '@/ui/assets/icons/settings/AccountList'; +import { AddProfileIcon } from '@/ui/assets/icons/settings/AddProfile'; +import { AddressIcon } from '@/ui/assets/icons/settings/Address'; +import { BackupIcon } from '@/ui/assets/icons/settings/Backup'; +import { CurrencyIcon } from '@/ui/assets/icons/settings/Currency'; +import { DevicesIcon } from '@/ui/assets/icons/settings/Devices'; +import { DevmodeIcon } from '@/ui/assets/icons/settings/Devmode'; +import { EditIcon } from '@/ui/assets/icons/settings/Edit'; +import { MobileIcon } from '@/ui/assets/icons/settings/Mobile'; +import { SecurityIcon } from '@/ui/assets/icons/settings/Security'; +import { LLHeader } from '@/ui/components'; +import IconEnd from '@/ui/components/iconfont/IconAVector11Stroke'; +import { ProfileItem } from '@/ui/components/profile/profile-item'; +import SettingsListItem from '@/ui/components/settings/setting-list-item'; +import { useWallet } from '@/ui/hooks/use-wallet'; +import { useProfiles } from '@/ui/hooks/useProfileHook'; +// Feature flags +const SHOW_DEVICES = false; + +const SettingTab = () => { + const usewallet = useWallet(); + const { profileIds, activeAccountType, userInfo } = useProfiles(); + const [isKeyphrase, setIsKeyphrase] = useState(false); + + const checkIsKeyphrase = useCallback(async () => { + const keyrings = await usewallet.checkMnemonics(); + await setIsKeyphrase(keyrings); + }, [usewallet]); + + useEffect(() => { + checkIsKeyphrase(); + }, [checkIsKeyphrase]); + + return ( +
+ + {userInfo && profileIds && profileIds.length > 1 && ( + + + {}} + setLoadingId={() => {}} + rightIcon={} + noPadding={true} + /> + + + )} + + {/* top link */} + + } + text={chrome.i18n.getMessage('Accounts')} + showArrow={false} + /> + + } + text={chrome.i18n.getMessage('AddressBook')} + showArrow={false} + /> + + + } + text={chrome.i18n.getMessage('Display__Currency')} + endIcon={} + /> + + {activeAccountType === 'main' && } + {isKeyphrase && activeAccountType === 'main' && ( + } + text={chrome.i18n.getMessage('Backup')} + endIcon={} + /> + )} + + } + text={chrome.i18n.getMessage('Password')} + endIcon={} + /> + + + } + text={chrome.i18n.getMessage('Try_Our_Mobile_APP')} + endIcon={ + <> + + window.open( + 'https://apps.apple.com/ca/app/flow-wallet-nfts-and-crypto/id6478996750' + ) + } + > + + + + window.open( + 'https://play.google.com/store/apps/details?id=com.flowfoundation.wallet' + ) + } + > + + + + } + /> + + + + } + text={chrome.i18n.getMessage('Developer__Mode')} + endIcon={} + /> + + + + {SHOW_DEVICES && ( + <> + } + text={chrome.i18n.getMessage('Devices')} + endIcon={} + /> + + + )} + + } + text={chrome.i18n.getMessage('About')} + endIcon={} + /> + + + await usewallet.lockAdd()} + icon={} + text={chrome.i18n.getMessage('Add_Profile') || 'Add Profile'} + endIcon={} + /> + + +
+ ); +}; + +export default SettingTab; diff --git a/src/ui/views/Setting/privatekey/Keydetail.tsx b/apps/extension/src/ui/views/Setting/privatekey/Keydetail.tsx similarity index 72% rename from src/ui/views/Setting/privatekey/Keydetail.tsx rename to apps/extension/src/ui/views/Setting/privatekey/Keydetail.tsx index 8d578d8bc..1e02f1feb 100644 --- a/src/ui/views/Setting/privatekey/Keydetail.tsx +++ b/apps/extension/src/ui/views/Setting/privatekey/Keydetail.tsx @@ -1,43 +1,30 @@ import { Box, IconButton, Typography } from '@mui/material'; import Grid from '@mui/material/Grid'; -import React, { useEffect, useState, useCallback } from 'react'; -import { useHistory, useLocation } from 'react-router-dom'; +import React, { useCallback, useEffect, useState } from 'react'; +import { useLocation, useNavigate } from 'react-router'; + +import { consoleError } from '@onflow/flow-wallet-shared/utils/console-log'; -import { pubKeyTupleToAccountKey } from '@/background/utils/account-key'; -import { consoleError } from '@/shared/utils/console-log'; import { LLHeader } from '@/ui/components'; import IconCopy from '@/ui/components/iconfont/IconCopy'; +import { useWallet } from '@/ui/hooks/use-wallet'; import { useProfiles } from '@/ui/hooks/useProfileHook'; -import { useWallet } from 'ui/utils'; - -interface State { - password: string; -} const Keydetail = () => { - const location = useLocation(); - const history = useHistory(); + const location = useLocation(); + const navigate = useNavigate(); const wallet = useWallet(); const { parentWallet } = useProfiles(); const [privatekey, setKey] = useState(undefined); + const publicKey = parentWallet?.publicKey; const verify = useCallback(async () => { try { - const pwd = location.state.password; - - const result = await wallet.getPubKeyPrivateKey(pwd); - - const accountKey = pubKeyTupleToAccountKey(parentWallet.publicKey, result); - let pk = ''; - - // Find matching algorithm - if (accountKey.public_key === result.P256.pubK) { - pk = result.P256.pk; - } else if (accountKey.public_key === result.SECP256K1.pubK) { - pk = result.SECP256K1.pk; - } else { - throw new Error('No matching public key algorithm found'); + const pwd: string | undefined = location.state?.password; + if (!pwd) { + throw new Error('Password is required'); } + const pk = await wallet.getPrivateKey(pwd); setKey(pk); } catch (error) { @@ -48,16 +35,16 @@ const Keydetail = () => { setKey('Error during verification'); } } - }, [location.state?.password, wallet, parentWallet]); + }, [location.state?.password, wallet]); useEffect(() => { if (!location.state?.password || !location.state) { - history.push('/dashboard/nested/privatekeypassword'); + navigate('/dashboard/nested/privatekeypassword'); } - if (parentWallet?.publicKey) { + if (publicKey) { verify(); } - }, [verify, parentWallet?.publicKey, history, location.state]); + }, [verify, publicKey, navigate, location.state]); const CredentialBox = ({ data }: { data?: string }) => { return ( @@ -125,7 +112,7 @@ const Keydetail = () => { {chrome.i18n.getMessage('Public__Key')} - + { {chrome.i18n.getMessage('Hash__Algorithm')}
- {parentWallet && parentWallet?.publicKey ? parentWallet?.hashAlgoString : ''} + {parentWallet && publicKey ? parentWallet?.hashAlgoString : ''}
{chrome.i18n.getMessage('Sign__Algorithm')}
- {parentWallet && parentWallet?.publicKey ? parentWallet?.signAlgoString : ''} + {parentWallet && publicKey ? parentWallet?.signAlgoString : ''}
diff --git a/src/ui/views/Setting/privatekey/Privatekeypassword.tsx b/apps/extension/src/ui/views/Setting/privatekey/Privatekeypassword.tsx similarity index 75% rename from src/ui/views/Setting/privatekey/Privatekeypassword.tsx rename to apps/extension/src/ui/views/Setting/privatekey/Privatekeypassword.tsx index e85b81681..fa4832ae2 100644 --- a/src/ui/views/Setting/privatekey/Privatekeypassword.tsx +++ b/apps/extension/src/ui/views/Setting/privatekey/Privatekeypassword.tsx @@ -1,13 +1,8 @@ -import { Typography, Button, Fade, Input, FormControl } from '@mui/material'; +import { Typography, Fade } from '@mui/material'; import Box from '@mui/material/Box'; -import React, { useCallback, useEffect, useState } from 'react'; -import { Link, useHistory } from 'react-router-dom'; +import React from 'react'; -import { LLHeader } from '@/ui/components'; -import CancelIcon from '@/ui/components/iconfont/IconClose'; -import SettingsPassword from '@/ui/components/SettingsPassword'; -import SlideRelative from '@/ui/components/SlideRelative'; -import { useWallet } from 'ui/utils'; +import SettingsPassword from '@/ui/components/password/SettingsPassword'; const PrivateKeyPassword = () => { return ( diff --git a/src/ui/views/Setting/recoveryphase/Recoveryphasedetail.tsx b/apps/extension/src/ui/views/Setting/recoveryphase/Recoveryphasedetail.tsx similarity index 94% rename from src/ui/views/Setting/recoveryphase/Recoveryphasedetail.tsx rename to apps/extension/src/ui/views/Setting/recoveryphase/Recoveryphasedetail.tsx index 40d4b9695..ce8d88adb 100644 --- a/src/ui/views/Setting/recoveryphase/Recoveryphasedetail.tsx +++ b/apps/extension/src/ui/views/Setting/recoveryphase/Recoveryphasedetail.tsx @@ -1,19 +1,14 @@ -import { Typography, Button } from '@mui/material'; +import { Button, Typography } from '@mui/material'; import Box from '@mui/material/Box'; -import React, { useState, useEffect, useCallback } from 'react'; -import { useLocation } from 'react-router-dom'; +import React, { useCallback, useEffect, useState } from 'react'; +import { useLocation } from 'react-router'; -// import { useRouteMatch } from 'react-router-dom'; import { LLHeader } from '@/ui/components'; import IconCopy from '@/ui/components/iconfont/IconCopy'; -import { useWallet } from 'ui/utils'; - -interface State { - password: string; -} +import { useWallet } from '@/ui/hooks/use-wallet'; const RecoveryPhasesDetail = () => { - const location = useLocation(); + const location = useLocation(); const wallet = useWallet(); const [recoveryphases, setRecovery] = useState(''); diff --git a/apps/extension/src/ui/views/Setting/recoveryphase/Recoveryphrasepassword.tsx b/apps/extension/src/ui/views/Setting/recoveryphase/Recoveryphrasepassword.tsx new file mode 100644 index 000000000..db66c2f95 --- /dev/null +++ b/apps/extension/src/ui/views/Setting/recoveryphase/Recoveryphrasepassword.tsx @@ -0,0 +1,55 @@ +import { Typography, Fade } from '@mui/material'; +import Box from '@mui/material/Box'; +import React from 'react'; + +import SettingsPassword from '@/ui/components/password/SettingsPassword'; + +const Recoveryphrasepassword = () => { + return ( + + + + + {chrome.i18n.getMessage('Do__not__share__your__secret__phrase')} + + + {chrome.i18n.getMessage('If__someone__has__your__secret__phrase')} + + + + + ); +}; + +export default Recoveryphrasepassword; diff --git a/apps/extension/src/ui/views/Setting/stories/Setting.stories.tsx b/apps/extension/src/ui/views/Setting/stories/Setting.stories.tsx new file mode 100644 index 000000000..7097c544f --- /dev/null +++ b/apps/extension/src/ui/views/Setting/stories/Setting.stories.tsx @@ -0,0 +1,142 @@ +import { type Meta, type StoryObj } from '@storybook/react-webpack5'; +import React from 'react'; +import { withRouter } from 'storybook-addon-remix-react-router'; + +import { useUserInfo as useUserInfoMock } from '@/ui/hooks/use-account-hooks.mock'; +import { useUserData } from '@/ui/hooks/use-data.mock'; +import { useWallet as useWalletMock } from '@/ui/hooks/use-wallet.mock'; +import { useNetwork } from '@/ui/hooks/useNetworkHook.mock'; +import { USE_PROFILES_MOCK, useProfiles } from '@/ui/hooks/useProfileHook.mock'; + +import SettingTab from '../index'; + +// Mock the useWallet hook +const mockUseWallet = { + getActiveAccountType: () => Promise.resolve('main'), + checkMnemonics: () => Promise.resolve(true), + lockAdd: () => Promise.resolve(), +}; + +const meta: Meta = { + title: 'Views/Setting/SettingTab', + component: SettingTab, + tags: ['autodocs'], + parameters: { + backgrounds: { + default: 'dark', + }, + docs: { + description: { + component: 'The main settings page for the Flow Wallet extension.', + }, + }, + }, + decorators: [ + withRouter, + (Story) => ( + +
+ +
+
+ ), + ], +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = { + render: () => { + useUserInfoMock.mockReturnValue({ + avatar: 'https://lilico.app/api/avatar/beam/120/avatar', + nickname: 'Test User', + username: 'testuser', + private: 0, + created: '2021-01-01', + id: '1', + }); + useNetwork.mockReturnValue({ + network: 'mainnet', + developerMode: false, + emulatorModeOn: false, + }); + useUserData.mockImplementation((key: string | null | undefined) => { + if (key === 'currentId') return '1'; + if (key === 'userWallets') return { currentAddress: '0x12345678', network: 'mainnet' }; + if (key === 'keyringState') return { currentId: '1' }; + if (key === 'lilicoPayer') return '0x12345678'; + return undefined; + }); + useProfiles.mockReturnValue({ + ...USE_PROFILES_MOCK, + profileIds: [], + userInfo: undefined, + }); + useWalletMock.mockReturnValue(mockUseWallet); + + return ; + }, + parameters: { + docs: { + description: { + story: 'Default settings page.', + }, + }, + }, +}; + +export const WithProfile: Story = { + render: () => { + useUserInfoMock.mockReturnValue({ + avatar: 'https://lilico.app/api/avatar/beam/120/avatar', + nickname: 'Test User', + username: 'testuser', + private: 0, + created: '2021-01-01', + id: '1', + }); + useNetwork.mockReturnValue({ + network: 'mainnet', + developerMode: false, + emulatorModeOn: false, + }); + useUserData.mockImplementation((key: string | null | undefined) => { + if (key === 'currentId') return '1'; + if (key === 'userWallets') return { currentAddress: '0x12345678', network: 'mainnet' }; + if (key === 'keyringState') return { currentId: '1' }; + if (key === 'lilicoPayer') return '0x12345678'; + return undefined; + }); + useProfiles.mockReturnValue({ + ...USE_PROFILES_MOCK, + profileIds: ['1', '2'], + userInfo: { + avatar: 'https://lilico.app/api/avatar/beam/120/avatar', + nickname: 'Test User', + username: 'testuser', + private: 0, + created: '2021-01-01', + id: '1', + }, + }); + useWalletMock.mockReturnValue(mockUseWallet); + + return ; + }, + parameters: { + docs: { + description: { + story: 'Settings page with a user profile displayed at the top.', + }, + }, + }, +}; diff --git a/src/ui/views/SortHat.tsx b/apps/extension/src/ui/views/SortHat.tsx similarity index 82% rename from src/ui/views/SortHat.tsx rename to apps/extension/src/ui/views/SortHat.tsx index abcead704..f93557534 100644 --- a/src/ui/views/SortHat.tsx +++ b/apps/extension/src/ui/views/SortHat.tsx @@ -1,9 +1,11 @@ import React, { useCallback, useEffect, useState } from 'react'; -import { Redirect } from 'react-router-dom'; +import { Navigate } from 'react-router'; -import Spin from 'ui/components/Spin'; -import { useWallet, getUiType, useApproval } from 'ui/utils'; -import { openInternalPageInTab } from 'ui/utils/webapi'; +import Spin from '@/ui/components/Spin'; +import { useApproval } from '@/ui/hooks/use-approval'; +import { useWallet } from '@/ui/hooks/use-wallet'; +import { getUiType } from '@/ui/utils'; +import { openInternalPageInTab } from '@/ui/utils/webapi'; const SortHat = () => { const wallet = useWallet(); @@ -69,7 +71,7 @@ const SortHat = () => { // // {to && } - {to && } + {to && } // ); }; diff --git a/src/ui/views/TokenDetail/ClaimTokenCard.tsx b/apps/extension/src/ui/views/TokenDetail/ClaimTokenCard.tsx similarity index 93% rename from src/ui/views/TokenDetail/ClaimTokenCard.tsx rename to apps/extension/src/ui/views/TokenDetail/ClaimTokenCard.tsx index 1e54efbba..108035512 100644 --- a/src/ui/views/TokenDetail/ClaimTokenCard.tsx +++ b/apps/extension/src/ui/views/TokenDetail/ClaimTokenCard.tsx @@ -1,10 +1,9 @@ -import { Typography, Box, ButtonBase } from '@mui/material'; +import { Box, ButtonBase, Typography } from '@mui/material'; import React from 'react'; +import Claim from '@/ui/assets/image/claim.png'; import { useNetwork } from '@/ui/hooks/useNetworkHook'; -import Claim from '../../assets/image/claim.png'; - const ClaimTokenCard = ({ token }) => { const { network } = useNetwork(); diff --git a/src/ui/views/TokenDetail/StackingCard.tsx b/apps/extension/src/ui/views/TokenDetail/StackingCard.tsx similarity index 92% rename from src/ui/views/TokenDetail/StackingCard.tsx rename to apps/extension/src/ui/views/TokenDetail/StackingCard.tsx index db6c19fc0..e5e83c473 100644 --- a/src/ui/views/TokenDetail/StackingCard.tsx +++ b/apps/extension/src/ui/views/TokenDetail/StackingCard.tsx @@ -1,7 +1,7 @@ -import { Typography, Box, ButtonBase } from '@mui/material'; +import { Box, ButtonBase, Typography } from '@mui/material'; import React from 'react'; -import flowGrey from 'ui/assets/svg/flow-grey.svg'; +import flowGrey from '@/ui/assets/svg/flow-grey.svg'; const StackingCard = () => { const openFlowPort = async () => { diff --git a/src/ui/views/TokenDetail/TokenInfoCard.tsx b/apps/extension/src/ui/views/TokenDetail/TokenInfoCard.tsx similarity index 84% rename from src/ui/views/TokenDetail/TokenInfoCard.tsx rename to apps/extension/src/ui/views/TokenDetail/TokenInfoCard.tsx index 4c5febbd0..72640dc38 100644 --- a/src/ui/views/TokenDetail/TokenInfoCard.tsx +++ b/apps/extension/src/ui/views/TokenDetail/TokenInfoCard.tsx @@ -1,26 +1,27 @@ -import { Typography, Box, ButtonBase, Skeleton } from '@mui/material'; +import { Box, ButtonBase, Skeleton, Typography } from '@mui/material'; import React, { useMemo } from 'react'; -import { useHistory } from 'react-router-dom'; +import { useNavigate } from 'react-router'; import { - type CustomFungibleTokenInfo, type CoinItem, - type ExtendedTokenInfo, + type CustomFungibleTokenInfo, type EvmCustomTokenInfo, -} from '@/shared/types/coin-types'; -import { type ActiveAccountType } from '@/shared/types/wallet-types'; -import { isValidEthereumAddress } from '@/shared/utils/address'; + type ExtendedTokenInfo, +} from '@onflow/flow-wallet-shared/types/coin-types'; +import { type ActiveAccountType } from '@onflow/flow-wallet-shared/types/wallet-types'; +import { isValidEthereumAddress } from '@onflow/flow-wallet-shared/utils/address'; + import buyIcon from '@/ui/assets/svg/buyIcon.svg'; import receiveIcon from '@/ui/assets/svg/receiveIcon.svg'; import sendIcon from '@/ui/assets/svg/sendIcon.svg'; import swapIcon from '@/ui/assets/svg/swapIcon.svg'; +import VerifiedIcon from '@/ui/assets/svg/verfied-check.svg'; import { IconButton } from '@/ui/components/IconButton'; import IconChevronRight from '@/ui/components/iconfont/IconChevronRight'; +import { CurrencyValue } from '@/ui/components/TokenLists/CurrencyValue'; +import TokenAvatar from '@/ui/components/TokenLists/TokenAvatar'; import { useCurrency } from '@/ui/hooks/preference-hooks'; -import { useCoins } from 'ui/hooks/useCoinHook'; - -import VerifiedIcon from '../../assets/svg/verfied-check.svg'; -import { CurrencyValue } from '../../components/TokenLists/CurrencyValue'; +import { useCoins } from '@/ui/hooks/useCoinHook'; const TokenInfoCard = ({ tokenInfo, @@ -33,7 +34,7 @@ const TokenInfoCard = ({ tokenId: string; setIsOnRamp: (isOnRamp: boolean) => void; }) => { - const history = useHistory(); + const navigate = useNavigate(); const { coins } = useCoins(); const currency = useCurrency(); @@ -46,9 +47,9 @@ const TokenInfoCard = ({ const toSend = () => { if (tokenInfo && 'symbol' in tokenInfo) { - history.push(`/dashboard/token/${tokenInfo.symbol}/send`); + navigate(`/dashboard/token/${tokenInfo.symbol}/send`); } else { - history.push(`/dashboard/token/${tokenInfo?.address}/send`); + navigate(`/dashboard/token/${tokenInfo?.address}/send`); } }; @@ -81,22 +82,12 @@ const TokenInfoCard = ({ > <> - {extendedTokenInfo?.logoURI ? ( - - ) : ( - - )} + extendedTokenInfo && window.open(getUrl(extendedTokenInfo), '_blank')} @@ -223,7 +214,7 @@ const TokenInfoCard = ({ )} history.push('/dashboard/wallet/deposit')} + onClick={() => navigate('/dashboard/wallet/deposit')} icon={receiveIcon} customSx={{ width: '42px', height: '42px' }} /> diff --git a/src/ui/views/TokenDetail/index.tsx b/apps/extension/src/ui/views/TokenDetail/index.tsx similarity index 90% rename from src/ui/views/TokenDetail/index.tsx rename to apps/extension/src/ui/views/TokenDetail/index.tsx index 38f783efe..50a2c09c9 100644 --- a/src/ui/views/TokenDetail/index.tsx +++ b/apps/extension/src/ui/views/TokenDetail/index.tsx @@ -1,38 +1,40 @@ import ArrowBackIcon from '@mui/icons-material/ArrowBack'; import MoreHorizIcon from '@mui/icons-material/MoreHoriz'; -import { Box, MenuItem, Typography, IconButton, Drawer } from '@mui/material'; +import { Box, Drawer, IconButton, MenuItem, Typography } from '@mui/material'; import React, { useEffect, useMemo, useState } from 'react'; -import { useHistory, useParams } from 'react-router-dom'; +import { useLocation, useNavigate, useParams } from 'react-router'; import type { CoinItem, CustomFungibleTokenInfo, EvmCustomTokenInfo, -} from '@/shared/types/coin-types'; -import { getPriceProvider } from '@/shared/types/network-types'; -import { consoleError, consoleWarn } from '@/shared/utils/console-log'; +} from '@onflow/flow-wallet-shared/types/coin-types'; +import { getPriceProvider } from '@onflow/flow-wallet-shared/types/network-types'; +import { consoleError, consoleWarn } from '@onflow/flow-wallet-shared/utils/console-log'; + +import tips from '@/ui/assets/svg/tips.svg'; +import WarningIcon from '@/ui/assets/svg/warning.svg'; import SecurityCard from '@/ui/components/SecurityCard'; import StorageUsageCard from '@/ui/components/StorageUsageCard'; +import PriceCard from '@/ui/components/TokenLists/PriceCard'; import { useAllTokenInfo, useEvmCustomTokens } from '@/ui/hooks/use-coin-hooks'; +import { useWallet } from '@/ui/hooks/use-wallet'; import { useCoins } from '@/ui/hooks/useCoinHook'; import { useProfiles } from '@/ui/hooks/useProfileHook'; -import tips from 'ui/assets/svg/tips.svg'; -import WarningIcon from 'ui/assets/svg/warning.svg'; -import { useWallet } from 'ui/utils'; - -import PriceCard from '../../components/TokenLists/PriceCard'; -import OnRampList from '../Wallet/OnRampList'; import ClaimTokenCard from './ClaimTokenCard'; import StackingCard from './StackingCard'; import TokenInfoCard from './TokenInfoCard'; +import OnRampList from '../Wallet/OnRampList'; const TokenDetail = () => { const usewallet = useWallet(); - const history = useHistory(); + const navigate = useNavigate(); + const location = useLocation(); // Get the token name and id from the url - const token = useParams<{ name: string }>().name.toLowerCase(); - const tokenId = useParams<{ id: string }>().id; + const params = useParams(); + const token = params.name?.toLowerCase(); + const tokenId = params.id; // Get the network, current wallet, and active account type const { network, currentWallet, activeAccountType } = useProfiles(); @@ -105,7 +107,7 @@ const TokenDetail = () => { // Get the price providers const priceProviders = useMemo(() => { - return getPriceProvider(token); + return token ? getPriceProvider(token) : []; }, [token]); const [menuOpen, setMenuOpen] = useState(false); @@ -122,14 +124,14 @@ const TokenDetail = () => { } await usewallet.removeCustomEvmToken(network, tokenInfo.address); - history.replace({ pathname: history.location.pathname, state: { refreshed: true } }); - history.goBack(); + navigate(location.pathname, { state: { refreshed: true } }); + navigate(-1); }; const Header = () => { return ( - + navigate(-1)}> @@ -218,7 +220,7 @@ const TokenDetail = () => { diff --git a/src/ui/views/TokenList/AddTokenConfirmation.tsx b/apps/extension/src/ui/views/TokenList/AddTokenConfirmation.tsx similarity index 92% rename from src/ui/views/TokenList/AddTokenConfirmation.tsx rename to apps/extension/src/ui/views/TokenList/AddTokenConfirmation.tsx index 7902c3c6b..2c7bbe44f 100644 --- a/src/ui/views/TokenList/AddTokenConfirmation.tsx +++ b/apps/extension/src/ui/views/TokenList/AddTokenConfirmation.tsx @@ -1,12 +1,13 @@ import CloseIcon from '@mui/icons-material/Close'; -import { Box, Typography, Drawer, Button, IconButton, CircularProgress } from '@mui/material'; +import { Box, Button, CircularProgress, Drawer, IconButton, Typography } from '@mui/material'; import Grid from '@mui/material/Grid'; import React, { useState } from 'react'; -import { useHistory } from 'react-router-dom'; +import { useNavigate } from 'react-router'; + +import { type TokenInfo } from '@onflow/flow-wallet-shared/types/token-info'; -import { type TokenInfo } from '@/shared/types/token-info'; import IconPlus from '@/ui/components/iconfont/IconPlus'; -import { useWallet } from 'ui/utils'; +import { useWallet } from '@/ui/hooks/use-wallet'; interface AddTokenConfirmationProps { isConfirmationOpen: boolean; @@ -18,7 +19,7 @@ interface AddTokenConfirmationProps { const AddTokenConfirmation = (props: AddTokenConfirmationProps) => { const wallet = useWallet(); - const history = useHistory(); + const navigate = useNavigate(); const [sending, setSending] = useState(false); // const [tid, setTid] = useState(''); @@ -41,7 +42,7 @@ const AddTokenConfirmation = (props: AddTokenConfirmationProps) => { props.handleAddBtnClicked(); await wallet.setDashIndex(0); setSending(false); - history.push(`/dashboard?activity=1&txId=${txId}`); + navigate(`/dashboard?activity=1&txId=${txId}`); } } catch (err) { setSending(false); diff --git a/src/ui/views/TokenList/index.tsx b/apps/extension/src/ui/views/TokenList/index.tsx similarity index 93% rename from src/ui/views/TokenList/index.tsx rename to apps/extension/src/ui/views/TokenList/index.tsx index 518931ad2..21c99cfdd 100644 --- a/src/ui/views/TokenList/index.tsx +++ b/apps/extension/src/ui/views/TokenList/index.tsx @@ -1,32 +1,30 @@ import SearchIcon from '@mui/icons-material/Search'; import { - List, Box, - Input, - InputAdornment, Card, + CardContent, CardMedia, + Input, + InputAdornment, + List, Skeleton, - CardContent, - Button, Switch, Typography, } from '@mui/material'; import Grid from '@mui/material/Grid'; import { StyledEngineProvider } from '@mui/material/styles'; -import React, { useState, useEffect, useCallback } from 'react'; +import React, { useCallback, useEffect, useState } from 'react'; -// import { useHistory } from 'react-router-dom'; -import { type ExtendedTokenInfo } from '@/shared/types/coin-types'; +// import { useNavigate } from 'react-router'; +import { type ExtendedTokenInfo } from '@onflow/flow-wallet-shared/types/coin-types'; + +import VerifiedIcon from '@/ui/assets/svg/verfied-check.svg'; import { LLHeader } from '@/ui/components'; import TokenItem from '@/ui/components/TokenLists/TokenItem'; import { useAllTokenInfo } from '@/ui/hooks/use-coin-hooks'; +import { useWallet } from '@/ui/hooks/use-wallet'; +import { useCoins } from '@/ui/hooks/useCoinHook'; import { useProfiles } from '@/ui/hooks/useProfileHook'; -import { useCoins } from 'ui/hooks/useCoinHook'; -import { useWallet } from 'ui/utils'; - -import CloseIcon from '../../assets/svg/close-icon.svg'; -import VerifiedIcon from '../../assets/svg/verfied-check.svg'; import AddTokenConfirmation from './AddTokenConfirmation'; @@ -75,7 +73,7 @@ const TokenList = () => { } }, [allTokenInfo]); - const handleTokenClick = (token, isEnabled) => { + const handleTokenClick = (token: ExtendedTokenInfo, isEnabled: boolean) => { if (!isEnabled) { setSelectedToken(token); setConfirmationOpen(true); @@ -263,11 +261,11 @@ const TokenList = () => { item.contractName).includes(token.contractName)} + enabled={!!coins?.map((item) => item.contractName).includes(token.contractName)} key={index} onClick={handleTokenClick} tokenFilter={tokenFilter} - updateTokenFilter={handleTokenClick} + updateTokenFilter={updateTokenFilter} showSwitch={false} /> ))} diff --git a/src/ui/views/Unlock/index.tsx b/apps/extension/src/ui/views/Unlock/index.tsx similarity index 60% rename from src/ui/views/Unlock/index.tsx rename to apps/extension/src/ui/views/Unlock/index.tsx index e0d8a46f4..7295923fc 100644 --- a/src/ui/views/Unlock/index.tsx +++ b/apps/extension/src/ui/views/Unlock/index.tsx @@ -1,46 +1,27 @@ -// import { useTranslation } from 'react-i18next'; -import { Input, Typography, Box, FormControl, CircularProgress } from '@mui/material'; +import { Box, CircularProgress, FormControl, Typography } from '@mui/material'; import React, { useCallback, useEffect, useRef, useState } from 'react'; -import { useHistory } from 'react-router-dom'; +import { useNavigate } from 'react-router'; + +import { consoleError } from '@onflow/flow-wallet-shared/utils/console-log'; +import { DEFAULT_PASSWORD } from '@onflow/flow-wallet-shared/utils/default'; -import { consoleError } from '@/shared/utils/console-log'; -import { DEFAULT_PASSWORD } from '@/shared/utils/default'; import lilo from '@/ui/assets/image/lilo.png'; -import { LLPrimaryButton } from '@/ui/components'; -import CancelIcon from '@/ui/components/iconfont/IconClose'; -import SlideRelative from '@/ui/components/SlideRelative'; -import { useProfiles } from '@/ui/hooks/useProfileHook'; -import { useWallet, useWalletLoaded } from '@/ui/utils'; +import { LLPrimaryButton } from '@/ui/components/LLPrimaryButton'; +import { PasswordInput } from '@/ui/components/password/PasswordInput'; +import { useWallet, useWalletLoaded } from '@/ui/hooks/use-wallet'; import { openInternalPageInTab } from '@/ui/utils/webapi'; import './style.css'; -const UsernameError: React.FC = () => ( - - - - {chrome.i18n.getMessage('Incorrect__Password')} - - -); - -const UnexpectedError: React.FC = () => ( - - - - {chrome.i18n.getMessage('Oops__unexpected__error')} - - -); - const Unlock = () => { const wallet = useWallet(); const walletIsLoaded = useWalletLoaded(); - const history = useHistory(); + const navigate = useNavigate(); const inputEl = useRef(null); - // const { t } = useTranslation(); const [showPasswordError, setShowPasswordError] = useState(false); const [showUnexpectedError, setShowUnexpectedError] = useState(false); + + const [isPasswordVisible, setPasswordVisible] = useState(false); const [password, setPassword] = useState(DEFAULT_PASSWORD); const [unlocking, setUnlocking] = useState(false); @@ -51,6 +32,7 @@ const Unlock = () => { const restPass = useCallback(async () => { await wallet.lockWallet(); + openInternalPageInTab('forgot'); }, [wallet]); @@ -67,14 +49,14 @@ const Unlock = () => { try { setUnlocking(true); await wallet.unlock(password); - history.replace('/'); + navigate('/', { replace: true }); } catch (err) { consoleError('failed to unlock wallet', err); setShowUnexpectedError(true); } finally { setUnlocking(false); } - }, [wallet, history, password]); + }, [wallet, navigate, password]); const handleKeyDown = useCallback( (event) => { @@ -127,48 +109,25 @@ const Unlock = () => { position: 'relative', }} > - { + onChange={(value) => { setShowPasswordError(false); - setPassword(event.target.value); + setPassword(value); }} + errorText={ + showPasswordError + ? chrome.i18n.getMessage('Incorrect__Password') + : showUnexpectedError + ? chrome.i18n.getMessage('Oops__unexpected__error') + : undefined + } + showPassword={isPasswordVisible} + setShowPassword={setPasswordVisible} + autoFocus={true} + placeholder={chrome.i18n.getMessage('Enter__Your__Password')} onKeyDown={handleKeyDown} /> - - - - - {showPasswordError ? : } - - - diff --git a/src/ui/views/Unlock/style.css b/apps/extension/src/ui/views/Unlock/style.css similarity index 100% rename from src/ui/views/Unlock/style.css rename to apps/extension/src/ui/views/Unlock/style.css diff --git a/src/ui/views/Wallet/AddCustom/AddCustomEvmToken.tsx b/apps/extension/src/ui/views/Wallet/AddCustom/AddCustomEvmToken.tsx similarity index 90% rename from src/ui/views/Wallet/AddCustom/AddCustomEvmToken.tsx rename to apps/extension/src/ui/views/Wallet/AddCustom/AddCustomEvmToken.tsx index 05495c2d1..8a3f7108b 100644 --- a/src/ui/views/Wallet/AddCustom/AddCustomEvmToken.tsx +++ b/apps/extension/src/ui/views/Wallet/AddCustom/AddCustomEvmToken.tsx @@ -1,29 +1,29 @@ import ArrowBackIcon from '@mui/icons-material/ArrowBack'; import { - Typography, Box, - IconButton, - Stack, - InputBase, CircularProgress, FormControl, + IconButton, + InputBase, + Stack, + Typography, } from '@mui/material'; import { styled } from '@mui/material/styles'; import { Contract, ethers } from 'ethers'; import React, { useState } from 'react'; import { useForm } from 'react-hook-form'; -import { useHistory } from 'react-router-dom'; +import { useLocation, useNavigate } from 'react-router'; -import { type CustomFungibleTokenInfo } from '@/shared/types/coin-types'; -import { networkToChainId } from '@/shared/types/network-types'; -import { consoleError } from '@/shared/utils/console-log'; +import { EVM_ENDPOINT } from '@onflow/flow-wallet-shared/constant/domain-constants'; +import { type CustomFungibleTokenInfo } from '@onflow/flow-wallet-shared/types/coin-types'; +import { networkToChainId } from '@onflow/flow-wallet-shared/types/network-types'; +import { isValidEthereumAddress, withPrefix } from '@onflow/flow-wallet-shared/utils/address'; +import { consoleError } from '@onflow/flow-wallet-shared/utils/console-log'; + +import { LLFormHelperText, LLPrimaryButton } from '@/ui/components'; import { refreshEvmToken } from '@/ui/hooks/use-coin-hooks'; +import { useWallet } from '@/ui/hooks/use-wallet'; import { useNetwork } from '@/ui/hooks/useNetworkHook'; -import { EVM_ENDPOINT } from 'consts'; -import { useWallet } from 'ui/utils'; - -import { withPrefix, isValidEthereumAddress } from '../../../../shared/utils/address'; -import { LLPrimaryButton, LLFormHelperText } from '../../../components'; import AddCustomEvmForm from './CustomEvmForm'; @@ -42,7 +42,8 @@ const StyledInput = styled(InputBase)(({ theme }) => ({ const AddCustomEvmToken = () => { const usewallet = useWallet(); - const history = useHistory(); + const navigate = useNavigate(); + const location = useLocation(); const { register, watch, @@ -139,15 +140,15 @@ const AddCustomEvmToken = () => { consoleError('Failed to import custom token:', error); } finally { setLoading(false); - history.replace({ pathname: history.location.pathname, state: { refreshed: true } }); - history.goBack(); + navigate(location.pathname, { state: { refreshed: true }, replace: true }); + navigate(-1); } }; const Header = () => { return ( - + navigate(-1)} sx={{ height: '40px', padding: '0' }}> { - const history = useHistory(); + const navigate = useNavigate(); return ( history.push(managePath)} + onClick={() => navigate(managePath)} sx={{ display: 'flex', justifyContent: 'center', @@ -51,7 +51,7 @@ const ActionButtons = ({ managePath, createPath }) => { Manage history.push(createPath)} + onClick={() => navigate(createPath)} sx={{ display: 'flex', justifyContent: 'center', @@ -86,7 +86,7 @@ const CoinList = ({ const currency = useCurrency(); const currencyCode = currency?.code; const currencySymbol = currency?.symbol; - const history = useHistory(); + const navigate = useNavigate(); const isLoading = coins === undefined; @@ -265,10 +265,10 @@ const CoinList = ({ return ( <> {activeAccountType === 'main' && ( - + )} {activeAccountType === 'evm' && ( - + )} @@ -321,18 +321,17 @@ const CoinList = ({ } disablePadding onClick={() => - history.push(`dashboard/tokendetail/${coin.unit.toLowerCase()}/${coin.id}`) + navigate(`/dashboard/tokendetail/${coin.unit.toLowerCase()}/${coin.id}`) } > - {!isLoading ? ( - - {coin.symbol?.charAt(0)} - - ) : ( - - )} + { const wallet = useWallet(); diff --git a/src/ui/views/Wallet/TokenDropdown.tsx b/apps/extension/src/ui/views/Wallet/TokenDropdown.tsx similarity index 91% rename from src/ui/views/Wallet/TokenDropdown.tsx rename to apps/extension/src/ui/views/Wallet/TokenDropdown.tsx index 1c69518df..e6c905b27 100644 --- a/src/ui/views/Wallet/TokenDropdown.tsx +++ b/apps/extension/src/ui/views/Wallet/TokenDropdown.tsx @@ -1,12 +1,12 @@ import { Box, IconButton, Menu, MenuItem } from '@mui/material'; import React, { useState } from 'react'; -import { useHistory } from 'react-router-dom'; +import { useNavigate } from 'react-router'; import IconCreate from '@/ui/components/iconfont/IconCreate'; const TokenDropdown = () => { const [anchorEl, setAnchorEl] = useState(null); - const history = useHistory(); + const navigate = useNavigate(); // Open the dropdown menu const handleMenuOpen = (event) => { @@ -20,13 +20,13 @@ const TokenDropdown = () => { // Navigate to Token List const goToTokenList = () => { - history.push('dashboard/tokenList'); + navigate('/dashboard/tokenList'); handleMenuClose(); }; // Navigate to Token List const goToCustom = () => { - history.push('dashboard/tokenList'); + navigate('/dashboard/tokenList'); handleMenuClose(); }; diff --git a/src/ui/views/Wallet/TransferList.tsx b/apps/extension/src/ui/views/Wallet/TransferList.tsx similarity index 98% rename from src/ui/views/Wallet/TransferList.tsx rename to apps/extension/src/ui/views/Wallet/TransferList.tsx index a65032bd0..7b96ca43c 100644 --- a/src/ui/views/Wallet/TransferList.tsx +++ b/apps/extension/src/ui/views/Wallet/TransferList.tsx @@ -2,27 +2,27 @@ import CallMadeRoundedIcon from '@mui/icons-material/CallMadeRounded'; import CallReceivedRoundedIcon from '@mui/icons-material/CallReceivedRounded'; import ChevronRightRoundedIcon from '@mui/icons-material/ChevronRightRounded'; import { - Typography, + Box, + Button, + CardMedia, ListItem, ListItemAvatar, - ListItemText, + ListItemButton, ListItemIcon, + ListItemText, Skeleton, - ListItemButton, - CardMedia, - Button, - Box, + Typography, } from '@mui/material'; import dayjs from 'dayjs'; import relativeTime from 'dayjs/plugin/relativeTime'; import React from 'react'; -import { formatString } from '@/shared/utils/address'; +import { formatString } from '@onflow/flow-wallet-shared/utils/address'; + +import activity from '@/ui/assets/svg/activity.svg'; +import { TokenBalance } from '@/ui/components/TokenLists/TokenBalance'; import { useProfiles } from '@/ui/hooks/useProfileHook'; import { useTransferList } from '@/ui/hooks/useTransferListHook'; -import activity from 'ui/assets/svg/activity.svg'; - -import { TokenBalance } from '../../components/TokenLists/TokenBalance'; dayjs.extend(relativeTime); diff --git a/src/ui/views/Wallet/index.tsx b/apps/extension/src/ui/views/Wallet/index.tsx similarity index 93% rename from src/ui/views/Wallet/index.tsx rename to apps/extension/src/ui/views/Wallet/index.tsx index 2cecacd37..47316eeca 100644 --- a/src/ui/views/Wallet/index.tsx +++ b/apps/extension/src/ui/views/Wallet/index.tsx @@ -1,27 +1,23 @@ -import { Typography, Button, Skeleton, Drawer, Tabs, Tab } from '@mui/material'; +import { Button, Drawer, Skeleton, Tab, Tabs, Typography } from '@mui/material'; import { Box } from '@mui/system'; -import React, { useCallback, useEffect, useState } from 'react'; -import { useHistory, useLocation } from 'react-router-dom'; +import React, { useEffect, useState } from 'react'; +import { useLocation, useNavigate } from 'react-router'; -import eventBus from '@/eventBus'; -import { type ActiveAccountType } from '@/shared/types/wallet-types'; -import { consoleError } from '@/shared/utils/console-log'; +import eventBus from '@/extension-shared/utils/message/eventBus'; import { ButtonRow } from '@/ui/components/ButtonRow'; import CoinsIcon from '@/ui/components/CoinsIcon'; import { IconActivity, IconNfts } from '@/ui/components/iconfont'; import LLComingSoon from '@/ui/components/LLComingSoonWarning'; +import { CurrencyValue } from '@/ui/components/TokenLists/CurrencyValue'; import { useCurrency } from '@/ui/hooks/preference-hooks'; import { useChildAccountFt } from '@/ui/hooks/use-coin-hooks'; +import { useWallet } from '@/ui/hooks/use-wallet'; import { useCoins } from '@/ui/hooks/useCoinHook'; import { useProfiles } from '@/ui/hooks/useProfileHook'; -import { useWallet } from '@/ui/utils'; -import { withPrefix } from '../../../shared/utils/address'; -import { CurrencyValue } from '../../components/TokenLists/CurrencyValue'; import MoveBoard from '../MoveBoard'; import NFTTab from '../NFT'; import NftEvm from '../NftEvm'; - import CoinList from './Coinlist'; import OnRampList from './OnRampList'; import TransferList from './TransferList'; @@ -49,7 +45,7 @@ const TabPanel = ({ }; const WalletTab = ({ network }) => { const wallet = useWallet(); - const history = useHistory(); + const navigate = useNavigate(); const location = useLocation(); const currency = useCurrency(); const { balance, coinsLoaded } = useCoins(); @@ -173,8 +169,8 @@ const WalletTab = ({ network }) => { history.push('/dashboard/token/flow/send')} - onReceiveClick={() => history.push('/dashboard/wallet/deposit')} + onSendClick={() => navigate('/dashboard/token/flow/send')} + onReceiveClick={() => navigate('/dashboard/wallet/deposit')} onSwapClick={() => window.open(swapLink, '_blank', 'noopener,noreferrer')} onBuyClick={() => setShowOnRamp(true)} onMoveClick={() => goMoveBoard()} diff --git a/apps/extension/src/ui/views/Welcome/RecoverProfile/index.tsx b/apps/extension/src/ui/views/Welcome/RecoverProfile/index.tsx new file mode 100644 index 000000000..587dbe3d4 --- /dev/null +++ b/apps/extension/src/ui/views/Welcome/RecoverProfile/index.tsx @@ -0,0 +1,216 @@ +import { Alert, Snackbar } from '@mui/material'; +import { + IMPORT_STEPS, + importProfileReducer, + INITIAL_IMPORT_STATE, +} from '@onflow/flow-wallet-reducers/import-profile-reducer'; +import React, { useEffect, useReducer } from 'react'; +import { useNavigate } from 'react-router'; + +import { consoleError } from '@onflow/flow-wallet-shared/utils/console-log'; + +import Google from '@/ui/components/google-import'; +import ImportTabs from '@/ui/components/import-components/ImportTabs'; +import AllSet from '@/ui/components/LandingPages/AllSet'; +import GoogleBackup from '@/ui/components/LandingPages/GoogleBackup'; +import LandingComponents from '@/ui/components/LandingPages/LandingComponents'; +import PickNickname from '@/ui/components/LandingPages/PickNickname'; +import SetPassword from '@/ui/components/LandingPages/SetPassword'; +import { useWallet } from '@/ui/hooks/use-wallet'; + +const RecoverProfile = () => { + const navigate = useNavigate(); + const usewallet = useWallet(); + + const [state, dispatch] = useReducer(importProfileReducer, INITIAL_IMPORT_STATE); + const { + activeTab, + mnemonic, + pk, + username, + nickname, + password, + errMessage, + showError, + showGoogleImport, + googleAccounts, + path, + phrase, + isAddWallet, + } = state; + + useEffect(() => { + const checkWalletStatus = async () => { + const isBooted = await usewallet.isBooted(); + dispatch({ type: 'SET_IS_ADD_WALLET', payload: isBooted }); + }; + + checkWalletStatus(); + }, [usewallet]); + + const handleErrorClose = (event?: React.SyntheticEvent | Event, reason?: string) => { + if (reason === 'clickaway') { + return; + } + dispatch({ type: 'SET_ERROR', payload: { message: '', show: false } }); + }; + + const submitPassword = async (newPassword: string) => { + dispatch({ type: 'SET_PASSWORD', payload: newPassword }); + // Check the password first so we can show the error message + if (isAddWallet) { + try { + await usewallet.verifyPasswordIfBooted(newPassword); + } catch (err) { + consoleError(err); + dispatch({ + type: 'SET_ERROR', + payload: { message: chrome.i18n.getMessage('Incorrect__Password'), show: true }, + }); + return; + } + } + try { + if (pk) { + await usewallet.importProfileUsingPrivateKey(nickname, newPassword, pk); + dispatch({ type: 'SET_ACTIVE_TAB', payload: IMPORT_STEPS.ALL_SET }); + } else if (mnemonic) { + await usewallet.importProfileUsingMnemonic(nickname, newPassword, mnemonic, path, phrase); + dispatch({ type: 'SET_ACTIVE_TAB', payload: IMPORT_STEPS.GOOGLE_BACKUP }); + } else { + throw new Error('No mnemonic or private key provided'); + } + + // Now get the proper username + const userInfo = await usewallet.getUserInfo(); + if (!userInfo) { + throw new Error('User info not found'); + } + dispatch({ type: 'SET_USERNAME', payload: userInfo.username }); + } catch (error) { + consoleError(error); + dispatch({ + type: 'SET_ERROR', + payload: { + message: 'An error occured importing your account. Please contact support.', + show: true, + }, + }); + } + }; + + const goBack = () => { + if (activeTab === IMPORT_STEPS.GOOGLE_BACKUP || activeTab === IMPORT_STEPS.ALL_SET) { + navigate(-1); + return; + } + dispatch({ type: 'GO_BACK' }); + }; + + const handleGoogleAccountsFound = (accounts: string[]) => { + dispatch({ type: 'SET_GOOGLE_IMPORT', payload: { show: true, accounts } }); + }; + + if (showGoogleImport) { + return ( + + dispatch({ + type: 'SET_GOOGLE_IMPORT', + payload: { show: false, accounts: [] }, + }) + } + /> + ); + } + return ( + + {activeTab === IMPORT_STEPS.IMPORT && ( + dispatch({ type: 'SET_MNEMONIC', payload: m })} + setPk={(k) => dispatch({ type: 'SET_PK', payload: k })} + setAccounts={(a) => dispatch({ type: 'SET_ACCOUNTS', payload: a })} + goPassword={() => + dispatch({ + type: 'SET_ACTIVE_TAB', + payload: IMPORT_STEPS.RECOVER_PASSWORD, + }) + } + handleSwitchTab={() => + dispatch({ + type: 'SET_ACTIVE_TAB', + payload: IMPORT_STEPS.PICK_USERNAME, + }) + } + setErrorMessage={(msg) => + dispatch({ + type: 'SET_ERROR', + payload: { message: msg, show: true }, + }) + } + setShowError={(show) => dispatch({ type: 'SET_ERROR', payload: { message: '', show } })} + handleGoogleAccountsFound={handleGoogleAccountsFound} + path={path} + setPath={(p) => dispatch({ type: 'SET_DERIVATION_PATH', payload: p })} + phrase={phrase} + setPhrase={(p) => dispatch({ type: 'SET_PASSPHRASE', payload: p })} + /> + )} + + {activeTab === IMPORT_STEPS.PICK_USERNAME && ( + + dispatch({ + type: 'SET_ACTIVE_TAB', + payload: IMPORT_STEPS.SET_PASSWORD, + }) + } + nickname={nickname} + setNickname={(u) => dispatch({ type: 'SET_NICKNAME', payload: u })} + /> + )} + + {(activeTab === IMPORT_STEPS.SET_PASSWORD || activeTab === IMPORT_STEPS.RECOVER_PASSWORD) && ( + + )} + {activeTab === IMPORT_STEPS.GOOGLE_BACKUP && username && password && ( + + dispatch({ + type: 'SET_ACTIVE_TAB', + payload: IMPORT_STEPS.ALL_SET, + }) + } + mnemonic={mnemonic} + username={username} + password={password} + /> + )} + + {activeTab === IMPORT_STEPS.ALL_SET && window.close()} />} + + + + {errMessage} + + + + ); +}; + +export default RecoverProfile; diff --git a/src/ui/views/Welcome/AccountImport/stories/AccountImport.stories.tsx b/apps/extension/src/ui/views/Welcome/RecoverProfile/stories/RecoverProfile.stories.tsx similarity index 63% rename from src/ui/views/Welcome/AccountImport/stories/AccountImport.stories.tsx rename to apps/extension/src/ui/views/Welcome/RecoverProfile/stories/RecoverProfile.stories.tsx index d574c5241..4a3048ded 100644 --- a/src/ui/views/Welcome/AccountImport/stories/AccountImport.stories.tsx +++ b/apps/extension/src/ui/views/Welcome/RecoverProfile/stories/RecoverProfile.stories.tsx @@ -1,22 +1,22 @@ import { Box } from '@mui/material'; import type { Meta, StoryObj } from '@storybook/react-webpack5'; import React from 'react'; +import { withRouter } from 'storybook-addon-remix-react-router'; +// eslint-disable-next-line import/order import { fn } from 'storybook/test'; -import { Link as LinkMock } from '@/stories/react-router-dom.mock'; -import { useWallet as useWalletMock } from '@/stories/wallet-context.mock'; +import { useWallet as useWalletMock } from '@/ui/hooks/use-wallet.mock'; -import AccountImport from '../index'; +import RecoverProfile from '../index'; const meta = { - title: 'View/Welcome/AccountImport', - component: AccountImport, + title: 'views/Welcome/RecoverProfile', + component: RecoverProfile, decorators: [ + withRouter, (Story) => { - LinkMock.mockReset(); - LinkMock.mockImplementation((props: any): React.ReactNode => ); useWalletMock.mockReset(); - useWalletMock.mockImplementation(() => ({ + useWalletMock.mockResolvedValue({ openapi: { checkImport: fn().mockResolvedValue({ status: 200 }), }, @@ -24,7 +24,7 @@ const meta = { importProfileUsingPrivateKey: fn(), importProfileUsingMnemonic: fn(), isBooted: fn().mockResolvedValue(false), - })); + }); return ( ; +} satisfies Meta; export default meta; -type Story = StoryObj; +type Story = StoryObj; export const Default: Story = { args: {}, diff --git a/src/ui/views/Welcome/Register/index.tsx b/apps/extension/src/ui/views/Welcome/Register/index.tsx similarity index 87% rename from src/ui/views/Welcome/Register/index.tsx rename to apps/extension/src/ui/views/Welcome/Register/index.tsx index f20e8ad52..5f1307ea0 100644 --- a/src/ui/views/Welcome/Register/index.tsx +++ b/apps/extension/src/ui/views/Welcome/Register/index.tsx @@ -1,6 +1,12 @@ import { Box } from '@mui/material'; +import { + INITIAL_REGISTER_STATE, + initRegisterState, + registerReducer, + STEPS, +} from '@onflow/flow-wallet-reducers/register-reducer'; import React, { useCallback, useEffect, useReducer } from 'react'; -import { useHistory } from 'react-router-dom'; +import { useNavigate } from 'react-router'; import AllSet from '@/ui/components/LandingPages/AllSet'; import GoogleBackup from '@/ui/components/LandingPages/GoogleBackup'; @@ -9,16 +15,10 @@ import PickNickname from '@/ui/components/LandingPages/PickNickname'; import RecoveryPhrase from '@/ui/components/LandingPages/RecoveryPhrase'; import RepeatPhrase from '@/ui/components/LandingPages/RepeatPhrase'; import SetPassword from '@/ui/components/LandingPages/SetPassword'; -import { - INITIAL_REGISTER_STATE, - initRegisterState, - registerReducer, - STEPS, -} from '@/ui/reducers/register-reducer'; -import { useWallet } from 'ui/utils'; +import { useWallet } from '@/ui/hooks/use-wallet'; const Register = () => { - const history = useHistory(); + const navigate = useNavigate(); const usewallet = useWallet(); const [state, dispatch] = useReducer(registerReducer, INITIAL_REGISTER_STATE, initRegisterState); @@ -38,13 +38,13 @@ const Register = () => { .getCurrentAccount() .then((res) => { if (res) { - history.push('/'); + navigate('/'); } }) .catch(() => { return; }); - }, [usewallet, history]); + }, [usewallet, navigate]); const submitPassword = useCallback( async (newPassword: string) => { @@ -64,7 +64,7 @@ const Register = () => { const goBack = () => { if (activeTab === STEPS.USERNAME || activeTab === STEPS.ALL_SET) { - history.goBack(); + navigate(-1); } else { dispatch({ type: 'GO_BACK' }); } @@ -107,14 +107,7 @@ const Register = () => { )} {activeTab === STEPS.PASSWORD && ( - dispatch({ type: 'SET_ACTIVE_TAB', payload: STEPS.BACKUP })} - onSubmit={submitPassword} - username={username} - showTerms={true} - autoFocus={true} - isLogin={isAddWallet} - /> + )} {activeTab === STEPS.BACKUP && username && password && ( diff --git a/src/ui/views/Welcome/Sync/SyncQr.tsx b/apps/extension/src/ui/views/Welcome/Sync/SyncQr.tsx similarity index 97% rename from src/ui/views/Welcome/Sync/SyncQr.tsx rename to apps/extension/src/ui/views/Welcome/Sync/SyncQr.tsx index 01d18a2d8..bfb328819 100644 --- a/src/ui/views/Welcome/Sync/SyncQr.tsx +++ b/apps/extension/src/ui/views/Welcome/Sync/SyncQr.tsx @@ -1,10 +1,10 @@ -import { Typography, CardMedia, Skeleton } from '@mui/material'; +import { CardMedia, Skeleton, Typography } from '@mui/material'; import { Box } from '@mui/system'; import React from 'react'; import { QRCode } from 'react-qrcode-logo'; -import lilo from 'ui/assets/image/lilo.png'; -import scanIcon from 'ui/assets/scan.svg'; +import lilo from '@/ui/assets/image/lilo.png'; +import scanIcon from '@/ui/assets/scan.svg'; interface SyncQrProps { uri: string; diff --git a/src/ui/views/Welcome/Sync/index.tsx b/apps/extension/src/ui/views/Welcome/Sync/index.tsx similarity index 92% rename from src/ui/views/Welcome/Sync/index.tsx rename to apps/extension/src/ui/views/Welcome/Sync/index.tsx index b681cc112..29305aec3 100644 --- a/src/ui/views/Welcome/Sync/index.tsx +++ b/apps/extension/src/ui/views/Welcome/Sync/index.tsx @@ -4,20 +4,24 @@ import SignClient from '@walletconnect/sign-client'; import { type SessionTypes } from '@walletconnect/types'; import * as bip39 from 'bip39'; import HDWallet from 'ethereum-hdwallet'; -import React, { useCallback, useEffect, useState, useRef } from 'react'; -import { useHistory } from 'react-router-dom'; +import React, { useCallback, useEffect, useRef, useState } from 'react'; +import { useNavigate } from 'react-router'; -import { isValidFlowAddress, withPrefix } from '@/shared/utils/address'; import { - SIGN_ALGO_NUM_ECDSA_secp256k1, HASH_ALGO_NUM_SHA2_256, -} from '@/shared/utils/algo-constants'; -import { consoleError } from '@/shared/utils/console-log'; -import { FCLWalletConnectMethod, type FCLWalletConnectSyncAccountInfo } from '@/shared/utils/type'; + SIGN_ALGO_NUM_ECDSA_secp256k1, +} from '@onflow/flow-wallet-shared/constant/algo-constants'; +import { + FCLWalletConnectMethod, + type FCLWalletConnectSyncAccountInfo, +} from '@onflow/flow-wallet-shared/types/type'; +import { isValidFlowAddress, withPrefix } from '@onflow/flow-wallet-shared/utils/address'; +import { consoleError } from '@onflow/flow-wallet-shared/utils/console-log'; + import AllSet from '@/ui/components/LandingPages/AllSet'; import LandingComponents from '@/ui/components/LandingPages/LandingComponents'; import SetPassword from '@/ui/components/LandingPages/SetPassword'; -import { useWallet } from 'ui/utils'; +import { useWallet } from '@/ui/hooks/use-wallet'; import SyncQr from './SyncQr'; @@ -54,7 +58,7 @@ interface DeviceInfoRequest { } const Sync = () => { - const history = useHistory(); + const navigate = useNavigate(); const usewallet = useWallet(); const [activeTab, setActiveTab] = useState(STEPS.QR); const [mnemonic] = useState(bip39.generateMnemonic()); @@ -82,13 +86,13 @@ const Sync = () => { .getCurrentAccount() .then((res) => { if (res) { - history.push('/'); + navigate('/'); } }) .catch(() => { return; }); - }, [usewallet, history]); + }, [usewallet, navigate]); useEffect(() => { loadView(); @@ -337,7 +341,7 @@ const Sync = () => { setActiveTab(STEPS.PASSWORD); break; default: - history.goBack(); + navigate(-1); } }; @@ -356,13 +360,7 @@ const Sync = () => { )} {activeTab === STEPS.PASSWORD && ( - setActiveTab(STEPS.ALL_SET)} - onSubmit={submitPassword} - title={<>{chrome.i18n.getMessage('Welcome__Back')}} - isLogin={isAddWallet} - autoFocus={true} - /> + )} {activeTab === STEPS.ALL_SET && ( diff --git a/src/ui/views/Welcome/AccountImport/index.tsx b/apps/extension/src/ui/views/Welcome/import-account/index.tsx similarity index 86% rename from src/ui/views/Welcome/AccountImport/index.tsx rename to apps/extension/src/ui/views/Welcome/import-account/index.tsx index 63245a2a3..f3bafcaf5 100644 --- a/src/ui/views/Welcome/AccountImport/index.tsx +++ b/apps/extension/src/ui/views/Welcome/import-account/index.tsx @@ -1,25 +1,25 @@ -import { Snackbar, Alert, Box } from '@mui/material'; -import React, { useCallback, useEffect, useReducer } from 'react'; -import { useHistory } from 'react-router-dom'; +import { Alert, Box, Snackbar } from '@mui/material'; +import { + IMPORT_STEPS, + importProfileReducer, + INITIAL_IMPORT_STATE, +} from '@onflow/flow-wallet-reducers/import-profile-reducer'; +import React, { useEffect, useReducer } from 'react'; +import { useNavigate } from 'react-router'; -import { consoleError } from '@/shared/utils/console-log'; +import { consoleError } from '@onflow/flow-wallet-shared/utils/console-log'; + +import Google from '@/ui/components/google-import'; +import ImportTabs from '@/ui/components/import-components/ImportTabs'; import AllSet from '@/ui/components/LandingPages/AllSet'; import GoogleBackup from '@/ui/components/LandingPages/GoogleBackup'; import LandingComponents from '@/ui/components/LandingPages/LandingComponents'; import PickNickname from '@/ui/components/LandingPages/PickNickname'; import SetPassword from '@/ui/components/LandingPages/SetPassword'; -import { - importProfileReducer, - INITIAL_IMPORT_STATE, - IMPORT_STEPS, -} from '@/ui/reducers/import-profile-reducer'; -import { useWallet } from '@/ui/utils/WalletContext'; - -import Google from './Google'; -import ImportTabs from './ImportTabs'; +import { useWallet } from '@/ui/hooks/use-wallet'; -const AccountImport = () => { - const history = useHistory(); +const ImportAccount = () => { + const navigate = useNavigate(); const usewallet = useWallet(); const [state, dispatch] = useReducer(importProfileReducer, INITIAL_IMPORT_STATE); @@ -38,22 +38,6 @@ const AccountImport = () => { phrase, isAddWallet, } = state; - const loadView = useCallback(async () => { - usewallet - .getCurrentAccount() - .then((res) => { - if (res) { - history.push('/'); - } - }) - .catch(() => { - return; - }); - }, [usewallet, history]); - - useEffect(() => { - loadView(); - }, [loadView]); useEffect(() => { const checkWalletStatus = async () => { @@ -117,7 +101,7 @@ const AccountImport = () => { const goBack = () => { if (activeTab === IMPORT_STEPS.GOOGLE_BACKUP || activeTab === IMPORT_STEPS.ALL_SET) { - history.goBack(); + navigate(-1); return; } dispatch({ type: 'GO_BACK' }); @@ -200,11 +184,7 @@ const AccountImport = () => { {(activeTab === IMPORT_STEPS.SET_PASSWORD || activeTab === IMPORT_STEPS.RECOVER_PASSWORD) && ( - {}} - onSubmit={submitPassword} - isLogin={isAddWallet} - /> + )} {activeTab === IMPORT_STEPS.GOOGLE_BACKUP && username && password && ( { ); }; -export default AccountImport; +export default ImportAccount; diff --git a/apps/extension/src/ui/views/Welcome/import-account/stories/import-account.stories.tsx b/apps/extension/src/ui/views/Welcome/import-account/stories/import-account.stories.tsx new file mode 100644 index 000000000..e585d5e29 --- /dev/null +++ b/apps/extension/src/ui/views/Welcome/import-account/stories/import-account.stories.tsx @@ -0,0 +1,52 @@ +import { Box } from '@mui/material'; +import type { Meta, StoryObj } from '@storybook/react-webpack5'; +import React from 'react'; +import { fn } from 'storybook/test'; +import { withRouter } from 'storybook-addon-remix-react-router'; + +import { useWallet as useWalletMock } from '@/ui/hooks/use-wallet.mock'; + +import ImportAccount from '../index'; + +const meta = { + title: 'views/Welcome/ImportAccount', + component: ImportAccount, + decorators: [ + withRouter, + (Story) => { + useWalletMock.mockReset(); + useWalletMock.mockResolvedValue({ + openapi: { + checkImport: fn().mockResolvedValue({ status: 200 }), + }, + getCurrentAccount: fn().mockResolvedValue(null), + importProfileUsingPrivateKey: fn(), + importProfileUsingMnemonic: fn(), + isBooted: fn().mockResolvedValue(false), + }); + return ( + + + + ); + }, + ], + parameters: { + layout: 'centered', + }, + args: {}, +} satisfies Meta; + +export default meta; + +type Story = StoryObj; + +export const Default: Story = { + args: {}, +}; diff --git a/apps/extension/src/ui/views/Welcome/index.tsx b/apps/extension/src/ui/views/Welcome/index.tsx new file mode 100644 index 000000000..a7c7fafdb --- /dev/null +++ b/apps/extension/src/ui/views/Welcome/index.tsx @@ -0,0 +1,231 @@ +import { Button, Typography } from '@mui/material'; +import { Box } from '@mui/system'; +import React from 'react'; +import { Link } from 'react-router'; + +import { TERMS_OF_SERVICE_URL, PRIVACY_POLICY_URL } from '@onflow/flow-wallet-shared/constant/urls'; + +import welcomeWallet from '@/ui/assets/svg/welcomeWallet.svg'; +import LandingComponents from '@/ui/components/LandingPages/LandingComponents'; +import { + COLOR_DARK_GRAY_1A1A1A, + COLOR_GREEN_FLOW_DARKMODE_00EF8B, + COLOR_WHITE_ALPHA_80_FFFFFFCC, + COLOR_GRADIENT_GREEN_00EF8B_00, + COLOR_GRADIENT_GREEN_00EF8B_20, + COLOR_GRADIENT_WHITE_FFFFFF_NEGATIVE_09, +} from '@/ui/style/color'; +import { translateToComponents } from '@/ui/utils/i18n-components'; + +const Welcome = () => { + return ( + {}} + showConfetti={false} + showRegisterHeader={true} + showSteps={false} + > + + + + {chrome.i18n.getMessage('Get_Started_with_Flow_wallet')} + + + + {chrome.i18n.getMessage('Welcome_to_Flow_Wallet')} + + + + {chrome.i18n.getMessage('Create_an_account_to_get_started')} + + + + + + + + {translateToComponents('legal_text', { + termslink: ({ children }) => ( + + {children} + + ), + privacylink: ({ children }) => ( + + {children} + + ), + })} + + + + + + + {chrome.i18n.getMessage('A_crypto_wallet_on_Flow')}{' '} + + {chrome.i18n.getMessage('Explorers_Collectors_and_Gamers')} + + + + + + ); +}; + +export default Welcome; diff --git a/apps/extension/src/ui/views/Welcome/stories/welcome.stories.tsx b/apps/extension/src/ui/views/Welcome/stories/welcome.stories.tsx new file mode 100644 index 000000000..cf9cfaced --- /dev/null +++ b/apps/extension/src/ui/views/Welcome/stories/welcome.stories.tsx @@ -0,0 +1,37 @@ +import { Box } from '@mui/material'; +import type { Meta, StoryObj } from '@storybook/react-webpack5'; +import React from 'react'; +import { withRouter } from 'storybook-addon-remix-react-router'; + +import Welcome from '../index'; + +const meta = { + title: 'views/Welcome', + component: Welcome, + decorators: [ + withRouter, + (Story) => ( + + + + ), + ], + parameters: { + layout: 'centered', + }, + args: {}, +} satisfies Meta; + +export default meta; + +type Story = StoryObj; + +export const Default: Story = { + args: {}, +}; diff --git a/src/ui/views/api-test/__tests__/api-test-page.test.ts b/apps/extension/src/ui/views/api-test/__tests__/api-test-page.test.ts similarity index 96% rename from src/ui/views/api-test/__tests__/api-test-page.test.ts rename to apps/extension/src/ui/views/api-test/__tests__/api-test-page.test.ts index b2e389618..386d6c404 100644 --- a/src/ui/views/api-test/__tests__/api-test-page.test.ts +++ b/apps/extension/src/ui/views/api-test/__tests__/api-test-page.test.ts @@ -1,6 +1,7 @@ -import { describe, it, expect } from 'vitest'; +import { describe, expect, it } from 'vitest'; + +import { createTestGroups } from '@/extension-shared/utils/test-data/test-groups'; -import { createTestGroups } from '../../../../shared/test-data/test-groups'; import methods from '../openapi-methods.json'; describe('ApiTestPage', () => { diff --git a/src/ui/views/api-test/api-test-page.tsx b/apps/extension/src/ui/views/api-test/api-test-page.tsx similarity index 98% rename from src/ui/views/api-test/api-test-page.tsx rename to apps/extension/src/ui/views/api-test/api-test-page.tsx index 84fccd4f8..97f79406f 100644 --- a/src/ui/views/api-test/api-test-page.tsx +++ b/apps/extension/src/ui/views/api-test/api-test-page.tsx @@ -1,32 +1,32 @@ import ExpandMoreIcon from '@mui/icons-material/ExpandMore'; import { + Accordion, + AccordionDetails, + AccordionSummary, Box, Button, + CircularProgress, Container, + Paper, TextField, Typography, - Paper, - Accordion, - AccordionSummary, - AccordionDetails, - CircularProgress, } from '@mui/material'; import * as bip39 from 'bip39'; -import React, { useState, useEffect } from 'react'; +import React, { useEffect, useState } from 'react'; -import { consoleError } from '@/shared/utils/console-log'; -import { useWallet } from '@/ui/utils'; +import { consoleError } from '@onflow/flow-wallet-shared/utils/console-log'; import { API_TEST_RESULTS, - type FetchDetail, type ApiTestResult, -} from '../../../shared/test-data/api-test-results'; + type FetchDetail, +} from '@/extension-shared/utils/test-data/api-test-results'; import { type ApiTestFunction, type CommonParams, createTestGroups, -} from '../../../shared/test-data/test-groups'; +} from '@/extension-shared/utils/test-data/test-groups'; +import { useWallet } from '@/ui/hooks/use-wallet'; const addFunctionResult = (prev: ApiTestResult[], result: ApiTestResult) => { const prevFunctionResult = prev.find((r) => r.functionName === result.functionName); diff --git a/src/ui/views/api-test/openapi-methods.json b/apps/extension/src/ui/views/api-test/openapi-methods.json similarity index 100% rename from src/ui/views/api-test/openapi-methods.json rename to apps/extension/src/ui/views/api-test/openapi-methods.json diff --git a/apps/extension/src/ui/views/index.tsx b/apps/extension/src/ui/views/index.tsx new file mode 100644 index 000000000..520cb5013 --- /dev/null +++ b/apps/extension/src/ui/views/index.tsx @@ -0,0 +1,97 @@ +import { CssBaseline } from '@mui/material'; +import { createTheme, ThemeProvider } from '@mui/material/styles'; +import React, { useEffect } from 'react'; +import { Route, HashRouter as Router, Routes, useLocation } from 'react-router'; + +import { initializeChromeLogging } from '@/extension-shared/utils/chrome-logger'; +import PrivateRoute from '@/ui/components/PrivateRoute'; +import { useWallet, useWalletLoaded } from '@/ui/hooks/use-wallet'; +import themeOptions from '@/ui/style/LLTheme'; +import { WalletProvider } from '@/ui/utils/WalletContext'; + +// Uncomment this when we need to test api-test +import ApiTestPage from './api-test/api-test-page'; +import Approval from './Approval'; +import Forgot from './Forgot'; +import Recover from './Forgot/Recover'; +import Reset from './Forgot/Reset'; +import InnerRoute from './InnerRoute'; +import SortHat from './SortHat'; +import Unlock from './Unlock'; +import Welcome from './Welcome'; +import RecoverProfile from './Welcome/RecoverProfile'; +import Register from './Welcome/Register'; +import Sync from './Welcome/Sync'; + +const theme = createTheme(themeOptions); + +const AppRoutes = () => { + const location = useLocation(); + const wallet = useWallet(); + const loaded = useWalletLoaded(); + useEffect(() => { + if (loaded) { + // Initialize Chrome logging - has to be done after mixpanel is initialized + initializeChromeLogging(); + } + }, [wallet, loaded]); + + useEffect(() => { + wallet.trackPageView(location.pathname); + }, [location, wallet]); + + return ( + + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + + + + } + /> + {/* uncomment this when we need to test api-test */} + {process.env.NODE_ENV === 'development' && ( + + + + } + /> + )} + + ); +}; + +function Main() { + return ( + + + + ); +} + +const App = ({ wallet }: { wallet: any }) => { + return ( + + + +
+ + + ); +}; + +export default App; diff --git a/src/ui/wdyr.ts b/apps/extension/src/ui/wdyr.ts similarity index 76% rename from src/ui/wdyr.ts rename to apps/extension/src/ui/wdyr.ts index fd78ab5a9..5751fcea0 100644 --- a/src/ui/wdyr.ts +++ b/apps/extension/src/ui/wdyr.ts @@ -1,5 +1,5 @@ import React from 'react'; -// import { useCurrentBalance } from 'ui/component/AddressList/AddressItem'; +// import { useCurrentBalance } from '@/ui/component/AddressList/AddressItem'; if (process.env.NODE_ENV === 'development') { const whyDidYouRender = require('@welldone-software/why-did-you-render'); diff --git a/svgTransform.js b/apps/extension/svgTransform.js similarity index 100% rename from svgTransform.js rename to apps/extension/svgTransform.js diff --git a/apps/extension/tsconfig.json b/apps/extension/tsconfig.json new file mode 100644 index 000000000..1e69daec3 --- /dev/null +++ b/apps/extension/tsconfig.json @@ -0,0 +1,44 @@ +{ + "compilerOptions": { + "baseUrl": "./", + "experimentalDecorators": true, + "emitDecoratorMetadata": true, + "module": "ESNext", + "target": "ESNext", + "moduleResolution": "bundler", + "noImplicitAny": false, + "composite": false, + "checkJs": true, + "strict": true, + "esModuleInterop": true, + "useUnknownInCatchVariables": false, + "resolveJsonModule": true, + "paths": { + "@onflow/flow-wallet-shared/*": ["../../packages/shared/src/*"], + "@onflow/flow-wallet-reducers/*": ["../../packages/reducers/src/*"], + "@/*": ["./src/*"] + }, + "lib": ["ES2021.String", "DOM", "DOM.Iterable"], + "types": ["chrome", "node", "react", "react-dom"], + "jsx": "react", + "allowSyntheticDefaultImports": true, + "allowJs": true, + "plugins": [ + { + "transform": "typescript-transform-paths", + "afterDeclarations": true + } + ], + "outDir": "./dist" + }, + "exclude": ["./node_modules"], + "include": [ + "src", + "__tests__", + "build", + "webpack.config.ts", + "postcss.config.mjs", + "svgTransform.js", + ".storybook/**/*" + ] +} diff --git a/tsconfig.node.json b/apps/extension/tsconfig.node.json similarity index 100% rename from tsconfig.node.json rename to apps/extension/tsconfig.node.json diff --git a/tsconfig.test.json b/apps/extension/tsconfig.test.json similarity index 100% rename from tsconfig.test.json rename to apps/extension/tsconfig.test.json diff --git a/vitest.config.ts b/apps/extension/vitest.config.ts similarity index 76% rename from vitest.config.ts rename to apps/extension/vitest.config.ts index 14d522be0..3e1ae35b2 100644 --- a/vitest.config.ts +++ b/apps/extension/vitest.config.ts @@ -23,12 +23,8 @@ export default defineConfig({ }, resolve: { alias: { - '@': '/src', - utils: '/src/utils', - ui: '/src/ui', - background: '/src/background', - consts: '/src/constant', - assets: '/src/ui/assets', + '@onflow/flow-wallet-shared': new URL('../../packages/shared/src', import.meta.url).pathname, + '@': new URL('./src', import.meta.url).pathname, }, }, }); diff --git a/vitest.init.ts b/apps/extension/vitest.init.ts similarity index 97% rename from vitest.init.ts rename to apps/extension/vitest.init.ts index 04c191d85..cb4c1e14b 100644 --- a/vitest.init.ts +++ b/apps/extension/vitest.init.ts @@ -130,7 +130,7 @@ vi.mock('firebase/auth/web-extension', () => ({ })); // Mock storage utility -vi.mock('@/background/utils/storage', () => ({ +vi.mock('@/core/utils/storage', () => ({ default: { get: vi.fn().mockResolvedValue({}), set: vi.fn().mockResolvedValue(undefined), @@ -140,7 +140,7 @@ vi.mock('@/background/utils/storage', () => ({ })); // Mock MixpanelService -vi.mock('@/background/service/mixpanel', () => ({ +vi.mock('@/core/service/mixpanel', () => ({ mixpanelTrack: { track: vi.fn(), identify: vi.fn(), diff --git a/webpack.config.ts b/apps/extension/webpack.config.ts similarity index 100% rename from webpack.config.ts rename to apps/extension/webpack.config.ts diff --git a/docs/architecture-separation.md b/docs/architecture-separation.md new file mode 100644 index 000000000..62a2a631f --- /dev/null +++ b/docs/architecture-separation.md @@ -0,0 +1,436 @@ +# Flow Reference Wallet - Architecture Separation + +## Folder Structure & Import Rules + +This document outlines the architectural boundaries and import rules enforced by ESLint in the Flow Reference Wallet Chrome extension. + +## Overview + +The codebase is organized into distinct layers with strict import rules to maintain separation of concerns and prevent architectural violations. Each folder has specific responsibilities and controlled dependencies. + +## Folder Structure + +``` +src/ +├── background/ # Chrome extension background scripts +├── core/ # Core business logic and services +├── ui/ # Popup UI components and views +│ ├── components/ # Reusable UI components +│ ├── views/ # Page-level components and screens +│ ├── hooks/ # Custom React hooks +│ ├── utils/ # UI-specific utilities +│ ├── assets/ # Static assets (images, fonts, etc.) +│ └── style/ # Styling and theming +├── content-script/ # Web page content scripts +└── packages/ # Workspace packages + ├── shared/ # Shared utilities and types + └── reducers/ # State management reducers +``` + +## Architecture Diagram + +```mermaid +graph TB + subgraph "Chrome Extension Context" + subgraph "Background Service Worker" + BG[background/] + CORE[core/] + BG --> CORE + end + + subgraph "UI Context" + UI[ui/] + subgraph "UI Internal Structure" + VIEWS[views/] + COMPONENTS[components/] + HOOKS[hooks/] + REDUCERS[hooks use reducers package] + UI_UTILS[utils/] + ASSETS[assets/] + STYLE[style/] + + VIEWS --> COMPONENTS + VIEWS --> HOOKS + COMPONENTS --> HOOKS + HOOKS -.->|messaging| BG + HOOKS --> SHARED + end + end + + subgraph "Content Script Context" + CS[content-script/] + end + + subgraph "Workspace Packages" + SHARED[shared/] + REDUCERS[reducers/] + end + end + + %% Dependencies + UI -.->|messaging| BG + CS --> BG + BG --> SHARED + CORE --> SHARED + UI --> SHARED + UI --> REDUCERS + CS --> SHARED + HOOKS --> REDUCERS + + %% Styling + classDef background fill:#e1f5fe + classDef core fill:#f3e5f5 + classDef ui fill:#e8f5e8 + classDef uiInternal fill:#c8e6c9 + classDef contentScript fill:#fff3e0 + classDef shared fill:#f5f5f5 + classDef reducers fill:#e3f2fd + + class BG background + class CORE core + class UI ui + class VIEWS,COMPONENTS,HOOKS,UI_UTILS,ASSETS,STYLE uiInternal + class CS contentScript + class SHARED shared + class REDUCERS reducers +``` + +## Layer Responsibilities + +### 1. Background (`src/background/`) + +- **Purpose**: Chrome extension background service worker +- **Responsibilities**: + - Extension lifecycle management + - Message routing between UI and core + - Chrome API interactions + - Wallet controller coordination +- **Can import from**: `@/core/*`, `@onflow/flow-wallet-shared/*` +- **Cannot import from**: `@/ui/*` + +### 2. Core (`src/core/`) + +- **Purpose**: Core business logic and services +- **Responsibilities**: + - Wallet services (keyring, transactions, etc.) + - Blockchain interactions + - Business logic + - Data persistence +- **Can import from**: `@onflow/flow-wallet-shared/*`, `@/background/webapi/*` +- **Cannot import from**: `@/ui/*`, `@/background/*` (except webapi) + +### 3. UI (`src/ui/`) + +- **Purpose**: Popup interface and user interactions +- **Responsibilities**: + - React components and views + - User interface logic + - State management for display + - User input handling +- **Can import from**: `@onflow/flow-wallet-shared/*` +- **Cannot import from**: `@/core/*`, `@/background/*` +- **Communication**: Uses messaging to communicate with background/wallet controller + +#### UI Internal Structure + +##### 3.1. Views (`src/ui/views/`) + +- **Purpose**: Page-level components and complete screens +- **Responsibilities**: + - Route components + - Page layouts + - Screen orchestration + - Complex user flows +- **Can import from**: `@/ui/components/*`, `@/ui/hooks/*`, `@/ui/utils/*`, `@/ui/assets/*`, `@/ui/style/*`, `@onflow/flow-wallet-shared/*`, `@onflow/flow-wallet-reducers/*` +- **Import pattern**: Views compose components and use hooks for state management + +##### 3.2. Components (`src/ui/components/`) + +- **Purpose**: Reusable UI components +- **Responsibilities**: + - Atomic UI elements + - Reusable component patterns + - Component composition + - UI interactions +- **Can import from**: `@/ui/hooks/*`, `@/ui/utils/*`, `@/ui/assets/*`, `@/ui/style/*`, `@onflow/flow-wallet-shared/*`, `@onflow/flow-wallet-reducers/*` +- **Cannot import from**: `@/ui/views/*` (components should not depend on views) + +##### 3.3. Hooks (`src/ui/hooks/`) + +- **Purpose**: Custom React hooks for state and side effects +- **Responsibilities**: + - State management logic + - Background communication + - Storage interactions + - Custom React patterns +- **Can import from**: `@/ui/utils/*`, `@onflow/flow-wallet-shared/*`, `@onflow/flow-wallet-reducers/*` +- **Special permissions**: Can communicate with background via messaging +- **Cannot import from**: `@/ui/views/*`, `@/ui/components/*` + +##### 3.4. Utils (`src/ui/utils/`) + +- **Purpose**: UI-specific utility functions +- **Responsibilities**: + - UI helper functions + - Formatting utilities + - UI-specific calculations + - Browser API wrappers +- **Can import from**: `@onflow/flow-wallet-shared/*` +- **Cannot import from**: Other UI subfolders (to prevent circular dependencies) + +##### 3.5. Assets (`src/ui/assets/`) + +- **Purpose**: Static assets for the UI +- **Responsibilities**: + - Images, icons, fonts + - Static JSON data + - SVG assets +- **Import pattern**: Imported by other UI components using `@/ui/assets/*` + +##### 3.6. Style (`src/ui/style/`) + +- **Purpose**: Styling and theming +- **Responsibilities**: + - Theme definitions + - CSS utilities + - Design tokens + - Global styles +- **Can import from**: `@onflow/flow-wallet-shared/*` (for shared constants) +- **Import pattern**: Imported by components for styling + +### 4. Content Script (`src/content-script/`) + +- **Purpose**: Web page integration +- **Responsibilities**: + - dApp provider injection + - Web page communication + - Flow FCL and Ethereum provider interfaces +- **Can import from**: `@/background/*`, `@onflow/flow-wallet-shared/*` + +### 5. Reducers Package (`@onflow/flow-wallet-reducers`) + +- **Purpose**: State management and data transformations (now as a separate workspace package) +- **Responsibilities**: + - State reduction logic + - Data transformations + - Action handling + - Pure state functions +- **Location**: `packages/reducers/` +- **Import as**: `@onflow/flow-wallet-reducers/*` +- **Can import from**: `@onflow/flow-wallet-shared/*` only +- **Cannot import from**: Any project folders or other packages +- **Note**: Must remain pure and isolated for predictable state management + +### 6. Shared Package (`@onflow/flow-wallet-shared`) + +- **Purpose**: Common utilities and types (now as a separate workspace package) +- **Responsibilities**: + - Type definitions + - Utility functions + - Constants + - Common helpers +- **Location**: `packages/shared/` +- **Import as**: `@onflow/flow-wallet-shared/*` +- **Can import from**: Nothing (standalone package) +- **Cannot import from**: Any project folders + +## Import Rules (Simplified) + +### Key Principles + +1. **Use aliases for cross-folder imports**: Always use `@/folder/*` syntax +2. **Shared package imports**: Use `@onflow/flow-wallet-shared/*` +3. **Layer boundaries are enforced**: UI ↔ Core/Background separation +4. **Relative imports allowed within folders**: Use `./` or `../` within the same folder + +### Examples + +```typescript +// ✅ Correct - importing from shared package +import { SomeType } from '@onflow/flow-wallet-shared/types/some-type'; +import { formatAddress } from '@onflow/flow-wallet-shared/utils/address'; + +// ✅ Correct - cross-folder imports with aliases +import { walletService } from '@/core/service/wallet'; +import { Button } from '@/ui/components/Button'; +import { useWallet } from '@/ui/hooks/use-wallet'; + +// ✅ Correct - relative imports within same folder +import { helper } from './helper'; +import { utils } from '../utils'; +``` + +### Relative Imports (Only within same subfolder) + +Use relative imports only within the same subfolder: + +```typescript +// ✅ Correct - within same subfolder +import { helper } from './helper'; +import { Component } from '../SubFolder/Component'; +import { utils } from '../../utils/index'; +``` + +### UI Import Hierarchy + +```typescript +// ✅ Views can import components +import { AccountCard } from '@/ui/components/account/account-card'; + +// ✅ Components can import hooks +import { useWallet } from '@/ui/hooks/use-wallet'; + +// ✅ Hooks can import reducers from package +import { accountReducer } from '@onflow/flow-wallet-reducers/account-reducer'; + +// ✅ Anyone can import from shared +import { formatAddress } from '@onflow/flow-wallet-shared/utils/address'; +``` + +### Forbidden Patterns + +```typescript +// ❌ Wrong - UI importing from core +import { keyringService } from '@/core/service/keyring'; + +// ❌ Wrong - Core importing from UI +import { Button } from '@/ui/components/Button'; + +// ❌ Wrong - Background importing from UI +import { useWallet } from '@/ui/hooks/use-wallet'; + +// ❌ Wrong - Components importing reducers from old location +import { accountReducer } from '@/ui/reducers/account-reducer'; +// ✅ Correct - Import from the package +import { accountReducer } from '@onflow/flow-wallet-reducers/account-reducer'; + +// ❌ Wrong - Using old shared path +import { formatAddress } from '@/shared/utils/address'; +// ✅ Correct - Use the package name +import { formatAddress } from '@onflow/flow-wallet-shared/utils/address'; +``` + +## Communication Patterns + +### UI ↔ Background Communication + +UI communicates with background through Chrome extension messaging: + +```typescript +// UI hooks +export const useWallet = () => { + const walletController = new WalletController(); + + const getAccounts = async () => { + return await walletController.getAccounts(); + }; + + return { getAccounts }; +}; + +// Background side +chrome.runtime.onMessage.addListener((message, sender, sendResponse) => { + // Handle messages from UI +}); +``` + +### UI Internal Communication + +```typescript +// Views use components and hooks +const Dashboard = () => { + const { accounts } = useWallet(); // Hook for data + + return ( +
+ {/* Component for UI */} +
+ ); +}; + +// Hooks use reducers from the package for state management +import { walletReducer } from '@onflow/flow-wallet-reducers/wallet-reducer'; + +const useWallet = () => { + const [state, dispatch] = useReducer(walletReducer, initialState); + // ... +}; +``` + +### Background ↔ Core Communication + +Background directly imports and uses core services: + +```typescript +// Background +import { keyringService } from '@/core/service/keyring'; +const accounts = await keyringService.getAccounts(); +``` + +## ESLint Enforcement (Simplified) + +The ESLint rules have been simplified to focus on the essential architectural boundaries: + +1. **Background folder**: + - Cannot import from `@/ui/*` + - All other imports allowed + +2. **Core folder**: + - Cannot import from `@/ui/*` + - Can only import `@/background/webapi/*` from background + - All other imports allowed + +3. **Core services**: + - Same as core, plus: + - Can only import from `@/core/service/*` or `@/core/utils/*` within core + +4. **UI folder**: + - Cannot import from `@/core/*` or `@/background/*` + - All other imports allowed + +5. **Reducers package** (`@onflow/flow-wallet-reducers`): + - Can only import from `@onflow/flow-wallet-shared/*` + - Must remain pure (no imports from other layers or packages) + +6. **Content script**: + - Cannot import from `@/ui/*` or `@/core/*` + - Can import from `@/background/*` and shared + +## Benefits + +This architecture provides: + +- **Clear separation of concerns**: Each layer has distinct responsibilities +- **Maintainable codebase**: Easier to understand and modify +- **Testable code**: Isolated layers can be tested independently +- **Chrome extension compliance**: Proper separation between contexts +- **Security**: Background service worker isolation +- **Scalability**: Clear boundaries for future development +- **Predictable state management**: Isolated reducers ensure predictable state changes +- **Reusable components**: Components can be used across different views +- **Organized UI structure**: Clear hierarchy from views → components → hooks → reducers + +## Development Guidelines + +1. **Before adding imports**: Check if the import follows the architectural rules +2. **Use aliases**: Always use `@/folder/*` aliases for cross-folder imports +3. **Use package imports**: Import from `@onflow/flow-wallet-shared/*` and `@onflow/flow-wallet-reducers/*` +4. **Keep layers isolated**: Don't create direct dependencies between UI and core +5. **Use messaging**: UI should communicate with core through background messaging +6. **Shared utilities**: Put common code in shared package, not in specific layers +7. **UI hierarchy**: Follow views → components → hooks pattern (reducers are now separate) +8. **Pure reducers**: Reducers must remain in the separate package and stay pure +9. **Reusable components**: Design components to be reusable across different views + +## Violations and Fixes + +If you encounter ESLint violations: + +1. **"UI cannot import from Core layer"**: Use the wallet controller messaging instead +2. **"Core cannot import from UI layer"**: Core should not depend on UI components +3. **"Background cannot import from UI layer"**: Background is a service worker without DOM access +4. **"Reducers must be pure"**: Reducers are now in a separate package and can only import from shared +5. **"Core services can only import webapi from background"**: Use the webapi module for browser APIs +6. **"Cannot import reducers from old location"**: Import from `@onflow/flow-wallet-reducers/*` instead + +This architecture ensures a maintainable, secure, and scalable Chrome extension codebase with clear separation of concerns at both the application and UI levels. diff --git a/docs/cache-data-model.md b/docs/cache-data-model.md index 8c13cc968..d64836786 100644 --- a/docs/cache-data-model.md +++ b/docs/cache-data-model.md @@ -81,7 +81,7 @@ export const getCachedNewData = async (param1: string, param2: string) => { - Loaders should not rely on any global or state - they should only use the arguments passed. e.g. never call anything in a loader to get the current state of something that is then used to load data. ```typescript -import { registerRefreshListener } from '@/background/utils/data-cache'; +import { registerRefreshListener } from '@/core/utils/data-cache'; const loadYourData = async (param1: string, param2: string): Promise => { const data = await fetchSomeData(param1, param2); @@ -161,7 +161,7 @@ Use batch refresh when: 1. **Use `registerBatchRefreshListener` instead of `registerRefreshListener`**: ```typescript -import { registerBatchRefreshListener } from '@/background/utils/data-cache'; +import { registerBatchRefreshListener } from '@/core/utils/data-cache'; registerBatchRefreshListener( accountBalanceRefreshRegex, @@ -183,7 +183,6 @@ registerBatchRefreshListener( ``` 2. **Parameters Explained**: - - `keyRegex`: The refresh key regex pattern (must include `-refresh` suffix) - `batchLoader`: Function that loads data for multiple items at once - `getBatchKey`: Function to extract the batch key from regex matches diff --git a/docs/cadence-scripts-usage-analysis.md b/docs/cadence-scripts-usage-analysis.md index 5030ce8d6..1c9d8bbe1 100644 --- a/docs/cadence-scripts-usage-analysis.md +++ b/docs/cadence-scripts-usage-analysis.md @@ -10,7 +10,7 @@ This document provides a comprehensive analysis of how `getScripts` is used thro ### Core Implementation -**Location**: `src/background/service/openapi.ts:2335` +**Location**: `src/core/service/openapi.ts:2335` ```typescript export const getScripts = async (network: string, category: string, scriptName: string) => { diff --git a/docs/images/import-account-menu.png b/docs/images/import-account-menu.png new file mode 100644 index 000000000..64f1341c1 Binary files /dev/null and b/docs/images/import-account-menu.png differ diff --git a/docs/images/import-account-qr.png b/docs/images/import-account-qr.png new file mode 100644 index 000000000..26064a94c Binary files /dev/null and b/docs/images/import-account-qr.png differ diff --git a/docs/images/import-profile.png b/docs/images/import-profile.png new file mode 100644 index 000000000..4d9b14f7f Binary files /dev/null and b/docs/images/import-profile.png differ diff --git a/docs/images/qr-code.png b/docs/images/qr-code.png new file mode 100644 index 000000000..c235be595 Binary files /dev/null and b/docs/images/qr-code.png differ diff --git a/docs/images/select-accounts.png b/docs/images/select-accounts.png new file mode 100644 index 000000000..8da71739f Binary files /dev/null and b/docs/images/select-accounts.png differ diff --git a/docs/images/select-profile.png b/docs/images/select-profile.png new file mode 100644 index 000000000..9e425a361 Binary files /dev/null and b/docs/images/select-profile.png differ diff --git a/docs/import-from-mobile.md b/docs/import-from-mobile.md new file mode 100644 index 000000000..131f928c7 --- /dev/null +++ b/docs/import-from-mobile.md @@ -0,0 +1,288 @@ +# Import Profile from Mobile + +## Overview + +The "Import Profile from Mobile" feature allows users to sync their Flow Wallet account from the mobile app to the Chrome extension. This is achieved using WalletConnect, a QR code, and secure transfer of the public key. The process ensures that sensitive data never leaves the user's devices and that we can be sure we are communicating with another wallet. + +Profiles are added to the extension by adding a new public key to an existing profile on mobile, including all of its accounts on mainnet and testnet. + +--- + +## User Flow + +1. **User selects "Import an existing Profile"** from the extension profile menu then **"Mobile App"** + + + +2. **A new Mnemonic is generated**. The user is prompted to repeat it. This is kept in memory until the user confirms the profile to import +3. **A QR code is generated** in the extension, representing a WalletConnect URI. + + + +4. **User scans the QR code** with the Flow Wallet mobile app. +5. **WalletConnect session is established** between the extension and the mobile app. +6. **WalletConnect `frw_add_key_to_all_profile_accounts` method called** The extension sends the public key it just created to the mobile app +7. **Mobile prompts the user to select the profile**. + + + +8. **Mobile creates a transaction to add the public key** to all of the accounts on both mainnet and testnet of the selected profile. There would be two transactions - one for each network. +9. **Mobile adds the public key to the user on our backend**. This will allow the user to log in on the extension. +10. **Response is sent to the extension via WalletConnect** to let the extension know it can save the mnemonic locally and log in. +11. **User prompted to enter password** This is used to save the new mnemonic in the keyring. +12. **Extension saves the mnemonic in keyring**. Only after the public key is added does the extension save the mnemonic—otherwise, we can be left with an empty profile. +13. **Extension logs the user into the imported profile** using the mnemonic to generate a private key and generate the signature for login. + +--- + +## Sequence Diagram + +```mermaid +sequenceDiagram + participant User + participant Extension + participant WalletConnect + participant MobileApp + participant Backend + + User->>Extension: Selects "Import an existing Profile" then "Mobile App" + Extension->>Extension: Generates new Mnemonic (kept in memory) + Extension->>User: Prompts user to repeat mnemonic + User->>Extension: Confirms mnemonic + Extension->>Extension: Generates WalletConnect URI (QR code) + Extension->>User: Displays QR code + User->>MobileApp: Scans QR code + MobileApp->>WalletConnect: Connects to session + WalletConnect->>Extension: Notifies of session + Extension->>MobileApp: Sends array of public keys ([publicKey1, publicKey2, ...]) to mobile app + MobileApp->>User: Prompts to select profile + User->>MobileApp: Selects profile + par For each network (mainnet, testnet) + MobileApp->>MobileApp: Creates batch transaction to add all public keys to all accounts on network + MobileApp->>Backend: Adds all public keys to user on backend (network-specific) + Backend-->>MobileApp: Confirms public keys added (network-specific) + end + MobileApp->>Extension: Sends response via WalletConnect (ready to login) + Extension->>User: Prompts for password (to save mnemonic) + User->>Extension: Enters password + Extension->>Extension: Saves mnemonic in keyring + Extension->>Extension: Logs user into imported profile + Extension->>User: Profile import complete +``` + +--- + +## WalletConnect Message Format + +When the extension is ready to add the new key to the selected profile, it should send a WalletConnect message to the mobile app using the following method and data structure: + +- **Method:** `frw_add_key_to_all_profile_accounts` +- **Params Example:** + +```json +{ + "publicKeys": [ + { + "publicKey": "", + "signAlgo": , + "hashAlgo": , + "weight": + } + ], + "deviceInfo": { + "deviceId": "...", + "name": "FRW Chrome Extension", + "userAgent": "Chrome" + // ...other device/location fields as needed + } +} +``` + +- The `publicKey` is the new key generated by the extension and kept in memory until the process is confirmed. +- `signAlgo`, `hashAlgo`, and `weight` are required for Flow key registration. +- `deviceInfo` is optional but can be included for analytics or device management. +- Note generally only one public would be sent as the seed phrase is not yet saved into the extendion, there would be no backup at the point this is called. However this may change in the future. + +**References:** + +- [FRW-iOS #1369](https://github.com/onflow/FRW-iOS/issues/1369) +- [FRW-Android #1144](https://github.com/onflow/FRW-Android/issues/1144) +- [FRW-Extension #1023](https://github.com/onflow/FRW-Extension/issues/1023) + +--- + +## Technical Details + +### Extension (Frontend) + +- **Mnemonic Generation:** + - The extension generates a new mnemonic and prompts the user to confirm it. The mnemonic is kept in memory and not saved until the backend confirms the public key addition. +- **WalletConnect Initialization:** + - The extension initializes a WalletConnect session and generates a QR code for the user to scan. +- **Session Handling:** + - On connection, the extension sends the new public key(s) to the mobile app. +- **Mobile Profile Selection:** + - The mobile app prompts the user to select a profile to which the new public key(s) will be added. +- **Public Key Addition:** + - The mobile app creates a **batch transaction** per network (mainnet and testnet) to add all provided public keys to all accounts of the selected profile and updates the backend. +- **Confirmation and Finalization:** + - Once the backend confirms the public keys are added, the mobile app notifies the extension via WalletConnect. + - The extension then prompts the user for their password, saves the mnemonic in the keyring, and logs the user into the imported profile. + +### Mobile App (Backend Coordination) + +- **Profile Selection and Transaction:** + - The mobile app receives the new public key(s) from the extension, prompts the user to select a profile, and creates a **batch transaction** per network to add all keys to all relevant accounts. See issue [FRW-web-next #380](https://github.com/onflow/FRW-web-next/issues/380) and [FRW-web-next #392](https://github.com/onflow/FRW-web-next/issues/392) for details of how to do this. +- **Backend Update:** + - The mobile app updates the backend to associate the new public keys with the user for each network. + - Call the `v3/sync` API call +- **Session Confirmation:** + - The mobile app sends a confirmation response to the extension via WalletConnect, signaling that the extension can now safely prompt for password, save the mnemonic, and log in. + +### Security Considerations + +- **Mnemonic Handling:** + - The mnemonic is only saved in the extension after the public key is successfully added to the user's accounts, preventing empty or orphaned profiles. +- **End-to-End Security:** + - Sensitive data (mnemonic, private key) never leaves the user's devices unencrypted. All communication between extension and mobile is via WalletConnect. +- **User Confirmation:** + - The user must confirm the mnemonic and select the profile on mobile, ensuring explicit consent for key addition. +- **Password Prompt Timing:** + - The password is only requested after backend confirmation, ensuring the mnemonic is not persisted prematurely. + +--- + +## Import Multiple Accounts from Mobile + +## Overview + +In addition to being able to import a whole profile from mobile, the user can import accounts from mobile to an existing profile. This will add the public key of the existing extension profile to the accounts the user selects on either mainnet or testnet. + +## User Flow + +1. **User selects "Import an existing Account"** from the extension profile menu then **"Mobile App"** + + + +2. **A QR code is generated** in the extension, representing a WalletConnect URI. + + + +3. **User ensures the correct profile is open then scans the QR code** with the Flow Wallet mobile app. +4. **WalletConnect session is established** between the extension and the mobile app. +5. **WalletConnect `frw_add_key_to_multiple_accounts` method called** The extension sends the public key it just created to the mobile app along with the network, signAlgo, hashAlgo, and weight (which should be 1000). +6. **Mobile prompts the user to select the accounts to import from the current profile**. It should switch to the network used in the event. It should indicate any accounts which already have the given key attached to it as "already imported". + + + +7. **Mobile creates a transaction to add public keys** to all of the selected accounts on whichever network the user selected. This will add the primary public key of the profile and any backup keys when the extension supports multi-backup. +8. **Response is sent to the extension via WalletConnect** to let the extension know which accounts were added. +9. **Extension accounts are updated**. The extension can update its cache locally with the account information as the indexer takes time to update. Once the indexer updates it can remove this info from local cache. We do the same thing when adding accounts. +10. **User told the accounts have been added** + +--- + +## Sequence Diagram + +```mermaid +sequenceDiagram + participant User + participant Extension + participant WalletConnect + participant MobileApp + participant Backend + + User->>Extension: Selects "Import an existing Account" then "Mobile App" + Extension->>User: Displays QR code + User->>MobileApp: Scans QR code + MobileApp->>WalletConnect: Connects to session + WalletConnect->>Extension: Notifies of session + Extension->>MobileApp: Calls frw_add_key_to_multiple_accounts (array of public keys, signAlgo, hashAlgo, weight, network) + MobileApp->>User: Prompts to select accounts (shows already imported) + User->>MobileApp: Selects accounts + MobileApp->>MobileApp: Creates batch transaction to add all public keys to all selected accounts on the supplied network + MobileApp->>Backend: Updates all selected accounts with new public keys (no profile update) + Backend-->>MobileApp: Confirms accounts updated + MobileApp->>Extension: Sends response via WalletConnect (accounts added) + Extension->>Extension: Updates local cache for accounts + Extension->>User: Notifies user accounts have been added +``` + +--- + +## WalletConnect Message Format + +When the extension is ready to add the public key to selected accounts, it should send a WalletConnect message to the mobile app using the following method and data structure: + +- **Method:** `frw_add_key_to_multiple_accounts` +- **Params Example:** + +```json +{ + "publicKeys": [ + { + "publicKey": "", + "signAlgo": , + "hashAlgo": , + "weight": + } + ], + "network": "mainnet" | "testnet" +} +``` + +- The `publicKey` is the key from the extension's existing profile. +- `signAlgo`, `hashAlgo`, and `weight` are required for Flow key registration. +- `network` specifies which network's accounts to import (mainnet or testnet). +- There can be multiple public keys if the extension supports multi-backup in the future + +**References:** + +- [FRW-iOS #1370](https://github.com/onflow/FRW-iOS/issues/1370) +- [FRW-Android #1145](https://github.com/onflow/FRW-Android/issues/1145) +- [FRW-Extension #1021](https://github.com/onflow/FRW-Extension/issues/1021) + +--- + +## Technical Details: Import Multiple Accounts from Mobile + +### Extension (Frontend) + +- **WalletConnect Initialization:** + - The extension initializes a WalletConnect session and generates a QR code for the user to scan. +- **Session Handling:** + - On connection, the extension sends the existing profile's public key(s) to the mobile app, along with the selected network. +- **Mobile Account Selection:** + - The mobile app prompts the user to select specific accounts to which the public key(s) will be added. +- **Public Key Addition:** + - The mobile app creates a **batch transaction** to add all provided public keys to all selected accounts on the specified network and updates the backend. +- **Confirmation and Finalization:** + - Once the backend confirms the public keys are added, the mobile app notifies the extension via WalletConnect. + - The extension updates its local cache for the imported accounts and notifies the user that the accounts have been added. + +### Mobile App (Backend Coordination) + +- **Account Selection and Transaction:** + - The mobile app receives the public key(s) and network from the extension, prompts the user to select accounts, and creates a **batch transaction** to add all keys to all selected accounts on the specified network. See issue [FRW-web-next #380](https://github.com/onflow/FRW-web-next/issues/380) and [FRW-web-next #392](https://github.com/onflow/FRW-web-next/issues/392) for details of how to do this. +- **Backend Update:** + - The mobile app updates the backend to associate the new public keys with the selected accounts. + - Call the `v3/sync` API call +- **Session Confirmation:** + - The mobile app sends a confirmation response to the extension via WalletConnect, signaling that the extension can now update its local cache and notify the user. + +--- + +## Security Considerations: Import Multiple Accounts from Mobile + +- **Key Handling:** + - Only the public key(s) from the existing extension profile are sent; no new mnemonic or private key is generated or transmitted. +- **End-to-End Security:** + - Sensitive data (private key, mnemonic) never leaves the user's devices unencrypted. All communication between extension and mobile is via WalletConnect. +- **User Confirmation:** + - The user must explicitly select which accounts to import on the mobile app, ensuring consent for key addition. +- **Cache Consistency:** + - The extension updates its local cache only after backend confirmation, reducing the risk of inconsistent state. +- **No Password Prompt:** + - Since no new mnemonic is generated, the user is not prompted for a password during this flow. + +--- diff --git a/docs/playwright-reports-gcs-setup.md b/docs/playwright-reports-gcs-setup.md new file mode 100644 index 000000000..1085df692 --- /dev/null +++ b/docs/playwright-reports-gcs-setup.md @@ -0,0 +1,110 @@ +# Playwright Reports to Google Cloud Storage Setup + +## Problem + +The Playwright reports are getting too big for GitHub Pages and need to be moved to Google Cloud Storage. + +## Current Setup Analysis + +- Current workflow in `.github/workflows/build.yml` uses GitHub Pages deployment (lines 229-297) +- Reports are sanitized using `build/sanitize-playwright.ts` before publishing +- Each report stored in `/reports/run-{github.run_id}/` directory +- 99+ historical report runs consuming ~26MB total storage + +## GCS and IAM Setup (Managed by IT) + +The Google Cloud Storage bucket and associated IAM resources will be created and managed by the IT team via Terraform. + +Authentication from GitHub Actions to Google Cloud will use **Workload Identity Federation**, which is a more secure method that avoids the need for long-lived service account keys. The IT team will provide the necessary identifiers for the Workload Identity Pool and the service account to be used by the GitHub Actions workflow. + +### Set GitHub Repository Secrets + +In your GitHub repository settings → Secrets and variables → Actions, add the following secrets, which will be provided by your IT team: + +- `PROJECT_ID`: Your GCP project ID. +- `WORKLOAD_IDENTITY_PROVIDER`: The full identifier of the Workload Identity Provider. +- `SERVICE_ACCOUNT`: The email of the Google Cloud service account to impersonate. + +Also, set the following as a **GitHub Variable** (not a secret): + +- `GCS_BUCKET_NAME`: The name of the GCS bucket for reports (e.g., `frw-playwright-reports`). + +## GitHub Actions Workflow Changes + +Replace the current deploy job (lines 229-297) in `.github/workflows/build.yml` with the following two jobs. This example splits the report deployment from other deployment steps (like Storybook) and removes the unnecessary source code checkout. + +```yaml +deploy-reports: + needs: [test] + runs-on: ubuntu-latest + if: always() + permissions: + contents: 'read' + id-token: 'write' + + steps: + - name: Download Playwright report + uses: actions/download-artifact@v4 + with: + name: playwright-report + path: playwright-report + + - name: Authenticate to Google Cloud + id: auth + uses: google-github-actions/auth@v2 + with: + token_format: 'access_token' + workload_identity_provider: ${{ secrets.WORKLOAD_IDENTITY_PROVIDER }} + service_account: ${{ secrets.SERVICE_ACCOUNT }} + + - name: Setup Google Cloud CLI + uses: google-github-actions/setup-gcloud@v1 + with: + project_id: ${{ secrets.PROJECT_ID }} + + - name: Upload reports to GCS + run: | + RUN_DIR="reports/run-${{ github.run_id }}" + gsutil -m cp -r playwright-report/* gs://${{ vars.GCS_BUCKET_NAME }}/$RUN_DIR/ + echo "REPORT_URL=https://storage.googleapis.com/${{ vars.GCS_BUCKET_NAME }}/$RUN_DIR/index.html" >> $GITHUB_ENV + + - name: Add Job Summary + if: always() + run: | + echo "## 🎭 Playwright Test Results" >> $GITHUB_STEP_SUMMARY + echo "### 📊 Report Details" >> $GITHUB_STEP_SUMMARY + echo "- **Run ID**: ${{ github.run_id }}" >> $GITHUB_STEP_SUMMARY + echo "- **Branch**: ${{ github.ref_name }}" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "### 🔗 Links" >> $GITHUB_STEP_SUMMARY + echo "- 📋 **[View Full Report](${{ env.REPORT_URL }})**" >> $GITHUB_STEP_SUMMARY +``` + +## Benefits Over GitHub Pages + +1. **No size limits** - GCS can handle much larger reports +2. **Better performance** - Google's CDN for faster loading +3. **Cost effective** - Pay only for storage used +4. **Retention control** - Set lifecycle policies to auto-delete old reports (managed by IT via Terraform) +5. **Better security** - Fine-grained access controls with Workload Identity Federation. + +## Access URLs + +Reports will be accessible at: +`https://storage.googleapis.com/YOUR_BUCKET_NAME/reports/run-GITHUB_RUN_ID/index.html` + +## Next Steps + +1. Receive GCS bucket details and Workload Identity configuration from the IT team. +2. Add GitHub secrets (`PROJECT_ID`, `WORKLOAD_IDENTITY_PROVIDER`, `SERVICE_ACCOUNT`) to the repository. +3. Add GitHub variable (`GCS_BUCKET_NAME`) to the repository. +4. Implement the workflow changes in `.github/workflows/build.yml`. +5. Test with a new commit to verify the setup works. + +## Task Status + +- [x] Research current Playwright reporting setup in GitHub Actions +- [x] Investigate Google Cloud Storage bucket setup for hosting reports +- [x] Design workflow modification to upload reports to GCS instead of GitHub Pages +- [x] Update documentation to reflect new setup with Workload Identity Federation +- [ ] Implement GitHub Actions workflow changes (pending bucket setup and secrets) diff --git a/eslint.config.base.mjs b/eslint.config.base.mjs new file mode 100644 index 000000000..602f7b261 --- /dev/null +++ b/eslint.config.base.mjs @@ -0,0 +1,119 @@ +import typescriptPlugin from '@typescript-eslint/eslint-plugin'; +import typescriptParser from '@typescript-eslint/parser'; +import importPlugin from 'eslint-plugin-import'; +import reactPlugin from 'eslint-plugin-react'; +import reactHooksPlugin from 'eslint-plugin-react-hooks'; +import unusedImportsPlugin from 'eslint-plugin-unused-imports'; +import globals from 'globals'; + +export const baseConfig = { + languageOptions: { + ecmaVersion: 'latest', + sourceType: 'module', + parser: typescriptParser, + parserOptions: { + project: true, + }, + globals: { + ...globals.browser, + ...globals.es2021, + ...globals.node, + chrome: 'readonly', + }, + }, + plugins: { + '@typescript-eslint': typescriptPlugin, + react: reactPlugin, + 'react-hooks': reactHooksPlugin, + import: importPlugin, + 'unused-imports': unusedImportsPlugin, + }, + settings: { + 'import/resolver': { + typescript: true, + node: true, + }, + react: { + version: 'detect', + }, + }, + rules: { + // TypeScript specific rules + '@typescript-eslint/no-explicit-any': 'warn', + '@typescript-eslint/explicit-module-boundary-types': 'off', + '@typescript-eslint/no-unused-vars': 'off', // Let unused-imports handle this + '@typescript-eslint/consistent-type-imports': [ + 'error', + { prefer: 'type-imports', fixStyle: 'inline-type-imports', disallowTypeAnnotations: false }, + ], + + // Unused imports rules + 'unused-imports/no-unused-imports': 'error', + 'unused-imports/no-unused-vars': [ + 'warn', + { vars: 'all', varsIgnorePattern: '^_', args: 'after-used', argsIgnorePattern: '^_' }, + ], + + // React rules + 'react/react-in-jsx-scope': 'error', // Required for React 17 + 'react/prop-types': 'off', + 'react-hooks/rules-of-hooks': 'error', + 'react-hooks/exhaustive-deps': 'error', + + // Import rules + 'import/no-unresolved': 'error', + 'import/order': [ + 'error', + { + groups: [['builtin', 'external'], 'internal', ['parent', 'sibling', 'index']], + pathGroups: [ + { + pattern: '@onflow/flow-wallet-shared/**', + group: 'external', + position: 'after', + }, + { + pattern: '@/**', + group: 'internal', + }, + ], + pathGroupsExcludedImportTypes: ['builtin'], + 'newlines-between': 'always', + alphabetize: { + order: 'asc', + caseInsensitive: true, + }, + }, + ], + + // General rules + 'no-console': ['error'], + 'prefer-const': 'error', + 'no-var': 'error', + eqeqeq: ['error', 'always'], + 'no-unused-expressions': 'error', + 'no-duplicate-imports': 'error', + 'no-restricted-syntax': [ + 'warn', + { + selector: 'CallExpression[callee.name="consoleLog"]', + message: 'Remove consoleLog once debugging is done', + }, + ], + }, +}; + +export const testConfig = { + rules: { + 'no-restricted-globals': 'off', + '@typescript-eslint/no-explicit-any': 'off', + 'no-console': ['off'], + 'no-restricted-imports': 'off', // Tests can import anything they need to test + }, +}; + +export const buildConfig = { + rules: { + 'no-console': ['off'], + }, +}; diff --git a/eslint.config.mjs b/eslint.config.mjs index 85582e197..6afa5c7b1 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -1,13 +1,4 @@ -// For more info, see https://github.com/storybookjs/eslint-plugin-storybook#configuration-flat-config-format -import storybook from 'eslint-plugin-storybook'; - -import js from '@eslint/js'; -import globals from 'globals'; -import typescriptParser from '@typescript-eslint/parser'; -import typescriptPlugin from '@typescript-eslint/eslint-plugin'; -import reactPlugin from 'eslint-plugin-react'; -import reactHooksPlugin from 'eslint-plugin-react-hooks'; -import importPlugin from 'eslint-plugin-import'; +import { baseConfig, buildConfig } from './eslint.config.base.mjs'; const config = [ // Base config for all files @@ -20,140 +11,20 @@ const config = [ '**/playwright/**', '**/playwright-report/**', '**/test-results/**', - '**/_raw/**', + 'apps/**', // Let each app handle its own linting ], - }, // JavaScript and TypeScript files - { - files: ['**/*.{js,jsx,ts,tsx}'], - languageOptions: { - ecmaVersion: 'latest', - sourceType: 'module', - parser: typescriptParser, - parserOptions: { - project: true, - }, - globals: { - ...globals.browser, - ...globals.es2021, - ...globals.node, - chrome: 'readonly', - }, - }, - plugins: { - '@typescript-eslint': typescriptPlugin, - react: reactPlugin, - 'react-hooks': reactHooksPlugin, - import: importPlugin, - }, - settings: { - 'import/resolver': { - typescript: true, - node: true, - }, - react: { - version: 'detect', // Change from '17' to 'detect' - }, - }, - rules: { - // TypeScript specific rules - '@typescript-eslint/no-explicit-any': 'warn', - '@typescript-eslint/explicit-module-boundary-types': 'off', - '@typescript-eslint/no-unused-vars': ['warn', { argsIgnorePattern: '^_' }], - '@typescript-eslint/consistent-type-imports': [ - 'error', - { prefer: 'type-imports', fixStyle: 'inline-type-imports', disallowTypeAnnotations: false }, - ], - - // React rules - 'react/react-in-jsx-scope': 'error', // Required for React 17 - 'react/prop-types': 'off', - 'react-hooks/rules-of-hooks': 'error', - 'react-hooks/exhaustive-deps': 'error', - - // Import rules - 'import/no-unresolved': 'error', - 'import/order': [ - 'error', - { - groups: ['builtin', 'external', 'internal', 'parent', 'sibling', 'index'], - 'newlines-between': 'always', - alphabetize: { - order: 'asc', - caseInsensitive: true, - }, - }, - ], - - // General rules - 'no-console': ['error'], - 'prefer-const': 'error', - 'no-var': 'error', - eqeqeq: ['error', 'always'], - 'no-unused-expressions': 'error', - 'no-duplicate-imports': 'error', - 'no-restricted-syntax': [ - 'warn', - { - selector: 'CallExpression[callee.name="consoleLog"]', - message: 'Remove consoleLog once debugging is done', - }, - ], - }, - }, // Test files specific config - { - files: [ - 'e2e/**/*', - 'playwright.config.ts', - 'vitest.config.ts', - 'vitest.init.ts', - '**/*.test.ts', - '**/__tests__/**', - ], - languageOptions: { - parserOptions: { - project: './tsconfig.test.json', - }, - }, - rules: { - 'no-restricted-globals': 'off', - '@typescript-eslint/no-explicit-any': 'off', - 'no-console': ['off'], - }, - }, // Build files specific config + }, + // JavaScript and TypeScript files in packages { - files: ['build/**/*.{js,jsx,ts,tsx}', '.storybook/**/*.{js,jsx,ts,tsx}'], - rules: { - 'no-console': ['off'], - }, - }, // Background-specific config for chrome extension + ...baseConfig, + files: ['packages/**/*.{js,jsx,ts,tsx}'], + }, + // Build/config files in root { - files: ['**/src/background/**/*.{js,jsx,ts,tsx}'], - rules: { - 'no-restricted-globals': [ - 'error', - { - name: 'window', - message: 'Do not use window in background scripts - use globalThis instead', - }, - { - name: 'document', - message: 'DOM APIs are not available in background scripts', - }, - ], - 'no-restricted-imports': [ - 'error', - { - patterns: [ - { - group: ['ui/*', '**/ui/**'], - message: 'UI components/modules cannot be imported into background scripts', - }, - ], - }, - ], - }, + ...baseConfig, + ...buildConfig, + files: ['*.{js,ts}', 'scripts/**/*.{js,ts}'], }, - ...storybook.configs['flat/recommended'], ]; export default config; diff --git a/package.json b/package.json index b38a98891..e3be9eb86 100644 --- a/package.json +++ b/package.json @@ -1,200 +1,51 @@ { - "name": "flow-reference-wallet", - "version": "2.8.7", - "description": "Digital wallet created for everyone.", + "name": "flow-wallet", + "version": "2.9.0", + "description": "Flow Wallet monorepo", "type": "module", + "private": true, "scripts": { - "prepare:dev": "pnpx tsx ./build/prepareManifest.ts dev", - "prepare:pro": "pnpx tsx ./build/prepareManifest.ts pro", - "clean": "mkdir -p dist && rm -rf dist/* && cp -r _raw/* dist", - "winClean": "if not exist dist mkdir dist && del /Q /F dist\\* && xcopy /E /I _raw dist", - "winBuild:dev": "set NODE_OPTIONS=--max-old-space-size=8192 && copy _raw\\manifest\\manifest.dev.json _raw\\manifest.json && pnpm run prepare:dev && pnpm run winClean && node build/webpack-cli-wrapper.cjs --progress --env config=dev", - "winBuild:dev-ci": "set NODE_OPTIONS=--max-old-space-size=8192 && copy _raw\\manifest\\manifest.dev.json _raw\\manifest.json && pnpm run prepare:dev && pnpm run winClean && node build/webpack-cli-wrapper.cjs --env config=dev --no-watch", - "build:dev": "NODE_OPTIONS=--max-old-space-size=8192 && cp _raw/manifest/manifest.dev.json _raw/manifest.json && pnpm run prepare:dev && pnpm run clean && node build/webpack-cli-wrapper.cjs --progress --env config=dev", - "build:dev-ci": "NODE_OPTIONS=--max-old-space-size=8192 && cp _raw/manifest/manifest.dev.json _raw/manifest.json && pnpm run prepare:dev && pnpm run clean && node build/webpack-cli-wrapper.cjs --env config=dev --no-watch", - "winBuild:pro": "copy _raw\\manifest\\manifest.pro.json _raw\\manifest.json && pnpm run prepare:pro && pnpm run winClean && node build/webpack-cli-wrapper.cjs --progress --env config=pro", - "build:ci": "cp _raw/manifest/manifest.pro.json _raw/manifest.json && pnpm run prepare:pro && pnpm run clean && node build/webpack-cli-wrapper.cjs --env config=pro", - "build:pro": "cp _raw/manifest/manifest.pro.json _raw/manifest.json && pnpm run prepare:pro && pnpm run clean && node build/webpack-cli-wrapper.cjs --progress --env config=pro", - "build:test": "cp _raw/manifest/manifest.dev.json _raw/manifest.json && pnpm run clean && node build/webpack-cli-wrapper.cjs --progress --env config=none", - "lint:fix": "eslint --fix .", - "lint": "eslint .", - "format:fix": "prettier --write .", + "dev": "pnpm -F flow-wallet-extension build:dev", + "build": "pnpm -F flow-wallet-extension build:pro", + "test": "pnpm -r test", + "test:e2e": "pnpm -r test:e2e", + "test:e2e:ui": "pnpm -r test:e2e:ui", + "lint": "eslint . && pnpm -r lint", + "lint:fix": "eslint --fix . && pnpm -r lint:fix", "format": "prettier .", - "icon": "npx iconfont-h5", - "test": "vitest", - "test:run": "vitest --run", - "test:e2e": "playwright test", - "test:e2e:ui": "playwright test --ui", - "test:e2e:ui:debug": "playwright test --ui --debug", - "test:unit": "vitest", - "test:unit:coverage": "vitest --coverage", - "pub": "pnpx tsx build/release.ts", + "format:fix": "prettier --write .", "prepare": "husky", - "preinstall": "npx only-allow pnpm", - "analyze:imports": "pnpx tsx build/analyze-imports.ts", - "analyze:dependencies": "pnpx tsx build/analyze-dependencies.ts", - "analyze:fetch": "./build/fetch-project-data.sh", - "analyze:project": "pnpx tsx build/analyze-project.ts", - "analyze:priority": "pnpm analyze:fetch && pnpm analyze:project", - "emulate:testnet": "flow emulator --chain-id testnet --rpc-host access.devnet.nodes.onflow.org:9000", - "emulate:mainnet": "flow emulator --chain-id mainnet --rpc-host access.mainnet.nodes.onflow.org:9000", - "gh:login": "gh auth login -s project && gh auth status", - "storybook": "storybook dev -p 6006", - "build-storybook": "storybook build" - }, - "dependencies": { - "@coinbase/cbpay-js": "^1.10.0", - "@debank/common": "^0.3.60", - "@emotion/react": "^11.14.0", - "@emotion/styled": "^11.14.0", - "@mui/icons-material": "^7.1.2", - "@mui/material": "^7.1.2", - "@mui/system": "^7.1.1", - "@noble/secp256k1": "^1.7.2", - "@onflow/fcl": "^1.18.0", - "@reown/walletkit": "^1.2.7", - "@trustwallet/wallet-core": "^4.3.6", - "@tsparticles/engine": "^3.8.1", - "@tsparticles/react": "^3.0.0", - "@walletconnect/core": "^2.21.3", - "@walletconnect/jsonrpc-utils": "^1.0.8", - "@walletconnect/sign-client": "^2.21.3", - "@walletconnect/types": "^2.21.3", - "@walletconnect/utils": "^2.21.3", - "aes-js": "^3.1.2", - "assert": "^2.1.0", - "bignumber.js": "^9.3.0", - "bip39": "^3.1.0", - "browser-passworder": "^2.0.3", - "compare-versions": "^4.1.4", - "copy-webpack-plugin": "^12.0.2", - "cross-fetch": "^4.1.0", - "crypto-browserify": "^3.12.1", - "dayjs": "^1.11.13", - "debounce": "^2.2.0", - "dedent": "^0.7.0", - "eth-rpc-errors": "^4.0.3", - "ethereum-hdwallet": "^0.0.26", - "ethereumjs-util": "^7.1.5", - "ethers": "^6.14.4", - "file-saver": "^2.0.5", - "firebase": "^10.14.1", - "hdkey": "0.8.0", - "history": "^4.10.1", - "koa-compose": "^4.1.0", - "lodash": "^4.17.21", - "loglevel": "^1.9.2", - "lru-cache": "^6.0.0", - "nanoid": "^3.3.11", - "process": "^0.11.10", - "qr-code-styling": "^1.9.2", - "qr-scanner": "^1.4.2", - "raw-loader": "^4.0.2", - "react": "^18.3.1", - "react-dom": "^18.3.1", - "react-highlight": "^0.15.0", - "react-hook-form": "^7.58.1", - "react-infinite-scroll-component": "^6.1.0", - "react-qrcode-logo": "^3.0.0", - "react-router-dom": "5.3.4", - "recharts": "^2.15.4", - "reflect-metadata": "^0.1.14", - "rlp": "^3.0.0", - "secp256k1": "^4.0.4", - "sha3": "^2.1.4", - "stream-browserify": "^3.0.0", - "stream-http": "^3.2.0", - "ts-toolbelt": "^9.6.0", - "tsparticles": "~3.6.0", - "use-debounce": "^10.0.5", - "uuid": "^11.1.0", - "vm-browserify": "^1.1.2", - "web3": "^4.16.0", - "web3-utils": "^4.3.3", - "webextension-polyfill": "^0.12.0", - "zxcvbn": "^4.4.2" + "storybook": "pnpm -F flow-wallet-extension storybook", + "build-storybook": "pnpm -F flow-wallet-extension build-storybook" }, "devDependencies": { - "@eslint/js": "^9.29.0", - "@metamask/eth-sig-util": "^8.2.0", - "@playwright/test": "^1.53.1", - "@storybook/addon-docs": "^9.0.12", - "@storybook/addon-onboarding": "^9.0.12", - "@storybook/addon-themes": "^9.0.12", - "@storybook/addon-webpack5-compiler-swc": "^3.0.0", - "@storybook/react-webpack5": "^9.0.12", - "@svgr/webpack": "^5.5.0", - "@types/chrome": "^0.0.281", - "@types/koa-compose": "^3.2.8", - "@types/lodash": "^4.17.18", - "@types/lru-cache": "^5.1.1", - "@types/node": "^22.15.32", - "@types/react": "^18.3.23", - "@types/react-dom": "^18.3.7", - "@types/react-router-dom": "^5.3.3", - "@types/webpack": "^5.28.5", - "@typescript-eslint/eslint-plugin": "^8.34.1", - "@typescript-eslint/parser": "^8.34.1", - "@vitest/coverage-v8": "3.2.4", - "@welldone-software/why-did-you-render": "^8.0.3", - "autoprefixer": "^10.4.21", - "chromatic": "^12.2.0", - "css-loader": "^7.1.2", - "dotenv": "^16.5.0", - "dotenv-webpack": "^8.1.0", - "enquirer": "^2.4.1", - "eslint": "^9.29.0", - "eslint-import-resolver-typescript": "^3.10.1", - "eslint-plugin-import": "^2.32.0", - "eslint-plugin-react": "^7.37.5", - "eslint-plugin-react-hooks": "^5.2.0", - "eslint-plugin-storybook": "^9.0.12", - "file-loader": "^6.2.0", - "globals": "^15.15.0", - "html-webpack-plugin": "^5.6.3", + "@commitlint/cli": "^19.6.1", + "@commitlint/config-conventional": "^19.6.0", + "@typescript-eslint/eslint-plugin": "^8.19.0", + "@typescript-eslint/parser": "^8.19.0", + "eslint": "^9.18.0", + "eslint-config-prettier": "^9.1.0", + "eslint-import-resolver-alias": "^1.1.2", + "eslint-import-resolver-typescript": "^3.7.0", + "eslint-plugin-import": "^2.31.0", + "eslint-plugin-prettier": "^5.2.2", + "eslint-plugin-react": "^7.37.3", + "eslint-plugin-react-hooks": "^5.1.0", + "eslint-plugin-storybook": "^0.11.2", + "eslint-plugin-unused-imports": "^4.1.4", + "globals": "^15.14.0", "husky": "^9.1.7", - "i18next": "^24.2.3", - "jszip": "^3.10.1", "lint-staged": "^15.5.2", - "os-browserify": "^0.3.0", - "path-browserify": "^1.0.1", - "pinst": "^3.0.0", - "postcss": "^8.5.6", - "postcss-custom-properties": "^14.0.6", - "postcss-import": "^16.1.1", - "postcss-loader": "^5.3.0", - "postcss-nested": "^7.0.2", - "prettier": "^3.5.3", - "react-devtools": "^6.1.2", - "react-i18next": "^15.5.3", - "shelljs": "^0.8.5", - "sinon-chrome": "^3.0.1", - "storybook": "^9.0.12", - "style-loader": "^4.0.0", - "table": "^6.9.0", - "ts-loader": "^9.5.2", - "ts-node": "^10.9.2", - "tsx": "^4.20.3", - "typescript": "^5.8.3", - "typescript-eslint": "^8.34.1", - "typescript-transform-paths": "^3.5.5", - "url-loader": "^4.1.1", - "vitest": "^3.2.4", - "webpack": "^5.99.9", - "webpack-cli": "^4.10.0", - "webpack-merge": "^5.10.0", - "zip-dir": "^2.0.0" + "prettier": "^3.4.2", + "typescript": "^5.7.2" }, - "keywords": [], - "author": "", - "license": "LGPL-3.0-or-later", "lint-staged": { "*.{js,jsx,ts,tsx,mjs}": "eslint", "*.{json,js,ts,jsx,tsx,html,md,mdx,mjs}": "prettier --list-different" }, "engines": { - "node": ">=22.11.0", - "pnpm": ">=9" + "node": ">=20.0.0", + "pnpm": ">=9.0.0" }, - "packageManager": "pnpm@10.12.1+sha512.f0dda8580f0ee9481c5c79a1d927b9164f2c478e90992ad268bbb2465a736984391d6333d2c327913578b2804af33474ca554ba29c04a8b13060a717675ae3ac" + "packageManager": "pnpm@10.12.4" } diff --git a/packages/reducers/package.json b/packages/reducers/package.json new file mode 100644 index 000000000..5add332ee --- /dev/null +++ b/packages/reducers/package.json @@ -0,0 +1,52 @@ +{ + "name": "@onflow/flow-wallet-reducers", + "version": "0.0.1", + "description": "Reducers for Flow Reference Wallet", + "type": "module", + "main": "./src/index.ts", + "types": "./src/index.ts", + "files": [ + "src", + "dist" + ], + "scripts": { + "build": "tsup", + "build:watch": "tsup --watch", + "type-check": "tsc --noEmit", + "clean": "rm -rf dist", + "test": "vitest", + "test:run": "vitest --run", + "test:coverage": "vitest --coverage", + "prepublishOnly": "pnpm build" + }, + "exports": { + ".": { + "types": "./src/index.ts", + "default": "./src/index.ts" + }, + "./*": { + "types": "./src/*.ts", + "default": "./src/*.ts" + } + }, + "dependencies": { + "@onflow/flow-wallet-shared": "workspace:*", + "bignumber.js": "^9.1.2" + }, + "devDependencies": { + "@types/node": "^22.10.2", + "@vitest/coverage-v8": "3.2.4", + "tsup": "^8.3.5", + "typescript": "^5.7.2", + "vitest": "^3.2.4" + }, + "engines": { + "node": ">=22.11.0" + }, + "repository": { + "type": "git", + "url": "https://github.com/onflow/FRW-Extension.git", + "directory": "packages/reducers" + }, + "license": "LGPL-3.0-or-later" +} diff --git a/src/ui/reducers/__tests__/register-reducer.test.ts b/packages/reducers/src/__tests__/register-reducer.test.ts similarity index 97% rename from src/ui/reducers/__tests__/register-reducer.test.ts rename to packages/reducers/src/__tests__/register-reducer.test.ts index b5c60f600..76ed054a9 100644 --- a/src/ui/reducers/__tests__/register-reducer.test.ts +++ b/packages/reducers/src/__tests__/register-reducer.test.ts @@ -1,6 +1,6 @@ import { describe, expect, it, vi } from 'vitest'; -import { DEFAULT_PASSWORD } from '@/shared/utils/default'; +import { DEFAULT_PASSWORD } from '@onflow/flow-wallet-shared/utils/default'; import { INITIAL_REGISTER_STATE, diff --git a/src/ui/reducers/__tests__/transaction-reducer.test.ts b/packages/reducers/src/__tests__/transaction-reducer.test.ts similarity index 91% rename from src/ui/reducers/__tests__/transaction-reducer.test.ts rename to packages/reducers/src/__tests__/transaction-reducer.test.ts index 0913562ea..311815230 100644 --- a/src/ui/reducers/__tests__/transaction-reducer.test.ts +++ b/packages/reducers/src/__tests__/transaction-reducer.test.ts @@ -1,12 +1,12 @@ import { describe, expect, it } from 'vitest'; -import { type ExtendedTokenInfo } from '@/shared/types/coin-types'; +import { type ExtendedTokenInfo } from '@onflow/flow-wallet-shared/types/coin-types'; import { - type NetworkType, + type AddressType, type TokenType, type TransactionState, -} from '@/shared/types/transaction-types'; -import { type WalletAddress } from '@/shared/types/wallet-types'; +} from '@onflow/flow-wallet-shared/types/transaction-types'; +import { type WalletAddress } from '@onflow/flow-wallet-shared/types/wallet-types'; import { INITIAL_TRANSACTION_STATE, @@ -22,8 +22,8 @@ describe('Transaction Reducer', () => { rootAddress: '', fromAddress: '', tokenType: 'Flow' as TokenType, - fromNetwork: 'Evm' as NetworkType, - toNetwork: 'Evm' as NetworkType, + fromNetwork: 'Evm' as AddressType, + toNetwork: 'Evm' as AddressType, toAddress: '', amount: '', fiatAmount: '', @@ -44,8 +44,8 @@ describe('Transaction Reducer', () => { const state = { ...INITIAL_TRANSACTION_STATE, tokenType: 'Flow' as TokenType, - fromNetwork: 'Evm' as NetworkType, - toNetwork: 'Cadence' as NetworkType, + fromNetwork: 'Evm' as AddressType, + toNetwork: 'Cadence' as AddressType, }; expect(getTransactionStateString(state)).toBe('FlowFromEvmToCadence'); }); @@ -259,8 +259,8 @@ describe('Transaction Reducer', () => { ...stateWithBalance, tokenInfo: token4Decimals, tokenType: 'FT' as TokenType, - fromNetwork: 'Evm' as NetworkType, - toNetwork: 'Cadence' as NetworkType, + fromNetwork: 'Evm' as AddressType, + toNetwork: 'Cadence' as AddressType, }; const action = { @@ -282,8 +282,8 @@ describe('Transaction Reducer', () => { { ...stateWithBalance, tokenType: 'Flow' as TokenType, - fromNetwork: 'Evm' as NetworkType, - toNetwork: 'Cadence' as NetworkType, + fromNetwork: 'Evm' as AddressType, + toNetwork: 'Cadence' as AddressType, }, action ); @@ -300,8 +300,8 @@ describe('Transaction Reducer', () => { { ...stateWithBalance, tokenType: 'Flow' as TokenType, - fromNetwork: 'Evm' as NetworkType, - toNetwork: 'Cadence' as NetworkType, + fromNetwork: 'Evm' as AddressType, + toNetwork: 'Cadence' as AddressType, }, action ); @@ -313,8 +313,8 @@ describe('Transaction Reducer', () => { it('should handle EVM to EVM transfers with up to 18 decimals', () => { const stateWithEvmNetworks: TransactionState = { ...stateWithBalance, - fromNetwork: 'Evm' as NetworkType, - toNetwork: 'Evm' as NetworkType, + fromNetwork: 'Evm' as AddressType, + toNetwork: 'Evm' as AddressType, tokenInfo: { ...stateWithBalance.tokenInfo, decimals: 18, @@ -334,8 +334,8 @@ describe('Transaction Reducer', () => { it('should limit non-EVM transfers to 8 decimals', () => { const stateWithMixedNetworks: TransactionState = { ...stateWithBalance, - fromNetwork: 'Evm' as NetworkType, - toNetwork: 'Cadence' as NetworkType, + fromNetwork: 'Evm' as AddressType, + toNetwork: 'Cadence' as AddressType, tokenInfo: { ...stateWithBalance.tokenInfo, decimals: 18, @@ -355,8 +355,8 @@ describe('Transaction Reducer', () => { it('should respect token decimals even if less than network maximum', () => { const stateWithLowDecimalToken: TransactionState = { ...stateWithBalance, - fromNetwork: 'Evm' as NetworkType, - toNetwork: 'Evm' as NetworkType, + fromNetwork: 'Evm' as AddressType, + toNetwork: 'Evm' as AddressType, tokenInfo: { ...stateWithBalance.tokenInfo, decimals: 6, @@ -384,8 +384,8 @@ describe('Transaction Reducer', () => { price: '2', }, tokenType: 'Flow' as TokenType, - fromNetwork: 'Evm' as NetworkType, - toNetwork: 'Cadence' as NetworkType, + fromNetwork: 'Evm' as AddressType, + toNetwork: 'Cadence' as AddressType, }; it('should set maximum amount in coin mode', () => { @@ -425,8 +425,8 @@ describe('Transaction Reducer', () => { { ...INITIAL_TRANSACTION_STATE, tokenType: 'Flow' as TokenType, - fromNetwork: 'Evm' as NetworkType, - toNetwork: 'Cadence' as NetworkType, + fromNetwork: 'Evm' as AddressType, + toNetwork: 'Cadence' as AddressType, }, action ); diff --git a/src/ui/reducers/import-profile-reducer.ts b/packages/reducers/src/import-profile-reducer.ts similarity index 93% rename from src/ui/reducers/import-profile-reducer.ts rename to packages/reducers/src/import-profile-reducer.ts index 83c6cae67..24aa4f1bf 100644 --- a/src/ui/reducers/import-profile-reducer.ts +++ b/packages/reducers/src/import-profile-reducer.ts @@ -1,6 +1,6 @@ -import { type PublicKeyAccount } from '@/shared/types/wallet-types'; -import { FLOW_BIP44_PATH } from '@/shared/utils/algo-constants'; -import { DEFAULT_PASSWORD } from '@/shared/utils/default'; +import { FLOW_BIP44_PATH } from '@onflow/flow-wallet-shared/constant/algo-constants'; +import { type PublicKeyAccount } from '@onflow/flow-wallet-shared/types/wallet-types'; +import { DEFAULT_PASSWORD } from '@onflow/flow-wallet-shared/utils/default'; export const IMPORT_STEPS = { IMPORT: 'import', diff --git a/packages/reducers/src/index.ts b/packages/reducers/src/index.ts new file mode 100644 index 000000000..724d4e334 --- /dev/null +++ b/packages/reducers/src/index.ts @@ -0,0 +1,3 @@ +export * from './transaction-reducer'; +export * from './register-reducer'; +export * from './import-profile-reducer'; diff --git a/src/ui/reducers/register-reducer.ts b/packages/reducers/src/register-reducer.ts similarity index 96% rename from src/ui/reducers/register-reducer.ts rename to packages/reducers/src/register-reducer.ts index eacdab197..d72d86a3a 100644 --- a/src/ui/reducers/register-reducer.ts +++ b/packages/reducers/src/register-reducer.ts @@ -1,6 +1,6 @@ import * as bip39 from 'bip39'; -import { DEFAULT_PASSWORD } from '@/shared/utils/default'; +import { DEFAULT_PASSWORD } from '@onflow/flow-wallet-shared/utils/default'; export const STEPS = { USERNAME: 'username', diff --git a/src/ui/reducers/transaction-reducer.ts b/packages/reducers/src/transaction-reducer.ts similarity index 92% rename from src/ui/reducers/transaction-reducer.ts rename to packages/reducers/src/transaction-reducer.ts index 669229e06..9d5d5c441 100644 --- a/src/ui/reducers/transaction-reducer.ts +++ b/packages/reducers/src/transaction-reducer.ts @@ -1,18 +1,17 @@ import BN from 'bignumber.js'; -import { type ExtendedTokenInfo } from '@/shared/types/coin-types'; -import { type Contact } from '@/shared/types/network-types'; +import { type ExtendedTokenInfo } from '@onflow/flow-wallet-shared/types/coin-types'; +import { type Contact } from '@onflow/flow-wallet-shared/types/network-types'; import type { - NetworkType, + AddressType, TokenType, TransactionState, TransactionStateString, -} from '@/shared/types/transaction-types'; -import { type WalletAddress } from '@/shared/types/wallet-types'; -import { isValidEthereumAddress } from '@/shared/utils/address'; -import { consoleError } from '@/shared/utils/console-log'; - -import { trimDecimalAmount } from '../../shared/utils/number'; +} from '@onflow/flow-wallet-shared/types/transaction-types'; +import { type WalletAddress } from '@onflow/flow-wallet-shared/types/wallet-types'; +import { isValidEthereumAddress } from '@onflow/flow-wallet-shared/utils/address'; +import { consoleError } from '@onflow/flow-wallet-shared/utils/console-log'; +import { trimDecimalAmount } from '@onflow/flow-wallet-shared/utils/number'; export const INITIAL_TRANSACTION_STATE: TransactionState = { currentTxState: '', @@ -76,11 +75,11 @@ type TransactionAction = } | { type: 'setFromNetwork'; - payload: NetworkType; + payload: AddressType; } | { type: 'setToNetwork'; - payload: NetworkType; + payload: AddressType; } | { type: 'setToAddress'; diff --git a/packages/reducers/tsconfig.json b/packages/reducers/tsconfig.json new file mode 100644 index 000000000..b789be690 --- /dev/null +++ b/packages/reducers/tsconfig.json @@ -0,0 +1,22 @@ +{ + "compilerOptions": { + "target": "ES2022", + "module": "ESNext", + "lib": ["ES2022"], + "moduleResolution": "bundler", + "declaration": true, + "declarationMap": true, + "sourceMap": true, + "strict": true, + "esModuleInterop": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true, + "resolveJsonModule": true, + "isolatedModules": true, + "outDir": "./dist", + "rootDir": "./", + "composite": true + }, + "include": ["src/**/*", "tsup.config.ts", "vitest.config.ts"], + "exclude": ["node_modules", "dist"] +} diff --git a/packages/reducers/tsup.config.ts b/packages/reducers/tsup.config.ts new file mode 100644 index 000000000..cfdccf7c5 --- /dev/null +++ b/packages/reducers/tsup.config.ts @@ -0,0 +1,16 @@ +import { defineConfig } from 'tsup'; + +export default defineConfig({ + entry: { + index: 'src/index.ts', + 'import-profile-reducer': 'src/import-profile-reducer.ts', + 'register-reducer': 'src/register-reducer.ts', + 'transaction-reducer': 'src/transaction-reducer.ts', + }, + format: ['cjs', 'esm'], + dts: true, + splitting: false, + sourcemap: true, + clean: true, + treeshake: true, +}); diff --git a/packages/reducers/vitest.config.ts b/packages/reducers/vitest.config.ts new file mode 100644 index 000000000..286e758d6 --- /dev/null +++ b/packages/reducers/vitest.config.ts @@ -0,0 +1,12 @@ +import { defineConfig } from 'vitest/config'; + +export default defineConfig({ + test: { + exclude: ['**/node_modules/**', '**/dist/**', '**/.{idea,git,cache,output,temp}/**'], + globals: true, + coverage: { + provider: 'v8', + reporter: ['text', 'json', 'html'], + }, + }, +}); diff --git a/packages/shared/package.json b/packages/shared/package.json new file mode 100644 index 000000000..e5b72985e --- /dev/null +++ b/packages/shared/package.json @@ -0,0 +1,83 @@ +{ + "name": "@onflow/flow-wallet-shared", + "version": "0.0.1", + "description": "Shared types and utilities for Flow Reference Wallet", + "type": "module", + "main": "./src/index.ts", + "types": "./src/index.ts", + "files": [ + "src", + "dist" + ], + "scripts": { + "build": "tsup", + "build:watch": "tsup --watch", + "type-check": "tsc --noEmit", + "clean": "rm -rf dist", + "test": "vitest", + "test:run": "vitest --run", + "test:coverage": "vitest --coverage", + "prepublishOnly": "pnpm build" + }, + "exports": { + ".": { + "types": "./src/index.ts", + "default": "./src/index.ts" + }, + "./types": { + "types": "./src/types/index.ts", + "default": "./src/types/index.ts" + }, + "./types/*": { + "types": "./src/types/*.ts", + "default": "./src/types/*.ts" + }, + "./constant": { + "types": "./src/constant/index.ts", + "default": "./src/constant/index.ts" + }, + "./constant/*": { + "types": "./src/constant/*.ts", + "default": "./src/constant/*.ts" + }, + "./utils": { + "types": "./src/utils/index.ts", + "default": "./src/utils/index.ts" + }, + "./utils/*": { + "types": "./src/utils/*.ts", + "default": "./src/utils/*.ts" + } + }, + "dependencies": { + "@onflow/fcl": "^1.13.1", + "@onflow/typedefs": "^1.4.0", + "@onflow/types": "^1.4.0", + "bignumber.js": "^9.1.2" + }, + "devDependencies": { + "@types/node": "^22.10.2", + "@vitest/coverage-v8": "3.2.4", + "tsup": "^8.3.5", + "typescript": "^5.7.2", + "vitest": "^3.2.4", + "@types/react": "^18.3.23", + "@types/react-dom": "^18.3.7", + "react": "^18.3.1", + "react-dom": "^18.3.1" + }, + "peerDependencies": { + "ethers": "^6.13.4", + "react": ">=16.8.0 <17.0.0 || >=17.0.0 <18.0.0 || >=18.0.0 <19.0.0", + "react-dom": ">=16.8.0 <17.0.0 || >=17.0.0 <18.0.0 || >=18.0.0 <19.0.0" + }, + "engines": { + "node": ">=22.11.0" + }, + "repository": { + "type": "git", + "url": "https://github.com/onflow/FRW-Extension.git", + "directory": "packages/shared" + }, + "license": "LGPL-3.0-or-later" +} diff --git a/src/shared/utils/algo-constants.ts b/packages/shared/src/constant/algo-constants.ts similarity index 97% rename from src/shared/utils/algo-constants.ts rename to packages/shared/src/constant/algo-constants.ts index 8739bd9a5..ae55b1b29 100644 --- a/src/shared/utils/algo-constants.ts +++ b/packages/shared/src/constant/algo-constants.ts @@ -1,5 +1,3 @@ -import { C } from 'ts-toolbelt'; - import { type SignAlgoString, type HashAlgoString, type ImportKeyType } from '../types/algo-types'; export const FLOW_BIP44_PATH = "m/44'/539'/0'/0/0"; diff --git a/packages/shared/src/constant/domain-constants.ts b/packages/shared/src/constant/domain-constants.ts new file mode 100644 index 000000000..6a7892d27 --- /dev/null +++ b/packages/shared/src/constant/domain-constants.ts @@ -0,0 +1,13 @@ +export const INTERNAL_REQUEST_ORIGIN = 'https://core.flow.com'; + +export const INITIAL_OPENAPI_URL = process.env.API_GO_SERVER_URL!; + +export const WEB_NEXT_URL = process.env.API_BASE_URL!; + +export const EVM_ENDPOINT = { + mainnet: 'https://mainnet.evm.nodes.onflow.org', + testnet: 'https://testnet.evm.nodes.onflow.org', +}; + +export const HTTP_STATUS_CONFLICT = 409; +export const HTTP_STATUS_TOO_MANY_REQUESTS = 429; diff --git a/src/background/utils/emoji.json b/packages/shared/src/constant/emoji.json similarity index 100% rename from src/background/utils/emoji.json rename to packages/shared/src/constant/emoji.json diff --git a/src/background/utils/erc20.abi.json b/packages/shared/src/constant/erc20.abi.json similarity index 100% rename from src/background/utils/erc20.abi.json rename to packages/shared/src/constant/erc20.abi.json diff --git a/src/background/utils/erc721.abi.json b/packages/shared/src/constant/erc721.abi.json similarity index 100% rename from src/background/utils/erc721.abi.json rename to packages/shared/src/constant/erc721.abi.json diff --git a/packages/shared/src/constant/events.ts b/packages/shared/src/constant/events.ts new file mode 100644 index 000000000..d8f754f5b --- /dev/null +++ b/packages/shared/src/constant/events.ts @@ -0,0 +1,16 @@ +export const EVENTS = { + walletIntialized: 'walletIntialized', + broadcastToUI: 'broadcastToUI', + broadcastToBackground: 'broadcastToBackground', + UIToBackground: 'UIToBackground', + SIGN_FINISHED: 'SIGN_FINISHED', + WALLETCONNECT: { + STATUS_CHANGED: 'WALLETCONNECT_STATUS_CHANGED', + INIT: 'WALLETCONNECT_INIT', + INITED: 'WALLETCONNECT_INITED', + }, + GNOSIS: { + TX_BUILT: 'TransactionBuilt', + TX_CONFIRMED: 'TransactionConfirmed', + }, +}; diff --git a/packages/shared/src/constant/index.ts b/packages/shared/src/constant/index.ts new file mode 100644 index 000000000..696bf1b83 --- /dev/null +++ b/packages/shared/src/constant/index.ts @@ -0,0 +1,11 @@ +// Re-export all constants +export * from './algo-constants'; +export * from './domain-constants'; +export * from './events'; + +// JSON exports +import emoji from './emoji.json'; +import erc20Abi from './erc20.abi.json'; +import erc721Abi from './erc721.abi.json'; + +export { emoji, erc20Abi, erc721Abi }; diff --git a/packages/shared/src/constant/urls.ts b/packages/shared/src/constant/urls.ts new file mode 100644 index 000000000..e4cdb4838 --- /dev/null +++ b/packages/shared/src/constant/urls.ts @@ -0,0 +1,4 @@ +export const TERMS_OF_SERVICE_URL = + process.env.TERMS_OF_SERVICE_URL || 'https://wallet.flow.com/terms-of-service'; +export const PRIVACY_POLICY_URL = + process.env.PRIVACY_POLICY_URL || 'https://wallet.flow.com/privacy-policy'; diff --git a/packages/shared/src/index.ts b/packages/shared/src/index.ts new file mode 100644 index 000000000..56be7ea5a --- /dev/null +++ b/packages/shared/src/index.ts @@ -0,0 +1,10 @@ +// Main entry point for @onflow/flow-wallet-shared + +// Re-export all types +export * from './types'; + +// Re-export all constants +export * from './constant'; + +// Re-export all utilities +export * from './utils'; diff --git a/src/shared/types/algo-types.ts b/packages/shared/src/types/algo-types.ts similarity index 100% rename from src/shared/types/algo-types.ts rename to packages/shared/src/types/algo-types.ts diff --git a/src/shared/types/coin-types.ts b/packages/shared/src/types/coin-types.ts similarity index 98% rename from src/shared/types/coin-types.ts rename to packages/shared/src/types/coin-types.ts index c0f1a40ac..30be473f6 100644 --- a/src/shared/types/coin-types.ts +++ b/packages/shared/src/types/coin-types.ts @@ -1,4 +1,4 @@ -import type { TokenInfo } from '@/shared/types/token-info'; +import type { TokenInfo } from './token-info'; export type CoinItem = { id: string; diff --git a/src/shared/types/feature-types.ts b/packages/shared/src/types/feature-types.ts similarity index 100% rename from src/shared/types/feature-types.ts rename to packages/shared/src/types/feature-types.ts diff --git a/packages/shared/src/types/index.ts b/packages/shared/src/types/index.ts new file mode 100644 index 000000000..e00b46af9 --- /dev/null +++ b/packages/shared/src/types/index.ts @@ -0,0 +1,13 @@ +// Re-export all types +export * from './algo-types'; +export * from './coin-types'; +export * from './feature-types'; +export * from './key-types'; +export * from './keyring-types'; +export * from './network-types'; +export * from './news-types'; +export * from './nft-types'; +export * from './token-info'; +export * from './tracking-types'; +export * from './transaction-types'; +export * from './wallet-types'; diff --git a/src/shared/types/key-types.ts b/packages/shared/src/types/key-types.ts similarity index 97% rename from src/shared/types/key-types.ts rename to packages/shared/src/types/key-types.ts index 0d5f00fd8..750913491 100644 --- a/src/shared/types/key-types.ts +++ b/packages/shared/src/types/key-types.ts @@ -1,7 +1,7 @@ import { SIGN_ALGO_NUM_ECDSA_P256, SIGN_ALGO_NUM_ECDSA_secp256k1, -} from '@/shared/utils/algo-constants'; +} from '../constant/algo-constants'; export type PublicPrivateKey = { publicKey: string; diff --git a/src/shared/types/keyring-types.ts b/packages/shared/src/types/keyring-types.ts similarity index 61% rename from src/shared/types/keyring-types.ts rename to packages/shared/src/types/keyring-types.ts index fb8b1627c..b4425ad27 100644 --- a/src/shared/types/keyring-types.ts +++ b/packages/shared/src/types/keyring-types.ts @@ -1,5 +1,3 @@ -import storage from '@/shared/utils/storage'; - export type VaultEntryV2 = { id: string; encryptedData: string; @@ -39,20 +37,24 @@ export const KEYRING_STATE_VAULT_V3 = 3; export const CURRENT_ID_KEY = 'currentId'; -const CURRENT_PUBKEY_KEY = 'currentPubKey'; - -export const returnCurrentPublicKey = async (): Promise => { - return await storage.get(CURRENT_PUBKEY_KEY); +export const KEYRING_TYPE = { + HdKeyring: 'HD Key Tree', + SimpleKeyring: 'Simple Key Pair', + HardwareKeyring: 'hardware', + WatchAddressKeyring: 'Watch Address', + WalletConnectKeyring: 'WalletConnect', + GnosisKeyring: 'Gnosis', }; - -export const getCurrentPublicKey = async (): Promise => { - const currentPubKey = await returnCurrentPublicKey(); - if (!currentPubKey) { - throw new Error('Current public key is not set.'); - } - return currentPubKey; -}; - -export const setCurrentPublicKey = async (pubKey: string) => { - await storage.set(CURRENT_PUBKEY_KEY, pubKey); +export const KEYRING_CLASS = { + PRIVATE_KEY: 'Simple Key Pair', + MNEMONIC: 'HD Key Tree', + HARDWARE: { + TREZOR: 'Trezor Hardware', + LEDGER: 'Ledger Hardware', + ONEKEY: 'Onekey Hardware', + GRIDPLUS: 'GridPlus Hardware', + }, + WATCH: 'Watch Address', + WALLETCONNECT: 'WalletConnect', + GNOSIS: 'Gnosis', }; diff --git a/src/shared/types/network-types.ts b/packages/shared/src/types/network-types.ts similarity index 99% rename from src/shared/types/network-types.ts rename to packages/shared/src/types/network-types.ts index a12c7ad70..b4a5ceb02 100644 --- a/src/shared/types/network-types.ts +++ b/packages/shared/src/types/network-types.ts @@ -496,6 +496,6 @@ export { type NewsType, type NewsDisplayType, type NewsConditionType, -} from '@/shared/types/news-types'; +} from './news-types'; export type NetworkType = 'mainnet' | 'testnet'; diff --git a/src/shared/types/news-types.ts b/packages/shared/src/types/news-types.ts similarity index 100% rename from src/shared/types/news-types.ts rename to packages/shared/src/types/news-types.ts diff --git a/src/shared/types/nft-types.ts b/packages/shared/src/types/nft-types.ts similarity index 100% rename from src/shared/types/nft-types.ts rename to packages/shared/src/types/nft-types.ts diff --git a/src/shared/utils/script-types.ts b/packages/shared/src/types/script-types.ts similarity index 87% rename from src/shared/utils/script-types.ts rename to packages/shared/src/types/script-types.ts index fb4ed3fab..9ead8d03a 100644 --- a/src/shared/utils/script-types.ts +++ b/packages/shared/src/types/script-types.ts @@ -1,5 +1,3 @@ -import { FlowNetwork, MAINNET_NETWORK, TESTNET_NETWORK } from '../types/network-types'; - /** * A set of cadence scripts * The key is the script name diff --git a/src/shared/types/token-info.ts b/packages/shared/src/types/token-info.ts similarity index 100% rename from src/shared/types/token-info.ts rename to packages/shared/src/types/token-info.ts diff --git a/src/shared/types/tracking-types.ts b/packages/shared/src/types/tracking-types.ts similarity index 100% rename from src/shared/types/tracking-types.ts rename to packages/shared/src/types/tracking-types.ts diff --git a/src/shared/types/transaction-types.ts b/packages/shared/src/types/transaction-types.ts similarity index 91% rename from src/shared/types/transaction-types.ts rename to packages/shared/src/types/transaction-types.ts index 562443916..c3a6a7dc1 100644 --- a/src/shared/types/transaction-types.ts +++ b/packages/shared/src/types/transaction-types.ts @@ -6,10 +6,10 @@ import { type WalletAddress } from './wallet-types'; export type TokenType = 'FT' | 'Flow'; // Define the network types -export type NetworkType = 'Evm' | 'Cadence' | 'Child'; +export type AddressType = 'Evm' | 'Cadence' | 'Child'; // Define the transaction direction -export type TransactionStateString = `${TokenType}From${NetworkType}To${NetworkType}`; +export type TransactionStateString = `${TokenType}From${AddressType}To${AddressType}`; export type TransactionState = { // A unique key for the transaction state @@ -20,14 +20,14 @@ export type TransactionState = { // the address of the account we're sending from fromAddress: WalletAddress | ''; // the network type of the root address - fromNetwork: NetworkType; + fromNetwork: AddressType; // the contact of the from address (if it exists) fromContact?: Contact; // the address of the to address toAddress: WalletAddress | ''; // the network type of the to address - toNetwork: NetworkType; + toNetwork: AddressType; // the contact of the to address (if it exists) toContact?: Contact; diff --git a/src/shared/utils/type.ts b/packages/shared/src/types/type.ts similarity index 100% rename from src/shared/utils/type.ts rename to packages/shared/src/types/type.ts diff --git a/src/shared/types/wallet-types.ts b/packages/shared/src/types/wallet-types.ts similarity index 96% rename from src/shared/types/wallet-types.ts rename to packages/shared/src/types/wallet-types.ts index a45616dcc..3773511fe 100644 --- a/src/shared/types/wallet-types.ts +++ b/packages/shared/src/types/wallet-types.ts @@ -1,6 +1,5 @@ -import { isValidEthereumAddress, isValidFlowAddress } from '../utils/address'; - import { type HashAlgoString, type SignAlgoString } from './algo-types'; +import { isValidEthereumAddress, isValidFlowAddress } from '../utils/address'; // Matches exactly 16 hex characters, with optional 0x prefix export type FlowAddress = `0x${string & { length: 16 }}` | `${string & { length: 16 }}`; @@ -112,7 +111,7 @@ export type WalletAccount = { chain: number; // testnet: 545, mainnet: MAINNET_CHAIN_ID id: number; name: string; - icon: string; + icon: string; // either an emoji or a url color: string; balance?: string; nfts?: number; @@ -120,7 +119,11 @@ export type WalletAccount = { export type WalletAccountWithBalance = WalletAccount & { balance: string; }; -export type MainAccount = WalletAccount & PublicKeyAccount; +export type MainAccount = WalletAccount & + PublicKeyAccount & { + evmAccount?: WalletAccount; + childAccounts?: WalletAccount[]; + }; export type MainAccountBalance = { address: string; diff --git a/src/shared/utils/address.ts b/packages/shared/src/utils/address.ts similarity index 94% rename from src/shared/utils/address.ts rename to packages/shared/src/utils/address.ts index 1b3bc65b3..67e019e3c 100644 --- a/src/shared/utils/address.ts +++ b/packages/shared/src/utils/address.ts @@ -1,4 +1,4 @@ -import { type FlowAddress, type EvmAddress } from '@/shared/types/wallet-types'; +import { type FlowAddress, type EvmAddress } from '../types/wallet-types'; export function sansPrefix(address: string): FlowAddress | EvmAddress | null { if (!address) return null; diff --git a/src/shared/utils/algo.test.ts b/packages/shared/src/utils/algo.test.ts similarity index 100% rename from src/shared/utils/algo.test.ts rename to packages/shared/src/utils/algo.test.ts diff --git a/src/shared/utils/algo.ts b/packages/shared/src/utils/algo.ts similarity index 83% rename from src/shared/utils/algo.ts rename to packages/shared/src/utils/algo.ts index 816e23290..17bdef852 100644 --- a/src/shared/utils/algo.ts +++ b/packages/shared/src/utils/algo.ts @@ -1,15 +1,14 @@ -import type { HashAlgoString, SignAlgoString } from '@/shared/types/algo-types'; - import { + HASH_ALGO_NUM_KMAC128_BLS_BLS12_381, HASH_ALGO_NUM_SHA2_256, - HASH_ALGO_NUM_SHA3_384, - HASH_ALGO_NUM_SHA3_256, HASH_ALGO_NUM_SHA2_384, + HASH_ALGO_NUM_SHA3_256, + HASH_ALGO_NUM_SHA3_384, + SIGN_ALGO_NUM_BLS_BLS12_381, SIGN_ALGO_NUM_ECDSA_P256, SIGN_ALGO_NUM_ECDSA_secp256k1, - SIGN_ALGO_NUM_BLS_BLS12_381, - HASH_ALGO_NUM_KMAC128_BLS_BLS12_381, -} from './algo-constants'; +} from '../constant/algo-constants'; +import type { HashAlgoString, SignAlgoString } from '../types/algo-types'; export function getHashAlgo(value: string): number { switch (value) { @@ -82,3 +81,14 @@ export function getStringFromSignAlgo(value: number): SignAlgoString { return 'unknown'; // Handle unknown values } } + +export function getCompatibleHashAlgo(signAlgo: number): number { + switch (signAlgo) { + case SIGN_ALGO_NUM_ECDSA_P256: + return HASH_ALGO_NUM_SHA3_256; + case SIGN_ALGO_NUM_ECDSA_secp256k1: + return HASH_ALGO_NUM_SHA2_256; + default: + throw new Error(`Unsupported sign algorithm: ${signAlgo}`); + } +} diff --git a/src/shared/utils/console-log.ts b/packages/shared/src/utils/console-log.ts similarity index 81% rename from src/shared/utils/console-log.ts rename to packages/shared/src/utils/console-log.ts index 573b856b9..171944be4 100644 --- a/src/shared/utils/console-log.ts +++ b/packages/shared/src/utils/console-log.ts @@ -4,13 +4,6 @@ const DEPLOYMENT_ENV = process.env.DEPLOYMENT_ENV; const IS_BETA = process.env.IS_BETA === 'true'; const IS_PROD = process.env.NODE_ENV === 'production' || DEPLOYMENT_ENV === 'production' || IS_BETA; -const extensionId = - chrome?.runtime?.id || IS_BETA - ? 'lpgbokkinafiehohpkiccnlncmeonkfc' - : DEPLOYMENT_ENV === 'production' - ? 'hpclkefagolihohboafpheddmmgdffjm' - : 'cfiagdgiikmjgfjnlballglniejjgegi'; - // Get the formatted stack trace const getFormattedStackTrace = () => { const error = new Error(); @@ -35,19 +28,32 @@ export type ConsoleMessageType = | 'console_debug' | 'console_trace'; +// Define the tracker function type +export type ConsoleTracker = ( + type: ConsoleMessageType, + message: string, + stack: string, + code: number +) => void; + +// Default tracker that does nothing +const defaultTracker: ConsoleTracker = () => { + // No-op by default - consumers can set their own tracker +}; + +// Allow custom tracker to be set +let customTracker: ConsoleTracker | null = null; + +export const setConsoleTracker = (tracker: ConsoleTracker) => { + customTracker = tracker; +}; + export const trackConsole = (type: ConsoleMessageType, message: string, code: number = 0) => { const sanitizedMessage = stripSensitive(message); - try { - chrome?.runtime?.sendMessage(extensionId, { - type, - message: sanitizedMessage, - stack: getFormattedStackTrace(), - code, - }); - } catch (error) { - // eslint-disable-next-line no-console - console.error('Could not track console error', error); - } + const stack = getFormattedStackTrace(); + + const tracker = customTracker || defaultTracker; + tracker(type, sanitizedMessage, stack, code); }; const _consoleLog = (...args: unknown[]) => { diff --git a/src/shared/utils/default.ts b/packages/shared/src/utils/default.ts similarity index 100% rename from src/shared/utils/default.ts rename to packages/shared/src/utils/default.ts diff --git a/src/background/utils/emoji-util.ts b/packages/shared/src/utils/emoji-util.ts similarity index 65% rename from src/background/utils/emoji-util.ts rename to packages/shared/src/utils/emoji-util.ts index 8b1673234..342fa971b 100644 --- a/src/background/utils/emoji-util.ts +++ b/packages/shared/src/utils/emoji-util.ts @@ -1,5 +1,5 @@ -import { type Emoji } from '@/shared/types/wallet-types'; -import emoji from 'background/utils/emoji.json'; +import emoji from '../constant/emoji.json'; +import { type Emoji } from '../types/wallet-types'; export const getEmojiList = (): Emoji[] => { return emoji.emojis; diff --git a/src/shared/utils/evaluate-storage.ts b/packages/shared/src/utils/evaluate-storage.ts similarity index 97% rename from src/shared/utils/evaluate-storage.ts rename to packages/shared/src/utils/evaluate-storage.ts index 0ef324b9f..3ae3d42c8 100644 --- a/src/shared/utils/evaluate-storage.ts +++ b/packages/shared/src/utils/evaluate-storage.ts @@ -1,6 +1,6 @@ import BigNumber from 'bignumber.js'; -import type { AccountBalanceInfo } from '../../shared/types/network-types'; +import type { AccountBalanceInfo } from '../types/network-types'; export type EvaluateStorageResult = { isStorageSufficient: boolean; diff --git a/src/shared/utils/formatTokenValue.test.ts b/packages/shared/src/utils/formatTokenValue.test.ts similarity index 100% rename from src/shared/utils/formatTokenValue.test.ts rename to packages/shared/src/utils/formatTokenValue.test.ts diff --git a/src/shared/utils/formatTokenValue.ts b/packages/shared/src/utils/formatTokenValue.ts similarity index 99% rename from src/shared/utils/formatTokenValue.ts rename to packages/shared/src/utils/formatTokenValue.ts index 8542e9f84..e220112b9 100644 --- a/src/shared/utils/formatTokenValue.ts +++ b/packages/shared/src/utils/formatTokenValue.ts @@ -1,7 +1,5 @@ import BigNumber from 'bignumber.js'; -import { numberWithCommas } from './number'; - interface TokenValueParts { leadingPart: string; zeroPart: number | null; diff --git a/src/shared/utils/getPeriodFrequency.ts b/packages/shared/src/utils/getPeriodFrequency.ts similarity index 88% rename from src/shared/utils/getPeriodFrequency.ts rename to packages/shared/src/utils/getPeriodFrequency.ts index ac44ca1ec..45ed4159c 100644 --- a/src/shared/utils/getPeriodFrequency.ts +++ b/packages/shared/src/utils/getPeriodFrequency.ts @@ -1,4 +1,4 @@ -import { Period, PeriodFrequency } from '@/shared/types/network-types'; +import { Period, PeriodFrequency } from '../types/network-types'; export const getPeriodFrequency = (period: Period): PeriodFrequency => { switch (period) { diff --git a/packages/shared/src/utils/index.ts b/packages/shared/src/utils/index.ts new file mode 100644 index 000000000..a6a792d4c --- /dev/null +++ b/packages/shared/src/utils/index.ts @@ -0,0 +1,12 @@ +// Re-export all utilities +export * from '../types/script-types'; +export * from '../types/type'; +export * from './address'; +export * from './algo'; +export * from './default'; +export * from './emoji-util'; +export * from './evaluate-storage'; +export * from './formatTokenValue'; +export * from './getPeriodFrequency'; +export * from './number'; +export * from './strip-sensitive'; diff --git a/src/shared/utils/__tests__/number.test.ts b/packages/shared/src/utils/number.test.ts similarity index 99% rename from src/shared/utils/__tests__/number.test.ts rename to packages/shared/src/utils/number.test.ts index 34f87bb70..22379d5b0 100644 --- a/src/shared/utils/__tests__/number.test.ts +++ b/packages/shared/src/utils/number.test.ts @@ -1,12 +1,12 @@ -import { describe, it, expect } from 'vitest'; +import { describe, expect, it } from 'vitest'; import { - formatLargeNumber, addDotSeparators, + convertToIntegerAmount, + formatLargeNumber, trimDecimalAmount, validateAmount, - convertToIntegerAmount, -} from '../number'; +} from './number'; describe('formatLargeNumber', () => { it('should format numbers into human readable format', () => { diff --git a/src/shared/utils/number.ts b/packages/shared/src/utils/number.ts similarity index 100% rename from src/shared/utils/number.ts rename to packages/shared/src/utils/number.ts diff --git a/src/shared/utils/strip-sensitive.ts b/packages/shared/src/utils/strip-sensitive.ts similarity index 100% rename from src/shared/utils/strip-sensitive.ts rename to packages/shared/src/utils/strip-sensitive.ts diff --git a/packages/shared/tsconfig.json b/packages/shared/tsconfig.json new file mode 100644 index 000000000..b789be690 --- /dev/null +++ b/packages/shared/tsconfig.json @@ -0,0 +1,22 @@ +{ + "compilerOptions": { + "target": "ES2022", + "module": "ESNext", + "lib": ["ES2022"], + "moduleResolution": "bundler", + "declaration": true, + "declarationMap": true, + "sourceMap": true, + "strict": true, + "esModuleInterop": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true, + "resolveJsonModule": true, + "isolatedModules": true, + "outDir": "./dist", + "rootDir": "./", + "composite": true + }, + "include": ["src/**/*", "tsup.config.ts", "vitest.config.ts"], + "exclude": ["node_modules", "dist"] +} diff --git a/packages/shared/tsup.config.ts b/packages/shared/tsup.config.ts new file mode 100644 index 000000000..5fa76f2ee --- /dev/null +++ b/packages/shared/tsup.config.ts @@ -0,0 +1,16 @@ +import { defineConfig } from 'tsup'; + +export default defineConfig({ + entry: { + index: 'src/index.ts', + 'types/index': 'src/types/index.ts', + 'constants/index': 'src/constants/index.ts', + 'utils/index': 'src/utils/index.ts', + }, + format: ['cjs', 'esm'], + dts: true, + splitting: false, + sourcemap: true, + clean: true, + treeshake: true, +}); diff --git a/packages/shared/vitest.config.ts b/packages/shared/vitest.config.ts new file mode 100644 index 000000000..286e758d6 --- /dev/null +++ b/packages/shared/vitest.config.ts @@ -0,0 +1,12 @@ +import { defineConfig } from 'vitest/config'; + +export default defineConfig({ + test: { + exclude: ['**/node_modules/**', '**/dist/**', '**/.{idea,git,cache,output,temp}/**'], + globals: true, + coverage: { + provider: 'v8', + reporter: ['text', 'json', 'html'], + }, + }, +}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f0ff5e44f..86c3bf112 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -5,12 +5,71 @@ settings: excludeLinksFromLockfile: false importers: - .: + devDependencies: + '@commitlint/cli': + specifier: ^19.6.1 + version: 19.8.1(@types/node@24.0.12)(typescript@5.8.3) + '@commitlint/config-conventional': + specifier: ^19.6.0 + version: 19.8.1 + '@typescript-eslint/eslint-plugin': + specifier: ^8.19.0 + version: 8.36.0(@typescript-eslint/parser@8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3))(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/parser': + specifier: ^8.19.0 + version: 8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) + eslint: + specifier: ^9.18.0 + version: 9.30.1(jiti@2.4.2) + eslint-config-prettier: + specifier: ^9.1.0 + version: 9.1.0(eslint@9.30.1(jiti@2.4.2)) + eslint-import-resolver-alias: + specifier: ^1.1.2 + version: 1.1.2(eslint-plugin-import@2.32.0) + eslint-import-resolver-typescript: + specifier: ^3.7.0 + version: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.30.1(jiti@2.4.2)) + eslint-plugin-import: + specifier: ^2.31.0 + version: 2.32.0(@typescript-eslint/parser@8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.30.1(jiti@2.4.2)) + eslint-plugin-prettier: + specifier: ^5.2.2 + version: 5.5.1(@types/eslint@9.6.1)(eslint-config-prettier@9.1.0(eslint@9.30.1(jiti@2.4.2)))(eslint@9.30.1(jiti@2.4.2))(prettier@3.6.2) + eslint-plugin-react: + specifier: ^7.37.3 + version: 7.37.5(eslint@9.30.1(jiti@2.4.2)) + eslint-plugin-react-hooks: + specifier: ^5.1.0 + version: 5.2.0(eslint@9.30.1(jiti@2.4.2)) + eslint-plugin-storybook: + specifier: ^0.11.2 + version: 0.11.6(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) + eslint-plugin-unused-imports: + specifier: ^4.1.4 + version: 4.1.4(@typescript-eslint/eslint-plugin@8.36.0(@typescript-eslint/parser@8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3))(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3))(eslint@9.30.1(jiti@2.4.2)) + globals: + specifier: ^15.14.0 + version: 15.15.0 + husky: + specifier: ^9.1.7 + version: 9.1.7 + lint-staged: + specifier: ^15.5.2 + version: 15.5.2 + prettier: + specifier: ^3.4.2 + version: 3.6.2 + typescript: + specifier: ^5.7.2 + version: 5.8.3 + + apps/extension: dependencies: '@coinbase/cbpay-js': specifier: ^1.10.0 - version: 1.10.0(regenerator-runtime@0.13.11) + version: 1.10.0 '@debank/common': specifier: ^0.3.60 version: 0.3.60 @@ -18,26 +77,32 @@ importers: specifier: ^11.14.0 version: 11.14.0(@types/react@18.3.23)(react@18.3.1) '@emotion/styled': - specifier: ^11.14.0 - version: 11.14.0(@emotion/react@11.14.0(@types/react@18.3.23)(react@18.3.1))(@types/react@18.3.23)(react@18.3.1) + specifier: ^11.14.1 + version: 11.14.1(@emotion/react@11.14.0(@types/react@18.3.23)(react@18.3.1))(@types/react@18.3.23)(react@18.3.1) '@mui/icons-material': - specifier: ^7.1.2 - version: 7.1.2(@mui/material@7.1.2(@emotion/react@11.14.0(@types/react@18.3.23)(react@18.3.1))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@18.3.23)(react@18.3.1))(@types/react@18.3.23)(react@18.3.1))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.23)(react@18.3.1) + specifier: ^7.2.0 + version: 7.2.0(@mui/material@7.2.0(@emotion/react@11.14.0(@types/react@18.3.23)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.23)(react@18.3.1))(@types/react@18.3.23)(react@18.3.1))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.23)(react@18.3.1) '@mui/material': - specifier: ^7.1.2 - version: 7.1.2(@emotion/react@11.14.0(@types/react@18.3.23)(react@18.3.1))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@18.3.23)(react@18.3.1))(@types/react@18.3.23)(react@18.3.1))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: ^7.2.0 + version: 7.2.0(@emotion/react@11.14.0(@types/react@18.3.23)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.23)(react@18.3.1))(@types/react@18.3.23)(react@18.3.1))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@mui/system': - specifier: ^7.1.1 - version: 7.1.1(@emotion/react@11.14.0(@types/react@18.3.23)(react@18.3.1))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@18.3.23)(react@18.3.1))(@types/react@18.3.23)(react@18.3.1))(@types/react@18.3.23)(react@18.3.1) + specifier: ^7.2.0 + version: 7.2.0(@emotion/react@11.14.0(@types/react@18.3.23)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.23)(react@18.3.1))(@types/react@18.3.23)(react@18.3.1))(@types/react@18.3.23)(react@18.3.1) '@noble/secp256k1': specifier: ^1.7.2 version: 1.7.2 '@onflow/fcl': - specifier: ^1.18.0 - version: 1.18.0(@types/react@18.3.23)(bufferutil@4.0.9)(google-protobuf@3.21.4)(jiti@2.4.2)(postcss@8.5.6)(react@18.3.1)(ts-node@10.9.2(@swc/core@1.12.1)(@types/node@22.15.32)(typescript@5.8.3))(tsx@4.20.3)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) + specifier: ^1.19.0 + version: 1.19.0(@types/react@18.3.23)(google-protobuf@3.21.4)(jiti@2.4.2)(postcss@8.5.6)(react@18.3.1)(ts-node@10.9.2(@swc/core@1.12.11)(@types/node@22.16.2)(typescript@5.8.3))(tsx@4.20.3)(typescript@5.8.3)(zod@3.25.76) + '@onflow/flow-wallet-reducers': + specifier: workspace:* + version: link:../../packages/reducers + '@onflow/flow-wallet-shared': + specifier: workspace:* + version: link:../../packages/shared '@reown/walletkit': - specifier: ^1.2.7 - version: 1.2.7(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) + specifier: ^1.2.8 + version: 1.2.8(typescript@5.8.3)(zod@3.25.76) '@trustwallet/wallet-core': specifier: ^4.3.6 version: 4.3.6 @@ -48,20 +113,20 @@ importers: specifier: ^3.0.0 version: 3.0.0(@tsparticles/engine@3.8.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@walletconnect/core': - specifier: ^2.21.3 - version: 2.21.3(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) + specifier: ^2.21.4 + version: 2.21.4(typescript@5.8.3)(zod@3.25.76) '@walletconnect/jsonrpc-utils': specifier: ^1.0.8 version: 1.0.8 '@walletconnect/sign-client': - specifier: ^2.21.3 - version: 2.21.3(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) + specifier: ^2.21.4 + version: 2.21.4(typescript@5.8.3)(zod@3.25.76) '@walletconnect/types': - specifier: ^2.21.3 - version: 2.21.3 + specifier: ^2.21.4 + version: 2.21.4 '@walletconnect/utils': - specifier: ^2.21.3 - version: 2.21.3(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) + specifier: ^2.21.4 + version: 2.21.4(typescript@5.8.3)(zod@3.25.76) aes-js: specifier: ^3.1.2 version: 3.1.2 @@ -80,9 +145,6 @@ importers: compare-versions: specifier: ^4.1.4 version: 4.1.4 - copy-webpack-plugin: - specifier: ^12.0.2 - version: 12.0.2(webpack@5.99.9) cross-fetch: specifier: ^4.1.0 version: 4.1.0 @@ -108,8 +170,8 @@ importers: specifier: ^7.1.5 version: 7.1.5 ethers: - specifier: ^6.14.4 - version: 6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10) + specifier: ^6.15.0 + version: 6.15.0 file-saver: specifier: ^2.0.5 version: 2.0.5 @@ -132,8 +194,8 @@ importers: specifier: ^1.9.2 version: 1.9.2 lru-cache: - specifier: ^6.0.0 - version: 6.0.0 + specifier: ^11.1.0 + version: 11.1.0 nanoid: specifier: ^3.3.11 version: 3.3.11 @@ -159,17 +221,17 @@ importers: specifier: ^0.15.0 version: 0.15.0 react-hook-form: - specifier: ^7.58.1 - version: 7.58.1(react@18.3.1) + specifier: ^7.60.0 + version: 7.60.0(react@18.3.1) react-infinite-scroll-component: specifier: ^6.1.0 version: 6.1.0(react@18.3.1) react-qrcode-logo: specifier: ^3.0.0 version: 3.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react-router-dom: - specifier: 5.3.4 - version: 5.3.4(react@18.3.1) + react-router: + specifier: ^7.6.3 + version: 7.6.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) recharts: specifier: ^2.15.4 version: 2.15.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -208,7 +270,7 @@ importers: version: 1.1.2 web3: specifier: ^4.16.0 - version: 4.16.0(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) + version: 4.16.0(typescript@5.8.3)(zod@3.25.76) web3-utils: specifier: ^4.3.3 version: 4.3.3 @@ -220,29 +282,29 @@ importers: version: 4.4.2 devDependencies: '@eslint/js': - specifier: ^9.29.0 - version: 9.29.0 + specifier: ^9.30.1 + version: 9.30.1 '@metamask/eth-sig-util': specifier: ^8.2.0 version: 8.2.0 '@playwright/test': - specifier: ^1.53.1 - version: 1.53.1 + specifier: ^1.53.2 + version: 1.53.2 '@storybook/addon-docs': - specifier: ^9.0.12 - version: 9.0.12(@types/react@18.3.23)(storybook@9.0.12(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10)) + specifier: ^9.0.16 + version: 9.0.16(@types/react@18.3.23)(storybook@9.0.16(@testing-library/dom@10.4.0)(prettier@3.6.2)) '@storybook/addon-onboarding': - specifier: ^9.0.12 - version: 9.0.12(storybook@9.0.12(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10)) + specifier: ^9.0.16 + version: 9.0.16(storybook@9.0.16(@testing-library/dom@10.4.0)(prettier@3.6.2)) '@storybook/addon-themes': - specifier: ^9.0.12 - version: 9.0.12(storybook@9.0.12(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10)) + specifier: ^9.0.16 + version: 9.0.16(storybook@9.0.16(@testing-library/dom@10.4.0)(prettier@3.6.2)) '@storybook/addon-webpack5-compiler-swc': specifier: ^3.0.0 version: 3.0.0(webpack@5.99.9) '@storybook/react-webpack5': - specifier: ^9.0.12 - version: 9.0.12(@swc/core@1.12.1)(esbuild@0.25.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.0.12(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10))(typescript@5.8.3)(webpack-cli@4.10.0) + specifier: ^9.0.16 + version: 9.0.16(@swc/core@1.12.11)(esbuild@0.25.6)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.0.16(@testing-library/dom@10.4.0)(prettier@3.6.2))(typescript@5.8.3)(webpack-cli@4.10.0) '@svgr/webpack': specifier: ^5.5.0 version: 5.5.0 @@ -253,35 +315,29 @@ importers: specifier: ^3.2.8 version: 3.2.8 '@types/lodash': - specifier: ^4.17.18 - version: 4.17.18 - '@types/lru-cache': - specifier: ^5.1.1 - version: 5.1.1 + specifier: ^4.17.20 + version: 4.17.20 '@types/node': - specifier: ^22.15.32 - version: 22.15.32 + specifier: ^22.16.2 + version: 22.16.2 '@types/react': specifier: ^18.3.23 version: 18.3.23 '@types/react-dom': specifier: ^18.3.7 version: 18.3.7(@types/react@18.3.23) - '@types/react-router-dom': - specifier: ^5.3.3 - version: 5.3.3 '@types/webpack': specifier: ^5.28.5 - version: 5.28.5(@swc/core@1.12.1)(esbuild@0.25.5)(webpack-cli@4.10.0) + version: 5.28.5(@swc/core@1.12.11)(esbuild@0.25.6)(webpack-cli@4.10.0) '@typescript-eslint/eslint-plugin': - specifier: ^8.34.1 - version: 8.34.1(@typescript-eslint/parser@8.34.1(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3) + specifier: ^8.36.0 + version: 8.36.0(@typescript-eslint/parser@8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3))(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) '@typescript-eslint/parser': - specifier: ^8.34.1 - version: 8.34.1(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3) + specifier: ^8.36.0 + version: 8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) '@vitest/coverage-v8': specifier: 3.2.4 - version: 3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@22.15.32)(jiti@2.4.2)(jsdom@16.7.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)) + version: 3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@22.16.2)(jiti@2.4.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)) '@welldone-software/why-did-you-render': specifier: ^8.0.3 version: 8.0.3(react@18.3.1) @@ -291,36 +347,45 @@ importers: chromatic: specifier: ^12.2.0 version: 12.2.0 + copy-webpack-plugin: + specifier: ^12.0.2 + version: 12.0.2(webpack@5.99.9) + cross-env: + specifier: ^7.0.3 + version: 7.0.3 css-loader: specifier: ^7.1.2 version: 7.1.2(webpack@5.99.9) dotenv: - specifier: ^16.5.0 - version: 16.5.0 + specifier: ^16.6.1 + version: 16.6.1 dotenv-webpack: - specifier: ^8.1.0 - version: 8.1.0(webpack@5.99.9) + specifier: ^8.1.1 + version: 8.1.1(webpack@5.99.9) enquirer: specifier: ^2.4.1 version: 2.4.1 eslint: - specifier: ^9.29.0 - version: 9.29.0(jiti@2.4.2) + specifier: ^9.30.1 + version: 9.30.1(jiti@2.4.2) eslint-import-resolver-typescript: specifier: ^3.10.1 - version: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.29.0(jiti@2.4.2)) + version: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.30.1(jiti@2.4.2)) eslint-plugin-import: specifier: ^2.32.0 - version: 2.32.0(@typescript-eslint/parser@8.34.1(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.29.0(jiti@2.4.2)) + version: 2.32.0(@typescript-eslint/parser@8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.30.1(jiti@2.4.2)) eslint-plugin-react: specifier: ^7.37.5 - version: 7.37.5(eslint@9.29.0(jiti@2.4.2)) + version: 7.37.5(eslint@9.30.1(jiti@2.4.2)) eslint-plugin-react-hooks: specifier: ^5.2.0 - version: 5.2.0(eslint@9.29.0(jiti@2.4.2)) + version: 5.2.0(eslint@9.30.1(jiti@2.4.2)) eslint-plugin-storybook: - specifier: ^9.0.12 - version: 9.0.12(eslint@9.29.0(jiti@2.4.2))(storybook@9.0.12(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10))(typescript@5.8.3) + specifier: ^9.0.16 + version: 9.0.16(eslint@9.30.1(jiti@2.4.2))(storybook@9.0.16(@testing-library/dom@10.4.0)(prettier@3.6.2))(typescript@5.8.3) + eslint-plugin-unused-imports: + specifier: ^4.1.4 + version: 4.1.4(@typescript-eslint/eslint-plugin@8.36.0(@typescript-eslint/parser@8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3))(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3))(eslint@9.30.1(jiti@2.4.2)) file-loader: specifier: ^6.2.0 version: 6.2.0(webpack@5.99.9) @@ -330,18 +395,12 @@ importers: html-webpack-plugin: specifier: ^5.6.3 version: 5.6.3(webpack@5.99.9) - husky: - specifier: ^9.1.7 - version: 9.1.7 i18next: specifier: ^24.2.3 version: 24.2.3(typescript@5.8.3) jszip: specifier: ^3.10.1 version: 3.10.1 - lint-staged: - specifier: ^15.5.2 - version: 15.5.2 os-browserify: specifier: ^0.3.0 version: 0.3.0 @@ -367,14 +426,17 @@ importers: specifier: ^7.0.2 version: 7.0.2(postcss@8.5.6) prettier: - specifier: ^3.5.3 - version: 3.5.3 + specifier: ^3.6.2 + version: 3.6.2 react-devtools: - specifier: ^6.1.2 - version: 6.1.2(bufferutil@4.0.9)(utf-8-validate@5.0.10) + specifier: ^6.1.5 + version: 6.1.5 react-i18next: - specifier: ^15.5.3 - version: 15.5.3(i18next@24.2.3(typescript@5.8.3))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.3) + specifier: ^15.6.0 + version: 15.6.0(i18next@24.2.3(typescript@5.8.3))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.3) + rimraf: + specifier: ^6.0.1 + version: 6.0.1 shelljs: specifier: ^0.8.5 version: 0.8.5 @@ -382,8 +444,11 @@ importers: specifier: ^3.0.1 version: 3.0.1 storybook: - specifier: ^9.0.12 - version: 9.0.12(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10) + specifier: ^9.0.16 + version: 9.0.16(@testing-library/dom@10.4.0)(prettier@3.6.2) + storybook-addon-remix-react-router: + specifier: ^5.0.0 + version: 5.0.0(react-dom@18.3.1(react@18.3.1))(react-router@7.6.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(storybook@9.0.16(@testing-library/dom@10.4.0)(prettier@3.6.2)) style-loader: specifier: ^4.0.0 version: 4.0.0(webpack@5.99.9) @@ -395,7 +460,7 @@ importers: version: 9.5.2(typescript@5.8.3)(webpack@5.99.9) ts-node: specifier: ^10.9.2 - version: 10.9.2(@swc/core@1.12.1)(@types/node@22.15.32)(typescript@5.8.3) + version: 10.9.2(@swc/core@1.12.11)(@types/node@22.16.2)(typescript@5.8.3) tsx: specifier: ^4.20.3 version: 4.20.3 @@ -403,8 +468,8 @@ importers: specifier: ^5.8.3 version: 5.8.3 typescript-eslint: - specifier: ^8.34.1 - version: 8.34.1(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3) + specifier: ^8.36.0 + version: 8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) typescript-transform-paths: specifier: ^3.5.5 version: 3.5.5(typescript@5.8.3) @@ -413,10 +478,10 @@ importers: version: 4.1.1(file-loader@6.2.0(webpack@5.99.9))(webpack@5.99.9) vitest: specifier: ^3.2.4 - version: 3.2.4(@types/debug@4.1.12)(@types/node@22.15.32)(jiti@2.4.2)(jsdom@16.7.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0) + version: 3.2.4(@types/debug@4.1.12)(@types/node@22.16.2)(jiti@2.4.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0) webpack: specifier: ^5.99.9 - version: 5.99.9(@swc/core@1.12.1)(esbuild@0.25.5)(webpack-cli@4.10.0) + version: 5.99.9(@swc/core@1.12.11)(esbuild@0.25.6)(webpack-cli@4.10.0) webpack-cli: specifier: ^4.10.0 version: 4.10.0(webpack@5.99.9) @@ -427,629 +492,1192 @@ importers: specifier: ^2.0.0 version: 2.0.0 -packages: + packages/reducers: + dependencies: + '@onflow/flow-wallet-shared': + specifier: workspace:* + version: link:../shared + bignumber.js: + specifier: ^9.1.2 + version: 9.3.0 + devDependencies: + '@types/node': + specifier: ^22.10.2 + version: 22.16.0 + '@vitest/coverage-v8': + specifier: 3.2.4 + version: 3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@22.16.0)(jiti@2.4.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)) + tsup: + specifier: ^8.3.5 + version: 8.5.0(@swc/core@1.12.11)(jiti@2.4.2)(postcss@8.5.6)(tsx@4.20.3)(typescript@5.8.3)(yaml@2.8.0) + typescript: + specifier: ^5.7.2 + version: 5.8.3 + vitest: + specifier: ^3.2.4 + version: 3.2.4(@types/debug@4.1.12)(@types/node@22.16.0)(jiti@2.4.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0) + + packages/shared: + dependencies: + '@onflow/fcl': + specifier: ^1.13.1 + version: 1.19.0(@types/react@18.3.23)(google-protobuf@3.21.4)(jiti@2.4.2)(postcss@8.5.6)(react@18.3.1)(ts-node@10.9.2(@swc/core@1.12.11)(@types/node@22.16.2)(typescript@5.8.3))(tsx@4.20.3)(typescript@5.8.3)(zod@3.25.76) + '@onflow/typedefs': + specifier: ^1.4.0 + version: 1.6.0 + '@onflow/types': + specifier: ^1.4.0 + version: 1.4.1 + bignumber.js: + specifier: ^9.1.2 + version: 9.3.0 + ethers: + specifier: ^6.13.4 + version: 6.15.0 + devDependencies: + '@types/node': + specifier: ^22.10.2 + version: 22.16.0 + '@types/react': + specifier: ^18.3.23 + version: 18.3.23 + '@types/react-dom': + specifier: ^18.3.7 + version: 18.3.7(@types/react@18.3.23) + '@vitest/coverage-v8': + specifier: 3.2.4 + version: 3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@22.16.0)(jiti@2.4.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)) + react: + specifier: ^18.3.1 + version: 18.3.1 + react-dom: + specifier: ^18.3.1 + version: 18.3.1(react@18.3.1) + tsup: + specifier: ^8.3.5 + version: 8.5.0(@swc/core@1.12.11)(jiti@2.4.2)(postcss@8.5.6)(tsx@4.20.3)(typescript@5.8.3)(yaml@2.8.0) + typescript: + specifier: ^5.7.2 + version: 5.8.3 + vitest: + specifier: ^3.2.4 + version: 3.2.4(@types/debug@4.1.12)(@types/node@22.16.0)(jiti@2.4.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0) +packages: '@adobe/css-tools@4.4.3': - resolution: {integrity: sha512-VQKMkwriZbaOgVCby1UDY/LDk5fIjhQicCvVPFqfe+69fWaPWydbWJ3wRt59/YzIwda1I81loas3oCoHxnqvdA==} + resolution: + { + integrity: sha512-VQKMkwriZbaOgVCby1UDY/LDk5fIjhQicCvVPFqfe+69fWaPWydbWJ3wRt59/YzIwda1I81loas3oCoHxnqvdA==, + } '@adraffy/ens-normalize@1.10.1': - resolution: {integrity: sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw==} + resolution: + { + integrity: sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw==, + } '@adraffy/ens-normalize@1.11.0': - resolution: {integrity: sha512-/3DDPKHqqIqxUULp8yP4zODUY1i+2xvVWsv8A79xGWdCAG+8sb0hRh0Rk2QyOJUnnbyPUAZYcpBuRe3nS2OIUg==} + resolution: + { + integrity: sha512-/3DDPKHqqIqxUULp8yP4zODUY1i+2xvVWsv8A79xGWdCAG+8sb0hRh0Rk2QyOJUnnbyPUAZYcpBuRe3nS2OIUg==, + } '@alloc/quick-lru@5.2.0': - resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==, + } + engines: { node: '>=10' } '@ampproject/remapping@2.3.0': - resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} - engines: {node: '>=6.0.0'} + resolution: + { + integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==, + } + engines: { node: '>=6.0.0' } '@babel/code-frame@7.27.1': - resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} - engines: {node: '>=6.9.0'} - - '@babel/compat-data@7.27.5': - resolution: {integrity: sha512-KiRAp/VoJaWkkte84TvUd9qjdbZAdiqyvMxrGl1N6vzFogKmaLgoM3L1kgtLicp2HP5fBJS8JrZKLVIZGVJAVg==} - engines: {node: '>=6.9.0'} - - '@babel/core@7.27.4': - resolution: {integrity: sha512-bXYxrXFubeYdvB0NhD/NBB3Qi6aZeV20GOWVI47t2dkecCEoneR4NPVcb7abpXDEvejgrUfFtG6vG/zxAKmg+g==} - engines: {node: '>=6.9.0'} - - '@babel/generator@7.27.5': - resolution: {integrity: sha512-ZGhA37l0e/g2s1Cnzdix0O3aLYm66eF8aufiVteOgnwxgnRP8GoyMj7VWsgWnQbVKXyge7hqrFh2K2TQM6t1Hw==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==, + } + engines: { node: '>=6.9.0' } + + '@babel/compat-data@7.28.0': + resolution: + { + integrity: sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw==, + } + engines: { node: '>=6.9.0' } + + '@babel/core@7.28.0': + resolution: + { + integrity: sha512-UlLAnTPrFdNGoFtbSXwcGFQBtQZJCNjaN6hQNP3UPvuNXT1i82N26KL3dZeIpNalWywr9IuQuncaAfUaS1g6sQ==, + } + engines: { node: '>=6.9.0' } + + '@babel/generator@7.28.0': + resolution: + { + integrity: sha512-lJjzvrbEeWrhB4P3QBsH7tey117PjLZnDbLiQEKjQ/fNJTjuq4HSqgFA+UNSwZT8D7dxxbnuSBMsa1lrWzKlQg==, + } + engines: { node: '>=6.9.0' } '@babel/helper-annotate-as-pure@7.27.3': - resolution: {integrity: sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==, + } + engines: { node: '>=6.9.0' } '@babel/helper-compilation-targets@7.27.2': - resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==, + } + engines: { node: '>=6.9.0' } '@babel/helper-create-class-features-plugin@7.27.1': - resolution: {integrity: sha512-QwGAmuvM17btKU5VqXfb+Giw4JcN0hjuufz3DYnpeVDvZLAObloM77bhMXiqry3Iio+Ai4phVRDwl6WU10+r5A==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-QwGAmuvM17btKU5VqXfb+Giw4JcN0hjuufz3DYnpeVDvZLAObloM77bhMXiqry3Iio+Ai4phVRDwl6WU10+r5A==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0 '@babel/helper-create-regexp-features-plugin@7.27.1': - resolution: {integrity: sha512-uVDC72XVf8UbrH5qQTc18Agb8emwjTiZrQE11Nv3CuBEZmVvTwwE9CBUEvHku06gQCAyYf8Nv6ja1IN+6LMbxQ==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-uVDC72XVf8UbrH5qQTc18Agb8emwjTiZrQE11Nv3CuBEZmVvTwwE9CBUEvHku06gQCAyYf8Nv6ja1IN+6LMbxQ==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-define-polyfill-provider@0.6.4': - resolution: {integrity: sha512-jljfR1rGnXXNWnmQg2K3+bvhkxB51Rl32QRaOTuwwjviGrHzIbSc8+x9CpraDtbT7mfyjXObULP4w/adunNwAw==} + '@babel/helper-define-polyfill-provider@0.6.5': + resolution: + { + integrity: sha512-uJnGFcPsWQK8fvjgGP5LZUZZsYGIoPeRjSF5PGwrelYgq7Q15/Ft9NGFp1zglwgIv//W0uG4BevRuSJRyylZPg==, + } peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + '@babel/helper-globals@7.28.0': + resolution: + { + integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==, + } + engines: { node: '>=6.9.0' } + '@babel/helper-member-expression-to-functions@7.27.1': - resolution: {integrity: sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==, + } + engines: { node: '>=6.9.0' } '@babel/helper-module-imports@7.27.1': - resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==, + } + engines: { node: '>=6.9.0' } '@babel/helper-module-transforms@7.27.3': - resolution: {integrity: sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0 '@babel/helper-optimise-call-expression@7.27.1': - resolution: {integrity: sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==, + } + engines: { node: '>=6.9.0' } '@babel/helper-plugin-utils@7.27.1': - resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==, + } + engines: { node: '>=6.9.0' } '@babel/helper-remap-async-to-generator@7.27.1': - resolution: {integrity: sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0 '@babel/helper-replace-supers@7.27.1': - resolution: {integrity: sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0 '@babel/helper-skip-transparent-expression-wrappers@7.27.1': - resolution: {integrity: sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==, + } + engines: { node: '>=6.9.0' } '@babel/helper-string-parser@7.27.1': - resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==, + } + engines: { node: '>=6.9.0' } '@babel/helper-validator-identifier@7.27.1': - resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==, + } + engines: { node: '>=6.9.0' } '@babel/helper-validator-option@7.27.1': - resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==, + } + engines: { node: '>=6.9.0' } '@babel/helper-wrap-function@7.27.1': - resolution: {integrity: sha512-NFJK2sHUvrjo8wAU/nQTWU890/zB2jj0qBcCbZbbf+005cAsv6tMjXz31fBign6M5ov1o0Bllu+9nbqkfsjjJQ==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-NFJK2sHUvrjo8wAU/nQTWU890/zB2jj0qBcCbZbbf+005cAsv6tMjXz31fBign6M5ov1o0Bllu+9nbqkfsjjJQ==, + } + engines: { node: '>=6.9.0' } '@babel/helpers@7.27.6': - resolution: {integrity: sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug==} - engines: {node: '>=6.9.0'} - - '@babel/parser@7.27.5': - resolution: {integrity: sha512-OsQd175SxWkGlzbny8J3K8TnnDD0N3lrIUtB92xwyRpzaenGZhxDvxN/JgU00U3CDZNj9tPuDJ5H0WS4Nt3vKg==} - engines: {node: '>=6.0.0'} + resolution: + { + integrity: sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug==, + } + engines: { node: '>=6.9.0' } + + '@babel/parser@7.28.0': + resolution: + { + integrity: sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==, + } + engines: { node: '>=6.0.0' } hasBin: true '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.27.1': - resolution: {integrity: sha512-QPG3C9cCVRQLxAVwmefEmwdTanECuUBMQZ/ym5kiw3XKCGA7qkuQLcjWWHcrD/GKbn/WmJwaezfuuAOcyKlRPA==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-QPG3C9cCVRQLxAVwmefEmwdTanECuUBMQZ/ym5kiw3XKCGA7qkuQLcjWWHcrD/GKbn/WmJwaezfuuAOcyKlRPA==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0 '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.27.1': - resolution: {integrity: sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0 '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.27.1': - resolution: {integrity: sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0 '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.27.1': - resolution: {integrity: sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.13.0 '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.27.1': - resolution: {integrity: sha512-6BpaYGDavZqkI6yT+KSPdpZFfpnd68UKXbcjI9pJ13pvHhPrCKWOOLp+ysvMeA+DxnhuPpgIaRpxRxo5A9t5jw==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-6BpaYGDavZqkI6yT+KSPdpZFfpnd68UKXbcjI9pJ13pvHhPrCKWOOLp+ysvMeA+DxnhuPpgIaRpxRxo5A9t5jw==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0 '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2': - resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-import-assertions@7.27.1': - resolution: {integrity: sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-import-attributes@7.27.1': - resolution: {integrity: sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-jsx@7.27.1': - resolution: {integrity: sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-unicode-sets-regex@7.18.6': - resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0 '@babel/plugin-transform-arrow-functions@7.27.1': - resolution: {integrity: sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-async-generator-functions@7.27.1': - resolution: {integrity: sha512-eST9RrwlpaoJBDHShc+DS2SG4ATTi2MYNb4OxYkf3n+7eb49LWpnS+HSpVfW4x927qQwgk8A2hGNVaajAEw0EA==} - engines: {node: '>=6.9.0'} + '@babel/plugin-transform-async-generator-functions@7.28.0': + resolution: + { + integrity: sha512-BEOdvX4+M765icNPZeidyADIvQ1m1gmunXufXxvRESy/jNNyfovIqUyE7MVgGBjWktCoJlzvFA1To2O4ymIO3Q==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-async-to-generator@7.27.1': - resolution: {integrity: sha512-NREkZsZVJS4xmTr8qzE5y8AfIPqsdQfRuUiLRTEzb7Qii8iFWCyDKaUV2c0rCuh4ljDZ98ALHP/PetiBV2nddA==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-NREkZsZVJS4xmTr8qzE5y8AfIPqsdQfRuUiLRTEzb7Qii8iFWCyDKaUV2c0rCuh4ljDZ98ALHP/PetiBV2nddA==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-block-scoped-functions@7.27.1': - resolution: {integrity: sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-block-scoping@7.27.5': - resolution: {integrity: sha512-JF6uE2s67f0y2RZcm2kpAUEbD50vH62TyWVebxwHAlbSdM49VqPz8t4a1uIjp4NIOIZ4xzLfjY5emt/RCyC7TQ==} - engines: {node: '>=6.9.0'} + '@babel/plugin-transform-block-scoping@7.28.0': + resolution: + { + integrity: sha512-gKKnwjpdx5sER/wl0WN0efUBFzF/56YZO0RJrSYP4CljXnP31ByY7fol89AzomdlLNzI36AvOTmYHsnZTCkq8Q==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-class-properties@7.27.1': - resolution: {integrity: sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-class-static-block@7.27.1': - resolution: {integrity: sha512-s734HmYU78MVzZ++joYM+NkJusItbdRcbm+AGRgJCt3iA+yux0QpD9cBVdz3tKyrjVYWRl7j0mHSmv4lhV0aoA==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-s734HmYU78MVzZ++joYM+NkJusItbdRcbm+AGRgJCt3iA+yux0QpD9cBVdz3tKyrjVYWRl7j0mHSmv4lhV0aoA==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.12.0 - '@babel/plugin-transform-classes@7.27.1': - resolution: {integrity: sha512-7iLhfFAubmpeJe/Wo2TVuDrykh/zlWXLzPNdL0Jqn/Xu8R3QQ8h9ff8FQoISZOsw74/HFqFI7NX63HN7QFIHKA==} - engines: {node: '>=6.9.0'} + '@babel/plugin-transform-classes@7.28.0': + resolution: + { + integrity: sha512-IjM1IoJNw72AZFlj33Cu8X0q2XK/6AaVC3jQu+cgQ5lThWD5ajnuUAml80dqRmOhmPkTH8uAwnpMu9Rvj0LTRA==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-computed-properties@7.27.1': - resolution: {integrity: sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-destructuring@7.27.3': - resolution: {integrity: sha512-s4Jrok82JpiaIprtY2nHsYmrThKvvwgHwjgd7UMiYhZaN0asdXNLr0y+NjTfkA7SyQE5i2Fb7eawUOZmLvyqOA==} - engines: {node: '>=6.9.0'} + '@babel/plugin-transform-destructuring@7.28.0': + resolution: + { + integrity: sha512-v1nrSMBiKcodhsyJ4Gf+Z0U/yawmJDBOTpEB3mcQY52r9RIyPneGyAS/yM6seP/8I+mWI3elOMtT5dB8GJVs+A==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-dotall-regex@7.27.1': - resolution: {integrity: sha512-gEbkDVGRvjj7+T1ivxrfgygpT7GUd4vmODtYpbs0gZATdkX8/iSnOtZSxiZnsgm1YjTgjI6VKBGSJJevkrclzw==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-gEbkDVGRvjj7+T1ivxrfgygpT7GUd4vmODtYpbs0gZATdkX8/iSnOtZSxiZnsgm1YjTgjI6VKBGSJJevkrclzw==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-duplicate-keys@7.27.1': - resolution: {integrity: sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.27.1': - resolution: {integrity: sha512-hkGcueTEzuhB30B3eJCbCYeCaaEQOmQR0AdvzpD4LoN0GXMWzzGSuRrxR2xTnCrvNbVwK9N6/jQ92GSLfiZWoQ==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-hkGcueTEzuhB30B3eJCbCYeCaaEQOmQR0AdvzpD4LoN0GXMWzzGSuRrxR2xTnCrvNbVwK9N6/jQ92GSLfiZWoQ==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0 '@babel/plugin-transform-dynamic-import@7.27.1': - resolution: {integrity: sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==, + } + engines: { node: '>=6.9.0' } + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-explicit-resource-management@7.28.0': + resolution: + { + integrity: sha512-K8nhUcn3f6iB+P3gwCv/no7OdzOZQcKchW6N389V6PD8NUWKZHzndOd9sPDVbMoBsbmjMqlB4L9fm+fEFNVlwQ==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-exponentiation-operator@7.27.1': - resolution: {integrity: sha512-uspvXnhHvGKf2r4VVtBpeFnuDWsJLQ6MF6lGJLC89jBR1uoVeqM416AZtTuhTezOfgHicpJQmoD5YUakO/YmXQ==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-uspvXnhHvGKf2r4VVtBpeFnuDWsJLQ6MF6lGJLC89jBR1uoVeqM416AZtTuhTezOfgHicpJQmoD5YUakO/YmXQ==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-export-namespace-from@7.27.1': - resolution: {integrity: sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-for-of@7.27.1': - resolution: {integrity: sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-function-name@7.27.1': - resolution: {integrity: sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-json-strings@7.27.1': - resolution: {integrity: sha512-6WVLVJiTjqcQauBhn1LkICsR2H+zm62I3h9faTDKt1qP4jn2o72tSvqMwtGFKGTpojce0gJs+76eZ2uCHRZh0Q==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-6WVLVJiTjqcQauBhn1LkICsR2H+zm62I3h9faTDKt1qP4jn2o72tSvqMwtGFKGTpojce0gJs+76eZ2uCHRZh0Q==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-literals@7.27.1': - resolution: {integrity: sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-logical-assignment-operators@7.27.1': - resolution: {integrity: sha512-SJvDs5dXxiae4FbSL1aBJlG4wvl594N6YEVVn9e3JGulwioy6z3oPjx/sQBO3Y4NwUu5HNix6KJ3wBZoewcdbw==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-SJvDs5dXxiae4FbSL1aBJlG4wvl594N6YEVVn9e3JGulwioy6z3oPjx/sQBO3Y4NwUu5HNix6KJ3wBZoewcdbw==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-member-expression-literals@7.27.1': - resolution: {integrity: sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-modules-amd@7.27.1': - resolution: {integrity: sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-modules-commonjs@7.27.1': - resolution: {integrity: sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-modules-systemjs@7.27.1': - resolution: {integrity: sha512-w5N1XzsRbc0PQStASMksmUeqECuzKuTJer7kFagK8AXgpCMkeDMO5S+aaFb7A51ZYDF7XI34qsTX+fkHiIm5yA==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-w5N1XzsRbc0PQStASMksmUeqECuzKuTJer7kFagK8AXgpCMkeDMO5S+aaFb7A51ZYDF7XI34qsTX+fkHiIm5yA==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-modules-umd@7.27.1': - resolution: {integrity: sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-named-capturing-groups-regex@7.27.1': - resolution: {integrity: sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0 '@babel/plugin-transform-new-target@7.27.1': - resolution: {integrity: sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-nullish-coalescing-operator@7.27.1': - resolution: {integrity: sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-numeric-separator@7.27.1': - resolution: {integrity: sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-object-rest-spread@7.27.3': - resolution: {integrity: sha512-7ZZtznF9g4l2JCImCo5LNKFHB5eXnN39lLtLY5Tg+VkR0jwOt7TBciMckuiQIOIW7L5tkQOCh3bVGYeXgMx52Q==} - engines: {node: '>=6.9.0'} + '@babel/plugin-transform-object-rest-spread@7.28.0': + resolution: + { + integrity: sha512-9VNGikXxzu5eCiQjdE4IZn8sb9q7Xsk5EXLDBKUYg1e/Tve8/05+KJEtcxGxAgCY5t/BpKQM+JEL/yT4tvgiUA==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-object-super@7.27.1': - resolution: {integrity: sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-optional-catch-binding@7.27.1': - resolution: {integrity: sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-optional-chaining@7.27.1': - resolution: {integrity: sha512-BQmKPPIuc8EkZgNKsv0X4bPmOoayeu4F1YCwx2/CfmDSXDbp7GnzlUH+/ul5VGfRg1AoFPsrIThlEBj2xb4CAg==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-BQmKPPIuc8EkZgNKsv0X4bPmOoayeu4F1YCwx2/CfmDSXDbp7GnzlUH+/ul5VGfRg1AoFPsrIThlEBj2xb4CAg==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-parameters@7.27.1': - resolution: {integrity: sha512-018KRk76HWKeZ5l4oTj2zPpSh+NbGdt0st5S6x0pga6HgrjBOJb24mMDHorFopOOd6YHkLgOZ+zaCjZGPO4aKg==} - engines: {node: '>=6.9.0'} + '@babel/plugin-transform-parameters@7.27.7': + resolution: + { + integrity: sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-private-methods@7.27.1': - resolution: {integrity: sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-private-property-in-object@7.27.1': - resolution: {integrity: sha512-5J+IhqTi1XPa0DXF83jYOaARrX+41gOewWbkPyjMNRDqgOCqdffGh8L3f/Ek5utaEBZExjSAzcyjmV9SSAWObQ==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-5J+IhqTi1XPa0DXF83jYOaARrX+41gOewWbkPyjMNRDqgOCqdffGh8L3f/Ek5utaEBZExjSAzcyjmV9SSAWObQ==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-property-literals@7.27.1': - resolution: {integrity: sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-react-constant-elements@7.27.1': - resolution: {integrity: sha512-edoidOjl/ZxvYo4lSBOQGDSyToYVkTAwyVoa2tkuYTSmjrB1+uAedoL5iROVLXkxH+vRgA7uP4tMg2pUJpZ3Ug==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-edoidOjl/ZxvYo4lSBOQGDSyToYVkTAwyVoa2tkuYTSmjrB1+uAedoL5iROVLXkxH+vRgA7uP4tMg2pUJpZ3Ug==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-react-display-name@7.27.1': - resolution: {integrity: sha512-p9+Vl3yuHPmkirRrg021XiP+EETmPMQTLr6Ayjj85RLNEbb3Eya/4VI0vAdzQG9SEAl2Lnt7fy5lZyMzjYoZQQ==} - engines: {node: '>=6.9.0'} + '@babel/plugin-transform-react-display-name@7.28.0': + resolution: + { + integrity: sha512-D6Eujc2zMxKjfa4Zxl4GHMsmhKKZ9VpcqIchJLvwTxad9zWIYulwYItBovpDOoNLISpcZSXoDJ5gaGbQUDqViA==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-react-jsx-development@7.27.1': - resolution: {integrity: sha512-ykDdF5yI4f1WrAolLqeF3hmYU12j9ntLQl/AOG1HAS21jxyg1Q0/J/tpREuYLfatGdGmXp/3yS0ZA76kOlVq9Q==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-ykDdF5yI4f1WrAolLqeF3hmYU12j9ntLQl/AOG1HAS21jxyg1Q0/J/tpREuYLfatGdGmXp/3yS0ZA76kOlVq9Q==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-react-jsx@7.27.1': - resolution: {integrity: sha512-2KH4LWGSrJIkVf5tSiBFYuXDAoWRq2MMwgivCf+93dd0GQi8RXLjKA/0EvRnVV5G0hrHczsquXuD01L8s6dmBw==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-2KH4LWGSrJIkVf5tSiBFYuXDAoWRq2MMwgivCf+93dd0GQi8RXLjKA/0EvRnVV5G0hrHczsquXuD01L8s6dmBw==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-react-pure-annotations@7.27.1': - resolution: {integrity: sha512-JfuinvDOsD9FVMTHpzA/pBLisxpv1aSf+OIV8lgH3MuWrks19R27e6a6DipIg4aX1Zm9Wpb04p8wljfKrVSnPA==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-JfuinvDOsD9FVMTHpzA/pBLisxpv1aSf+OIV8lgH3MuWrks19R27e6a6DipIg4aX1Zm9Wpb04p8wljfKrVSnPA==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-regenerator@7.27.5': - resolution: {integrity: sha512-uhB8yHerfe3MWnuLAhEbeQ4afVoqv8BQsPqrTv7e/jZ9y00kJL6l9a/f4OWaKxotmjzewfEyXE1vgDJenkQ2/Q==} - engines: {node: '>=6.9.0'} + '@babel/plugin-transform-regenerator@7.28.0': + resolution: + { + integrity: sha512-LOAozRVbqxEVjSKfhGnuLoE4Kz4Oc5UJzuvFUhSsQzdCdaAQu06mG8zDv2GFSerM62nImUZ7K92vxnQcLSDlCQ==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-regexp-modifiers@7.27.1': - resolution: {integrity: sha512-TtEciroaiODtXvLZv4rmfMhkCv8jx3wgKpL68PuiPh2M4fvz5jhsA7697N1gMvkvr/JTF13DrFYyEbY9U7cVPA==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-TtEciroaiODtXvLZv4rmfMhkCv8jx3wgKpL68PuiPh2M4fvz5jhsA7697N1gMvkvr/JTF13DrFYyEbY9U7cVPA==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0 '@babel/plugin-transform-reserved-words@7.27.1': - resolution: {integrity: sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-shorthand-properties@7.27.1': - resolution: {integrity: sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-spread@7.27.1': - resolution: {integrity: sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-sticky-regex@7.27.1': - resolution: {integrity: sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-template-literals@7.27.1': - resolution: {integrity: sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-typeof-symbol@7.27.1': - resolution: {integrity: sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-unicode-escapes@7.27.1': - resolution: {integrity: sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-unicode-property-regex@7.27.1': - resolution: {integrity: sha512-uW20S39PnaTImxp39O5qFlHLS9LJEmANjMG7SxIhap8rCHqu0Ik+tLEPX5DKmHn6CsWQ7j3lix2tFOa5YtL12Q==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-uW20S39PnaTImxp39O5qFlHLS9LJEmANjMG7SxIhap8rCHqu0Ik+tLEPX5DKmHn6CsWQ7j3lix2tFOa5YtL12Q==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-unicode-regex@7.27.1': - resolution: {integrity: sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-unicode-sets-regex@7.27.1': - resolution: {integrity: sha512-EtkOujbc4cgvb0mlpQefi4NTPBzhSIevblFevACNLUspmrALgmEBdL/XfnyyITfd8fKBZrZys92zOWcik7j9Tw==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-EtkOujbc4cgvb0mlpQefi4NTPBzhSIevblFevACNLUspmrALgmEBdL/XfnyyITfd8fKBZrZys92zOWcik7j9Tw==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0 - '@babel/preset-env@7.27.2': - resolution: {integrity: sha512-Ma4zSuYSlGNRlCLO+EAzLnCmJK2vdstgv+n7aUP+/IKZrOfWHOJVdSJtuub8RzHTj3ahD37k5OKJWvzf16TQyQ==} - engines: {node: '>=6.9.0'} + '@babel/preset-env@7.28.0': + resolution: + { + integrity: sha512-VmaxeGOwuDqzLl5JUkIRM1X2Qu2uKGxHEQWh+cvvbl7JuJRgKGJSfsEF/bUaxFhJl/XAyxBe7q7qSuTbKFuCyg==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/preset-modules@0.1.6-no-external-plugins': - resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==} + resolution: + { + integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==, + } peerDependencies: '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 '@babel/preset-react@7.27.1': - resolution: {integrity: sha512-oJHWh2gLhU9dW9HHr42q0cI0/iHHXTLGe39qvpAZZzagHy0MzYLCnCVV0symeRvzmjHyVU7mw2K06E6u/JwbhA==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-oJHWh2gLhU9dW9HHr42q0cI0/iHHXTLGe39qvpAZZzagHy0MzYLCnCVV0symeRvzmjHyVU7mw2K06E6u/JwbhA==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/runtime@7.27.6': - resolution: {integrity: sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q==, + } + engines: { node: '>=6.9.0' } '@babel/template@7.27.2': - resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} - engines: {node: '>=6.9.0'} - - '@babel/traverse@7.27.4': - resolution: {integrity: sha512-oNcu2QbHqts9BtOWJosOVJapWjBDSxGCpFvikNR5TGDYDQf3JwpIoMzIKrvfoti93cLfPJEG4tH9SPVeyCGgdA==} - engines: {node: '>=6.9.0'} - - '@babel/types@7.27.6': - resolution: {integrity: sha512-ETyHEk2VHHvl9b9jZP5IHPavHYk57EhanlRRuae9XCpb/j5bDCbPPMOBfCWhnl/7EDJz0jEMCi/RhccCE8r1+Q==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==, + } + engines: { node: '>=6.9.0' } + + '@babel/traverse@7.28.0': + resolution: + { + integrity: sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg==, + } + engines: { node: '>=6.9.0' } + + '@babel/types@7.28.0': + resolution: + { + integrity: sha512-jYnje+JyZG5YThjHiF28oT4SIZLnYOcSBb6+SDaFIyzDVSkXQmQQYclJ2R+YxcdmK0AX6x1E5OQNtuh3jHDrUg==, + } + engines: { node: '>=6.9.0' } '@bcoe/v8-coverage@1.0.2': - resolution: {integrity: sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==, + } + engines: { node: '>=18' } '@coinbase/cbpay-js@1.10.0': - resolution: {integrity: sha512-jQ4rqJFNbsCMZ74ATucAUv2IpkbPFXsY+6AVBvFVNKmG4rEgc10Fa87pw/idm6Tlrs7EERQRXEs21DvJpMzi8A==} - engines: {node: '>= 14'} + resolution: + { + integrity: sha512-jQ4rqJFNbsCMZ74ATucAUv2IpkbPFXsY+6AVBvFVNKmG4rEgc10Fa87pw/idm6Tlrs7EERQRXEs21DvJpMzi8A==, + } + engines: { node: '>= 14' } peerDependencies: regenerator-runtime: ^0.13.9 peerDependenciesMeta: regenerator-runtime: optional: true + '@commitlint/cli@19.8.1': + resolution: + { + integrity: sha512-LXUdNIkspyxrlV6VDHWBmCZRtkEVRpBKxi2Gtw3J54cGWhLCTouVD/Q6ZSaSvd2YaDObWK8mDjrz3TIKtaQMAA==, + } + engines: { node: '>=v18' } + hasBin: true + + '@commitlint/config-conventional@19.8.1': + resolution: + { + integrity: sha512-/AZHJL6F6B/G959CsMAzrPKKZjeEiAVifRyEwXxcT6qtqbPwGw+iQxmNS+Bu+i09OCtdNRW6pNpBvgPrtMr9EQ==, + } + engines: { node: '>=v18' } + + '@commitlint/config-validator@19.8.1': + resolution: + { + integrity: sha512-0jvJ4u+eqGPBIzzSdqKNX1rvdbSU1lPNYlfQQRIFnBgLy26BtC0cFnr7c/AyuzExMxWsMOte6MkTi9I3SQ3iGQ==, + } + engines: { node: '>=v18' } + + '@commitlint/ensure@19.8.1': + resolution: + { + integrity: sha512-mXDnlJdvDzSObafjYrOSvZBwkD01cqB4gbnnFuVyNpGUM5ijwU/r/6uqUmBXAAOKRfyEjpkGVZxaDsCVnHAgyw==, + } + engines: { node: '>=v18' } + + '@commitlint/execute-rule@19.8.1': + resolution: + { + integrity: sha512-YfJyIqIKWI64Mgvn/sE7FXvVMQER/Cd+s3hZke6cI1xgNT/f6ZAz5heND0QtffH+KbcqAwXDEE1/5niYayYaQA==, + } + engines: { node: '>=v18' } + + '@commitlint/format@19.8.1': + resolution: + { + integrity: sha512-kSJj34Rp10ItP+Eh9oCItiuN/HwGQMXBnIRk69jdOwEW9llW9FlyqcWYbHPSGofmjsqeoxa38UaEA5tsbm2JWw==, + } + engines: { node: '>=v18' } + + '@commitlint/is-ignored@19.8.1': + resolution: + { + integrity: sha512-AceOhEhekBUQ5dzrVhDDsbMaY5LqtN8s1mqSnT2Kz1ERvVZkNihrs3Sfk1Je/rxRNbXYFzKZSHaPsEJJDJV8dg==, + } + engines: { node: '>=v18' } + + '@commitlint/lint@19.8.1': + resolution: + { + integrity: sha512-52PFbsl+1EvMuokZXLRlOsdcLHf10isTPlWwoY1FQIidTsTvjKXVXYb7AvtpWkDzRO2ZsqIgPK7bI98x8LRUEw==, + } + engines: { node: '>=v18' } + + '@commitlint/load@19.8.1': + resolution: + { + integrity: sha512-9V99EKG3u7z+FEoe4ikgq7YGRCSukAcvmKQuTtUyiYPnOd9a2/H9Ak1J9nJA1HChRQp9OA/sIKPugGS+FK/k1A==, + } + engines: { node: '>=v18' } + + '@commitlint/message@19.8.1': + resolution: + { + integrity: sha512-+PMLQvjRXiU+Ae0Wc+p99EoGEutzSXFVwQfa3jRNUZLNW5odZAyseb92OSBTKCu+9gGZiJASt76Cj3dLTtcTdg==, + } + engines: { node: '>=v18' } + + '@commitlint/parse@19.8.1': + resolution: + { + integrity: sha512-mmAHYcMBmAgJDKWdkjIGq50X4yB0pSGpxyOODwYmoexxxiUCy5JJT99t1+PEMK7KtsCtzuWYIAXYAiKR+k+/Jw==, + } + engines: { node: '>=v18' } + + '@commitlint/read@19.8.1': + resolution: + { + integrity: sha512-03Jbjb1MqluaVXKHKRuGhcKWtSgh3Jizqy2lJCRbRrnWpcM06MYm8th59Xcns8EqBYvo0Xqb+2DoZFlga97uXQ==, + } + engines: { node: '>=v18' } + + '@commitlint/resolve-extends@19.8.1': + resolution: + { + integrity: sha512-GM0mAhFk49I+T/5UCYns5ayGStkTt4XFFrjjf0L4S26xoMTSkdCf9ZRO8en1kuopC4isDFuEm7ZOm/WRVeElVg==, + } + engines: { node: '>=v18' } + + '@commitlint/rules@19.8.1': + resolution: + { + integrity: sha512-Hnlhd9DyvGiGwjfjfToMi1dsnw1EXKGJNLTcsuGORHz6SS9swRgkBsou33MQ2n51/boIDrbsg4tIBbRpEWK2kw==, + } + engines: { node: '>=v18' } + + '@commitlint/to-lines@19.8.1': + resolution: + { + integrity: sha512-98Mm5inzbWTKuZQr2aW4SReY6WUukdWXuZhrqf1QdKPZBCCsXuG87c+iP0bwtD6DBnmVVQjgp4whoHRVixyPBg==, + } + engines: { node: '>=v18' } + + '@commitlint/top-level@19.8.1': + resolution: + { + integrity: sha512-Ph8IN1IOHPSDhURCSXBz44+CIu+60duFwRsg6HqaISFHQHbmBtxVw4ZrFNIYUzEP7WwrNPxa2/5qJ//NK1FGcw==, + } + engines: { node: '>=v18' } + + '@commitlint/types@19.8.1': + resolution: + { + integrity: sha512-/yCrWGCoA1SVKOks25EGadP9Pnj0oAIHGpl2wH2M2Y46dPM2ueb8wyCVOD7O3WCTkaJ0IkKvzhl1JY7+uCT2Dw==, + } + engines: { node: '>=v18' } + '@cspotcode/source-map-support@0.8.1': - resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==, + } + engines: { node: '>=12' } '@csstools/cascade-layer-name-parser@2.0.5': - resolution: {integrity: sha512-p1ko5eHgV+MgXFVa4STPKpvPxr6ReS8oS2jzTukjR74i5zJNyWO1ZM1m8YKBXnzDKWfBN1ztLYlHxbVemDD88A==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-p1ko5eHgV+MgXFVa4STPKpvPxr6ReS8oS2jzTukjR74i5zJNyWO1ZM1m8YKBXnzDKWfBN1ztLYlHxbVemDD88A==, + } + engines: { node: '>=18' } peerDependencies: '@csstools/css-parser-algorithms': ^3.0.5 '@csstools/css-tokenizer': ^3.0.4 '@csstools/css-parser-algorithms@3.0.5': - resolution: {integrity: sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==, + } + engines: { node: '>=18' } peerDependencies: '@csstools/css-tokenizer': ^3.0.4 '@csstools/css-tokenizer@3.0.4': - resolution: {integrity: sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==, + } + engines: { node: '>=18' } '@csstools/utilities@2.0.0': - resolution: {integrity: sha512-5VdOr0Z71u+Yp3ozOx8T11N703wIFGVRgOWbOZMKgglPJsWA54MRIoMNVMa7shUToIhx5J8vX4sOZgD2XiihiQ==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-5VdOr0Z71u+Yp3ozOx8T11N703wIFGVRgOWbOZMKgglPJsWA54MRIoMNVMa7shUToIhx5J8vX4sOZgD2XiihiQ==, + } + engines: { node: '>=18' } peerDependencies: postcss: ^8.4 '@debank/common@0.3.60': - resolution: {integrity: sha512-SaFTXvnn2aYQTPB3B8YD/AhHYwdMRiqu7jCkYV6c/Sd3MmxzJR3v+Kd4jlQniKfEdB21+1vMb0NlzHw/gyemlw==} + resolution: + { + integrity: sha512-SaFTXvnn2aYQTPB3B8YD/AhHYwdMRiqu7jCkYV6c/Sd3MmxzJR3v+Kd4jlQniKfEdB21+1vMb0NlzHw/gyemlw==, + } '@discoveryjs/json-ext@0.5.7': - resolution: {integrity: sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==} - engines: {node: '>=10.0.0'} + resolution: + { + integrity: sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==, + } + engines: { node: '>=10.0.0' } '@electron/get@2.0.3': - resolution: {integrity: sha512-Qkzpg2s9GnVV2I2BjRksUi43U5e6+zaQMcjoJy0C+C5oxaKl+fmckGDQFtRpZpZV0NQekuZZ+tGz7EA9TVnQtQ==} - engines: {node: '>=12'} - - '@emnapi/core@1.4.3': - resolution: {integrity: sha512-4m62DuCE07lw01soJwPiBGC0nAww0Q+RY70VZ+n49yDIO13yyinhbWCeNnaob0lakDtWQzSdtNWzJeOJt2ma+g==} - - '@emnapi/runtime@1.4.3': - resolution: {integrity: sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ==} - - '@emnapi/wasi-threads@1.0.2': - resolution: {integrity: sha512-5n3nTJblwRi8LlXkJ9eBzu+kZR8Yxcc7ubakyQTFzPMtIhFpUBRbsnc2Dv88IZDIbCDlBiWrknhB4Lsz7mg6BA==} + resolution: + { + integrity: sha512-Qkzpg2s9GnVV2I2BjRksUi43U5e6+zaQMcjoJy0C+C5oxaKl+fmckGDQFtRpZpZV0NQekuZZ+tGz7EA9TVnQtQ==, + } + engines: { node: '>=12' } + + '@emnapi/core@1.4.4': + resolution: + { + integrity: sha512-A9CnAbC6ARNMKcIcrQwq6HeHCjpcBZ5wSx4U01WXCqEKlrzB9F9315WDNHkrs2xbx7YjjSxbUYxuN6EQzpcY2g==, + } + + '@emnapi/runtime@1.4.4': + resolution: + { + integrity: sha512-hHyapA4A3gPaDCNfiqyZUStTMqIkKRshqPIuDOXv1hcBnD4U3l8cP0T1HMCfGRxQ6V64TGCcoswChANyOAwbQg==, + } + + '@emnapi/wasi-threads@1.0.3': + resolution: + { + integrity: sha512-8K5IFFsQqF9wQNJptGbS6FNKgUTsSRYnTqNCG1vPP8jFdjSv18n2mQfJpkt2Oibo9iBEzcDnDxNwKTzC7svlJw==, + } '@emotion/babel-plugin@11.13.5': - resolution: {integrity: sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ==} + resolution: + { + integrity: sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ==, + } '@emotion/cache@11.14.0': - resolution: {integrity: sha512-L/B1lc/TViYk4DcpGxtAVbx0ZyiKM5ktoIyafGkH6zg/tj+mA+NE//aPYKG0k8kCHSHVJrpLpcAlOBEXQ3SavA==} + resolution: + { + integrity: sha512-L/B1lc/TViYk4DcpGxtAVbx0ZyiKM5ktoIyafGkH6zg/tj+mA+NE//aPYKG0k8kCHSHVJrpLpcAlOBEXQ3SavA==, + } '@emotion/hash@0.9.2': - resolution: {integrity: sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==} + resolution: + { + integrity: sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==, + } '@emotion/is-prop-valid@1.3.1': - resolution: {integrity: sha512-/ACwoqx7XQi9knQs/G0qKvv5teDMhD7bXYns9N/wM8ah8iNb8jZ2uNO0YOgiq2o2poIvVtJS2YALasQuMSQ7Kw==} + resolution: + { + integrity: sha512-/ACwoqx7XQi9knQs/G0qKvv5teDMhD7bXYns9N/wM8ah8iNb8jZ2uNO0YOgiq2o2poIvVtJS2YALasQuMSQ7Kw==, + } '@emotion/memoize@0.9.0': - resolution: {integrity: sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==} + resolution: + { + integrity: sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==, + } '@emotion/react@11.14.0': - resolution: {integrity: sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA==} + resolution: + { + integrity: sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA==, + } peerDependencies: '@types/react': '*' react: '>=16.8.0' @@ -1058,13 +1686,22 @@ packages: optional: true '@emotion/serialize@1.3.3': - resolution: {integrity: sha512-EISGqt7sSNWHGI76hC7x1CksiXPahbxEOrC5RjmFRJTqLyEK9/9hZvBbiYn70dw4wuwMKiEMCUlR6ZXTSWQqxA==} + resolution: + { + integrity: sha512-EISGqt7sSNWHGI76hC7x1CksiXPahbxEOrC5RjmFRJTqLyEK9/9hZvBbiYn70dw4wuwMKiEMCUlR6ZXTSWQqxA==, + } '@emotion/sheet@1.4.0': - resolution: {integrity: sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==} - - '@emotion/styled@11.14.0': - resolution: {integrity: sha512-XxfOnXFffatap2IyCeJyNov3kiDQWoR08gPUQxvbL7fxKryGBKUZUkG6Hz48DZwVrJSVh9sJboyV1Ds4OW6SgA==} + resolution: + { + integrity: sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==, + } + + '@emotion/styled@11.14.1': + resolution: + { + integrity: sha512-qEEJt42DuToa3gurlH4Qqc1kVpNq8wO8cJtDzU46TjlzWjDlsVyevtYCRijVq3SrHsROS+gVQ8Fnea108GnKzw==, + } peerDependencies: '@emotion/react': ^11.0.0-rc.0 '@types/react': '*' @@ -1074,286 +1711,469 @@ packages: optional: true '@emotion/unitless@0.10.0': - resolution: {integrity: sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==} + resolution: + { + integrity: sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==, + } '@emotion/use-insertion-effect-with-fallbacks@1.2.0': - resolution: {integrity: sha512-yJMtVdH59sxi/aVJBpk9FQq+OR8ll5GT8oWd57UpeaKEVGab41JWaCFA7FRLoMLloOZF/c/wsPoe+bfGmRKgDg==} + resolution: + { + integrity: sha512-yJMtVdH59sxi/aVJBpk9FQq+OR8ll5GT8oWd57UpeaKEVGab41JWaCFA7FRLoMLloOZF/c/wsPoe+bfGmRKgDg==, + } peerDependencies: react: '>=16.8.0' '@emotion/utils@1.4.2': - resolution: {integrity: sha512-3vLclRofFziIa3J2wDh9jjbkUz9qk5Vi3IZ/FSTKViB0k+ef0fPV7dYrUIugbgupYDx7v9ud/SjrtEP8Y4xLoA==} + resolution: + { + integrity: sha512-3vLclRofFziIa3J2wDh9jjbkUz9qk5Vi3IZ/FSTKViB0k+ef0fPV7dYrUIugbgupYDx7v9ud/SjrtEP8Y4xLoA==, + } '@emotion/weak-memoize@0.4.0': - resolution: {integrity: sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==} - - '@esbuild/aix-ppc64@0.25.5': - resolution: {integrity: sha512-9o3TMmpmftaCMepOdA5k/yDw8SfInyzWWTjYTFCX3kPSDJMROQTb8jg+h9Cnwnmm1vOzvxN7gIfB5V2ewpjtGA==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==, + } + + '@esbuild/aix-ppc64@0.25.6': + resolution: + { + integrity: sha512-ShbM/3XxwuxjFiuVBHA+d3j5dyac0aEVVq1oluIDf71hUw0aRF59dV/efUsIwFnR6m8JNM2FjZOzmaZ8yG61kw==, + } + engines: { node: '>=18' } cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.25.5': - resolution: {integrity: sha512-VGzGhj4lJO+TVGV1v8ntCZWJktV7SGCs3Pn1GRWI1SBFtRALoomm8k5E9Pmwg3HOAal2VDc2F9+PM/rEY6oIDg==} - engines: {node: '>=18'} + '@esbuild/android-arm64@0.25.6': + resolution: + { + integrity: sha512-hd5zdUarsK6strW+3Wxi5qWws+rJhCCbMiC9QZyzoxfk5uHRIE8T287giQxzVpEvCwuJ9Qjg6bEjcRJcgfLqoA==, + } + engines: { node: '>=18' } cpu: [arm64] os: [android] - '@esbuild/android-arm@0.25.5': - resolution: {integrity: sha512-AdJKSPeEHgi7/ZhuIPtcQKr5RQdo6OO2IL87JkianiMYMPbCtot9fxPbrMiBADOWWm3T2si9stAiVsGbTQFkbA==} - engines: {node: '>=18'} + '@esbuild/android-arm@0.25.6': + resolution: + { + integrity: sha512-S8ToEOVfg++AU/bHwdksHNnyLyVM+eMVAOf6yRKFitnwnbwwPNqKr3srzFRe7nzV69RQKb5DgchIX5pt3L53xg==, + } + engines: { node: '>=18' } cpu: [arm] os: [android] - '@esbuild/android-x64@0.25.5': - resolution: {integrity: sha512-D2GyJT1kjvO//drbRT3Hib9XPwQeWd9vZoBJn+bu/lVsOZ13cqNdDeqIF/xQ5/VmWvMduP6AmXvylO/PIc2isw==} - engines: {node: '>=18'} + '@esbuild/android-x64@0.25.6': + resolution: + { + integrity: sha512-0Z7KpHSr3VBIO9A/1wcT3NTy7EB4oNC4upJ5ye3R7taCc2GUdeynSLArnon5G8scPwaU866d3H4BCrE5xLW25A==, + } + engines: { node: '>=18' } cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.25.5': - resolution: {integrity: sha512-GtaBgammVvdF7aPIgH2jxMDdivezgFu6iKpmT+48+F8Hhg5J/sfnDieg0aeG/jfSvkYQU2/pceFPDKlqZzwnfQ==} - engines: {node: '>=18'} + '@esbuild/darwin-arm64@0.25.6': + resolution: + { + integrity: sha512-FFCssz3XBavjxcFxKsGy2DYK5VSvJqa6y5HXljKzhRZ87LvEi13brPrf/wdyl/BbpbMKJNOr1Sd0jtW4Ge1pAA==, + } + engines: { node: '>=18' } cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.25.5': - resolution: {integrity: sha512-1iT4FVL0dJ76/q1wd7XDsXrSW+oLoquptvh4CLR4kITDtqi2e/xwXwdCVH8hVHU43wgJdsq7Gxuzcs6Iq/7bxQ==} - engines: {node: '>=18'} + '@esbuild/darwin-x64@0.25.6': + resolution: + { + integrity: sha512-GfXs5kry/TkGM2vKqK2oyiLFygJRqKVhawu3+DOCk7OxLy/6jYkWXhlHwOoTb0WqGnWGAS7sooxbZowy+pK9Yg==, + } + engines: { node: '>=18' } cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.25.5': - resolution: {integrity: sha512-nk4tGP3JThz4La38Uy/gzyXtpkPW8zSAmoUhK9xKKXdBCzKODMc2adkB2+8om9BDYugz+uGV7sLmpTYzvmz6Sw==} - engines: {node: '>=18'} + '@esbuild/freebsd-arm64@0.25.6': + resolution: + { + integrity: sha512-aoLF2c3OvDn2XDTRvn8hN6DRzVVpDlj2B/F66clWd/FHLiHaG3aVZjxQX2DYphA5y/evbdGvC6Us13tvyt4pWg==, + } + engines: { node: '>=18' } cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.25.5': - resolution: {integrity: sha512-PrikaNjiXdR2laW6OIjlbeuCPrPaAl0IwPIaRv+SMV8CiM8i2LqVUHFC1+8eORgWyY7yhQY+2U2fA55mBzReaw==} - engines: {node: '>=18'} + '@esbuild/freebsd-x64@0.25.6': + resolution: + { + integrity: sha512-2SkqTjTSo2dYi/jzFbU9Plt1vk0+nNg8YC8rOXXea+iA3hfNJWebKYPs3xnOUf9+ZWhKAaxnQNUf2X9LOpeiMQ==, + } + engines: { node: '>=18' } cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.25.5': - resolution: {integrity: sha512-Z9kfb1v6ZlGbWj8EJk9T6czVEjjq2ntSYLY2cw6pAZl4oKtfgQuS4HOq41M/BcoLPzrUbNd+R4BXFyH//nHxVg==} - engines: {node: '>=18'} + '@esbuild/linux-arm64@0.25.6': + resolution: + { + integrity: sha512-b967hU0gqKd9Drsh/UuAm21Khpoh6mPBSgz8mKRq4P5mVK8bpA+hQzmm/ZwGVULSNBzKdZPQBRT3+WuVavcWsQ==, + } + engines: { node: '>=18' } cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.25.5': - resolution: {integrity: sha512-cPzojwW2okgh7ZlRpcBEtsX7WBuqbLrNXqLU89GxWbNt6uIg78ET82qifUy3W6OVww6ZWobWub5oqZOVtwolfw==} - engines: {node: '>=18'} + '@esbuild/linux-arm@0.25.6': + resolution: + { + integrity: sha512-SZHQlzvqv4Du5PrKE2faN0qlbsaW/3QQfUUc6yO2EjFcA83xnwm91UbEEVx4ApZ9Z5oG8Bxz4qPE+HFwtVcfyw==, + } + engines: { node: '>=18' } cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.25.5': - resolution: {integrity: sha512-sQ7l00M8bSv36GLV95BVAdhJ2QsIbCuCjh/uYrWiMQSUuV+LpXwIqhgJDcvMTj+VsQmqAHL2yYaasENvJ7CDKA==} - engines: {node: '>=18'} + '@esbuild/linux-ia32@0.25.6': + resolution: + { + integrity: sha512-aHWdQ2AAltRkLPOsKdi3xv0mZ8fUGPdlKEjIEhxCPm5yKEThcUjHpWB1idN74lfXGnZ5SULQSgtr5Qos5B0bPw==, + } + engines: { node: '>=18' } cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.25.5': - resolution: {integrity: sha512-0ur7ae16hDUC4OL5iEnDb0tZHDxYmuQyhKhsPBV8f99f6Z9KQM02g33f93rNH5A30agMS46u2HP6qTdEt6Q1kg==} - engines: {node: '>=18'} + '@esbuild/linux-loong64@0.25.6': + resolution: + { + integrity: sha512-VgKCsHdXRSQ7E1+QXGdRPlQ/e08bN6WMQb27/TMfV+vPjjTImuT9PmLXupRlC90S1JeNNW5lzkAEO/McKeJ2yg==, + } + engines: { node: '>=18' } cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.25.5': - resolution: {integrity: sha512-kB/66P1OsHO5zLz0i6X0RxlQ+3cu0mkxS3TKFvkb5lin6uwZ/ttOkP3Z8lfR9mJOBk14ZwZ9182SIIWFGNmqmg==} - engines: {node: '>=18'} + '@esbuild/linux-mips64el@0.25.6': + resolution: + { + integrity: sha512-WViNlpivRKT9/py3kCmkHnn44GkGXVdXfdc4drNmRl15zVQ2+D2uFwdlGh6IuK5AAnGTo2qPB1Djppj+t78rzw==, + } + engines: { node: '>=18' } cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.25.5': - resolution: {integrity: sha512-UZCmJ7r9X2fe2D6jBmkLBMQetXPXIsZjQJCjgwpVDz+YMcS6oFR27alkgGv3Oqkv07bxdvw7fyB71/olceJhkQ==} - engines: {node: '>=18'} + '@esbuild/linux-ppc64@0.25.6': + resolution: + { + integrity: sha512-wyYKZ9NTdmAMb5730I38lBqVu6cKl4ZfYXIs31Baf8aoOtB4xSGi3THmDYt4BTFHk7/EcVixkOV2uZfwU3Q2Jw==, + } + engines: { node: '>=18' } cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.25.5': - resolution: {integrity: sha512-kTxwu4mLyeOlsVIFPfQo+fQJAV9mh24xL+y+Bm6ej067sYANjyEw1dNHmvoqxJUCMnkBdKpvOn0Ahql6+4VyeA==} - engines: {node: '>=18'} + '@esbuild/linux-riscv64@0.25.6': + resolution: + { + integrity: sha512-KZh7bAGGcrinEj4qzilJ4hqTY3Dg2U82c8bv+e1xqNqZCrCyc+TL9AUEn5WGKDzm3CfC5RODE/qc96OcbIe33w==, + } + engines: { node: '>=18' } cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.25.5': - resolution: {integrity: sha512-K2dSKTKfmdh78uJ3NcWFiqyRrimfdinS5ErLSn3vluHNeHVnBAFWC8a4X5N+7FgVE1EjXS1QDZbpqZBjfrqMTQ==} - engines: {node: '>=18'} + '@esbuild/linux-s390x@0.25.6': + resolution: + { + integrity: sha512-9N1LsTwAuE9oj6lHMyyAM+ucxGiVnEqUdp4v7IaMmrwb06ZTEVCIs3oPPplVsnjPfyjmxwHxHMF8b6vzUVAUGw==, + } + engines: { node: '>=18' } cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.25.5': - resolution: {integrity: sha512-uhj8N2obKTE6pSZ+aMUbqq+1nXxNjZIIjCjGLfsWvVpy7gKCOL6rsY1MhRh9zLtUtAI7vpgLMK6DxjO8Qm9lJw==} - engines: {node: '>=18'} + '@esbuild/linux-x64@0.25.6': + resolution: + { + integrity: sha512-A6bJB41b4lKFWRKNrWoP2LHsjVzNiaurf7wyj/XtFNTsnPuxwEBWHLty+ZE0dWBKuSK1fvKgrKaNjBS7qbFKig==, + } + engines: { node: '>=18' } cpu: [x64] os: [linux] - '@esbuild/netbsd-arm64@0.25.5': - resolution: {integrity: sha512-pwHtMP9viAy1oHPvgxtOv+OkduK5ugofNTVDilIzBLpoWAM16r7b/mxBvfpuQDpRQFMfuVr5aLcn4yveGvBZvw==} - engines: {node: '>=18'} + '@esbuild/netbsd-arm64@0.25.6': + resolution: + { + integrity: sha512-IjA+DcwoVpjEvyxZddDqBY+uJ2Snc6duLpjmkXm/v4xuS3H+3FkLZlDm9ZsAbF9rsfP3zeA0/ArNDORZgrxR/Q==, + } + engines: { node: '>=18' } cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-x64@0.25.5': - resolution: {integrity: sha512-WOb5fKrvVTRMfWFNCroYWWklbnXH0Q5rZppjq0vQIdlsQKuw6mdSihwSo4RV/YdQ5UCKKvBy7/0ZZYLBZKIbwQ==} - engines: {node: '>=18'} + '@esbuild/netbsd-x64@0.25.6': + resolution: + { + integrity: sha512-dUXuZr5WenIDlMHdMkvDc1FAu4xdWixTCRgP7RQLBOkkGgwuuzaGSYcOpW4jFxzpzL1ejb8yF620UxAqnBrR9g==, + } + engines: { node: '>=18' } cpu: [x64] os: [netbsd] - '@esbuild/openbsd-arm64@0.25.5': - resolution: {integrity: sha512-7A208+uQKgTxHd0G0uqZO8UjK2R0DDb4fDmERtARjSHWxqMTye4Erz4zZafx7Di9Cv+lNHYuncAkiGFySoD+Mw==} - engines: {node: '>=18'} + '@esbuild/openbsd-arm64@0.25.6': + resolution: + { + integrity: sha512-l8ZCvXP0tbTJ3iaqdNf3pjaOSd5ex/e6/omLIQCVBLmHTlfXW3zAxQ4fnDmPLOB1x9xrcSi/xtCWFwCZRIaEwg==, + } + engines: { node: '>=18' } cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-x64@0.25.5': - resolution: {integrity: sha512-G4hE405ErTWraiZ8UiSoesH8DaCsMm0Cay4fsFWOOUcz8b8rC6uCvnagr+gnioEjWn0wC+o1/TAHt+It+MpIMg==} - engines: {node: '>=18'} + '@esbuild/openbsd-x64@0.25.6': + resolution: + { + integrity: sha512-hKrmDa0aOFOr71KQ/19JC7az1P0GWtCN1t2ahYAf4O007DHZt/dW8ym5+CUdJhQ/qkZmI1HAF8KkJbEFtCL7gw==, + } + engines: { node: '>=18' } cpu: [x64] os: [openbsd] - '@esbuild/sunos-x64@0.25.5': - resolution: {integrity: sha512-l+azKShMy7FxzY0Rj4RCt5VD/q8mG/e+mDivgspo+yL8zW7qEwctQ6YqKX34DTEleFAvCIUviCFX1SDZRSyMQA==} - engines: {node: '>=18'} + '@esbuild/openharmony-arm64@0.25.6': + resolution: + { + integrity: sha512-+SqBcAWoB1fYKmpWoQP4pGtx+pUUC//RNYhFdbcSA16617cchuryuhOCRpPsjCblKukAckWsV+aQ3UKT/RMPcA==, + } + engines: { node: '>=18' } + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.25.6': + resolution: + { + integrity: sha512-dyCGxv1/Br7MiSC42qinGL8KkG4kX0pEsdb0+TKhmJZgCUDBGmyo1/ArCjNGiOLiIAgdbWgmWgib4HoCi5t7kA==, + } + engines: { node: '>=18' } cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.25.5': - resolution: {integrity: sha512-O2S7SNZzdcFG7eFKgvwUEZ2VG9D/sn/eIiz8XRZ1Q/DO5a3s76Xv0mdBzVM5j5R639lXQmPmSo0iRpHqUUrsxw==} - engines: {node: '>=18'} + '@esbuild/win32-arm64@0.25.6': + resolution: + { + integrity: sha512-42QOgcZeZOvXfsCBJF5Afw73t4veOId//XD3i+/9gSkhSV6Gk3VPlWncctI+JcOyERv85FUo7RxuxGy+z8A43Q==, + } + engines: { node: '>=18' } cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.25.5': - resolution: {integrity: sha512-onOJ02pqs9h1iMJ1PQphR+VZv8qBMQ77Klcsqv9CNW2w6yLqoURLcgERAIurY6QE63bbLuqgP9ATqajFLK5AMQ==} - engines: {node: '>=18'} + '@esbuild/win32-ia32@0.25.6': + resolution: + { + integrity: sha512-4AWhgXmDuYN7rJI6ORB+uU9DHLq/erBbuMoAuB4VWJTu5KtCgcKYPynF0YI1VkBNuEfjNlLrFr9KZPJzrtLkrQ==, + } + engines: { node: '>=18' } cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.25.5': - resolution: {integrity: sha512-TXv6YnJ8ZMVdX+SXWVBo/0p8LTcrUYngpWjvm91TMjjBQii7Oz11Lw5lbDV5Y0TzuhSJHwiH4hEtC1I42mMS0g==} - engines: {node: '>=18'} + '@esbuild/win32-x64@0.25.6': + resolution: + { + integrity: sha512-NgJPHHbEpLQgDH2MjQu90pzW/5vvXIZ7KOnPyNBm92A6WgZ/7b6fJyUBjoumLqeOQQGqY2QjQxRo97ah4Sj0cA==, + } + engines: { node: '>=18' } cpu: [x64] os: [win32] '@eslint-community/eslint-utils@4.7.0': - resolution: {integrity: sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + resolution: + { + integrity: sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 '@eslint-community/regexpp@4.12.1': - resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} - engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - - '@eslint/config-array@0.20.1': - resolution: {integrity: sha512-OL0RJzC/CBzli0DrrR31qzj6d6i6Mm3HByuhflhl4LOBiWxN+3i6/t/ZQQNii4tjksXi8r2CRW1wMpWA2ULUEw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@eslint/config-helpers@0.2.3': - resolution: {integrity: sha512-u180qk2Um1le4yf0ruXH3PYFeEZeYC3p/4wCTKrr2U1CmGdzGi3KtY0nuPDH48UJxlKCC5RDzbcbh4X0XlqgHg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + resolution: + { + integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==, + } + engines: { node: ^12.0.0 || ^14.0.0 || >=16.0.0 } + + '@eslint/config-array@0.21.0': + resolution: + { + integrity: sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + + '@eslint/config-helpers@0.3.0': + resolution: + { + integrity: sha512-ViuymvFmcJi04qdZeDc2whTHryouGcDlaxPqarTD0ZE10ISpxGUVZGZDx4w01upyIynL3iu6IXH2bS1NhclQMw==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } '@eslint/core@0.14.0': - resolution: {integrity: sha512-qIbV0/JZr7iSDjqAc60IqbLdsj9GDt16xQtWD+B78d/HAlvysGdZZ6rpJHGAc2T0FQx1X6thsSPdnoiGKdNtdg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@eslint/core@0.15.0': - resolution: {integrity: sha512-b7ePw78tEWWkpgZCDYkbqDOP8dmM6qe+AOC6iuJqlq1R/0ahMAeH3qynpnqKFGkMltrp44ohV4ubGyvLX28tzw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + resolution: + { + integrity: sha512-qIbV0/JZr7iSDjqAc60IqbLdsj9GDt16xQtWD+B78d/HAlvysGdZZ6rpJHGAc2T0FQx1X6thsSPdnoiGKdNtdg==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + + '@eslint/core@0.15.1': + resolution: + { + integrity: sha512-bkOp+iumZCCbt1K1CmWf0R9pM5yKpDv+ZXtvSyQpudrI9kuFLp+bM2WOPXImuD/ceQuaa8f5pj93Y7zyECIGNA==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } '@eslint/eslintrc@3.3.1': - resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@eslint/js@9.29.0': - resolution: {integrity: sha512-3PIF4cBw/y+1u2EazflInpV+lYsSG0aByVIQzAgb1m1MhHFSbqTyNqtBKHgWf/9Ykud+DhILS9EGkmekVhbKoQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + resolution: + { + integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + + '@eslint/js@9.30.1': + resolution: + { + integrity: sha512-zXhuECFlyep42KZUhWjfvsmXGX39W8K8LFb8AWXM9gSV9dQB+MrJGLKvW6Zw0Ggnbpw0VHTtrhFXYe3Gym18jg==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } '@eslint/object-schema@2.1.6': - resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@eslint/plugin-kit@0.3.2': - resolution: {integrity: sha512-4SaFZCNfJqvk/kenHpI8xvN42DMaoycy4PzKc5otHxRswww1kAt82OlBuwRVLofCACCTZEcla2Ydxv8scMXaTg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + resolution: + { + integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + + '@eslint/plugin-kit@0.3.3': + resolution: + { + integrity: sha512-1+WqvgNMhmlAambTvT3KPtCl/Ibr68VldY2XY40SL1CE0ZXiakFR/cbTspaF5HsnpDMvcYYoJHfl4980NBjGag==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } '@ethereumjs/common@3.2.0': - resolution: {integrity: sha512-pksvzI0VyLgmuEF2FA/JR/4/y6hcPq8OUail3/AvycBaW1d5VSauOZzqGvJ3RTmR4MU35lWE8KseKOsEhrFRBA==} + resolution: + { + integrity: sha512-pksvzI0VyLgmuEF2FA/JR/4/y6hcPq8OUail3/AvycBaW1d5VSauOZzqGvJ3RTmR4MU35lWE8KseKOsEhrFRBA==, + } '@ethereumjs/rlp@4.0.1': - resolution: {integrity: sha512-tqsQiBQDQdmPWE1xkkBq4rlSW5QZpLOUJ5RJh2/9fug+q9tnUhuZoVLk7s0scUIKTOzEtR72DFBXI4WiZcMpvw==} - engines: {node: '>=14'} + resolution: + { + integrity: sha512-tqsQiBQDQdmPWE1xkkBq4rlSW5QZpLOUJ5RJh2/9fug+q9tnUhuZoVLk7s0scUIKTOzEtR72DFBXI4WiZcMpvw==, + } + engines: { node: '>=14' } hasBin: true '@ethereumjs/rlp@5.0.2': - resolution: {integrity: sha512-DziebCdg4JpGlEqEdGgXmjqcFoJi+JGulUXwEjsZGAscAQ7MyD/7LE/GVCP29vEQxKc7AAwjT3A2ywHp2xfoCA==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-DziebCdg4JpGlEqEdGgXmjqcFoJi+JGulUXwEjsZGAscAQ7MyD/7LE/GVCP29vEQxKc7AAwjT3A2ywHp2xfoCA==, + } + engines: { node: '>=18' } hasBin: true '@ethereumjs/tx@4.2.0': - resolution: {integrity: sha512-1nc6VO4jtFd172BbSnTnDQVr9IYBFl1y4xPzZdtkrkKIncBCkdbgfdRV+MiTkJYAtTxvV12GRZLqBFT1PNK6Yw==} - engines: {node: '>=14'} + resolution: + { + integrity: sha512-1nc6VO4jtFd172BbSnTnDQVr9IYBFl1y4xPzZdtkrkKIncBCkdbgfdRV+MiTkJYAtTxvV12GRZLqBFT1PNK6Yw==, + } + engines: { node: '>=14' } '@ethereumjs/util@8.1.0': - resolution: {integrity: sha512-zQ0IqbdX8FZ9aw11vP+dZkKDkS+kgIvQPHnSAXzP9pLu+Rfu3D3XEeLbicvoXJTYnhZiPmsZUxgdzXwNKxRPbA==} - engines: {node: '>=14'} + resolution: + { + integrity: sha512-zQ0IqbdX8FZ9aw11vP+dZkKDkS+kgIvQPHnSAXzP9pLu+Rfu3D3XEeLbicvoXJTYnhZiPmsZUxgdzXwNKxRPbA==, + } + engines: { node: '>=14' } '@firebase/analytics-compat@0.2.14': - resolution: {integrity: sha512-unRVY6SvRqfNFIAA/kwl4vK+lvQAL2HVcgu9zTrUtTyYDmtIt/lOuHJynBMYEgLnKm39YKBDhtqdapP2e++ASw==} + resolution: + { + integrity: sha512-unRVY6SvRqfNFIAA/kwl4vK+lvQAL2HVcgu9zTrUtTyYDmtIt/lOuHJynBMYEgLnKm39YKBDhtqdapP2e++ASw==, + } peerDependencies: '@firebase/app-compat': 0.x '@firebase/analytics-types@0.8.2': - resolution: {integrity: sha512-EnzNNLh+9/sJsimsA/FGqzakmrAUKLeJvjRHlg8df1f97NLUlFidk9600y0ZgWOp3CAxn6Hjtk+08tixlUOWyw==} + resolution: + { + integrity: sha512-EnzNNLh+9/sJsimsA/FGqzakmrAUKLeJvjRHlg8df1f97NLUlFidk9600y0ZgWOp3CAxn6Hjtk+08tixlUOWyw==, + } '@firebase/analytics@0.10.8': - resolution: {integrity: sha512-CVnHcS4iRJPqtIDc411+UmFldk0ShSK3OB+D0bKD8Ck5Vro6dbK5+APZpkuWpbfdL359DIQUnAaMLE+zs/PVyA==} + resolution: + { + integrity: sha512-CVnHcS4iRJPqtIDc411+UmFldk0ShSK3OB+D0bKD8Ck5Vro6dbK5+APZpkuWpbfdL359DIQUnAaMLE+zs/PVyA==, + } peerDependencies: '@firebase/app': 0.x '@firebase/app-check-compat@0.3.15': - resolution: {integrity: sha512-zFIvIFFNqDXpOT2huorz9cwf56VT3oJYRFjSFYdSbGYEJYEaXjLJbfC79lx/zjx4Fh+yuN8pry3TtvwaevrGbg==} + resolution: + { + integrity: sha512-zFIvIFFNqDXpOT2huorz9cwf56VT3oJYRFjSFYdSbGYEJYEaXjLJbfC79lx/zjx4Fh+yuN8pry3TtvwaevrGbg==, + } peerDependencies: '@firebase/app-compat': 0.x '@firebase/app-check-interop-types@0.3.2': - resolution: {integrity: sha512-LMs47Vinv2HBMZi49C09dJxp0QT5LwDzFaVGf/+ITHe3BlIhUiLNttkATSXplc89A2lAaeTqjgqVkiRfUGyQiQ==} + resolution: + { + integrity: sha512-LMs47Vinv2HBMZi49C09dJxp0QT5LwDzFaVGf/+ITHe3BlIhUiLNttkATSXplc89A2lAaeTqjgqVkiRfUGyQiQ==, + } '@firebase/app-check-types@0.5.2': - resolution: {integrity: sha512-FSOEzTzL5bLUbD2co3Zut46iyPWML6xc4x+78TeaXMSuJap5QObfb+rVvZJtla3asN4RwU7elaQaduP+HFizDA==} + resolution: + { + integrity: sha512-FSOEzTzL5bLUbD2co3Zut46iyPWML6xc4x+78TeaXMSuJap5QObfb+rVvZJtla3asN4RwU7elaQaduP+HFizDA==, + } '@firebase/app-check@0.8.8': - resolution: {integrity: sha512-O49RGF1xj7k6BuhxGpHmqOW5hqBIAEbt2q6POW0lIywx7emYtzPDeQI+ryQpC4zbKX646SoVZ711TN1DBLNSOQ==} + resolution: + { + integrity: sha512-O49RGF1xj7k6BuhxGpHmqOW5hqBIAEbt2q6POW0lIywx7emYtzPDeQI+ryQpC4zbKX646SoVZ711TN1DBLNSOQ==, + } peerDependencies: '@firebase/app': 0.x '@firebase/app-compat@0.2.43': - resolution: {integrity: sha512-HM96ZyIblXjAC7TzE8wIk2QhHlSvksYkQ4Ukh1GmEenzkucSNUmUX4QvoKrqeWsLEQ8hdcojABeCV8ybVyZmeg==} + resolution: + { + integrity: sha512-HM96ZyIblXjAC7TzE8wIk2QhHlSvksYkQ4Ukh1GmEenzkucSNUmUX4QvoKrqeWsLEQ8hdcojABeCV8ybVyZmeg==, + } '@firebase/app-types@0.9.2': - resolution: {integrity: sha512-oMEZ1TDlBz479lmABwWsWjzHwheQKiAgnuKxE0pz0IXCVx7/rtlkx1fQ6GfgK24WCrxDKMplZrT50Kh04iMbXQ==} + resolution: + { + integrity: sha512-oMEZ1TDlBz479lmABwWsWjzHwheQKiAgnuKxE0pz0IXCVx7/rtlkx1fQ6GfgK24WCrxDKMplZrT50Kh04iMbXQ==, + } '@firebase/app@0.10.13': - resolution: {integrity: sha512-OZiDAEK/lDB6xy/XzYAyJJkaDqmQ+BCtOEPLqFvxWKUz5JbBmej7IiiRHdtiIOD/twW7O5AxVsfaaGA/V1bNsA==} + resolution: + { + integrity: sha512-OZiDAEK/lDB6xy/XzYAyJJkaDqmQ+BCtOEPLqFvxWKUz5JbBmej7IiiRHdtiIOD/twW7O5AxVsfaaGA/V1bNsA==, + } '@firebase/auth-compat@0.5.14': - resolution: {integrity: sha512-2eczCSqBl1KUPJacZlFpQayvpilg3dxXLy9cSMTKtQMTQSmondUtPI47P3ikH3bQAXhzKLOE+qVxJ3/IRtu9pw==} + resolution: + { + integrity: sha512-2eczCSqBl1KUPJacZlFpQayvpilg3dxXLy9cSMTKtQMTQSmondUtPI47P3ikH3bQAXhzKLOE+qVxJ3/IRtu9pw==, + } peerDependencies: '@firebase/app-compat': 0.x '@firebase/auth-interop-types@0.2.3': - resolution: {integrity: sha512-Fc9wuJGgxoxQeavybiuwgyi+0rssr76b+nHpj+eGhXFYAdudMWyfBHvFL/I5fEHniUM/UQdFzi9VXJK2iZF7FQ==} + resolution: + { + integrity: sha512-Fc9wuJGgxoxQeavybiuwgyi+0rssr76b+nHpj+eGhXFYAdudMWyfBHvFL/I5fEHniUM/UQdFzi9VXJK2iZF7FQ==, + } '@firebase/auth-types@0.12.2': - resolution: {integrity: sha512-qsEBaRMoGvHO10unlDJhaKSuPn4pyoTtlQuP1ghZfzB6rNQPuhp/N/DcFZxm9i4v0SogjCbf9reWupwIvfmH6w==} + resolution: + { + integrity: sha512-qsEBaRMoGvHO10unlDJhaKSuPn4pyoTtlQuP1ghZfzB6rNQPuhp/N/DcFZxm9i4v0SogjCbf9reWupwIvfmH6w==, + } peerDependencies: '@firebase/app-types': 0.x '@firebase/util': 1.x '@firebase/auth@1.7.9': - resolution: {integrity: sha512-yLD5095kVgDw965jepMyUrIgDklD6qH/BZNHeKOgvu7pchOKNjVM+zQoOVYJIKWMWOWBq8IRNVU6NXzBbozaJg==} + resolution: + { + integrity: sha512-yLD5095kVgDw965jepMyUrIgDklD6qH/BZNHeKOgvu7pchOKNjVM+zQoOVYJIKWMWOWBq8IRNVU6NXzBbozaJg==, + } peerDependencies: '@firebase/app': 0.x '@react-native-async-storage/async-storage': ^1.18.1 @@ -1362,282 +2182,504 @@ packages: optional: true '@firebase/component@0.6.9': - resolution: {integrity: sha512-gm8EUEJE/fEac86AvHn8Z/QW8BvR56TBw3hMW0O838J/1mThYQXAIQBgUv75EqlCZfdawpWLrKt1uXvp9ciK3Q==} + resolution: + { + integrity: sha512-gm8EUEJE/fEac86AvHn8Z/QW8BvR56TBw3hMW0O838J/1mThYQXAIQBgUv75EqlCZfdawpWLrKt1uXvp9ciK3Q==, + } '@firebase/data-connect@0.1.0': - resolution: {integrity: sha512-vSe5s8dY13ilhLnfY0eYRmQsdTbH7PUFZtBbqU6JVX/j8Qp9A6G5gG6//ulbX9/1JFOF1IWNOne9c8S/DOCJaQ==} + resolution: + { + integrity: sha512-vSe5s8dY13ilhLnfY0eYRmQsdTbH7PUFZtBbqU6JVX/j8Qp9A6G5gG6//ulbX9/1JFOF1IWNOne9c8S/DOCJaQ==, + } peerDependencies: '@firebase/app': 0.x '@firebase/database-compat@1.0.8': - resolution: {integrity: sha512-OpeWZoPE3sGIRPBKYnW9wLad25RaWbGyk7fFQe4xnJQKRzlynWeFBSRRAoLE2Old01WXwskUiucNqUUVlFsceg==} + resolution: + { + integrity: sha512-OpeWZoPE3sGIRPBKYnW9wLad25RaWbGyk7fFQe4xnJQKRzlynWeFBSRRAoLE2Old01WXwskUiucNqUUVlFsceg==, + } '@firebase/database-types@1.0.5': - resolution: {integrity: sha512-fTlqCNwFYyq/C6W7AJ5OCuq5CeZuBEsEwptnVxlNPkWCo5cTTyukzAHRSO/jaQcItz33FfYrrFk1SJofcu2AaQ==} + resolution: + { + integrity: sha512-fTlqCNwFYyq/C6W7AJ5OCuq5CeZuBEsEwptnVxlNPkWCo5cTTyukzAHRSO/jaQcItz33FfYrrFk1SJofcu2AaQ==, + } '@firebase/database@1.0.8': - resolution: {integrity: sha512-dzXALZeBI1U5TXt6619cv0+tgEhJiwlUtQ55WNZY7vGAjv7Q1QioV969iYwt1AQQ0ovHnEW0YW9TiBfefLvErg==} + resolution: + { + integrity: sha512-dzXALZeBI1U5TXt6619cv0+tgEhJiwlUtQ55WNZY7vGAjv7Q1QioV969iYwt1AQQ0ovHnEW0YW9TiBfefLvErg==, + } '@firebase/firestore-compat@0.3.38': - resolution: {integrity: sha512-GoS0bIMMkjpLni6StSwRJarpu2+S5m346Na7gr9YZ/BZ/W3/8iHGNr9PxC+f0rNZXqS4fGRn88pICjrZEgbkqQ==} + resolution: + { + integrity: sha512-GoS0bIMMkjpLni6StSwRJarpu2+S5m346Na7gr9YZ/BZ/W3/8iHGNr9PxC+f0rNZXqS4fGRn88pICjrZEgbkqQ==, + } peerDependencies: '@firebase/app-compat': 0.x '@firebase/firestore-types@3.0.2': - resolution: {integrity: sha512-wp1A+t5rI2Qc/2q7r2ZpjUXkRVPtGMd6zCLsiWurjsQpqPgFin3AhNibKcIzoF2rnToNa/XYtyWXuifjOOwDgg==} + resolution: + { + integrity: sha512-wp1A+t5rI2Qc/2q7r2ZpjUXkRVPtGMd6zCLsiWurjsQpqPgFin3AhNibKcIzoF2rnToNa/XYtyWXuifjOOwDgg==, + } peerDependencies: '@firebase/app-types': 0.x '@firebase/util': 1.x '@firebase/firestore@4.7.3': - resolution: {integrity: sha512-NwVU+JPZ/3bhvNSJMCSzfcBZZg8SUGyzZ2T0EW3/bkUeefCyzMISSt/TTIfEHc8cdyXGlMqfGe3/62u9s74UEg==} - engines: {node: '>=10.10.0'} + resolution: + { + integrity: sha512-NwVU+JPZ/3bhvNSJMCSzfcBZZg8SUGyzZ2T0EW3/bkUeefCyzMISSt/TTIfEHc8cdyXGlMqfGe3/62u9s74UEg==, + } + engines: { node: '>=10.10.0' } peerDependencies: '@firebase/app': 0.x '@firebase/functions-compat@0.3.14': - resolution: {integrity: sha512-dZ0PKOKQFnOlMfcim39XzaXonSuPPAVuzpqA4ONTIdyaJK/OnBaIEVs/+BH4faa1a2tLeR+Jy15PKqDRQoNIJw==} + resolution: + { + integrity: sha512-dZ0PKOKQFnOlMfcim39XzaXonSuPPAVuzpqA4ONTIdyaJK/OnBaIEVs/+BH4faa1a2tLeR+Jy15PKqDRQoNIJw==, + } peerDependencies: '@firebase/app-compat': 0.x '@firebase/functions-types@0.6.2': - resolution: {integrity: sha512-0KiJ9lZ28nS2iJJvimpY4nNccV21rkQyor5Iheu/nq8aKXJqtJdeSlZDspjPSBBiHRzo7/GMUttegnsEITqR+w==} + resolution: + { + integrity: sha512-0KiJ9lZ28nS2iJJvimpY4nNccV21rkQyor5Iheu/nq8aKXJqtJdeSlZDspjPSBBiHRzo7/GMUttegnsEITqR+w==, + } '@firebase/functions@0.11.8': - resolution: {integrity: sha512-Lo2rTPDn96naFIlSZKVd1yvRRqqqwiJk7cf9TZhUerwnPKgBzXy+aHE22ry+6EjCaQusUoNai6mU6p+G8QZT1g==} + resolution: + { + integrity: sha512-Lo2rTPDn96naFIlSZKVd1yvRRqqqwiJk7cf9TZhUerwnPKgBzXy+aHE22ry+6EjCaQusUoNai6mU6p+G8QZT1g==, + } peerDependencies: '@firebase/app': 0.x '@firebase/installations-compat@0.2.9': - resolution: {integrity: sha512-2lfdc6kPXR7WaL4FCQSQUhXcPbI7ol3wF+vkgtU25r77OxPf8F/VmswQ7sgIkBBWtymn5ZF20TIKtnOj9rjb6w==} + resolution: + { + integrity: sha512-2lfdc6kPXR7WaL4FCQSQUhXcPbI7ol3wF+vkgtU25r77OxPf8F/VmswQ7sgIkBBWtymn5ZF20TIKtnOj9rjb6w==, + } peerDependencies: '@firebase/app-compat': 0.x '@firebase/installations-types@0.5.2': - resolution: {integrity: sha512-que84TqGRZJpJKHBlF2pkvc1YcXrtEDOVGiDjovP/a3s6W4nlbohGXEsBJo0JCeeg/UG9A+DEZVDUV9GpklUzA==} + resolution: + { + integrity: sha512-que84TqGRZJpJKHBlF2pkvc1YcXrtEDOVGiDjovP/a3s6W4nlbohGXEsBJo0JCeeg/UG9A+DEZVDUV9GpklUzA==, + } peerDependencies: '@firebase/app-types': 0.x '@firebase/installations@0.6.9': - resolution: {integrity: sha512-hlT7AwCiKghOX3XizLxXOsTFiFCQnp/oj86zp1UxwDGmyzsyoxtX+UIZyVyH/oBF5+XtblFG9KZzZQ/h+dpy+Q==} + resolution: + { + integrity: sha512-hlT7AwCiKghOX3XizLxXOsTFiFCQnp/oj86zp1UxwDGmyzsyoxtX+UIZyVyH/oBF5+XtblFG9KZzZQ/h+dpy+Q==, + } peerDependencies: '@firebase/app': 0.x '@firebase/logger@0.4.2': - resolution: {integrity: sha512-Q1VuA5M1Gjqrwom6I6NUU4lQXdo9IAQieXlujeHZWvRt1b7qQ0KwBaNAjgxG27jgF9/mUwsNmO8ptBCGVYhB0A==} + resolution: + { + integrity: sha512-Q1VuA5M1Gjqrwom6I6NUU4lQXdo9IAQieXlujeHZWvRt1b7qQ0KwBaNAjgxG27jgF9/mUwsNmO8ptBCGVYhB0A==, + } '@firebase/messaging-compat@0.2.12': - resolution: {integrity: sha512-pKsiUVZrbmRgdImYqhBNZlkKJbqjlPkVdQRZGRbkTyX4OSGKR0F/oJeCt1a8jEg5UnBp4fdVwSWSp4DuCovvEQ==} + resolution: + { + integrity: sha512-pKsiUVZrbmRgdImYqhBNZlkKJbqjlPkVdQRZGRbkTyX4OSGKR0F/oJeCt1a8jEg5UnBp4fdVwSWSp4DuCovvEQ==, + } peerDependencies: '@firebase/app-compat': 0.x '@firebase/messaging-interop-types@0.2.2': - resolution: {integrity: sha512-l68HXbuD2PPzDUOFb3aG+nZj5KA3INcPwlocwLZOzPp9rFM9yeuI9YLl6DQfguTX5eAGxO0doTR+rDLDvQb5tA==} + resolution: + { + integrity: sha512-l68HXbuD2PPzDUOFb3aG+nZj5KA3INcPwlocwLZOzPp9rFM9yeuI9YLl6DQfguTX5eAGxO0doTR+rDLDvQb5tA==, + } '@firebase/messaging@0.12.12': - resolution: {integrity: sha512-6q0pbzYBJhZEtUoQx7hnPhZvAbuMNuBXKQXOx2YlWhSrlv9N1m0ZzlNpBbu/ItTzrwNKTibdYzUyaaxdWLg+4w==} + resolution: + { + integrity: sha512-6q0pbzYBJhZEtUoQx7hnPhZvAbuMNuBXKQXOx2YlWhSrlv9N1m0ZzlNpBbu/ItTzrwNKTibdYzUyaaxdWLg+4w==, + } peerDependencies: '@firebase/app': 0.x '@firebase/performance-compat@0.2.9': - resolution: {integrity: sha512-dNl95IUnpsu3fAfYBZDCVhXNkASE0uo4HYaEPd2/PKscfTvsgqFAOxfAXzBEDOnynDWiaGUnb5M1O00JQ+3FXA==} + resolution: + { + integrity: sha512-dNl95IUnpsu3fAfYBZDCVhXNkASE0uo4HYaEPd2/PKscfTvsgqFAOxfAXzBEDOnynDWiaGUnb5M1O00JQ+3FXA==, + } peerDependencies: '@firebase/app-compat': 0.x '@firebase/performance-types@0.2.2': - resolution: {integrity: sha512-gVq0/lAClVH5STrIdKnHnCo2UcPLjJlDUoEB/tB4KM+hAeHUxWKnpT0nemUPvxZ5nbdY/pybeyMe8Cs29gEcHA==} + resolution: + { + integrity: sha512-gVq0/lAClVH5STrIdKnHnCo2UcPLjJlDUoEB/tB4KM+hAeHUxWKnpT0nemUPvxZ5nbdY/pybeyMe8Cs29gEcHA==, + } '@firebase/performance@0.6.9': - resolution: {integrity: sha512-PnVaak5sqfz5ivhua+HserxTJHtCar/7zM0flCX6NkzBNzJzyzlH4Hs94h2Il0LQB99roBqoE5QT1JqWqcLJHQ==} + resolution: + { + integrity: sha512-PnVaak5sqfz5ivhua+HserxTJHtCar/7zM0flCX6NkzBNzJzyzlH4Hs94h2Il0LQB99roBqoE5QT1JqWqcLJHQ==, + } peerDependencies: '@firebase/app': 0.x '@firebase/remote-config-compat@0.2.9': - resolution: {integrity: sha512-AxzGpWfWFYejH2twxfdOJt5Cfh/ATHONegTd/a0p5flEzsD5JsxXgfkFToop+mypEL3gNwawxrxlZddmDoNxyA==} + resolution: + { + integrity: sha512-AxzGpWfWFYejH2twxfdOJt5Cfh/ATHONegTd/a0p5flEzsD5JsxXgfkFToop+mypEL3gNwawxrxlZddmDoNxyA==, + } peerDependencies: '@firebase/app-compat': 0.x '@firebase/remote-config-types@0.3.2': - resolution: {integrity: sha512-0BC4+Ud7y2aPTyhXJTMTFfrGGLqdYXrUB9sJVAB8NiqJswDTc4/2qrE/yfUbnQJhbSi6ZaTTBKyG3n1nplssaA==} + resolution: + { + integrity: sha512-0BC4+Ud7y2aPTyhXJTMTFfrGGLqdYXrUB9sJVAB8NiqJswDTc4/2qrE/yfUbnQJhbSi6ZaTTBKyG3n1nplssaA==, + } '@firebase/remote-config@0.4.9': - resolution: {integrity: sha512-EO1NLCWSPMHdDSRGwZ73kxEEcTopAxX1naqLJFNApp4hO8WfKfmEpmjxmP5TrrnypjIf2tUkYaKsfbEA7+AMmA==} + resolution: + { + integrity: sha512-EO1NLCWSPMHdDSRGwZ73kxEEcTopAxX1naqLJFNApp4hO8WfKfmEpmjxmP5TrrnypjIf2tUkYaKsfbEA7+AMmA==, + } peerDependencies: '@firebase/app': 0.x '@firebase/storage-compat@0.3.12': - resolution: {integrity: sha512-hA4VWKyGU5bWOll+uwzzhEMMYGu9PlKQc1w4DWxB3aIErWYzonrZjF0icqNQZbwKNIdh8SHjZlFeB2w6OSsjfg==} + resolution: + { + integrity: sha512-hA4VWKyGU5bWOll+uwzzhEMMYGu9PlKQc1w4DWxB3aIErWYzonrZjF0icqNQZbwKNIdh8SHjZlFeB2w6OSsjfg==, + } peerDependencies: '@firebase/app-compat': 0.x '@firebase/storage-types@0.8.2': - resolution: {integrity: sha512-0vWu99rdey0g53lA7IShoA2Lol1jfnPovzLDUBuon65K7uKG9G+L5uO05brD9pMw+l4HRFw23ah3GwTGpEav6g==} + resolution: + { + integrity: sha512-0vWu99rdey0g53lA7IShoA2Lol1jfnPovzLDUBuon65K7uKG9G+L5uO05brD9pMw+l4HRFw23ah3GwTGpEav6g==, + } peerDependencies: '@firebase/app-types': 0.x '@firebase/util': 1.x '@firebase/storage@0.13.2': - resolution: {integrity: sha512-fxuJnHshbhVwuJ4FuISLu+/76Aby2sh+44ztjF2ppoe0TELIDxPW6/r1KGlWYt//AD0IodDYYA8ZTN89q8YqUw==} + resolution: + { + integrity: sha512-fxuJnHshbhVwuJ4FuISLu+/76Aby2sh+44ztjF2ppoe0TELIDxPW6/r1KGlWYt//AD0IodDYYA8ZTN89q8YqUw==, + } peerDependencies: '@firebase/app': 0.x '@firebase/util@1.10.0': - resolution: {integrity: sha512-xKtx4A668icQqoANRxyDLBLz51TAbDP9KRfpbKGxiCAW346d0BeJe5vN6/hKxxmWwnZ0mautyv39JxviwwQMOQ==} + resolution: + { + integrity: sha512-xKtx4A668icQqoANRxyDLBLz51TAbDP9KRfpbKGxiCAW346d0BeJe5vN6/hKxxmWwnZ0mautyv39JxviwwQMOQ==, + } '@firebase/vertexai-preview@0.0.4': - resolution: {integrity: sha512-EBSqyu9eg8frQlVU9/HjKtHN7odqbh9MtAcVz3WwHj4gLCLOoN9F/o+oxlq3CxvFrd3CNTZwu6d2mZtVlEInng==} - engines: {node: '>=18.0.0'} + resolution: + { + integrity: sha512-EBSqyu9eg8frQlVU9/HjKtHN7odqbh9MtAcVz3WwHj4gLCLOoN9F/o+oxlq3CxvFrd3CNTZwu6d2mZtVlEInng==, + } + engines: { node: '>=18.0.0' } peerDependencies: '@firebase/app': 0.x '@firebase/app-types': 0.x '@firebase/webchannel-wrapper@1.0.1': - resolution: {integrity: sha512-jmEnr/pk0yVkA7mIlHNnxCi+wWzOFUg0WyIotgkKAb2u1J7fAeDBcVNSTjTihbAYNusCLQdW5s9IJ5qwnEufcQ==} + resolution: + { + integrity: sha512-jmEnr/pk0yVkA7mIlHNnxCi+wWzOFUg0WyIotgkKAb2u1J7fAeDBcVNSTjTihbAYNusCLQdW5s9IJ5qwnEufcQ==, + } '@grpc/grpc-js@1.9.15': - resolution: {integrity: sha512-nqE7Hc0AzI+euzUwDAy0aY5hCp10r734gMGRdU+qOPX0XSceI2ULrcXB5U2xSc5VkWwalCj4M7GzCAygZl2KoQ==} - engines: {node: ^8.13.0 || >=10.10.0} + resolution: + { + integrity: sha512-nqE7Hc0AzI+euzUwDAy0aY5hCp10r734gMGRdU+qOPX0XSceI2ULrcXB5U2xSc5VkWwalCj4M7GzCAygZl2KoQ==, + } + engines: { node: ^8.13.0 || >=10.10.0 } '@grpc/proto-loader@0.7.15': - resolution: {integrity: sha512-tMXdRCfYVixjuFK+Hk0Q1s38gV9zDiDJfWL3h1rv4Qc39oILCu1TRTDt7+fGUI8K4G1Fj125Hx/ru3azECWTyQ==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-tMXdRCfYVixjuFK+Hk0Q1s38gV9zDiDJfWL3h1rv4Qc39oILCu1TRTDt7+fGUI8K4G1Fj125Hx/ru3azECWTyQ==, + } + engines: { node: '>=6' } hasBin: true '@humanfs/core@0.19.1': - resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} - engines: {node: '>=18.18.0'} + resolution: + { + integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==, + } + engines: { node: '>=18.18.0' } '@humanfs/node@0.16.6': - resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==} - engines: {node: '>=18.18.0'} + resolution: + { + integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==, + } + engines: { node: '>=18.18.0' } '@humanwhocodes/module-importer@1.0.1': - resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} - engines: {node: '>=12.22'} + resolution: + { + integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==, + } + engines: { node: '>=12.22' } '@humanwhocodes/retry@0.3.1': - resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} - engines: {node: '>=18.18'} + resolution: + { + integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==, + } + engines: { node: '>=18.18' } '@humanwhocodes/retry@0.4.3': - resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} - engines: {node: '>=18.18'} + resolution: + { + integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==, + } + engines: { node: '>=18.18' } '@improbable-eng/grpc-web@0.15.0': - resolution: {integrity: sha512-ERft9/0/8CmYalqOVnJnpdDry28q+j+nAlFFARdjyxXDJ+Mhgv9+F600QC8BR9ygOfrXRlAk6CvST2j+JCpQPg==} + resolution: + { + integrity: sha512-ERft9/0/8CmYalqOVnJnpdDry28q+j+nAlFFARdjyxXDJ+Mhgv9+F600QC8BR9ygOfrXRlAk6CvST2j+JCpQPg==, + } peerDependencies: google-protobuf: ^3.14.0 + '@isaacs/balanced-match@4.0.1': + resolution: + { + integrity: sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==, + } + engines: { node: 20 || >=22 } + + '@isaacs/brace-expansion@5.0.0': + resolution: + { + integrity: sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==, + } + engines: { node: 20 || >=22 } + '@isaacs/cliui@8.0.2': - resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==, + } + engines: { node: '>=12' } '@istanbuljs/schema@0.1.3': - resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} - engines: {node: '>=8'} - - '@jridgewell/gen-mapping@0.3.8': - resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} - engines: {node: '>=6.0.0'} + resolution: + { + integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==, + } + engines: { node: '>=8' } + + '@jridgewell/gen-mapping@0.3.12': + resolution: + { + integrity: sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==, + } '@jridgewell/resolve-uri@3.1.2': - resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} - engines: {node: '>=6.0.0'} - - '@jridgewell/set-array@1.2.1': - resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} - engines: {node: '>=6.0.0'} - - '@jridgewell/source-map@0.3.6': - resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==} - - '@jridgewell/sourcemap-codec@1.5.0': - resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} - - '@jridgewell/trace-mapping@0.3.25': - resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + resolution: + { + integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==, + } + engines: { node: '>=6.0.0' } + + '@jridgewell/source-map@0.3.10': + resolution: + { + integrity: sha512-0pPkgz9dY+bijgistcTTJ5mR+ocqRXLuhXHYdzoMmmoJ2C9S46RCm2GMUbatPEUK9Yjy26IrAy8D/M00lLkv+Q==, + } + + '@jridgewell/sourcemap-codec@1.5.4': + resolution: + { + integrity: sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==, + } + + '@jridgewell/trace-mapping@0.3.29': + resolution: + { + integrity: sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==, + } '@jridgewell/trace-mapping@0.3.9': - resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + resolution: + { + integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==, + } '@lit-labs/ssr-dom-shim@1.3.0': - resolution: {integrity: sha512-nQIWonJ6eFAvUUrSlwyHDm/aE8PBDu5kRpL0vHMg6K8fK3Diq1xdPjTnsJSwxABhaZ+5eBi1btQB5ShUTKo4nQ==} + resolution: + { + integrity: sha512-nQIWonJ6eFAvUUrSlwyHDm/aE8PBDu5kRpL0vHMg6K8fK3Diq1xdPjTnsJSwxABhaZ+5eBi1btQB5ShUTKo4nQ==, + } '@lit/reactive-element@1.6.3': - resolution: {integrity: sha512-QuTgnG52Poic7uM1AN5yJ09QMe0O28e10XzSvWDz02TJiiKee4stsiownEIadWm8nYzyDAyT+gKzUoZmiWQtsQ==} + resolution: + { + integrity: sha512-QuTgnG52Poic7uM1AN5yJ09QMe0O28e10XzSvWDz02TJiiKee4stsiownEIadWm8nYzyDAyT+gKzUoZmiWQtsQ==, + } '@mdx-js/react@3.1.0': - resolution: {integrity: sha512-QjHtSaoameoalGnKDT3FoIl4+9RwyTmo9ZJGBdLOks/YOiWHoRDI3PUwEzOE7kEmGcV3AFcp9K6dYu9rEuKLAQ==} + resolution: + { + integrity: sha512-QjHtSaoameoalGnKDT3FoIl4+9RwyTmo9ZJGBdLOks/YOiWHoRDI3PUwEzOE7kEmGcV3AFcp9K6dYu9rEuKLAQ==, + } peerDependencies: '@types/react': '>=16' react: '>=16' '@metamask/abi-utils@3.0.0': - resolution: {integrity: sha512-a/l0DiSIr7+CBYVpHygUa3ztSlYLFCQMsklLna+t6qmNY9+eIO5TedNxhyIyvaJ+4cN7TLy0NQFbp9FV3X2ktg==} - engines: {node: ^18.18 || ^20.14 || >=22} + resolution: + { + integrity: sha512-a/l0DiSIr7+CBYVpHygUa3ztSlYLFCQMsklLna+t6qmNY9+eIO5TedNxhyIyvaJ+4cN7TLy0NQFbp9FV3X2ktg==, + } + engines: { node: ^18.18 || ^20.14 || >=22 } '@metamask/eth-sig-util@8.2.0': - resolution: {integrity: sha512-LZDglIh4gYGw9Myp+2aIwKrj6lIJpMC4e0m7wKJU+BxLLBFcrTgKrjdjstXGVWvuYG3kutlh9J+uNBRPJqffWQ==} - engines: {node: ^18.18 || ^20.14 || >=22} + resolution: + { + integrity: sha512-LZDglIh4gYGw9Myp+2aIwKrj6lIJpMC4e0m7wKJU+BxLLBFcrTgKrjdjstXGVWvuYG3kutlh9J+uNBRPJqffWQ==, + } + engines: { node: ^18.18 || ^20.14 || >=22 } '@metamask/superstruct@3.2.1': - resolution: {integrity: sha512-fLgJnDOXFmuVlB38rUN5SmU7hAFQcCjrg3Vrxz67KTY7YHFnSNEKvX4avmEBdOI0yTCxZjwMCFEqsC8k2+Wd3g==} - engines: {node: '>=16.0.0'} - - '@metamask/utils@11.4.0': - resolution: {integrity: sha512-dqsi65DAyprs91wo/D0yTST2Sry9h2krf1NADBJb9L3NTJn1py0w+C8K4jVVSh0XTrrj0/MF/t6XldGsidfypA==} - engines: {node: ^18.18 || ^20.14 || >=22} + resolution: + { + integrity: sha512-fLgJnDOXFmuVlB38rUN5SmU7hAFQcCjrg3Vrxz67KTY7YHFnSNEKvX4avmEBdOI0yTCxZjwMCFEqsC8k2+Wd3g==, + } + engines: { node: '>=16.0.0' } + + '@metamask/utils@11.4.2': + resolution: + { + integrity: sha512-TygCcGmUbhmpxjYMm+mx68kRiJ80jYV54/Aa8gUFBv4cTX7ulX2XZKr8CJoJAw3K3FN5ZvCRmU0IzWZFaonwhA==, + } + engines: { node: ^18.18 || ^20.14 || >=22 } + + '@mjackson/form-data-parser@0.4.0': + resolution: + { + integrity: sha512-zDQ0sFfXqn2bJaZ/ypXfGUe0lUjCzXybBHYEoyWaO2w1dZ0nOM9nRER8tVVv3a8ZIgO/zF6p2I5ieWJAUOzt3w==, + } + + '@mjackson/headers@0.5.1': + resolution: + { + integrity: sha512-sJpFgecPT/zJvwk3GRNVWNs8EkwaJoUNU2D0VMlp+gDJs6cuSTm1q/aCZi3ZtuV6CgDEQ4l2ZjUG3A9JrQlbNA==, + } + + '@mjackson/multipart-parser@0.6.3': + resolution: + { + integrity: sha512-aQhySnM6OpAYMMG+m7LEygYye99hB1md/Cy1AFE0yD5hfNW+X4JDu7oNVY9Gc6IW8PZ45D1rjFLDIUdnkXmwrA==, + } '@motionone/animation@10.18.0': - resolution: {integrity: sha512-9z2p5GFGCm0gBsZbi8rVMOAJCtw1WqBTIPw3ozk06gDvZInBPIsQcHgYogEJ4yuHJ+akuW8g1SEIOpTOvYs8hw==} + resolution: + { + integrity: sha512-9z2p5GFGCm0gBsZbi8rVMOAJCtw1WqBTIPw3ozk06gDvZInBPIsQcHgYogEJ4yuHJ+akuW8g1SEIOpTOvYs8hw==, + } '@motionone/dom@10.18.0': - resolution: {integrity: sha512-bKLP7E0eyO4B2UaHBBN55tnppwRnaE3KFfh3Ps9HhnAkar3Cb69kUCJY9as8LrccVYKgHA+JY5dOQqJLOPhF5A==} + resolution: + { + integrity: sha512-bKLP7E0eyO4B2UaHBBN55tnppwRnaE3KFfh3Ps9HhnAkar3Cb69kUCJY9as8LrccVYKgHA+JY5dOQqJLOPhF5A==, + } '@motionone/easing@10.18.0': - resolution: {integrity: sha512-VcjByo7XpdLS4o9T8t99JtgxkdMcNWD3yHU/n6CLEz3bkmKDRZyYQ/wmSf6daum8ZXqfUAgFeCZSpJZIMxaCzg==} + resolution: + { + integrity: sha512-VcjByo7XpdLS4o9T8t99JtgxkdMcNWD3yHU/n6CLEz3bkmKDRZyYQ/wmSf6daum8ZXqfUAgFeCZSpJZIMxaCzg==, + } '@motionone/generators@10.18.0': - resolution: {integrity: sha512-+qfkC2DtkDj4tHPu+AFKVfR/C30O1vYdvsGYaR13W/1cczPrrcjdvYCj0VLFuRMN+lP1xvpNZHCRNM4fBzn1jg==} + resolution: + { + integrity: sha512-+qfkC2DtkDj4tHPu+AFKVfR/C30O1vYdvsGYaR13W/1cczPrrcjdvYCj0VLFuRMN+lP1xvpNZHCRNM4fBzn1jg==, + } '@motionone/svelte@10.16.4': - resolution: {integrity: sha512-zRVqk20lD1xqe+yEDZhMYgftsuHc25+9JSo+r0a0OWUJFocjSV9D/+UGhX4xgJsuwB9acPzXLr20w40VnY2PQA==} + resolution: + { + integrity: sha512-zRVqk20lD1xqe+yEDZhMYgftsuHc25+9JSo+r0a0OWUJFocjSV9D/+UGhX4xgJsuwB9acPzXLr20w40VnY2PQA==, + } '@motionone/types@10.17.1': - resolution: {integrity: sha512-KaC4kgiODDz8hswCrS0btrVrzyU2CSQKO7Ps90ibBVSQmjkrt2teqta6/sOG59v7+dPnKMAg13jyqtMKV2yJ7A==} + resolution: + { + integrity: sha512-KaC4kgiODDz8hswCrS0btrVrzyU2CSQKO7Ps90ibBVSQmjkrt2teqta6/sOG59v7+dPnKMAg13jyqtMKV2yJ7A==, + } '@motionone/utils@10.18.0': - resolution: {integrity: sha512-3XVF7sgyTSI2KWvTf6uLlBJ5iAgRgmvp3bpuOiQJvInd4nZ19ET8lX5unn30SlmRH7hXbBbH+Gxd0m0klJ3Xtw==} + resolution: + { + integrity: sha512-3XVF7sgyTSI2KWvTf6uLlBJ5iAgRgmvp3bpuOiQJvInd4nZ19ET8lX5unn30SlmRH7hXbBbH+Gxd0m0klJ3Xtw==, + } '@motionone/vue@10.16.4': - resolution: {integrity: sha512-z10PF9JV6SbjFq+/rYabM+8CVlMokgl8RFGvieSGNTmrkQanfHn+15XBrhG3BgUfvmTeSeyShfOHpG0i9zEdcg==} + resolution: + { + integrity: sha512-z10PF9JV6SbjFq+/rYabM+8CVlMokgl8RFGvieSGNTmrkQanfHn+15XBrhG3BgUfvmTeSeyShfOHpG0i9zEdcg==, + } deprecated: Motion One for Vue is deprecated. Use Oku Motion instead https://oku-ui.com/motion '@msgpack/msgpack@3.1.2': - resolution: {integrity: sha512-JEW4DEtBzfe8HvUYecLU9e6+XJnKDlUAIve8FvPzF3Kzs6Xo/KuZkZJsDH0wJXl/qEZbeeE7edxDNY3kMs39hQ==} - engines: {node: '>= 18'} - - '@mui/core-downloads-tracker@7.1.2': - resolution: {integrity: sha512-0gLO1PvbJwSYe5ji021tGj6HFqrtEPMGKK4L1zWwRbhzrWWUumUJvMvJUsIgWQIYQsgOnhq9k2Fc1BxLGHDsAg==} - - '@mui/icons-material@7.1.2': - resolution: {integrity: sha512-slqJByDub7Y1UcokrM17BoMBMvn8n7daXFXVoTv0MEH5k3sHjmsH8ql/Mt3s9vQ20cORDr83UZ448TEGcbrXtw==} - engines: {node: '>=14.0.0'} + resolution: + { + integrity: sha512-JEW4DEtBzfe8HvUYecLU9e6+XJnKDlUAIve8FvPzF3Kzs6Xo/KuZkZJsDH0wJXl/qEZbeeE7edxDNY3kMs39hQ==, + } + engines: { node: '>= 18' } + + '@mui/core-downloads-tracker@7.2.0': + resolution: + { + integrity: sha512-d49s7kEgI5iX40xb2YPazANvo7Bx0BLg/MNRwv+7BVpZUzXj1DaVCKlQTDex3gy/0jsCb4w7AY2uH4t4AJvSog==, + } + + '@mui/icons-material@7.2.0': + resolution: + { + integrity: sha512-gRCspp3pfjHQyTmSOmYw7kUQTd9Udpdan4R8EnZvqPeoAtHnPzkvjBrBqzKaoAbbBp5bGF7BcD18zZJh4nwu0A==, + } + engines: { node: '>=14.0.0' } peerDependencies: - '@mui/material': ^7.1.2 + '@mui/material': ^7.2.0 '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 react: ^17.0.0 || ^18.0.0 || ^19.0.0 peerDependenciesMeta: '@types/react': optional: true - '@mui/material@7.1.2': - resolution: {integrity: sha512-Z5PYKkA6Kd8vS04zKxJNpwuvt6IoMwqpbidV7RCrRQQKwczIwcNcS8L6GnN4pzFYfEs+N9v6co27DmG07rcnoA==} - engines: {node: '>=14.0.0'} + '@mui/material@7.2.0': + resolution: + { + integrity: sha512-NTuyFNen5Z2QY+I242MDZzXnFIVIR6ERxo7vntFi9K1wCgSwvIl0HcAO2OOydKqqKApE6omRiYhpny1ZhGuH7Q==, + } + engines: { node: '>=14.0.0' } peerDependencies: '@emotion/react': ^11.5.0 '@emotion/styled': ^11.3.0 - '@mui/material-pigment-css': ^7.1.1 + '@mui/material-pigment-css': ^7.2.0 '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 react: ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^17.0.0 || ^18.0.0 || ^19.0.0 @@ -1651,9 +2693,12 @@ packages: '@types/react': optional: true - '@mui/private-theming@7.1.1': - resolution: {integrity: sha512-M8NbLUx+armk2ZuaxBkkMk11ultnWmrPlN0Xe3jUEaBChg/mcxa5HWIWS1EE4DF36WRACaAHVAvyekWlDQf0PQ==} - engines: {node: '>=14.0.0'} + '@mui/private-theming@7.2.0': + resolution: + { + integrity: sha512-y6N1Yt3T5RMxVFnCh6+zeSWBuQdNDm5/UlM0EAYZzZR/1u+XKJWYQmbpx4e+F+1EpkYi3Nk8KhPiQDi83M3zIw==, + } + engines: { node: '>=14.0.0' } peerDependencies: '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 react: ^17.0.0 || ^18.0.0 || ^19.0.0 @@ -1661,9 +2706,12 @@ packages: '@types/react': optional: true - '@mui/styled-engine@7.1.1': - resolution: {integrity: sha512-R2wpzmSN127j26HrCPYVQ53vvMcT5DaKLoWkrfwUYq3cYytL6TQrCH8JBH3z79B6g4nMZZVoaXrxO757AlShaw==} - engines: {node: '>=14.0.0'} + '@mui/styled-engine@7.2.0': + resolution: + { + integrity: sha512-yq08xynbrNYcB1nBcW9Fn8/h/iniM3ewRguGJXPIAbHvxEF7Pz95kbEEOAAhwzxMX4okhzvHmk0DFuC5ayvgIQ==, + } + engines: { node: '>=14.0.0' } peerDependencies: '@emotion/react': ^11.4.1 '@emotion/styled': ^11.3.0 @@ -1674,9 +2722,12 @@ packages: '@emotion/styled': optional: true - '@mui/system@7.1.1': - resolution: {integrity: sha512-Kj1uhiqnj4Zo7PDjAOghtXJtNABunWvhcRU0O7RQJ7WOxeynoH6wXPcilphV8QTFtkKaip8EiNJRiCD+B3eROA==} - engines: {node: '>=14.0.0'} + '@mui/system@7.2.0': + resolution: + { + integrity: sha512-PG7cm/WluU6RAs+gNND2R9vDwNh+ERWxPkqTaiXQJGIFAyJ+VxhyKfzpdZNk0z0XdmBxxi9KhFOpgxjehf/O0A==, + } + engines: { node: '>=14.0.0' } peerDependencies: '@emotion/react': ^11.5.0 '@emotion/styled': ^11.3.0 @@ -1690,17 +2741,23 @@ packages: '@types/react': optional: true - '@mui/types@7.4.3': - resolution: {integrity: sha512-2UCEiK29vtiZTeLdS2d4GndBKacVyxGvReznGXGr+CzW/YhjIX+OHUdCIczZjzcRAgKBGmE9zCIgoV9FleuyRQ==} + '@mui/types@7.4.4': + resolution: + { + integrity: sha512-p63yhbX52MO/ajXC7hDHJA5yjzJekvWD3q4YDLl1rSg+OXLczMYPvTuSuviPRCgRX8+E42RXz1D/dz9SxPSlWg==, + } peerDependencies: '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 peerDependenciesMeta: '@types/react': optional: true - '@mui/utils@7.1.1': - resolution: {integrity: sha512-BkOt2q7MBYl7pweY2JWwfrlahhp+uGLR8S+EhiyRaofeRYUWL2YKbSGQvN4hgSN1i8poN0PaUiii1kEMrchvzg==} - engines: {node: '>=14.0.0'} + '@mui/utils@7.2.0': + resolution: + { + integrity: sha512-O0i1GQL6MDzhKdy9iAu5Yr0Sz1wZjROH1o3aoztuivdCXqEeQYnEjTDiRLGuFxI9zrUbTHBwobMyQH5sNtyacw==, + } + engines: { node: '>=14.0.0' } peerDependencies: '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 react: ^17.0.0 || ^18.0.0 || ^19.0.0 @@ -1709,108 +2766,198 @@ packages: optional: true '@napi-rs/wasm-runtime@0.2.11': - resolution: {integrity: sha512-9DPkXtvHydrcOsopiYpUgPHpmj0HWZKMUnL2dZqpvC42lsratuBG06V5ipyno0fUek5VlFsNQ+AcFATSrJXgMA==} + resolution: + { + integrity: sha512-9DPkXtvHydrcOsopiYpUgPHpmj0HWZKMUnL2dZqpvC42lsratuBG06V5ipyno0fUek5VlFsNQ+AcFATSrJXgMA==, + } '@noble/ciphers@1.3.0': - resolution: {integrity: sha512-2I0gnIVPtfnMw9ee9h1dJG7tp81+8Ob3OJb3Mv37rx5L40/b0i7djjCVvGOVqc9AEIQyvyu1i6ypKdFw8R8gQw==} - engines: {node: ^14.21.3 || >=16} + resolution: + { + integrity: sha512-2I0gnIVPtfnMw9ee9h1dJG7tp81+8Ob3OJb3Mv37rx5L40/b0i7djjCVvGOVqc9AEIQyvyu1i6ypKdFw8R8gQw==, + } + engines: { node: ^14.21.3 || >=16 } '@noble/curves@1.2.0': - resolution: {integrity: sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==} + resolution: + { + integrity: sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==, + } '@noble/curves@1.4.2': - resolution: {integrity: sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==} + resolution: + { + integrity: sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==, + } '@noble/curves@1.8.0': - resolution: {integrity: sha512-j84kjAbzEnQHaSIhRPUmB3/eVXu2k3dKPl2LOrR8fSOIL+89U+7lV117EWHtq/GHM3ReGHM46iRBdZfpc4HRUQ==} - engines: {node: ^14.21.3 || >=16} + resolution: + { + integrity: sha512-j84kjAbzEnQHaSIhRPUmB3/eVXu2k3dKPl2LOrR8fSOIL+89U+7lV117EWHtq/GHM3ReGHM46iRBdZfpc4HRUQ==, + } + engines: { node: ^14.21.3 || >=16 } '@noble/curves@1.9.1': - resolution: {integrity: sha512-k11yZxZg+t+gWvBbIswW0yoJlu8cHOC7dhunwOzoWH/mXGBiYyR4YY6hAEK/3EUs4UpB8la1RfdRpeGsFHkWsA==} - engines: {node: ^14.21.3 || >=16} + resolution: + { + integrity: sha512-k11yZxZg+t+gWvBbIswW0yoJlu8cHOC7dhunwOzoWH/mXGBiYyR4YY6hAEK/3EUs4UpB8la1RfdRpeGsFHkWsA==, + } + engines: { node: ^14.21.3 || >=16 } '@noble/curves@1.9.2': - resolution: {integrity: sha512-HxngEd2XUcg9xi20JkwlLCtYwfoFw4JGkuZpT+WlsPD4gB/cxkvTD8fSsoAnphGZhFdZYKeQIPCuFlWPm1uE0g==} - engines: {node: ^14.21.3 || >=16} + resolution: + { + integrity: sha512-HxngEd2XUcg9xi20JkwlLCtYwfoFw4JGkuZpT+WlsPD4gB/cxkvTD8fSsoAnphGZhFdZYKeQIPCuFlWPm1uE0g==, + } + engines: { node: ^14.21.3 || >=16 } '@noble/hashes@1.3.2': - resolution: {integrity: sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==} - engines: {node: '>= 16'} + resolution: + { + integrity: sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==, + } + engines: { node: '>= 16' } '@noble/hashes@1.4.0': - resolution: {integrity: sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==} - engines: {node: '>= 16'} + resolution: + { + integrity: sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==, + } + engines: { node: '>= 16' } '@noble/hashes@1.7.0': - resolution: {integrity: sha512-HXydb0DgzTpDPwbVeDGCG1gIu7X6+AuU6Zl6av/E/KG8LMsvPntvq+w17CHRpKBmN6Ybdrt1eP3k4cj8DJa78w==} - engines: {node: ^14.21.3 || >=16} + resolution: + { + integrity: sha512-HXydb0DgzTpDPwbVeDGCG1gIu7X6+AuU6Zl6av/E/KG8LMsvPntvq+w17CHRpKBmN6Ybdrt1eP3k4cj8DJa78w==, + } + engines: { node: ^14.21.3 || >=16 } '@noble/hashes@1.8.0': - resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} - engines: {node: ^14.21.3 || >=16} + resolution: + { + integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==, + } + engines: { node: ^14.21.3 || >=16 } '@noble/secp256k1@1.7.2': - resolution: {integrity: sha512-/qzwYl5eFLH8OWIecQWM31qld2g1NfjgylK+TNhqtaUKP37Nm+Y+z30Fjhw0Ct8p9yCQEm2N3W/AckdIb3SMcQ==} + resolution: + { + integrity: sha512-/qzwYl5eFLH8OWIecQWM31qld2g1NfjgylK+TNhqtaUKP37Nm+Y+z30Fjhw0Ct8p9yCQEm2N3W/AckdIb3SMcQ==, + } '@nodelib/fs.scandir@2.1.5': - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} + resolution: + { + integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==, + } + engines: { node: '>= 8' } '@nodelib/fs.stat@2.0.5': - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} + resolution: + { + integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==, + } + engines: { node: '>= 8' } '@nodelib/fs.walk@1.2.8': - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} + resolution: + { + integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==, + } + engines: { node: '>= 8' } '@nolyfill/is-core-module@1.0.39': - resolution: {integrity: sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==} - engines: {node: '>=12.4.0'} + resolution: + { + integrity: sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==, + } + engines: { node: '>=12.4.0' } '@onflow/config@1.5.2': - resolution: {integrity: sha512-pz/qIG7LhvH3A+a0IJUygwsndFTQ2GoVdADC89WBj9fmR1z4izKL6j2P21xL4gZ39u0jeS5EFWSkdsBWq4yb0w==} - - '@onflow/fcl-core@1.19.0': - resolution: {integrity: sha512-K+bpjeW+O2aD0cICLIWJZ7d9M1rmcMQpmtoDlKyR4jFgePEneOcE2f93tAd9ghXnj0F9YhyCYGD0W4dTyrAeaQ==} - - '@onflow/fcl-wc@6.0.3': - resolution: {integrity: sha512-IeSn1uf5l99MUSbQduhBUBz0gCUIilPxra+CzIBLll1KA5BFZ84C4DRppCfbrcEYZlJR1MZ2AizVap//5x80yg==} + resolution: + { + integrity: sha512-pz/qIG7LhvH3A+a0IJUygwsndFTQ2GoVdADC89WBj9fmR1z4izKL6j2P21xL4gZ39u0jeS5EFWSkdsBWq4yb0w==, + } + + '@onflow/fcl-core@1.20.0': + resolution: + { + integrity: sha512-si9Efr2hw+IxOnZAxLAv1vDklTBPdD7GUkrgKv4TxMSCgq0D/isF6nGsUbb+jA5x7yz0+uN3mXUv84LW8XyyDQ==, + } + + '@onflow/fcl-wc@6.0.4': + resolution: + { + integrity: sha512-m1U/kkB66jbBmpu/TCZoQV+CVvHiLfH0BUelp/3ecPy7XBNO7ix9cQL5HGvmJD+i99u1mynC59q0xgcSa2qXSg==, + } peerDependencies: - '@onflow/fcl-core': 1.19.0 + '@onflow/fcl-core': 1.20.0 - '@onflow/fcl@1.18.0': - resolution: {integrity: sha512-vu7jGtF9MwoSERouc1YzN4a4QDfkOiEJw2QjUJKNmhs91g1vnxmK6ZSUKp+GoqtlvofaOXYtJ5nrpppJQiZdpQ==} + '@onflow/fcl@1.19.0': + resolution: + { + integrity: sha512-PtABHza3oSVFIQRd8knOM+jqEcWsqRNIwNtWmElnLY7kuBRJJuoOT84Kxua0dWcE567IiDOPtjRoFpfqqnosyQ==, + } '@onflow/interaction@0.0.11': - resolution: {integrity: sha512-Xuq1Mmx6Wyba/F/L+QLQs0yJeQDsIDwy5SKk5vrCuVgIj0yD8k506g5L8ODrbM1LWll8i0tQsoOi0F85vNl5sA==} + resolution: + { + integrity: sha512-Xuq1Mmx6Wyba/F/L+QLQs0yJeQDsIDwy5SKk5vrCuVgIj0yD8k506g5L8ODrbM1LWll8i0tQsoOi0F85vNl5sA==, + } '@onflow/rlp@1.2.3': - resolution: {integrity: sha512-Mm1jSzDhdTofMGhg3NtUD8uKntj7u1dSMr+Q4VwOw2YQhwGTGJrzsHc7qgkJxwDnjU0Ra8VQfqd54bZzX0R2aQ==} + resolution: + { + integrity: sha512-Mm1jSzDhdTofMGhg3NtUD8uKntj7u1dSMr+Q4VwOw2YQhwGTGJrzsHc7qgkJxwDnjU0Ra8VQfqd54bZzX0R2aQ==, + } '@onflow/sdk@1.9.0': - resolution: {integrity: sha512-pBttKHokutv/3Z8/P7dssTDpfjkugtb6B//PlRxAkGnKEjYXFN6iGi/aZB5WGPZaJq/vAIB65IKNBl7XKFz1jA==} + resolution: + { + integrity: sha512-pBttKHokutv/3Z8/P7dssTDpfjkugtb6B//PlRxAkGnKEjYXFN6iGi/aZB5WGPZaJq/vAIB65IKNBl7XKFz1jA==, + } '@onflow/transport-http@1.13.0': - resolution: {integrity: sha512-Gw8o3r9Dcneiz64rRtxQZB4nzewpXVdi6OxTyuSG5QSA/WpxDUPu9JjAbxtDBGm9Ul//LW9g4KRUmSX+a+3FeA==} + resolution: + { + integrity: sha512-Gw8o3r9Dcneiz64rRtxQZB4nzewpXVdi6OxTyuSG5QSA/WpxDUPu9JjAbxtDBGm9Ul//LW9g4KRUmSX+a+3FeA==, + } '@onflow/typedefs@1.6.0': - resolution: {integrity: sha512-2JxZ5ePSeeh8OPRTQjxpQoavmvsYtK05O+6KcFTFcJp4x+YkVOxl0o8OZl5ERHWW2J3BvutuVFEmP0AXuKxzPg==} + resolution: + { + integrity: sha512-2JxZ5ePSeeh8OPRTQjxpQoavmvsYtK05O+6KcFTFcJp4x+YkVOxl0o8OZl5ERHWW2J3BvutuVFEmP0AXuKxzPg==, + } '@onflow/types@1.4.1': - resolution: {integrity: sha512-oKKaNTPfb9OJos4C6RoK3sql9Bx8mi+8ytTc7wLJbjv+n6YUov2zRGkGsPzj2QxL2Xf48CLYtPNn7cBNr3v39w==} + resolution: + { + integrity: sha512-oKKaNTPfb9OJos4C6RoK3sql9Bx8mi+8ytTc7wLJbjv+n6YUov2zRGkGsPzj2QxL2Xf48CLYtPNn7cBNr3v39w==, + } '@onflow/util-actor@1.3.4': - resolution: {integrity: sha512-BQeFdy0obs2x+XTEkss7MjuasS7gCfIStwGsgpH0aG3siBu+IsMYPiDdrHOeYS2Jn/pSFXF5R85NYrnMvlDhlA==} + resolution: + { + integrity: sha512-BQeFdy0obs2x+XTEkss7MjuasS7gCfIStwGsgpH0aG3siBu+IsMYPiDdrHOeYS2Jn/pSFXF5R85NYrnMvlDhlA==, + } '@onflow/util-address@1.2.3': - resolution: {integrity: sha512-5u1pLQT6MmTlRQLv8zVJP/iOkgytvpzK+32nXcJ29XE0y7YI6GLrFfgKGBIRsiqiSLp7SU6XI5RukEJEblmwOw==} + resolution: + { + integrity: sha512-5u1pLQT6MmTlRQLv8zVJP/iOkgytvpzK+32nXcJ29XE0y7YI6GLrFfgKGBIRsiqiSLp7SU6XI5RukEJEblmwOw==, + } '@onflow/util-invariant@1.2.4': - resolution: {integrity: sha512-U4D30lrAxSgqTPQsIvC3gPDoXVxuhLS9TZk4WxEvNfcQrI6VYKvWRe4m/5mUrc4kpE+ntXZmnbs+DUM7oLlkcg==} + resolution: + { + integrity: sha512-U4D30lrAxSgqTPQsIvC3gPDoXVxuhLS9TZk4WxEvNfcQrI6VYKvWRe4m/5mUrc4kpE+ntXZmnbs+DUM7oLlkcg==, + } '@onflow/util-logger@1.3.3': - resolution: {integrity: sha512-eivdbF7cKNjTL2nuvI3pjDavDDfTXRq4pJtJpkI8hJMz0XJb84o7D5CLPcDRId//1Kc/qoqM/driHz5A4J52Qw==} + resolution: + { + integrity: sha512-eivdbF7cKNjTL2nuvI3pjDavDDfTXRq4pJtJpkI8hJMz0XJb84o7D5CLPcDRId//1Kc/qoqM/driHz5A4J52Qw==, + } peerDependencies: '@onflow/util-config': '>1.1.1' peerDependenciesMeta: @@ -1818,419 +2965,702 @@ packages: optional: true '@onflow/util-rpc@0.0.2': - resolution: {integrity: sha512-UFYT99rdHEFOpfG5A/lFJFQBw4Q0b7MKN7lWTwYf/AU+bVm5zgNJ/V4Z9CXOSnA55ztLauYdk+eWldbhC9pqiw==} + resolution: + { + integrity: sha512-UFYT99rdHEFOpfG5A/lFJFQBw4Q0b7MKN7lWTwYf/AU+bVm5zgNJ/V4Z9CXOSnA55ztLauYdk+eWldbhC9pqiw==, + } '@onflow/util-semver@1.0.3': - resolution: {integrity: sha512-c604ewWCXUT1WpqeOiblNi3YWOQTGx3UgRWNXbRTD9K17Fh2DaXBTHYVu7FSreGwPGarU0T3iTBWkuuWJXSGwA==} + resolution: + { + integrity: sha512-c604ewWCXUT1WpqeOiblNi3YWOQTGx3UgRWNXbRTD9K17Fh2DaXBTHYVu7FSreGwPGarU0T3iTBWkuuWJXSGwA==, + } '@onflow/util-template@1.2.3': - resolution: {integrity: sha512-yNF7mI5L1y6yJHL+HxmTgIdd/oF1HD/kzjzZgjOyAvk+mLXzML+sWkqRSoIYcETbQ0w6cdNg3xvzZgTLuLIK3A==} + resolution: + { + integrity: sha512-yNF7mI5L1y6yJHL+HxmTgIdd/oF1HD/kzjzZgjOyAvk+mLXzML+sWkqRSoIYcETbQ0w6cdNg3xvzZgTLuLIK3A==, + } '@onflow/util-uid@1.2.3': - resolution: {integrity: sha512-gCTVvBBgDcZFX6SGyHPwoPVbK4e9sp0DC1kaQ0cgAt83YgodqiBiJLlwMBYNKuL03zSI6Ic5/TJVMVsruG7l9w==} + resolution: + { + integrity: sha512-gCTVvBBgDcZFX6SGyHPwoPVbK4e9sp0DC1kaQ0cgAt83YgodqiBiJLlwMBYNKuL03zSI6Ic5/TJVMVsruG7l9w==, + } '@pkgjs/parseargs@0.11.0': - resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} - engines: {node: '>=14'} - - '@playwright/test@1.53.1': - resolution: {integrity: sha512-Z4c23LHV0muZ8hfv4jw6HngPJkbbtZxTkxPNIg7cJcTc9C28N/p2q7g3JZS2SiKBBHJ3uM1dgDye66bB7LEk5w==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==, + } + engines: { node: '>=14' } + + '@pkgr/core@0.2.7': + resolution: + { + integrity: sha512-YLT9Zo3oNPJoBjBc4q8G2mjU4tqIbf5CEOORbUUr48dCD9q3umJ3IPlVqOqDakPfd2HuwccBaqlGhN4Gmr5OWg==, + } + engines: { node: ^12.20.0 || ^14.18.0 || >=16.0.0 } + + '@playwright/test@1.53.2': + resolution: + { + integrity: sha512-tEB2U5z74ebBeyfGNZ3Jfg29AnW+5HlWhvHtb/Mqco9pFdZU1ZLNdVb2UtB5CvmiilNr2ZfVH/qMmAROG/XTzw==, + } + engines: { node: '>=18' } hasBin: true '@popperjs/core@2.11.8': - resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} + resolution: + { + integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==, + } '@protobufjs/aspromise@1.1.2': - resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} + resolution: + { + integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==, + } '@protobufjs/base64@1.1.2': - resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==} + resolution: + { + integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==, + } '@protobufjs/codegen@2.0.4': - resolution: {integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==} + resolution: + { + integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==, + } '@protobufjs/eventemitter@1.1.0': - resolution: {integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==} + resolution: + { + integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==, + } '@protobufjs/fetch@1.1.0': - resolution: {integrity: sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==} + resolution: + { + integrity: sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==, + } '@protobufjs/float@1.0.2': - resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==} + resolution: + { + integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==, + } '@protobufjs/inquire@1.1.0': - resolution: {integrity: sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==} + resolution: + { + integrity: sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==, + } '@protobufjs/path@1.1.2': - resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==} + resolution: + { + integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==, + } '@protobufjs/pool@1.1.0': - resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==} + resolution: + { + integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==, + } '@protobufjs/utf8@1.1.0': - resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} - - '@reown/walletkit@1.2.7': - resolution: {integrity: sha512-jqVjhuSDDrJH9+vNzRlOWn0seVKPmUrI/L/YLrKFkFYoHBTKzBtm7rXFBmCsau32WJd2Jh56wBM8H9QtoYlVKw==} - - '@rollup/rollup-android-arm-eabi@4.44.0': - resolution: {integrity: sha512-xEiEE5oDW6tK4jXCAyliuntGR+amEMO7HLtdSshVuhFnKTYoeYMyXQK7pLouAJJj5KHdwdn87bfHAR2nSdNAUA==} + resolution: + { + integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==, + } + + '@reown/walletkit@1.2.8': + resolution: + { + integrity: sha512-X3EO9P6+Dvc++h8OwpBtBhGmq+890UlG/o0Ilb98l5ByDr3QVcYOURRIPVcV6pkTJ9sE6sVDXW7RIRiYSnQp2g==, + } + + '@rollup/rollup-android-arm-eabi@4.44.2': + resolution: + { + integrity: sha512-g0dF8P1e2QYPOj1gu7s/3LVP6kze9A7m6x0BZ9iTdXK8N5c2V7cpBKHV3/9A4Zd8xxavdhK0t4PnqjkqVmUc9Q==, + } cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.44.0': - resolution: {integrity: sha512-uNSk/TgvMbskcHxXYHzqwiyBlJ/lGcv8DaUfcnNwict8ba9GTTNxfn3/FAoFZYgkaXXAdrAA+SLyKplyi349Jw==} + '@rollup/rollup-android-arm64@4.44.2': + resolution: + { + integrity: sha512-Yt5MKrOosSbSaAK5Y4J+vSiID57sOvpBNBR6K7xAaQvk3MkcNVV0f9fE20T+41WYN8hDn6SGFlFrKudtx4EoxA==, + } cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.44.0': - resolution: {integrity: sha512-VGF3wy0Eq1gcEIkSCr8Ke03CWT+Pm2yveKLaDvq51pPpZza3JX/ClxXOCmTYYq3us5MvEuNRTaeyFThCKRQhOA==} + '@rollup/rollup-darwin-arm64@4.44.2': + resolution: + { + integrity: sha512-EsnFot9ZieM35YNA26nhbLTJBHD0jTwWpPwmRVDzjylQT6gkar+zenfb8mHxWpRrbn+WytRRjE0WKsfaxBkVUA==, + } cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.44.0': - resolution: {integrity: sha512-fBkyrDhwquRvrTxSGH/qqt3/T0w5Rg0L7ZIDypvBPc1/gzjJle6acCpZ36blwuwcKD/u6oCE/sRWlUAcxLWQbQ==} + '@rollup/rollup-darwin-x64@4.44.2': + resolution: + { + integrity: sha512-dv/t1t1RkCvJdWWxQ2lWOO+b7cMsVw5YFaS04oHpZRWehI1h0fV1gF4wgGCTyQHHjJDfbNpwOi6PXEafRBBezw==, + } cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.44.0': - resolution: {integrity: sha512-u5AZzdQJYJXByB8giQ+r4VyfZP+walV+xHWdaFx/1VxsOn6eWJhK2Vl2eElvDJFKQBo/hcYIBg/jaKS8ZmKeNQ==} + '@rollup/rollup-freebsd-arm64@4.44.2': + resolution: + { + integrity: sha512-W4tt4BLorKND4qeHElxDoim0+BsprFTwb+vriVQnFFtT/P6v/xO5I99xvYnVzKWrK6j7Hb0yp3x7V5LUbaeOMg==, + } cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.44.0': - resolution: {integrity: sha512-qC0kS48c/s3EtdArkimctY7h3nHicQeEUdjJzYVJYR3ct3kWSafmn6jkNCA8InbUdge6PVx6keqjk5lVGJf99g==} + '@rollup/rollup-freebsd-x64@4.44.2': + resolution: + { + integrity: sha512-tdT1PHopokkuBVyHjvYehnIe20fxibxFCEhQP/96MDSOcyjM/shlTkZZLOufV3qO6/FQOSiJTBebhVc12JyPTA==, + } cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.44.0': - resolution: {integrity: sha512-x+e/Z9H0RAWckn4V2OZZl6EmV0L2diuX3QB0uM1r6BvhUIv6xBPL5mrAX2E3e8N8rEHVPwFfz/ETUbV4oW9+lQ==} + '@rollup/rollup-linux-arm-gnueabihf@4.44.2': + resolution: + { + integrity: sha512-+xmiDGGaSfIIOXMzkhJ++Oa0Gwvl9oXUeIiwarsdRXSe27HUIvjbSIpPxvnNsRebsNdUo7uAiQVgBD1hVriwSQ==, + } cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.44.0': - resolution: {integrity: sha512-1exwiBFf4PU/8HvI8s80icyCcnAIB86MCBdst51fwFmH5dyeoWVPVgmQPcKrMtBQ0W5pAs7jBCWuRXgEpRzSCg==} + '@rollup/rollup-linux-arm-musleabihf@4.44.2': + resolution: + { + integrity: sha512-bDHvhzOfORk3wt8yxIra8N4k/N0MnKInCW5OGZaeDYa/hMrdPaJzo7CSkjKZqX4JFUWjUGm88lI6QJLCM7lDrA==, + } cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.44.0': - resolution: {integrity: sha512-ZTR2mxBHb4tK4wGf9b8SYg0Y6KQPjGpR4UWwTFdnmjB4qRtoATZ5dWn3KsDwGa5Z2ZBOE7K52L36J9LueKBdOQ==} + '@rollup/rollup-linux-arm64-gnu@4.44.2': + resolution: + { + integrity: sha512-NMsDEsDiYghTbeZWEGnNi4F0hSbGnsuOG+VnNvxkKg0IGDvFh7UVpM/14mnMwxRxUf9AdAVJgHPvKXf6FpMB7A==, + } cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.44.0': - resolution: {integrity: sha512-GFWfAhVhWGd4r6UxmnKRTBwP1qmModHtd5gkraeW2G490BpFOZkFtem8yuX2NyafIP/mGpRJgTJ2PwohQkUY/Q==} + '@rollup/rollup-linux-arm64-musl@4.44.2': + resolution: + { + integrity: sha512-lb5bxXnxXglVq+7imxykIp5xMq+idehfl+wOgiiix0191av84OqbjUED+PRC5OA8eFJYj5xAGcpAZ0pF2MnW+A==, + } cpu: [arm64] os: [linux] - '@rollup/rollup-linux-loongarch64-gnu@4.44.0': - resolution: {integrity: sha512-xw+FTGcov/ejdusVOqKgMGW3c4+AgqrfvzWEVXcNP6zq2ue+lsYUgJ+5Rtn/OTJf7e2CbgTFvzLW2j0YAtj0Gg==} + '@rollup/rollup-linux-loongarch64-gnu@4.44.2': + resolution: + { + integrity: sha512-Yl5Rdpf9pIc4GW1PmkUGHdMtbx0fBLE1//SxDmuf3X0dUC57+zMepow2LK0V21661cjXdTn8hO2tXDdAWAqE5g==, + } cpu: [loong64] os: [linux] - '@rollup/rollup-linux-powerpc64le-gnu@4.44.0': - resolution: {integrity: sha512-bKGibTr9IdF0zr21kMvkZT4K6NV+jjRnBoVMt2uNMG0BYWm3qOVmYnXKzx7UhwrviKnmK46IKMByMgvpdQlyJQ==} + '@rollup/rollup-linux-powerpc64le-gnu@4.44.2': + resolution: + { + integrity: sha512-03vUDH+w55s680YYryyr78jsO1RWU9ocRMaeV2vMniJJW/6HhoTBwyyiiTPVHNWLnhsnwcQ0oH3S9JSBEKuyqw==, + } cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.44.0': - resolution: {integrity: sha512-vV3cL48U5kDaKZtXrti12YRa7TyxgKAIDoYdqSIOMOFBXqFj2XbChHAtXquEn2+n78ciFgr4KIqEbydEGPxXgA==} + '@rollup/rollup-linux-riscv64-gnu@4.44.2': + resolution: + { + integrity: sha512-iYtAqBg5eEMG4dEfVlkqo05xMOk6y/JXIToRca2bAWuqjrJYJlx/I7+Z+4hSrsWU8GdJDFPL4ktV3dy4yBSrzg==, + } cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-riscv64-musl@4.44.0': - resolution: {integrity: sha512-TDKO8KlHJuvTEdfw5YYFBjhFts2TR0VpZsnLLSYmB7AaohJhM8ctDSdDnUGq77hUh4m/djRafw+9zQpkOanE2Q==} + '@rollup/rollup-linux-riscv64-musl@4.44.2': + resolution: + { + integrity: sha512-e6vEbgaaqz2yEHqtkPXa28fFuBGmUJ0N2dOJK8YUfijejInt9gfCSA7YDdJ4nYlv67JfP3+PSWFX4IVw/xRIPg==, + } cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.44.0': - resolution: {integrity: sha512-8541GEyktXaw4lvnGp9m84KENcxInhAt6vPWJ9RodsB/iGjHoMB2Pp5MVBCiKIRxrxzJhGCxmNzdu+oDQ7kwRA==} + '@rollup/rollup-linux-s390x-gnu@4.44.2': + resolution: + { + integrity: sha512-evFOtkmVdY3udE+0QKrV5wBx7bKI0iHz5yEVx5WqDJkxp9YQefy4Mpx3RajIVcM6o7jxTvVd/qpC1IXUhGc1Mw==, + } cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.44.0': - resolution: {integrity: sha512-iUVJc3c0o8l9Sa/qlDL2Z9UP92UZZW1+EmQ4xfjTc1akr0iUFZNfxrXJ/R1T90h/ILm9iXEY6+iPrmYB3pXKjw==} + '@rollup/rollup-linux-x64-gnu@4.44.2': + resolution: + { + integrity: sha512-/bXb0bEsWMyEkIsUL2Yt5nFB5naLAwyOWMEviQfQY1x3l5WsLKgvZf66TM7UTfED6erckUVUJQ/jJ1FSpm3pRQ==, + } cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.44.0': - resolution: {integrity: sha512-PQUobbhLTQT5yz/SPg116VJBgz+XOtXt8D1ck+sfJJhuEsMj2jSej5yTdp8CvWBSceu+WW+ibVL6dm0ptG5fcA==} + '@rollup/rollup-linux-x64-musl@4.44.2': + resolution: + { + integrity: sha512-3D3OB1vSSBXmkGEZR27uiMRNiwN08/RVAcBKwhUYPaiZ8bcvdeEwWPvbnXvvXHY+A/7xluzcN+kaiOFNiOZwWg==, + } cpu: [x64] os: [linux] - '@rollup/rollup-win32-arm64-msvc@4.44.0': - resolution: {integrity: sha512-M0CpcHf8TWn+4oTxJfh7LQuTuaYeXGbk0eageVjQCKzYLsajWS/lFC94qlRqOlyC2KvRT90ZrfXULYmukeIy7w==} + '@rollup/rollup-win32-arm64-msvc@4.44.2': + resolution: + { + integrity: sha512-VfU0fsMK+rwdK8mwODqYeM2hDrF2WiHaSmCBrS7gColkQft95/8tphyzv2EupVxn3iE0FI78wzffoULH1G+dkw==, + } cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.44.0': - resolution: {integrity: sha512-3XJ0NQtMAXTWFW8FqZKcw3gOQwBtVWP/u8TpHP3CRPXD7Pd6s8lLdH3sHWh8vqKCyyiI8xW5ltJScQmBU9j7WA==} + '@rollup/rollup-win32-ia32-msvc@4.44.2': + resolution: + { + integrity: sha512-+qMUrkbUurpE6DVRjiJCNGZBGo9xM4Y0FXU5cjgudWqIBWbcLkjE3XprJUsOFgC6xjBClwVa9k6O3A7K3vxb5Q==, + } cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.44.0': - resolution: {integrity: sha512-Q2Mgwt+D8hd5FIPUuPDsvPR7Bguza6yTkJxspDGkZj7tBRn2y4KSWYuIXpftFSjBra76TbKerCV7rgFPQrn+wQ==} + '@rollup/rollup-win32-x64-msvc@4.44.2': + resolution: + { + integrity: sha512-3+QZROYfJ25PDcxFF66UEk8jGWigHJeecZILvkPkyQN7oc5BvFo4YEXFkOs154j3FTMp9mn9Ky8RCOwastduEA==, + } cpu: [x64] os: [win32] '@rtsao/scc@1.1.0': - resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} + resolution: + { + integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==, + } '@scure/base@1.1.9': - resolution: {integrity: sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg==} + resolution: + { + integrity: sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg==, + } '@scure/base@1.2.6': - resolution: {integrity: sha512-g/nm5FgUa//MCj1gV09zTJTaM6KBAHqLN907YVQqf7zC49+DcO4B1so4ZX07Ef10Twr6nuqYEH9GEggFXA4Fmg==} + resolution: + { + integrity: sha512-g/nm5FgUa//MCj1gV09zTJTaM6KBAHqLN907YVQqf7zC49+DcO4B1so4ZX07Ef10Twr6nuqYEH9GEggFXA4Fmg==, + } '@scure/bip32@1.4.0': - resolution: {integrity: sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg==} + resolution: + { + integrity: sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg==, + } '@scure/bip32@1.7.0': - resolution: {integrity: sha512-E4FFX/N3f4B80AKWp5dP6ow+flD1LQZo/w8UnLGYZO674jS6YnYeepycOOksv+vLPSpgN35wgKgy+ybfTb2SMw==} + resolution: + { + integrity: sha512-E4FFX/N3f4B80AKWp5dP6ow+flD1LQZo/w8UnLGYZO674jS6YnYeepycOOksv+vLPSpgN35wgKgy+ybfTb2SMw==, + } '@scure/bip39@1.3.0': - resolution: {integrity: sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ==} + resolution: + { + integrity: sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ==, + } '@scure/bip39@1.6.0': - resolution: {integrity: sha512-+lF0BbLiJNwVlev4eKelw1WWLaiKXw7sSl8T6FvBlWkdX+94aGJ4o8XjUdlyhTCjd8c+B3KT3JfS8P0bLRNU6A==} + resolution: + { + integrity: sha512-+lF0BbLiJNwVlev4eKelw1WWLaiKXw7sSl8T6FvBlWkdX+94aGJ4o8XjUdlyhTCjd8c+B3KT3JfS8P0bLRNU6A==, + } '@sindresorhus/is@4.6.0': - resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==, + } + engines: { node: '>=10' } '@sindresorhus/merge-streams@2.3.0': - resolution: {integrity: sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==, + } + engines: { node: '>=18' } '@sinonjs/commons@1.8.6': - resolution: {integrity: sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==} + resolution: + { + integrity: sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==, + } '@sinonjs/formatio@3.2.2': - resolution: {integrity: sha512-B8SEsgd8gArBLMD6zpRw3juQ2FVSsmdd7qlevyDqzS9WTCtvF55/gAL+h6gue8ZvPYcdiPdvueM/qm//9XzyTQ==} + resolution: + { + integrity: sha512-B8SEsgd8gArBLMD6zpRw3juQ2FVSsmdd7qlevyDqzS9WTCtvF55/gAL+h6gue8ZvPYcdiPdvueM/qm//9XzyTQ==, + } '@sinonjs/samsam@3.3.3': - resolution: {integrity: sha512-bKCMKZvWIjYD0BLGnNrxVuw4dkWCYsLqFOUWw8VgKF/+5Y+mE7LfHWPIYoDXowH+3a9LsWDMo0uAP8YDosPvHQ==} + resolution: + { + integrity: sha512-bKCMKZvWIjYD0BLGnNrxVuw4dkWCYsLqFOUWw8VgKF/+5Y+mE7LfHWPIYoDXowH+3a9LsWDMo0uAP8YDosPvHQ==, + } '@sinonjs/text-encoding@0.7.3': - resolution: {integrity: sha512-DE427ROAphMQzU4ENbliGYrBSYPXF+TtLg9S8vzeA+OF4ZKzoDdzfL8sxuMUGS/lgRhM6j1URSk9ghf7Xo1tyA==} - - '@storybook/addon-docs@9.0.12': - resolution: {integrity: sha512-bAuFy4BWGEBIC0EAS4N+V8mHj7NZiSdDnJUSr4Al3znEVzNHLpQAMRznkga2Ok8x+gwcyBG7W47dLbDXVqLZDg==} + resolution: + { + integrity: sha512-DE427ROAphMQzU4ENbliGYrBSYPXF+TtLg9S8vzeA+OF4ZKzoDdzfL8sxuMUGS/lgRhM6j1URSk9ghf7Xo1tyA==, + } + + '@storybook/addon-docs@9.0.16': + resolution: + { + integrity: sha512-/ZXaxMC/JqL0cnVuyPHXdJhNvgCrKvxcnM3ACdgBLsEIGcIqegPF+Ahkb2f9sjU36sR7ihT81cL/7cUvQwzd4Q==, + } peerDependencies: - storybook: ^9.0.12 + storybook: ^9.0.16 - '@storybook/addon-onboarding@9.0.12': - resolution: {integrity: sha512-hqgaINYMDiA2op+Cb77LvwdJkgpMUMAnp5ugJjkn5icLpSTkZxnaQrlC0lTHOZBxUjR5NlS2ApSAuMvrCXQLAw==} + '@storybook/addon-onboarding@9.0.16': + resolution: + { + integrity: sha512-69BPJ9fGNGpDAcGvNJ58V5uQOmpHkQMLcgp/ON3NepoCHiSReUzojB6wV8Ag13PUZmvWXVnE14SWKBZp93xTFQ==, + } peerDependencies: - storybook: ^9.0.12 + storybook: ^9.0.16 - '@storybook/addon-themes@9.0.12': - resolution: {integrity: sha512-Pp2RYhHGjkMcmkDYuUCSoJ6FgEbWPC3LdyedXiyyaY7p93dWWIRn2ZeXsYxSi71RYYvnbijulShjYwfzBbCeDQ==} + '@storybook/addon-themes@9.0.16': + resolution: + { + integrity: sha512-lzUkriN/DqEbokZTQlleob+1Tkuccv+3LLOGlP9hgk45ug3iiPV67Uq8iZapr7lofSJ525QnMB2XktkPReDpYA==, + } peerDependencies: - storybook: ^9.0.12 + storybook: ^9.0.16 '@storybook/addon-webpack5-compiler-swc@3.0.0': - resolution: {integrity: sha512-qkQwQEvHlxwPCHz/xakGfXJusEa1gKMw7enELh6QGopblfN3rMiV084boqiIqBReqWTasSwHOqvuElAu0NQ+8w==} - engines: {node: '>=18'} - - '@storybook/builder-webpack5@9.0.12': - resolution: {integrity: sha512-zfmGYZjDppYPZZgSwW9ZRfIrCvshZcLombKmVEodlt/RMs5N5zaTCNf5p7+Z1BBcRpH5HXHWjwmrlobW6LzsLg==} + resolution: + { + integrity: sha512-qkQwQEvHlxwPCHz/xakGfXJusEa1gKMw7enELh6QGopblfN3rMiV084boqiIqBReqWTasSwHOqvuElAu0NQ+8w==, + } + engines: { node: '>=18' } + + '@storybook/builder-webpack5@9.0.16': + resolution: + { + integrity: sha512-Hb45cgUr6aYK24HBt42EGApbJVosunt7x6DTjawHD2BAqpfSxo6urLnKFIhx8H+af88XN37MTbp5bNozvw4WPA==, + } peerDependencies: - storybook: ^9.0.12 + storybook: ^9.0.16 typescript: '*' peerDependenciesMeta: typescript: optional: true - '@storybook/core-webpack@9.0.12': - resolution: {integrity: sha512-soFgpQh8pfba94YjkFBMNO4460/NEhdWe2WUPJs5drz2tOyGSElYma9KKjkbn+SQtr4qG0Xu7P56e8DJMXiMDg==} + '@storybook/core-webpack@9.0.16': + resolution: + { + integrity: sha512-U1SiqRywp6pu0DNy1uSH6b6B4aw7clYvICf+HNRzULYfS6V7ZHD2VaBmcf1xgx0aqVEPUGv6f46oZr2pzmcjGw==, + } peerDependencies: - storybook: ^9.0.12 + storybook: ^9.0.16 - '@storybook/csf-plugin@9.0.12': - resolution: {integrity: sha512-5EueJQJAu77Lh+EedG4Q/kEOZNlTY/g+fWsT7B5DTtLVy0ypnghsHY8X3KYT/0+NNgTtoO0if4F+ejVYaLnMzA==} + '@storybook/csf-plugin@9.0.16': + resolution: + { + integrity: sha512-MSmfPwI0j1mMAc+R3DVkVBQf2KLzaVn2SLdEwweesx63Nh9j3zu9CqKEa0zOuDX1lR2M0DZU0lV6K4sc2EYI4A==, + } peerDependencies: - storybook: ^9.0.12 + storybook: ^9.0.16 + + '@storybook/csf@0.1.13': + resolution: + { + integrity: sha512-7xOOwCLGB3ebM87eemep89MYRFTko+D8qE7EdAAq74lgdqRR5cOUtYWJLjO2dLtP94nqoOdHJo6MdLLKzg412Q==, + } '@storybook/global@5.0.0': - resolution: {integrity: sha512-FcOqPAXACP0I3oJ/ws6/rrPT9WGhu915Cg8D02a9YxLo0DE9zI+a9A5gRGvmQ09fiWPukqI8ZAEoQEdWUKMQdQ==} + resolution: + { + integrity: sha512-FcOqPAXACP0I3oJ/ws6/rrPT9WGhu915Cg8D02a9YxLo0DE9zI+a9A5gRGvmQ09fiWPukqI8ZAEoQEdWUKMQdQ==, + } '@storybook/icons@1.4.0': - resolution: {integrity: sha512-Td73IeJxOyalzvjQL+JXx72jlIYHgs+REaHiREOqfpo3A2AYYG71AUbcv+lg7mEDIweKVCxsMQ0UKo634c8XeA==} - engines: {node: '>=14.0.0'} + resolution: + { + integrity: sha512-Td73IeJxOyalzvjQL+JXx72jlIYHgs+REaHiREOqfpo3A2AYYG71AUbcv+lg7mEDIweKVCxsMQ0UKo634c8XeA==, + } + engines: { node: '>=14.0.0' } peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - '@storybook/preset-react-webpack@9.0.12': - resolution: {integrity: sha512-Tl3Qrll29dwltI4lP15zbeSXqikKa4Ucp6NKf4+W/4adzOqGRjj/bIzO3FsIPoGNs4wfy5DsOgUUPHxI4Jx97w==} - engines: {node: '>=20.0.0'} + '@storybook/preset-react-webpack@9.0.16': + resolution: + { + integrity: sha512-esAGMKxeXfbW2O86u9foSOGegGQz78335u9RiCKaHXz6gl/xsoE60q3EEQhYxftO630YRfIXbZY7+N9rvbs78w==, + } + engines: { node: '>=20.0.0' } peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - storybook: ^9.0.12 + storybook: ^9.0.16 typescript: '*' peerDependenciesMeta: typescript: optional: true '@storybook/react-docgen-typescript-plugin@1.0.6--canary.9.0c3f3b7.0': - resolution: {integrity: sha512-KUqXC3oa9JuQ0kZJLBhVdS4lOneKTOopnNBK4tUAgoxWQ3u/IjzdueZjFr7gyBrXMoU6duutk3RQR9u8ZpYJ4Q==} + resolution: + { + integrity: sha512-KUqXC3oa9JuQ0kZJLBhVdS4lOneKTOopnNBK4tUAgoxWQ3u/IjzdueZjFr7gyBrXMoU6duutk3RQR9u8ZpYJ4Q==, + } peerDependencies: typescript: '>= 4.x' webpack: '>= 4' - '@storybook/react-dom-shim@9.0.12': - resolution: {integrity: sha512-OMBitzkJRga/UJF1ScSnaxgBSlAVePCK8wzPkGDn0MmsjZ4oDWuNZeKnVO1+tb6n2rZHws7RmKGxHzHAZTY+zQ==} + '@storybook/react-dom-shim@9.0.16': + resolution: + { + integrity: sha512-5aIK+31R41mRUvDB4vmBv8hwh3IVHIk/Zbs6kkWF2a+swOsB2+a06aLX21lma4/0T/AuFVXHWat0+inQ4nrXRg==, + } peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - storybook: ^9.0.12 - - '@storybook/react-webpack5@9.0.12': - resolution: {integrity: sha512-SHVwmmnodGcvLn0pclPu4P9b3qexUXTFPsGmtjQnGObZ3AqhjWiei8h4pYtX8m8zhu419QWevykJq6oWvYzHdA==} - engines: {node: '>=20.0.0'} + storybook: ^9.0.16 + + '@storybook/react-webpack5@9.0.16': + resolution: + { + integrity: sha512-0m2JKE+ZiEquC6CBwVnsgzOFlkRNNRKnBUJg/K38QSeK62l3zD8Dy7j19LQzUUyMCnYdKYql67kKn8tDOeekOw==, + } + engines: { node: '>=20.0.0' } peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - storybook: ^9.0.12 + storybook: ^9.0.16 typescript: '>= 4.9.x' peerDependenciesMeta: typescript: optional: true - '@storybook/react@9.0.12': - resolution: {integrity: sha512-rDrf5MDfsguNDTSOfGqhAjQDhp3jDMdzAoCqLjQ75M647C8nsv9i+fftO3k0rMxIJRrESpZWqVZ4tsjOX+J3DA==} - engines: {node: '>=20.0.0'} + '@storybook/react@9.0.16': + resolution: + { + integrity: sha512-1jk9fBe8vEoZrba9cK19ZDdZgYMXUNl3Egjj5RsTMYMc1L2mtIu9o56VyK/1V4Q52N9IyawHvmIIuxc5pCZHkQ==, + } + engines: { node: '>=20.0.0' } peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - storybook: ^9.0.12 + storybook: ^9.0.16 typescript: '>= 4.9.x' peerDependenciesMeta: typescript: optional: true '@svgr/babel-plugin-add-jsx-attribute@5.4.0': - resolution: {integrity: sha512-ZFf2gs/8/6B8PnSofI0inYXr2SDNTDScPXhN7k5EqD4aZ3gi6u+rbmZHVB8IM3wDyx8ntKACZbtXSm7oZGRqVg==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-ZFf2gs/8/6B8PnSofI0inYXr2SDNTDScPXhN7k5EqD4aZ3gi6u+rbmZHVB8IM3wDyx8ntKACZbtXSm7oZGRqVg==, + } + engines: { node: '>=10' } '@svgr/babel-plugin-remove-jsx-attribute@5.4.0': - resolution: {integrity: sha512-yaS4o2PgUtwLFGTKbsiAy6D0o3ugcUhWK0Z45umJ66EPWunAz9fuFw2gJuje6wqQvQWOTJvIahUwndOXb7QCPg==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-yaS4o2PgUtwLFGTKbsiAy6D0o3ugcUhWK0Z45umJ66EPWunAz9fuFw2gJuje6wqQvQWOTJvIahUwndOXb7QCPg==, + } + engines: { node: '>=10' } '@svgr/babel-plugin-remove-jsx-empty-expression@5.0.1': - resolution: {integrity: sha512-LA72+88A11ND/yFIMzyuLRSMJ+tRKeYKeQ+mR3DcAZ5I4h5CPWN9AHyUzJbWSYp/u2u0xhmgOe0+E41+GjEueA==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-LA72+88A11ND/yFIMzyuLRSMJ+tRKeYKeQ+mR3DcAZ5I4h5CPWN9AHyUzJbWSYp/u2u0xhmgOe0+E41+GjEueA==, + } + engines: { node: '>=10' } '@svgr/babel-plugin-replace-jsx-attribute-value@5.0.1': - resolution: {integrity: sha512-PoiE6ZD2Eiy5mK+fjHqwGOS+IXX0wq/YDtNyIgOrc6ejFnxN4b13pRpiIPbtPwHEc+NT2KCjteAcq33/F1Y9KQ==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-PoiE6ZD2Eiy5mK+fjHqwGOS+IXX0wq/YDtNyIgOrc6ejFnxN4b13pRpiIPbtPwHEc+NT2KCjteAcq33/F1Y9KQ==, + } + engines: { node: '>=10' } '@svgr/babel-plugin-svg-dynamic-title@5.4.0': - resolution: {integrity: sha512-zSOZH8PdZOpuG1ZVx/cLVePB2ibo3WPpqo7gFIjLV9a0QsuQAzJiwwqmuEdTaW2pegyBE17Uu15mOgOcgabQZg==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-zSOZH8PdZOpuG1ZVx/cLVePB2ibo3WPpqo7gFIjLV9a0QsuQAzJiwwqmuEdTaW2pegyBE17Uu15mOgOcgabQZg==, + } + engines: { node: '>=10' } '@svgr/babel-plugin-svg-em-dimensions@5.4.0': - resolution: {integrity: sha512-cPzDbDA5oT/sPXDCUYoVXEmm3VIoAWAPT6mSPTJNbQaBNUuEKVKyGH93oDY4e42PYHRW67N5alJx/eEol20abw==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-cPzDbDA5oT/sPXDCUYoVXEmm3VIoAWAPT6mSPTJNbQaBNUuEKVKyGH93oDY4e42PYHRW67N5alJx/eEol20abw==, + } + engines: { node: '>=10' } '@svgr/babel-plugin-transform-react-native-svg@5.4.0': - resolution: {integrity: sha512-3eYP/SaopZ41GHwXma7Rmxcv9uRslRDTY1estspeB1w1ueZWd/tPlMfEOoccYpEMZU3jD4OU7YitnXcF5hLW2Q==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-3eYP/SaopZ41GHwXma7Rmxcv9uRslRDTY1estspeB1w1ueZWd/tPlMfEOoccYpEMZU3jD4OU7YitnXcF5hLW2Q==, + } + engines: { node: '>=10' } '@svgr/babel-plugin-transform-svg-component@5.5.0': - resolution: {integrity: sha512-q4jSH1UUvbrsOtlo/tKcgSeiCHRSBdXoIoqX1pgcKK/aU3JD27wmMKwGtpB8qRYUYoyXvfGxUVKchLuR5pB3rQ==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-q4jSH1UUvbrsOtlo/tKcgSeiCHRSBdXoIoqX1pgcKK/aU3JD27wmMKwGtpB8qRYUYoyXvfGxUVKchLuR5pB3rQ==, + } + engines: { node: '>=10' } '@svgr/babel-preset@5.5.0': - resolution: {integrity: sha512-4FiXBjvQ+z2j7yASeGPEi8VD/5rrGQk4Xrq3EdJmoZgz/tpqChpo5hgXDvmEauwtvOc52q8ghhZK4Oy7qph4ig==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-4FiXBjvQ+z2j7yASeGPEi8VD/5rrGQk4Xrq3EdJmoZgz/tpqChpo5hgXDvmEauwtvOc52q8ghhZK4Oy7qph4ig==, + } + engines: { node: '>=10' } '@svgr/core@5.5.0': - resolution: {integrity: sha512-q52VOcsJPvV3jO1wkPtzTuKlvX7Y3xIcWRpCMtBF3MrteZJtBfQw/+u0B1BHy5ColpQc1/YVTrPEtSYIMNZlrQ==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-q52VOcsJPvV3jO1wkPtzTuKlvX7Y3xIcWRpCMtBF3MrteZJtBfQw/+u0B1BHy5ColpQc1/YVTrPEtSYIMNZlrQ==, + } + engines: { node: '>=10' } '@svgr/hast-util-to-babel-ast@5.5.0': - resolution: {integrity: sha512-cAaR/CAiZRB8GP32N+1jocovUtvlj0+e65TB50/6Lcime+EA49m/8l+P2ko+XPJ4dw3xaPS3jOL4F2X4KWxoeQ==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-cAaR/CAiZRB8GP32N+1jocovUtvlj0+e65TB50/6Lcime+EA49m/8l+P2ko+XPJ4dw3xaPS3jOL4F2X4KWxoeQ==, + } + engines: { node: '>=10' } '@svgr/plugin-jsx@5.5.0': - resolution: {integrity: sha512-V/wVh33j12hGh05IDg8GpIUXbjAPnTdPTKuP4VNLggnwaHMPNQNae2pRnyTAILWCQdz5GyMqtO488g7CKM8CBA==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-V/wVh33j12hGh05IDg8GpIUXbjAPnTdPTKuP4VNLggnwaHMPNQNae2pRnyTAILWCQdz5GyMqtO488g7CKM8CBA==, + } + engines: { node: '>=10' } '@svgr/plugin-svgo@5.5.0': - resolution: {integrity: sha512-r5swKk46GuQl4RrVejVwpeeJaydoxkdwkM1mBKOgJLBUJPGaLci6ylg/IjhrRsREKDkr4kbMWdgOtbXEh0fyLQ==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-r5swKk46GuQl4RrVejVwpeeJaydoxkdwkM1mBKOgJLBUJPGaLci6ylg/IjhrRsREKDkr4kbMWdgOtbXEh0fyLQ==, + } + engines: { node: '>=10' } '@svgr/webpack@5.5.0': - resolution: {integrity: sha512-DOBOK255wfQxguUta2INKkzPj6AIS6iafZYiYmHn6W3pHlycSRRlvWKCfLDG10fXfLWqE3DJHgRUOyJYmARa7g==} - engines: {node: '>=10'} - - '@swc/core-darwin-arm64@1.12.1': - resolution: {integrity: sha512-nUjWVcJ3YS2N40ZbKwYO2RJ4+o2tWYRzNOcIQp05FqW0+aoUCVMdAUUzQinPDynfgwVshDAXCKemY8X7nN5MaA==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-DOBOK255wfQxguUta2INKkzPj6AIS6iafZYiYmHn6W3pHlycSRRlvWKCfLDG10fXfLWqE3DJHgRUOyJYmARa7g==, + } + engines: { node: '>=10' } + + '@swc/core-darwin-arm64@1.12.11': + resolution: + { + integrity: sha512-J19Jj9Y5x/N0loExH7W0OI9OwwoVyxutDdkyq1o/kgXyBqmmzV7Y/Q9QekI2Fm/qc5mNeAdP7aj4boY4AY/JPw==, + } + engines: { node: '>=10' } cpu: [arm64] os: [darwin] - '@swc/core-darwin-x64@1.12.1': - resolution: {integrity: sha512-OGm4a4d3OeJn+tRt8H/eiHgTFrJbS6r8mi/Ob65tAEXZGHN900T2kR7c5ALr0V2hBOQ8BfhexwPoQlGQP/B95w==} - engines: {node: '>=10'} + '@swc/core-darwin-x64@1.12.11': + resolution: + { + integrity: sha512-PTuUQrfStQ6cjW+uprGO2lpQHy84/l0v+GqRqq8s/jdK55rFRjMfCeyf6FAR0l6saO5oNOQl+zWR1aNpj8pMQw==, + } + engines: { node: '>=10' } cpu: [x64] os: [darwin] - '@swc/core-linux-arm-gnueabihf@1.12.1': - resolution: {integrity: sha512-76YeeQKyK0EtNkQiNBZ0nbVGooPf9IucY0WqVXVpaU4wuG7ZyLEE2ZAIgXafIuzODGQoLfetue7I8boMxh1/MA==} - engines: {node: '>=10'} + '@swc/core-linux-arm-gnueabihf@1.12.11': + resolution: + { + integrity: sha512-poxBq152HsupOtnZilenvHmxZ9a8SRj4LtfxUnkMDNOGrZR9oxbQNwEzNKfi3RXEcXz+P8c0Rai1ubBazXv8oQ==, + } + engines: { node: '>=10' } cpu: [arm] os: [linux] - '@swc/core-linux-arm64-gnu@1.12.1': - resolution: {integrity: sha512-BxJDIJPq1+aCh9UsaSAN6wo3tuln8UhNXruOrzTI8/ElIig/3sAueDM6Eq7GvZSGGSA7ljhNATMJ0elD7lFatQ==} - engines: {node: '>=10'} + '@swc/core-linux-arm64-gnu@1.12.11': + resolution: + { + integrity: sha512-y1HNamR/D0Hc8xIE910ysyLe269UYiGaQPoLjQS0phzWFfWdMj9bHM++oydVXZ4RSWycO7KyJ3uvw4NilvyMKQ==, + } + engines: { node: '>=10' } cpu: [arm64] os: [linux] - '@swc/core-linux-arm64-musl@1.12.1': - resolution: {integrity: sha512-NhLdbffSXvY0/FwUSAl4hKBlpe5GHQGXK8DxTo3HHjLsD9sCPYieo3vG0NQoUYAy4ZUY1WeGjyxeq4qZddJzEQ==} - engines: {node: '>=10'} + '@swc/core-linux-arm64-musl@1.12.11': + resolution: + { + integrity: sha512-LlBxPh/32pyQsu2emMEOFRm7poEFLsw12Y1mPY7FWZiZeptomKSOSHRzKDz9EolMiV4qhK1caP1lvW4vminYgQ==, + } + engines: { node: '>=10' } cpu: [arm64] os: [linux] - '@swc/core-linux-x64-gnu@1.12.1': - resolution: {integrity: sha512-CrYnV8SZIgArQ9LKH0xEF95PKXzX9WkRSc5j55arOSBeDCeDUQk1Bg/iKdnDiuj5HC1hZpvzwMzSBJjv+Z70jA==} - engines: {node: '>=10'} + '@swc/core-linux-x64-gnu@1.12.11': + resolution: + { + integrity: sha512-bOjiZB8O/1AzHkzjge1jqX62HGRIpOHqFUrGPfAln/NC6NR+Z2A78u3ixV7k5KesWZFhCV0YVGJL+qToL27myA==, + } + engines: { node: '>=10' } cpu: [x64] os: [linux] - '@swc/core-linux-x64-musl@1.12.1': - resolution: {integrity: sha512-BQMl3d0HaGB0/h2xcKlGtjk/cGRn2tnbsaChAKcjFdCepblKBCz1pgO/mL7w5iXq3s57wMDUn++71/a5RAkZOA==} - engines: {node: '>=10'} + '@swc/core-linux-x64-musl@1.12.11': + resolution: + { + integrity: sha512-4dzAtbT/m3/UjF045+33gLiHd8aSXJDoqof7gTtu4q0ZyAf7XJ3HHspz+/AvOJLVo4FHHdFcdXhmo/zi1nFn8A==, + } + engines: { node: '>=10' } cpu: [x64] os: [linux] - '@swc/core-win32-arm64-msvc@1.12.1': - resolution: {integrity: sha512-b7NeGnpqTfmIGtUqXBl0KqoSmOnH64nRZoT5l4BAGdvwY7nxitWR94CqZuwyLPty/bLywmyDA9uO12Kvgb3+gg==} - engines: {node: '>=10'} + '@swc/core-win32-arm64-msvc@1.12.11': + resolution: + { + integrity: sha512-h8HiwBZErKvCAmjW92JvQp0iOqm6bncU4ac5jxBGkRApabpUenNJcj3h2g5O6GL5K6T9/WhnXE5gyq/s1fhPQg==, + } + engines: { node: '>=10' } cpu: [arm64] os: [win32] - '@swc/core-win32-ia32-msvc@1.12.1': - resolution: {integrity: sha512-iU/29X2D7cHBp1to62cUg/5Xk8K+lyOJiKIGGW5rdzTW/c2zz3d/ehgpzVP/rqC4NVr88MXspqHU4il5gmDajw==} - engines: {node: '>=10'} + '@swc/core-win32-ia32-msvc@1.12.11': + resolution: + { + integrity: sha512-1pwr325mXRNUhxTtXmx1IokV5SiRL+6iDvnt3FRXj+X5UvXXKtg2zeyftk+03u8v8v8WUr5I32hIypVJPTNxNg==, + } + engines: { node: '>=10' } cpu: [ia32] os: [win32] - '@swc/core-win32-x64-msvc@1.12.1': - resolution: {integrity: sha512-+Zh+JKDwiFqV5N9yAd2DhYVGPORGh9cfenu1ptr9yge+eHAf7vZJcC3rnj6QMR1QJh0Y5VC9+YBjRFjZVA7XDw==} - engines: {node: '>=10'} + '@swc/core-win32-x64-msvc@1.12.11': + resolution: + { + integrity: sha512-5gggWo690Gvs7XiPxAmb5tHwzB9RTVXUV7AWoGb6bmyUd1OXYaebQF0HAOtade5jIoNhfQMQJ7QReRgt/d2jAA==, + } + engines: { node: '>=10' } cpu: [x64] os: [win32] - '@swc/core@1.12.1': - resolution: {integrity: sha512-aKXdDTqxTVFl/bKQZ3EQUjEMBEoF6JBv29moMZq0kbVO43na6u/u+3Vcbhbrh+A2N0X5OL4RaveuWfAjEgOmeA==} - engines: {node: '>=10'} + '@swc/core@1.12.11': + resolution: + { + integrity: sha512-P3GM+0lqjFctcp5HhR9mOcvLSX3SptI9L1aux0Fuvgt8oH4f92rCUrkodAa0U2ktmdjcyIiG37xg2mb/dSCYSA==, + } + engines: { node: '>=10' } peerDependencies: '@swc/helpers': '>=0.5.17' peerDependenciesMeta: @@ -2238,587 +3668,1075 @@ packages: optional: true '@swc/counter@0.1.3': - resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} + resolution: + { + integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==, + } '@swc/types@0.1.23': - resolution: {integrity: sha512-u1iIVZV9Q0jxY+yM2vw/hZGDNudsN85bBpTqzAQ9rzkxW9D+e3aEM4Han+ow518gSewkXgjmEK0BD79ZcNVgPw==} + resolution: + { + integrity: sha512-u1iIVZV9Q0jxY+yM2vw/hZGDNudsN85bBpTqzAQ9rzkxW9D+e3aEM4Han+ow518gSewkXgjmEK0BD79ZcNVgPw==, + } '@szmarczak/http-timer@4.0.6': - resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==, + } + engines: { node: '>=10' } '@testing-library/dom@10.4.0': - resolution: {integrity: sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==, + } + engines: { node: '>=18' } '@testing-library/jest-dom@6.6.3': - resolution: {integrity: sha512-IteBhl4XqYNkM54f4ejhLRJiZNqcSCoXUOG2CPK7qbD322KjQozM4kHQOfkG2oln9b9HTYqs+Sae8vBATubxxA==} - engines: {node: '>=14', npm: '>=6', yarn: '>=1'} + resolution: + { + integrity: sha512-IteBhl4XqYNkM54f4ejhLRJiZNqcSCoXUOG2CPK7qbD322KjQozM4kHQOfkG2oln9b9HTYqs+Sae8vBATubxxA==, + } + engines: { node: '>=14', npm: '>=6', yarn: '>=1' } '@testing-library/user-event@14.6.1': - resolution: {integrity: sha512-vq7fv0rnt+QTXgPxr5Hjc210p6YKq2kmdziLgnsZGgLJ9e6VAShx1pACLuRjd/AS/sr7phAR58OIIpf0LlmQNw==} - engines: {node: '>=12', npm: '>=6'} + resolution: + { + integrity: sha512-vq7fv0rnt+QTXgPxr5Hjc210p6YKq2kmdziLgnsZGgLJ9e6VAShx1pACLuRjd/AS/sr7phAR58OIIpf0LlmQNw==, + } + engines: { node: '>=12', npm: '>=6' } peerDependencies: '@testing-library/dom': '>=7.21.4' - '@tootallnate/once@1.1.2': - resolution: {integrity: sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==} - engines: {node: '>= 6'} - '@trustwallet/wallet-core@4.3.6': - resolution: {integrity: sha512-X+n2CzDhIfUtnQtqqM3Su6XmBdzUijMu8uQEnA9yQWfOv7d33LfaQ9vNbzvpFk4I52K7n6AWLaylM1unuIuTJQ==} + resolution: + { + integrity: sha512-X+n2CzDhIfUtnQtqqM3Su6XmBdzUijMu8uQEnA9yQWfOv7d33LfaQ9vNbzvpFk4I52K7n6AWLaylM1unuIuTJQ==, + } '@tsconfig/node10@1.0.11': - resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==} + resolution: + { + integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==, + } '@tsconfig/node12@1.0.11': - resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} + resolution: + { + integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==, + } '@tsconfig/node14@1.0.3': - resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} + resolution: + { + integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==, + } '@tsconfig/node16@1.0.4': - resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} + resolution: + { + integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==, + } '@tsparticles/basic@3.8.1': - resolution: {integrity: sha512-my114zRmekT/+I2cGuEnHxlX5G/jO0iVtNnsxxlsgspXUTSY+fDixmrNF4UgFkuaIwd9Bv/yH+7S/4HE4qte7A==} + resolution: + { + integrity: sha512-my114zRmekT/+I2cGuEnHxlX5G/jO0iVtNnsxxlsgspXUTSY+fDixmrNF4UgFkuaIwd9Bv/yH+7S/4HE4qte7A==, + } '@tsparticles/engine@3.8.1': - resolution: {integrity: sha512-S8h10nuZfElY7oih//NUHnT5qf4v3/dnsU8CMs7dz5lBEGr3amrYrXk0V+YKPTIQwfdmJHUaSBoAqFiv4aEGIA==} + resolution: + { + integrity: sha512-S8h10nuZfElY7oih//NUHnT5qf4v3/dnsU8CMs7dz5lBEGr3amrYrXk0V+YKPTIQwfdmJHUaSBoAqFiv4aEGIA==, + } '@tsparticles/interaction-external-attract@3.8.1': - resolution: {integrity: sha512-GWzyj5MOzjb5pNWuqAueNZS2ilPcZ0isiqwcb0BjjpwfiGfL72UyIbNUDMLncsW+4jcwB4WyMsv/qOGDmAwVfQ==} + resolution: + { + integrity: sha512-GWzyj5MOzjb5pNWuqAueNZS2ilPcZ0isiqwcb0BjjpwfiGfL72UyIbNUDMLncsW+4jcwB4WyMsv/qOGDmAwVfQ==, + } '@tsparticles/interaction-external-bounce@3.8.1': - resolution: {integrity: sha512-tgVzsE3orneSeSUc1XhRD6Iqs8Rkm11iRdkncKSpNx4SI2eJWFPhwit2wIiHQ+IuvgCmM2DXRtLgEVeaux71zg==} + resolution: + { + integrity: sha512-tgVzsE3orneSeSUc1XhRD6Iqs8Rkm11iRdkncKSpNx4SI2eJWFPhwit2wIiHQ+IuvgCmM2DXRtLgEVeaux71zg==, + } '@tsparticles/interaction-external-bubble@3.8.1': - resolution: {integrity: sha512-edRVFybiVFd5vEjfEkHgrBTXfPTKc05EqCmRuOEd5gOll1ui0nPtknzj9JiLrPacQAJ7OgZKlHWYQb1u5Yy5Tw==} + resolution: + { + integrity: sha512-edRVFybiVFd5vEjfEkHgrBTXfPTKc05EqCmRuOEd5gOll1ui0nPtknzj9JiLrPacQAJ7OgZKlHWYQb1u5Yy5Tw==, + } '@tsparticles/interaction-external-connect@3.8.1': - resolution: {integrity: sha512-DQ0nNB0VDSxFxeaJQvm91NDUU/UPoiHE+uUzyw5qSoWJEGTUOj/QkW0GuBinCo99i8MH/wLDqMS9nb+7ZejpUw==} + resolution: + { + integrity: sha512-DQ0nNB0VDSxFxeaJQvm91NDUU/UPoiHE+uUzyw5qSoWJEGTUOj/QkW0GuBinCo99i8MH/wLDqMS9nb+7ZejpUw==, + } '@tsparticles/interaction-external-grab@3.8.1': - resolution: {integrity: sha512-nPaHrazEr14CGokGGkFHYXZJTN3Inshe04uQNj+Rj4Lz9dAIqq8EFuSejp0g9lk2cTHWfVf4SK4r8+aJz9Ow4Q==} + resolution: + { + integrity: sha512-nPaHrazEr14CGokGGkFHYXZJTN3Inshe04uQNj+Rj4Lz9dAIqq8EFuSejp0g9lk2cTHWfVf4SK4r8+aJz9Ow4Q==, + } '@tsparticles/interaction-external-pause@3.8.1': - resolution: {integrity: sha512-W+6bjNDddtzlikwnfmk2G/GJsz4ZnoqvK0c63earvnPNUAJmkzrvmLS52JoaIOSyclOIeD4LmubT6IsQDv5ohA==} + resolution: + { + integrity: sha512-W+6bjNDddtzlikwnfmk2G/GJsz4ZnoqvK0c63earvnPNUAJmkzrvmLS52JoaIOSyclOIeD4LmubT6IsQDv5ohA==, + } '@tsparticles/interaction-external-push@3.8.1': - resolution: {integrity: sha512-LgaXaBM5QXRCeYt3DzphEhE/OirEGnV4iJrXKGJ/FrYMH7kOao85rPmCtYQNYzIy6K0XstmATmTvFRziZ/M4VQ==} + resolution: + { + integrity: sha512-LgaXaBM5QXRCeYt3DzphEhE/OirEGnV4iJrXKGJ/FrYMH7kOao85rPmCtYQNYzIy6K0XstmATmTvFRziZ/M4VQ==, + } '@tsparticles/interaction-external-remove@3.8.1': - resolution: {integrity: sha512-mwo1DRJPIqzrWfs2G+kfQ5/HyM5j/soIj11zur3BkIlm9vdYIxUpA+hvO734oekSjJxY7YFmYUaqc4vC5TFE5w==} + resolution: + { + integrity: sha512-mwo1DRJPIqzrWfs2G+kfQ5/HyM5j/soIj11zur3BkIlm9vdYIxUpA+hvO734oekSjJxY7YFmYUaqc4vC5TFE5w==, + } '@tsparticles/interaction-external-repulse@3.8.1': - resolution: {integrity: sha512-r0E828zrKIRHA27daItHtI9QEp1tO8d8dmF8Ld8+orn7q0+BKG+uGvNTYJFZ+hqR+lp5AkLOiThf7L2wLS9M1A==} + resolution: + { + integrity: sha512-r0E828zrKIRHA27daItHtI9QEp1tO8d8dmF8Ld8+orn7q0+BKG+uGvNTYJFZ+hqR+lp5AkLOiThf7L2wLS9M1A==, + } '@tsparticles/interaction-external-slow@3.8.1': - resolution: {integrity: sha512-U4P6c9V6/fSDsWchD4oAYAIPHA/203LzQ7+792cMxa7YThza0VS7YyJUQ1PACjGMmfeKbE34/eoGPqESKakeLw==} + resolution: + { + integrity: sha512-U4P6c9V6/fSDsWchD4oAYAIPHA/203LzQ7+792cMxa7YThza0VS7YyJUQ1PACjGMmfeKbE34/eoGPqESKakeLw==, + } '@tsparticles/interaction-external-trail@3.8.1': - resolution: {integrity: sha512-CUiTxCtTASYdqi55KpJ98IRnuLS+G66v+s1/dZeAE7F7wzL7tkcUBQ3hP1yzBpFmKsoYHJfz9nAfocAkgRb6hg==} + resolution: + { + integrity: sha512-CUiTxCtTASYdqi55KpJ98IRnuLS+G66v+s1/dZeAE7F7wzL7tkcUBQ3hP1yzBpFmKsoYHJfz9nAfocAkgRb6hg==, + } '@tsparticles/interaction-particles-attract@3.8.1': - resolution: {integrity: sha512-lo5JAVdeh1tQq/7SDsIllNdyIJgF3hSquWLARUIwGolezD91bEmHp/rlhTscX5NrqiM3y7z3inJPhR0nP5kGeg==} + resolution: + { + integrity: sha512-lo5JAVdeh1tQq/7SDsIllNdyIJgF3hSquWLARUIwGolezD91bEmHp/rlhTscX5NrqiM3y7z3inJPhR0nP5kGeg==, + } '@tsparticles/interaction-particles-collisions@3.8.1': - resolution: {integrity: sha512-teqn1CZVoJkT/ubhkb4R/H1rnx7DoIeerHXS5uME+vrLIqzkn8QlWdEdTJ7PhdB+Ct2iYAeXCrJWwIqnKaAL3w==} + resolution: + { + integrity: sha512-teqn1CZVoJkT/ubhkb4R/H1rnx7DoIeerHXS5uME+vrLIqzkn8QlWdEdTJ7PhdB+Ct2iYAeXCrJWwIqnKaAL3w==, + } '@tsparticles/interaction-particles-links@3.8.1': - resolution: {integrity: sha512-D+X7wEWyhfV7J0uDWf5vWDhxjfaNovNZW0BWscR9qSy8pl3hjRpv0sJ/QaQFscmK5SzVz28tUFDRLbH1aV5v/Q==} + resolution: + { + integrity: sha512-D+X7wEWyhfV7J0uDWf5vWDhxjfaNovNZW0BWscR9qSy8pl3hjRpv0sJ/QaQFscmK5SzVz28tUFDRLbH1aV5v/Q==, + } '@tsparticles/move-base@3.8.1': - resolution: {integrity: sha512-DNFRL1QT8ZQYLg3fIk74EbHJq5HGOq9CM2bCci9dDcdymvN4L7aWVFQavRiWDbi3y1EUW3+jeHSMbD3qHAfOeA==} + resolution: + { + integrity: sha512-DNFRL1QT8ZQYLg3fIk74EbHJq5HGOq9CM2bCci9dDcdymvN4L7aWVFQavRiWDbi3y1EUW3+jeHSMbD3qHAfOeA==, + } '@tsparticles/move-parallax@3.8.1': - resolution: {integrity: sha512-umrIttaJGUgfxpnolbMU2BekoN4gw0RgcfVsWR7jzHErA7eTzdJ2mikbQFD+3/1DfTDgJOjWx+dy8a3G/bSsZg==} + resolution: + { + integrity: sha512-umrIttaJGUgfxpnolbMU2BekoN4gw0RgcfVsWR7jzHErA7eTzdJ2mikbQFD+3/1DfTDgJOjWx+dy8a3G/bSsZg==, + } '@tsparticles/plugin-absorbers@3.8.1': - resolution: {integrity: sha512-Di2Gncl3tCOCkLr2xZH8qCTVop3ES1r4lnLGDfmWPwUoSwSAUDE1epXKuf/9aLgdCMe7B4v/BGIr3YKUtTO3ww==} + resolution: + { + integrity: sha512-Di2Gncl3tCOCkLr2xZH8qCTVop3ES1r4lnLGDfmWPwUoSwSAUDE1epXKuf/9aLgdCMe7B4v/BGIr3YKUtTO3ww==, + } '@tsparticles/plugin-easing-quad@3.8.1': - resolution: {integrity: sha512-+BiPNHgsNbbh0AhWKjrmJaAu5c37naqjbME8ZYl0BClI0AC5AzBUaezYRxECaLrdtHJvKrZXFMr6Q0sxjDc6QQ==} + resolution: + { + integrity: sha512-+BiPNHgsNbbh0AhWKjrmJaAu5c37naqjbME8ZYl0BClI0AC5AzBUaezYRxECaLrdtHJvKrZXFMr6Q0sxjDc6QQ==, + } '@tsparticles/plugin-emitters-shape-circle@3.8.1': - resolution: {integrity: sha512-YmUzR5I0Yotadsz/UstDzhRAxEKkJBZ3SSF3y0TcP4t7CDyv5moMzi0W1bW/MeT7rt8d8RLYsS9qyOX/5a5DDw==} + resolution: + { + integrity: sha512-YmUzR5I0Yotadsz/UstDzhRAxEKkJBZ3SSF3y0TcP4t7CDyv5moMzi0W1bW/MeT7rt8d8RLYsS9qyOX/5a5DDw==, + } '@tsparticles/plugin-emitters-shape-square@3.8.1': - resolution: {integrity: sha512-hg8a9ZD3PPRuNW8y/jqrRS2J153DkVvAfSdsO+l2PASG8vYVaxzUD1kqAUknUhNZmhg3BvtwQp+ojCNaat5/Lg==} + resolution: + { + integrity: sha512-hg8a9ZD3PPRuNW8y/jqrRS2J153DkVvAfSdsO+l2PASG8vYVaxzUD1kqAUknUhNZmhg3BvtwQp+ojCNaat5/Lg==, + } '@tsparticles/plugin-emitters@3.8.1': - resolution: {integrity: sha512-PGldE3OHs1hsZM6a8qHpXvKIMhaWAqZNwq8v7FwgJGxikXVvYtkKSaWslTpID3hYvtB6+whKig2uWURmq2TUsg==} + resolution: + { + integrity: sha512-PGldE3OHs1hsZM6a8qHpXvKIMhaWAqZNwq8v7FwgJGxikXVvYtkKSaWslTpID3hYvtB6+whKig2uWURmq2TUsg==, + } '@tsparticles/plugin-hex-color@3.8.1': - resolution: {integrity: sha512-AmgB7XIYBCvg5HcqYb19YpcjEx2k4DpU2e24n0rradDDeqKKcz7EWI/08FlAnDb5HUs1em63vaAanl1vdm3+OA==} + resolution: + { + integrity: sha512-AmgB7XIYBCvg5HcqYb19YpcjEx2k4DpU2e24n0rradDDeqKKcz7EWI/08FlAnDb5HUs1em63vaAanl1vdm3+OA==, + } '@tsparticles/plugin-hsl-color@3.8.1': - resolution: {integrity: sha512-Ja6oEX6yu0064e4a+Fv1TBJiG5y0hqWwoOKSqf/Ra/zo01ageOEvDVX70FOVSrP+iEPGPznKVNcZs1tEOOvO0g==} + resolution: + { + integrity: sha512-Ja6oEX6yu0064e4a+Fv1TBJiG5y0hqWwoOKSqf/Ra/zo01ageOEvDVX70FOVSrP+iEPGPznKVNcZs1tEOOvO0g==, + } '@tsparticles/plugin-rgb-color@3.8.1': - resolution: {integrity: sha512-xNLqnaFUYjU+7dCHQXjZdM4UojUAVorPVmXlYmkh1xmujLljEaFTwCg1UJVlNq+fXENIFkeaf3/XT0U/q0ZBTA==} + resolution: + { + integrity: sha512-xNLqnaFUYjU+7dCHQXjZdM4UojUAVorPVmXlYmkh1xmujLljEaFTwCg1UJVlNq+fXENIFkeaf3/XT0U/q0ZBTA==, + } '@tsparticles/react@3.0.0': - resolution: {integrity: sha512-hjGEtTT1cwv6BcjL+GcVgH++KYs52bIuQGW3PWv7z3tMa8g0bd6RI/vWSLj7p//NZ3uTjEIeilYIUPBh7Jfq/Q==} + resolution: + { + integrity: sha512-hjGEtTT1cwv6BcjL+GcVgH++KYs52bIuQGW3PWv7z3tMa8g0bd6RI/vWSLj7p//NZ3uTjEIeilYIUPBh7Jfq/Q==, + } peerDependencies: '@tsparticles/engine': ^3.0.2 react: '>=16.8.0' react-dom: '>=16.8.0' '@tsparticles/shape-circle@3.8.1': - resolution: {integrity: sha512-dM/f+qcpd8/KfviuVuKiTS8KLDE/T7xxHK7EI2S49yPW6yrJJBXdL7T4N9/n/6PF+Wslcl+kf/eTDjEAI3WjNQ==} + resolution: + { + integrity: sha512-dM/f+qcpd8/KfviuVuKiTS8KLDE/T7xxHK7EI2S49yPW6yrJJBXdL7T4N9/n/6PF+Wslcl+kf/eTDjEAI3WjNQ==, + } '@tsparticles/shape-emoji@3.8.1': - resolution: {integrity: sha512-xiXNZ/afdecengUXhOqgUwR+vysgaseVpzEjoGoliOMWq4WHWv+S6ujNfes2oz3x736mTlvKdXcEWRncSXaKWw==} + resolution: + { + integrity: sha512-xiXNZ/afdecengUXhOqgUwR+vysgaseVpzEjoGoliOMWq4WHWv+S6ujNfes2oz3x736mTlvKdXcEWRncSXaKWw==, + } '@tsparticles/shape-image@3.8.1': - resolution: {integrity: sha512-7Yi25uLXvcY5A6TzyVBjYPsTmeTrE+0a2YO8kdp3O7V9NRGCSfXKnPRFp+lNOTiQRRvOG+SSzx2G18dfc/jwQg==} + resolution: + { + integrity: sha512-7Yi25uLXvcY5A6TzyVBjYPsTmeTrE+0a2YO8kdp3O7V9NRGCSfXKnPRFp+lNOTiQRRvOG+SSzx2G18dfc/jwQg==, + } '@tsparticles/shape-line@3.8.1': - resolution: {integrity: sha512-aXVKkpGLgi1hbU/JO+opzy3OTt6PfxWrhGZyI0ms3vdcRX9uYlq4GoNUoKPVfntjWzhecF+FNNZ9gqUG/+WZLQ==} + resolution: + { + integrity: sha512-aXVKkpGLgi1hbU/JO+opzy3OTt6PfxWrhGZyI0ms3vdcRX9uYlq4GoNUoKPVfntjWzhecF+FNNZ9gqUG/+WZLQ==, + } '@tsparticles/shape-polygon@3.8.1': - resolution: {integrity: sha512-1pAx85NJbgmsOngl+ZAYH8vxwPJmoddjWCbWTD0wlp/x+2NRjn1iaGBKObPKLgwVzsAXb9qNHMsUX/x0C54svw==} + resolution: + { + integrity: sha512-1pAx85NJbgmsOngl+ZAYH8vxwPJmoddjWCbWTD0wlp/x+2NRjn1iaGBKObPKLgwVzsAXb9qNHMsUX/x0C54svw==, + } '@tsparticles/shape-square@3.8.1': - resolution: {integrity: sha512-4cjDt6542dkc15zxG1VYT7ScgPXM3+5VGtwMfh5CYNBx+GZZ3R+XUo1Q66JadcqKcNdHXfMWbXCMxs0GaiTtSw==} + resolution: + { + integrity: sha512-4cjDt6542dkc15zxG1VYT7ScgPXM3+5VGtwMfh5CYNBx+GZZ3R+XUo1Q66JadcqKcNdHXfMWbXCMxs0GaiTtSw==, + } '@tsparticles/shape-star@3.8.1': - resolution: {integrity: sha512-wBxnawqan/ocguNxY6cOEXF+YVnLIUmGBlnVGYx/7U9E2UHuHEKkoumob4fUflKISjvj5eQLpm/E1eUfYMd6RA==} + resolution: + { + integrity: sha512-wBxnawqan/ocguNxY6cOEXF+YVnLIUmGBlnVGYx/7U9E2UHuHEKkoumob4fUflKISjvj5eQLpm/E1eUfYMd6RA==, + } '@tsparticles/shape-text@3.8.1': - resolution: {integrity: sha512-PuEQobjHE5F/G2anv87b4K+wrBBuqE6H08Pm7BAb+qDl/LDmVZrrYrm4xl1DP07M/fhBJZpaBSgQ/m/5synSHw==} + resolution: + { + integrity: sha512-PuEQobjHE5F/G2anv87b4K+wrBBuqE6H08Pm7BAb+qDl/LDmVZrrYrm4xl1DP07M/fhBJZpaBSgQ/m/5synSHw==, + } '@tsparticles/slim@3.8.1': - resolution: {integrity: sha512-b6JV8MrxMz0XYn0eBCI/Mq8VCRyeaWfUyQaQyxLiRd96xpBXCeULooJF+Eaz9it1sUI898a5QfvY8djNXs4OJw==} + resolution: + { + integrity: sha512-b6JV8MrxMz0XYn0eBCI/Mq8VCRyeaWfUyQaQyxLiRd96xpBXCeULooJF+Eaz9it1sUI898a5QfvY8djNXs4OJw==, + } '@tsparticles/updater-color@3.8.1': - resolution: {integrity: sha512-HKrZzrF8YJ+TD+FdIwaWOPV565bkBhe+Ewj7CwKblG7H/SG+C6n1xIYobXkGP5pYkkQ+Cm1UV/Aq0Ih7sa+rJg==} + resolution: + { + integrity: sha512-HKrZzrF8YJ+TD+FdIwaWOPV565bkBhe+Ewj7CwKblG7H/SG+C6n1xIYobXkGP5pYkkQ+Cm1UV/Aq0Ih7sa+rJg==, + } '@tsparticles/updater-destroy@3.8.1': - resolution: {integrity: sha512-OMy8zZv3ujiaLw1i2BNWOhDgBPNnDiKlTwIP1mK0N9cYOplJkgaxmHOc7NhCndnLvZaYHqfN2bujLK2iBgNdbw==} + resolution: + { + integrity: sha512-OMy8zZv3ujiaLw1i2BNWOhDgBPNnDiKlTwIP1mK0N9cYOplJkgaxmHOc7NhCndnLvZaYHqfN2bujLK2iBgNdbw==, + } '@tsparticles/updater-life@3.8.1': - resolution: {integrity: sha512-5rCFFKD7js1lKgTpKOLo2OfmisWp4qqMVUVR4bNPeR0Ne/dcwDbKDzWyYS2AMsvWv/gcTTtWiarRfAiVQ5HtNg==} + resolution: + { + integrity: sha512-5rCFFKD7js1lKgTpKOLo2OfmisWp4qqMVUVR4bNPeR0Ne/dcwDbKDzWyYS2AMsvWv/gcTTtWiarRfAiVQ5HtNg==, + } '@tsparticles/updater-opacity@3.8.1': - resolution: {integrity: sha512-41dJ0T7df7AUFFkV9yU0buUfUwh+hLYcViXxkDy+6CJiiNCNZ4H404w1DTpBQLL4fbxUcDk9BXZLV7gkE2OfAw==} + resolution: + { + integrity: sha512-41dJ0T7df7AUFFkV9yU0buUfUwh+hLYcViXxkDy+6CJiiNCNZ4H404w1DTpBQLL4fbxUcDk9BXZLV7gkE2OfAw==, + } '@tsparticles/updater-out-modes@3.8.1': - resolution: {integrity: sha512-BY8WqQwoDFpgPybwTzBU2GnxtRkjWnGStqBnR53x5+f1j7geTSY6WjcOvl1W+IkjtwtjiifriwBl41EbqMrjdQ==} + resolution: + { + integrity: sha512-BY8WqQwoDFpgPybwTzBU2GnxtRkjWnGStqBnR53x5+f1j7geTSY6WjcOvl1W+IkjtwtjiifriwBl41EbqMrjdQ==, + } '@tsparticles/updater-roll@3.8.1': - resolution: {integrity: sha512-KYFTfMr8/M5pYBJFUFVrkogJURtKO5ogNSocOCf0v2QLMsbT5+OKNO7CLtxPZD98vTGRD3CHlt53/PF0tSesDA==} + resolution: + { + integrity: sha512-KYFTfMr8/M5pYBJFUFVrkogJURtKO5ogNSocOCf0v2QLMsbT5+OKNO7CLtxPZD98vTGRD3CHlt53/PF0tSesDA==, + } '@tsparticles/updater-rotate@3.8.1': - resolution: {integrity: sha512-gpI07H1+diuuUdhJsQ1RlfHSD3fzBJrjyuwGuoXgHmvKzak6EWKpYfUMOraH4Dm41m/4kJZelle4nST+NpIuoA==} + resolution: + { + integrity: sha512-gpI07H1+diuuUdhJsQ1RlfHSD3fzBJrjyuwGuoXgHmvKzak6EWKpYfUMOraH4Dm41m/4kJZelle4nST+NpIuoA==, + } '@tsparticles/updater-size@3.8.1': - resolution: {integrity: sha512-SC2ZxewtpwKadCalotK6x2YanxRO3hTMW1Rxzx9V2rcjAIgh/Nw49Vuithy2TDq8RtTc9rHDAPic2vMQ/lYQwA==} + resolution: + { + integrity: sha512-SC2ZxewtpwKadCalotK6x2YanxRO3hTMW1Rxzx9V2rcjAIgh/Nw49Vuithy2TDq8RtTc9rHDAPic2vMQ/lYQwA==, + } '@tsparticles/updater-stroke-color@3.8.1': - resolution: {integrity: sha512-rofHCf5oRHP2H+BTJ4D3r4mTqZtre3c8bsdJHATle26+gLpzbt6I1a83wAY8xnsQa1BNnRAfEsnb7GpdZ1vYaw==} + resolution: + { + integrity: sha512-rofHCf5oRHP2H+BTJ4D3r4mTqZtre3c8bsdJHATle26+gLpzbt6I1a83wAY8xnsQa1BNnRAfEsnb7GpdZ1vYaw==, + } '@tsparticles/updater-tilt@3.8.1': - resolution: {integrity: sha512-qMVd/sjrAds8m6vXFH5YKN8zrQR9SLdn5N5EvHx/JuKpOut4NhG85u8AEJL6ct1g7hY8Zj9kfi/dDSSovkaHhw==} + resolution: + { + integrity: sha512-qMVd/sjrAds8m6vXFH5YKN8zrQR9SLdn5N5EvHx/JuKpOut4NhG85u8AEJL6ct1g7hY8Zj9kfi/dDSSovkaHhw==, + } '@tsparticles/updater-twinkle@3.8.1': - resolution: {integrity: sha512-ETJ1zLYp4vjSjmXDiXXr0yW4Vw8sL6XixM0NPU3yx/dKCVi9SGVMlRymfkxJV+9jMuU/pUCCmRnIdDS7YrDGmw==} + resolution: + { + integrity: sha512-ETJ1zLYp4vjSjmXDiXXr0yW4Vw8sL6XixM0NPU3yx/dKCVi9SGVMlRymfkxJV+9jMuU/pUCCmRnIdDS7YrDGmw==, + } '@tsparticles/updater-wobble@3.8.1': - resolution: {integrity: sha512-PkjVgeSkW0EebJQ9PdpwSMWU2fAvKsVSuH4KGmodYlgGkH0/zvKjMOPMEI6YRAor1/vF1soFyLYp9Vax7Ae13g==} + resolution: + { + integrity: sha512-PkjVgeSkW0EebJQ9PdpwSMWU2fAvKsVSuH4KGmodYlgGkH0/zvKjMOPMEI6YRAor1/vF1soFyLYp9Vax7Ae13g==, + } '@tybys/wasm-util@0.9.0': - resolution: {integrity: sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==} + resolution: + { + integrity: sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==, + } '@types/accepts@1.3.7': - resolution: {integrity: sha512-Pay9fq2lM2wXPWbteBsRAGiWH2hig4ZE2asK+mm7kUzlxRTfL961rj89I6zV/E3PcIkDqyuBEcMxFT7rccugeQ==} + resolution: + { + integrity: sha512-Pay9fq2lM2wXPWbteBsRAGiWH2hig4ZE2asK+mm7kUzlxRTfL961rj89I6zV/E3PcIkDqyuBEcMxFT7rccugeQ==, + } '@types/aria-query@5.0.4': - resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} + resolution: + { + integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==, + } '@types/babel__core@7.20.5': - resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + resolution: + { + integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==, + } '@types/babel__generator@7.27.0': - resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==} + resolution: + { + integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==, + } '@types/babel__template@7.4.4': - resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + resolution: + { + integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==, + } '@types/babel__traverse@7.20.7': - resolution: {integrity: sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==} + resolution: + { + integrity: sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==, + } '@types/bn.js@4.11.6': - resolution: {integrity: sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==} + resolution: + { + integrity: sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==, + } '@types/bn.js@5.2.0': - resolution: {integrity: sha512-DLbJ1BPqxvQhIGbeu8VbUC1DiAiahHtAYvA0ZEAa4P31F7IaArc8z3C3BRQdWX4mtLQuABG4yzp76ZrS02Ui1Q==} + resolution: + { + integrity: sha512-DLbJ1BPqxvQhIGbeu8VbUC1DiAiahHtAYvA0ZEAa4P31F7IaArc8z3C3BRQdWX4mtLQuABG4yzp76ZrS02Ui1Q==, + } '@types/body-parser@1.19.6': - resolution: {integrity: sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==} + resolution: + { + integrity: sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==, + } '@types/cacheable-request@6.0.3': - resolution: {integrity: sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==} + resolution: + { + integrity: sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==, + } '@types/chai@5.2.2': - resolution: {integrity: sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==} + resolution: + { + integrity: sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==, + } '@types/chrome@0.0.281': - resolution: {integrity: sha512-MH+8FFrJ1POZwKnKRBa+jZcVp+yCFxes6PYKvgFd0qLTzoQe+TdejC3dkA8gSs8UGjFKrKzu4AkZypmswv0NOg==} + resolution: + { + integrity: sha512-MH+8FFrJ1POZwKnKRBa+jZcVp+yCFxes6PYKvgFd0qLTzoQe+TdejC3dkA8gSs8UGjFKrKzu4AkZypmswv0NOg==, + } '@types/connect@3.4.38': - resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} + resolution: + { + integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==, + } '@types/content-disposition@0.5.9': - resolution: {integrity: sha512-8uYXI3Gw35MhiVYhG3s295oihrxRyytcRHjSjqnqZVDDy/xcGBRny7+Xj1Wgfhv5QzRtN2hB2dVRBUX9XW3UcQ==} + resolution: + { + integrity: sha512-8uYXI3Gw35MhiVYhG3s295oihrxRyytcRHjSjqnqZVDDy/xcGBRny7+Xj1Wgfhv5QzRtN2hB2dVRBUX9XW3UcQ==, + } + + '@types/conventional-commits-parser@5.0.1': + resolution: + { + integrity: sha512-7uz5EHdzz2TqoMfV7ee61Egf5y6NkcO4FB/1iCCQnbeiI1F3xzv3vK5dBCXUCLQgGYS+mUeigK1iKQzvED+QnQ==, + } '@types/cookies@0.9.1': - resolution: {integrity: sha512-E/DPgzifH4sM1UMadJMWd6mO2jOd4g1Ejwzx8/uRCDpJis1IrlyQEcGAYEomtAqRYmD5ORbNXMeI9U0RiVGZbg==} + resolution: + { + integrity: sha512-E/DPgzifH4sM1UMadJMWd6mO2jOd4g1Ejwzx8/uRCDpJis1IrlyQEcGAYEomtAqRYmD5ORbNXMeI9U0RiVGZbg==, + } '@types/d3-array@3.2.1': - resolution: {integrity: sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==} + resolution: + { + integrity: sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==, + } '@types/d3-color@3.1.3': - resolution: {integrity: sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==} + resolution: + { + integrity: sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==, + } '@types/d3-ease@3.0.2': - resolution: {integrity: sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==} + resolution: + { + integrity: sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==, + } '@types/d3-interpolate@3.0.4': - resolution: {integrity: sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==} + resolution: + { + integrity: sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==, + } '@types/d3-path@3.1.1': - resolution: {integrity: sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==} + resolution: + { + integrity: sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==, + } '@types/d3-scale@4.0.9': - resolution: {integrity: sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==} + resolution: + { + integrity: sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==, + } '@types/d3-shape@3.1.7': - resolution: {integrity: sha512-VLvUQ33C+3J+8p+Daf+nYSOsjB4GXp19/S/aGo60m9h1v6XaxjiT82lKVWJCfzhtuZ3yD7i/TPeC/fuKLLOSmg==} + resolution: + { + integrity: sha512-VLvUQ33C+3J+8p+Daf+nYSOsjB4GXp19/S/aGo60m9h1v6XaxjiT82lKVWJCfzhtuZ3yD7i/TPeC/fuKLLOSmg==, + } '@types/d3-time@3.0.4': - resolution: {integrity: sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==} + resolution: + { + integrity: sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==, + } '@types/d3-timer@3.0.2': - resolution: {integrity: sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==} + resolution: + { + integrity: sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==, + } '@types/debug@4.1.12': - resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + resolution: + { + integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==, + } '@types/deep-eql@4.0.2': - resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} + resolution: + { + integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==, + } '@types/doctrine@0.0.9': - resolution: {integrity: sha512-eOIHzCUSH7SMfonMG1LsC2f8vxBFtho6NGBznK41R84YzPuvSBzrhEps33IsQiOW9+VL6NQ9DbjQJznk/S4uRA==} + resolution: + { + integrity: sha512-eOIHzCUSH7SMfonMG1LsC2f8vxBFtho6NGBznK41R84YzPuvSBzrhEps33IsQiOW9+VL6NQ9DbjQJznk/S4uRA==, + } '@types/eslint-scope@3.7.7': - resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} + resolution: + { + integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==, + } '@types/eslint@9.6.1': - resolution: {integrity: sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==} + resolution: + { + integrity: sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==, + } '@types/estree@1.0.8': - resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + resolution: + { + integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==, + } - '@types/express-serve-static-core@5.0.6': - resolution: {integrity: sha512-3xhRnjJPkULekpSzgtoNYYcTWgEZkp4myc+Saevii5JPnHNvHMRlBSHDbs7Bh1iPPoVTERHEZXyhyLbMEsExsA==} + '@types/express-serve-static-core@5.0.7': + resolution: + { + integrity: sha512-R+33OsgWw7rOhD1emjU7dzCDHucJrgJXMA5PYCzJxVil0dsyx5iBEPHqpPfiKNJQb7lZ1vxwoLR4Z87bBUpeGQ==, + } '@types/express@5.0.3': - resolution: {integrity: sha512-wGA0NX93b19/dZC1J18tKWVIYWyyF2ZjT9vin/NRu0qzzvfVzWjs04iq2rQ3H65vCTQYlRqs3YHfY7zjdV+9Kw==} + resolution: + { + integrity: sha512-wGA0NX93b19/dZC1J18tKWVIYWyyF2ZjT9vin/NRu0qzzvfVzWjs04iq2rQ3H65vCTQYlRqs3YHfY7zjdV+9Kw==, + } '@types/filesystem@0.0.36': - resolution: {integrity: sha512-vPDXOZuannb9FZdxgHnqSwAG/jvdGM8Wq+6N4D/d80z+D4HWH+bItqsZaVRQykAn6WEVeEkLm2oQigyHtgb0RA==} + resolution: + { + integrity: sha512-vPDXOZuannb9FZdxgHnqSwAG/jvdGM8Wq+6N4D/d80z+D4HWH+bItqsZaVRQykAn6WEVeEkLm2oQigyHtgb0RA==, + } '@types/filewriter@0.0.33': - resolution: {integrity: sha512-xFU8ZXTw4gd358lb2jw25nxY9QAgqn2+bKKjKOYfNCzN4DKCFetK7sPtrlpg66Ywe3vWY9FNxprZawAh9wfJ3g==} + resolution: + { + integrity: sha512-xFU8ZXTw4gd358lb2jw25nxY9QAgqn2+bKKjKOYfNCzN4DKCFetK7sPtrlpg66Ywe3vWY9FNxprZawAh9wfJ3g==, + } '@types/har-format@1.2.16': - resolution: {integrity: sha512-fluxdy7ryD3MV6h8pTfTYpy/xQzCFC7m89nOH9y94cNqJ1mDIDPut7MnRHI3F6qRmh/cT2fUjG1MLdCNb4hE9A==} - - '@types/history@4.7.11': - resolution: {integrity: sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==} + resolution: + { + integrity: sha512-fluxdy7ryD3MV6h8pTfTYpy/xQzCFC7m89nOH9y94cNqJ1mDIDPut7MnRHI3F6qRmh/cT2fUjG1MLdCNb4hE9A==, + } '@types/html-minifier-terser@6.1.0': - resolution: {integrity: sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==} + resolution: + { + integrity: sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==, + } '@types/http-assert@1.5.6': - resolution: {integrity: sha512-TTEwmtjgVbYAzZYWyeHPrrtWnfVkm8tQkP8P21uQifPgMRgjrow3XDEYqucuC8SKZJT7pUnhU/JymvjggxO9vw==} + resolution: + { + integrity: sha512-TTEwmtjgVbYAzZYWyeHPrrtWnfVkm8tQkP8P21uQifPgMRgjrow3XDEYqucuC8SKZJT7pUnhU/JymvjggxO9vw==, + } '@types/http-cache-semantics@4.0.4': - resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==} + resolution: + { + integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==, + } '@types/http-errors@2.0.5': - resolution: {integrity: sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==} + resolution: + { + integrity: sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==, + } '@types/json-schema@7.0.15': - resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + resolution: + { + integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==, + } '@types/json5@0.0.29': - resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} + resolution: + { + integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==, + } '@types/keygrip@1.0.6': - resolution: {integrity: sha512-lZuNAY9xeJt7Bx4t4dx0rYCDqGPW8RXhQZK1td7d4H6E9zYbLoOtjBvfwdTKpsyxQI/2jv+armjX/RW+ZNpXOQ==} + resolution: + { + integrity: sha512-lZuNAY9xeJt7Bx4t4dx0rYCDqGPW8RXhQZK1td7d4H6E9zYbLoOtjBvfwdTKpsyxQI/2jv+armjX/RW+ZNpXOQ==, + } '@types/keyv@3.1.4': - resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} + resolution: + { + integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==, + } '@types/koa-compose@3.2.8': - resolution: {integrity: sha512-4Olc63RY+MKvxMwVknCUDhRQX1pFQoBZ/lXcRLP69PQkEpze/0cr8LNqJQe5NFb/b19DWi2a5bTi2VAlQzhJuA==} + resolution: + { + integrity: sha512-4Olc63RY+MKvxMwVknCUDhRQX1pFQoBZ/lXcRLP69PQkEpze/0cr8LNqJQe5NFb/b19DWi2a5bTi2VAlQzhJuA==, + } '@types/koa@2.15.0': - resolution: {integrity: sha512-7QFsywoE5URbuVnG3loe03QXuGajrnotr3gQkXcEBShORai23MePfFYdhz90FEtBBpkyIYQbVD+evKtloCgX3g==} + resolution: + { + integrity: sha512-7QFsywoE5URbuVnG3loe03QXuGajrnotr3gQkXcEBShORai23MePfFYdhz90FEtBBpkyIYQbVD+evKtloCgX3g==, + } - '@types/lodash@4.17.18': - resolution: {integrity: sha512-KJ65INaxqxmU6EoCiJmRPZC9H9RVWCRd349tXM2M3O5NA7cY6YL7c0bHAHQ93NOfTObEQ004kd2QVHs/r0+m4g==} - - '@types/lru-cache@5.1.1': - resolution: {integrity: sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw==} + '@types/lodash@4.17.20': + resolution: + { + integrity: sha512-H3MHACvFUEiujabxhaI/ImO6gUrd8oOurg7LQtS7mbwIXA/cUqWrvBsaeJ23aZEPk1TAYkurjfMbSELfoCXlGA==, + } '@types/mdx@2.0.13': - resolution: {integrity: sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==} + resolution: + { + integrity: sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==, + } '@types/mime@1.3.5': - resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} + resolution: + { + integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==, + } '@types/ms@2.1.0': - resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} + resolution: + { + integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==, + } '@types/node@16.18.126': - resolution: {integrity: sha512-OTcgaiwfGFBKacvfwuHzzn1KLxH/er8mluiy8/uM3sGXHaRe73RrSIj01jow9t4kJEW633Ov+cOexXeiApTyAw==} - - '@types/node@22.15.32': - resolution: {integrity: sha512-3jigKqgSjsH6gYZv2nEsqdXfZqIFGAV36XYYjf9KGZ3PSG+IhLecqPnI310RvjutyMwifE2hhhNEklOUrvx/wA==} + resolution: + { + integrity: sha512-OTcgaiwfGFBKacvfwuHzzn1KLxH/er8mluiy8/uM3sGXHaRe73RrSIj01jow9t4kJEW633Ov+cOexXeiApTyAw==, + } + + '@types/node@22.16.0': + resolution: + { + integrity: sha512-B2egV9wALML1JCpv3VQoQ+yesQKAmNMBIAY7OteVrikcOcAkWm+dGL6qpeCktPjAv6N1JLnhbNiqS35UpFyBsQ==, + } + + '@types/node@22.16.2': + resolution: + { + integrity: sha512-Cdqa/eJTvt4fC4wmq1Mcc0CPUjp/Qy2FGqLza3z3pKymsI969TcZ54diNJv8UYUgeWxyb8FSbCkhdR6WqmUFhA==, + } '@types/node@22.7.5': - resolution: {integrity: sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ==} + resolution: + { + integrity: sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ==, + } + + '@types/node@24.0.12': + resolution: + { + integrity: sha512-LtOrbvDf5ndC9Xi+4QZjVL0woFymF/xSTKZKPgrrl7H7XoeDvnD+E2IclKVDyaK9UM756W/3BXqSU+JEHopA9g==, + } '@types/offscreencanvas@2019.7.3': - resolution: {integrity: sha512-ieXiYmgSRXUDeOntE1InxjWyvEelZGP63M+cGuquuRLuIKKT1osnkXjxev9B7d1nXSug5vpunx+gNlbVxMlC9A==} + resolution: + { + integrity: sha512-ieXiYmgSRXUDeOntE1InxjWyvEelZGP63M+cGuquuRLuIKKT1osnkXjxev9B7d1nXSug5vpunx+gNlbVxMlC9A==, + } '@types/parse-json@4.0.2': - resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} + resolution: + { + integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==, + } '@types/pbkdf2@3.1.2': - resolution: {integrity: sha512-uRwJqmiXmh9++aSu1VNEn3iIxWOhd8AHXNSdlaLfdAAdSTY9jYVeGWnzejM3dvrkbqE3/hyQkQQ29IFATEGlew==} + resolution: + { + integrity: sha512-uRwJqmiXmh9++aSu1VNEn3iIxWOhd8AHXNSdlaLfdAAdSTY9jYVeGWnzejM3dvrkbqE3/hyQkQQ29IFATEGlew==, + } '@types/prop-types@15.7.15': - resolution: {integrity: sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==} + resolution: + { + integrity: sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==, + } '@types/q@1.5.8': - resolution: {integrity: sha512-hroOstUScF6zhIi+5+x0dzqrHA1EJi+Irri6b1fxolMTqqHIV/Cg77EtnQcZqZCu8hR3mX2BzIxN4/GzI68Kfw==} + resolution: + { + integrity: sha512-hroOstUScF6zhIi+5+x0dzqrHA1EJi+Irri6b1fxolMTqqHIV/Cg77EtnQcZqZCu8hR3mX2BzIxN4/GzI68Kfw==, + } '@types/qs@6.14.0': - resolution: {integrity: sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==} + resolution: + { + integrity: sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==, + } '@types/range-parser@1.2.7': - resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} + resolution: + { + integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==, + } '@types/react-dom@18.3.7': - resolution: {integrity: sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==} + resolution: + { + integrity: sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==, + } peerDependencies: '@types/react': ^18.0.0 - '@types/react-router-dom@5.3.3': - resolution: {integrity: sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw==} - - '@types/react-router@5.1.20': - resolution: {integrity: sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q==} - '@types/react-transition-group@4.4.12': - resolution: {integrity: sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w==} + resolution: + { + integrity: sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w==, + } peerDependencies: '@types/react': '*' '@types/react@18.3.23': - resolution: {integrity: sha512-/LDXMQh55EzZQ0uVAZmKKhfENivEvWz6E+EYzh+/MCjMhNsotd+ZHhBGIjFDTi6+fz0OhQQQLbTgdQIxxCsC0w==} + resolution: + { + integrity: sha512-/LDXMQh55EzZQ0uVAZmKKhfENivEvWz6E+EYzh+/MCjMhNsotd+ZHhBGIjFDTi6+fz0OhQQQLbTgdQIxxCsC0w==, + } '@types/resolve@1.20.6': - resolution: {integrity: sha512-A4STmOXPhMUtHH+S6ymgE2GiBSMqf4oTvcQZMcHzokuTLVYzXTB8ttjcgxOVaAp2lGwEdzZ0J+cRbbeevQj1UQ==} + resolution: + { + integrity: sha512-A4STmOXPhMUtHH+S6ymgE2GiBSMqf4oTvcQZMcHzokuTLVYzXTB8ttjcgxOVaAp2lGwEdzZ0J+cRbbeevQj1UQ==, + } '@types/responselike@1.0.3': - resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==} + resolution: + { + integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==, + } '@types/secp256k1@4.0.6': - resolution: {integrity: sha512-hHxJU6PAEUn0TP4S/ZOzuTUvJWuZ6eIKeNKb5RBpODvSl6hp1Wrw4s7ATY50rklRCScUDpHzVA/DQdSjJ3UoYQ==} + resolution: + { + integrity: sha512-hHxJU6PAEUn0TP4S/ZOzuTUvJWuZ6eIKeNKb5RBpODvSl6hp1Wrw4s7ATY50rklRCScUDpHzVA/DQdSjJ3UoYQ==, + } '@types/semver@7.7.0': - resolution: {integrity: sha512-k107IF4+Xr7UHjwDc7Cfd6PRQfbdkiRabXGRjo07b4WyPahFBZCZ1sE+BNxYIJPPg73UkfOsVOLwqVc/6ETrIA==} + resolution: + { + integrity: sha512-k107IF4+Xr7UHjwDc7Cfd6PRQfbdkiRabXGRjo07b4WyPahFBZCZ1sE+BNxYIJPPg73UkfOsVOLwqVc/6ETrIA==, + } '@types/send@0.17.5': - resolution: {integrity: sha512-z6F2D3cOStZvuk2SaP6YrwkNO65iTZcwA2ZkSABegdkAh/lf+Aa/YQndZVfmEXT5vgAp6zv06VQ3ejSVjAny4w==} + resolution: + { + integrity: sha512-z6F2D3cOStZvuk2SaP6YrwkNO65iTZcwA2ZkSABegdkAh/lf+Aa/YQndZVfmEXT5vgAp6zv06VQ3ejSVjAny4w==, + } '@types/serve-static@1.15.8': - resolution: {integrity: sha512-roei0UY3LhpOJvjbIP6ZZFngyLKl5dskOtDhxY5THRSpO+ZI+nzJ+m5yUMzGrp89YRa7lvknKkMYjqQFGwA7Sg==} + resolution: + { + integrity: sha512-roei0UY3LhpOJvjbIP6ZZFngyLKl5dskOtDhxY5THRSpO+ZI+nzJ+m5yUMzGrp89YRa7lvknKkMYjqQFGwA7Sg==, + } '@types/trusted-types@2.0.7': - resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} + resolution: + { + integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==, + } '@types/webpack@5.28.5': - resolution: {integrity: sha512-wR87cgvxj3p6D0Crt1r5avwqffqPXUkNlnQ1mjU93G7gCuFjufZR4I6j8cz5g1F1tTYpfOOFvly+cmIQwL9wvw==} + resolution: + { + integrity: sha512-wR87cgvxj3p6D0Crt1r5avwqffqPXUkNlnQ1mjU93G7gCuFjufZR4I6j8cz5g1F1tTYpfOOFvly+cmIQwL9wvw==, + } '@types/ws@8.5.3': - resolution: {integrity: sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==} + resolution: + { + integrity: sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==, + } '@types/yauzl@2.10.3': - resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} - - '@typescript-eslint/eslint-plugin@8.34.1': - resolution: {integrity: sha512-STXcN6ebF6li4PxwNeFnqF8/2BNDvBupf2OPx2yWNzr6mKNGF7q49VM00Pz5FaomJyqvbXpY6PhO+T9w139YEQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + resolution: + { + integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==, + } + + '@typescript-eslint/eslint-plugin@8.36.0': + resolution: + { + integrity: sha512-lZNihHUVB6ZZiPBNgOQGSxUASI7UJWhT8nHyUGCnaQ28XFCw98IfrMCG3rUl1uwUWoAvodJQby2KTs79UTcrAg==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } peerDependencies: - '@typescript-eslint/parser': ^8.34.1 + '@typescript-eslint/parser': ^8.36.0 eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/parser@8.34.1': - resolution: {integrity: sha512-4O3idHxhyzjClSMJ0a29AcoK0+YwnEqzI6oz3vlRf3xw0zbzt15MzXwItOlnr5nIth6zlY2RENLsOPvhyrKAQA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/parser@8.36.0': + resolution: + { + integrity: sha512-FuYgkHwZLuPbZjQHzJXrtXreJdFMKl16BFYyRrLxDhWr6Qr7Kbcu2s1Yhu8tsiMXw1S0W1pjfFfYEt+R604s+Q==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/project-service@8.34.1': - resolution: {integrity: sha512-nuHlOmFZfuRwLJKDGQOVc0xnQrAmuq1Mj/ISou5044y1ajGNp2BNliIqp7F2LPQ5sForz8lempMFCovfeS1XoA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/project-service@8.36.0': + resolution: + { + integrity: sha512-JAhQFIABkWccQYeLMrHadu/fhpzmSQ1F1KXkpzqiVxA/iYI6UnRt2trqXHt1sYEcw1mxLnB9rKMsOxXPxowN/g==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } peerDependencies: typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/scope-manager@8.34.1': - resolution: {integrity: sha512-beu6o6QY4hJAgL1E8RaXNC071G4Kso2MGmJskCFQhRhg8VOH/FDbC8soP8NHN7e/Hdphwp8G8cE6OBzC8o41ZA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@typescript-eslint/tsconfig-utils@8.34.1': - resolution: {integrity: sha512-K4Sjdo4/xF9NEeA2khOb7Y5nY6NSXBnod87uniVYW9kHP+hNlDV8trUSFeynA2uxWam4gIWgWoygPrv9VMWrYg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/scope-manager@8.36.0': + resolution: + { + integrity: sha512-wCnapIKnDkN62fYtTGv2+RY8FlnBYA3tNm0fm91kc2BjPhV2vIjwwozJ7LToaLAyb1ca8BxrS7vT+Pvvf7RvqA==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + + '@typescript-eslint/tsconfig-utils@8.36.0': + resolution: + { + integrity: sha512-Nhh3TIEgN18mNbdXpd5Q8mSCBnrZQeY9V7Ca3dqYvNDStNIGRmJA6dmrIPMJ0kow3C7gcQbpsG2rPzy1Ks/AnA==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } peerDependencies: typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/type-utils@8.34.1': - resolution: {integrity: sha512-Tv7tCCr6e5m8hP4+xFugcrwTOucB8lshffJ6zf1mF1TbU67R+ntCc6DzLNKM+s/uzDyv8gLq7tufaAhIBYeV8g==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/type-utils@8.36.0': + resolution: + { + integrity: sha512-5aaGYG8cVDd6cxfk/ynpYzxBRZJk7w/ymto6uiyUFtdCozQIsQWh7M28/6r57Fwkbweng8qAzoMCPwSJfWlmsg==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/types@8.34.1': - resolution: {integrity: sha512-rjLVbmE7HR18kDsjNIZQHxmv9RZwlgzavryL5Lnj2ujIRTeXlKtILHgRNmQ3j4daw7zd+mQgy+uyt6Zo6I0IGA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@typescript-eslint/typescript-estree@8.34.1': - resolution: {integrity: sha512-rjCNqqYPuMUF5ODD+hWBNmOitjBWghkGKJg6hiCHzUvXRy6rK22Jd3rwbP2Xi+R7oYVvIKhokHVhH41BxPV5mA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/types@8.36.0': + resolution: + { + integrity: sha512-xGms6l5cTJKQPZOKM75Dl9yBfNdGeLRsIyufewnxT4vZTrjC0ImQT4fj8QmtJK84F58uSh5HVBSANwcfiXxABQ==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + + '@typescript-eslint/typescript-estree@8.36.0': + resolution: + { + integrity: sha512-JaS8bDVrfVJX4av0jLpe4ye0BpAaUW7+tnS4Y4ETa3q7NoZgzYbN9zDQTJ8kPb5fQ4n0hliAt9tA4Pfs2zA2Hg==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } peerDependencies: typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/utils@8.34.1': - resolution: {integrity: sha512-mqOwUdZ3KjtGk7xJJnLbHxTuWVn3GO2WZZuM+Slhkun4+qthLdXx32C8xIXbO1kfCECb3jIs3eoxK3eryk7aoQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/utils@8.36.0': + resolution: + { + integrity: sha512-VOqmHu42aEMT+P2qYjylw6zP/3E/HvptRwdn/PZxyV27KhZg2IOszXod4NcXisWzPAGSS4trE/g4moNj6XmH2g==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/visitor-keys@8.34.1': - resolution: {integrity: sha512-xoh5rJ+tgsRKoXnkBPFRLZ7rjKM0AfVbC68UZ/ECXoDbfggb9RbEySN359acY1vS3qZ0jVTVWzbtfapwm5ztxw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@unrs/resolver-binding-android-arm-eabi@1.9.1': - resolution: {integrity: sha512-dd7yIp1hfJFX9ZlVLQRrh/Re9WMUHHmF9hrKD1yIvxcyNr2BhQ3xc1upAVhy8NijadnCswAxWQu8MkkSMC1qXQ==} + '@typescript-eslint/visitor-keys@8.36.0': + resolution: + { + integrity: sha512-vZrhV2lRPWDuGoxcmrzRZyxAggPL+qp3WzUrlZD+slFueDiYHxeBa34dUXPuC0RmGKzl4lS5kFJYvKCq9cnNDA==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + + '@unrs/resolver-binding-android-arm-eabi@1.11.0': + resolution: + { + integrity: sha512-LRw5BW29sYj9NsQC6QoqeLVQhEa+BwVINYyMlcve+6stwdBsSt5UB7zw4UZB4+4PNqIVilHoMaPWCb/KhABHQw==, + } cpu: [arm] os: [android] - '@unrs/resolver-binding-android-arm64@1.9.1': - resolution: {integrity: sha512-EzUPcMFtDVlo5yrbzMqUsGq3HnLXw+3ZOhSd7CUaDmbTtnrzM+RO2ntw2dm2wjbbc5djWj3yX0wzbbg8pLhx8g==} + '@unrs/resolver-binding-android-arm64@1.11.0': + resolution: + { + integrity: sha512-zYX8D2zcWCAHqghA8tPjbp7LwjVXbIZP++mpU/Mrf5jUVlk3BWIxkeB8yYzZi5GpFSlqMcRZQxQqbMI0c2lASQ==, + } cpu: [arm64] os: [android] - '@unrs/resolver-binding-darwin-arm64@1.9.1': - resolution: {integrity: sha512-nB+dna3q4kOleKFcSZJ/wDXIsAd1kpMO9XrVAt8tG3RDWJ6vi+Ic6bpz4cmg5tWNeCfHEY4KuqJCB+pKejPEmQ==} + '@unrs/resolver-binding-darwin-arm64@1.11.0': + resolution: + { + integrity: sha512-YsYOT049hevAY/lTYD77GhRs885EXPeAfExG5KenqMJ417nYLS2N/kpRpYbABhFZBVQn+2uRPasTe4ypmYoo3w==, + } cpu: [arm64] os: [darwin] - '@unrs/resolver-binding-darwin-x64@1.9.1': - resolution: {integrity: sha512-aKWHCrOGaCGwZcekf3TnczQoBxk5w//W3RZ4EQyhux6rKDwBPgDU9Y2yGigCV1Z+8DWqZgVGQi+hdpnlSy3a1w==} + '@unrs/resolver-binding-darwin-x64@1.11.0': + resolution: + { + integrity: sha512-PSjvk3OZf1aZImdGY5xj9ClFG3bC4gnSSYWrt+id0UAv+GwwVldhpMFjAga8SpMo2T1GjV9UKwM+QCsQCQmtdA==, + } cpu: [x64] os: [darwin] - '@unrs/resolver-binding-freebsd-x64@1.9.1': - resolution: {integrity: sha512-4dIEMXrXt0UqDVgrsUd1I+NoIzVQWXy/CNhgpfS75rOOMK/4Abn0Mx2M2gWH4Mk9+ds/ASAiCmqoUFynmMY5hA==} + '@unrs/resolver-binding-freebsd-x64@1.11.0': + resolution: + { + integrity: sha512-KC/iFaEN/wsTVYnHClyHh5RSYA9PpuGfqkFua45r4sweXpC0KHZ+BYY7ikfcGPt5w1lMpR1gneFzuqWLQxsRKg==, + } cpu: [x64] os: [freebsd] - '@unrs/resolver-binding-linux-arm-gnueabihf@1.9.1': - resolution: {integrity: sha512-vtvS13IXPs1eE8DuS/soiosqMBeyh50YLRZ+p7EaIKAPPeevRnA9G/wu/KbVt01ZD5qiGjxS+CGIdVC7I6gTOw==} + '@unrs/resolver-binding-linux-arm-gnueabihf@1.11.0': + resolution: + { + integrity: sha512-CDh/0v8uot43cB4yKtDL9CVY8pbPnMV0dHyQCE4lFz6PW/+9tS0i9eqP5a91PAqEBVMqH1ycu+k8rP6wQU846w==, + } cpu: [arm] os: [linux] - '@unrs/resolver-binding-linux-arm-musleabihf@1.9.1': - resolution: {integrity: sha512-BfdnN6aZ7NcX8djW8SR6GOJc+K+sFhWRF4vJueVE0vbUu5N1bLnBpxJg1TGlhSyo+ImC4SR0jcNiKN0jdoxt+A==} + '@unrs/resolver-binding-linux-arm-musleabihf@1.11.0': + resolution: + { + integrity: sha512-+TE7epATDSnvwr3L/hNHX3wQ8KQYB+jSDTdywycg3qDqvavRP8/HX9qdq/rMcnaRDn4EOtallb3vL/5wCWGCkw==, + } cpu: [arm] os: [linux] - '@unrs/resolver-binding-linux-arm64-gnu@1.9.1': - resolution: {integrity: sha512-Jhge7lFtH0QqfRz2PyJjJXWENqywPteITd+nOS0L6AhbZli+UmEyGBd2Sstt1c+l9C+j/YvKTl9wJo9PPmsFNg==} + '@unrs/resolver-binding-linux-arm64-gnu@1.11.0': + resolution: + { + integrity: sha512-VBAYGg3VahofpQ+L4k/ZO8TSICIbUKKTaMYOWHWfuYBFqPbSkArZZLezw3xd27fQkxX4BaLGb/RKnW0dH9Y/UA==, + } cpu: [arm64] os: [linux] - '@unrs/resolver-binding-linux-arm64-musl@1.9.1': - resolution: {integrity: sha512-ofdK/ow+ZSbSU0pRoB7uBaiRHeaAOYQFU5Spp87LdcPL/P1RhbCTMSIYVb61XWzsVEmYKjHFtoIE0wxP6AFvrA==} + '@unrs/resolver-binding-linux-arm64-musl@1.11.0': + resolution: + { + integrity: sha512-9IgGFUUb02J1hqdRAHXpZHIeUHRrbnGo6vrRbz0fREH7g+rzQy53/IBSyadZ/LG5iqMxukriNPu4hEMUn+uWEg==, + } cpu: [arm64] os: [linux] - '@unrs/resolver-binding-linux-ppc64-gnu@1.9.1': - resolution: {integrity: sha512-eC8SXVn8de67HacqU7PoGdHA+9tGbqfEdD05AEFRAB81ejeQtNi5Fx7lPcxpLH79DW0BnMAHau3hi4RVkHfSCw==} + '@unrs/resolver-binding-linux-ppc64-gnu@1.11.0': + resolution: + { + integrity: sha512-LR4iQ/LPjMfivpL2bQ9kmm3UnTas3U+umcCnq/CV7HAkukVdHxrDD1wwx74MIWbbgzQTLPYY7Ur2MnnvkYJCBQ==, + } cpu: [ppc64] os: [linux] - '@unrs/resolver-binding-linux-riscv64-gnu@1.9.1': - resolution: {integrity: sha512-fIkwvAAQ41kfoGWfzeJ33iLGShl0JEDZHrMnwTHMErUcPkaaZRJYjQjsFhMl315NEQ4mmTlC+2nfK/J2IszDOw==} + '@unrs/resolver-binding-linux-riscv64-gnu@1.11.0': + resolution: + { + integrity: sha512-HCupFQwMrRhrOg7YHrobbB5ADg0Q8RNiuefqMHVsdhEy9lLyXm/CxsCXeLJdrg27NAPsCaMDtdlm8Z2X8x91Tg==, + } cpu: [riscv64] os: [linux] - '@unrs/resolver-binding-linux-riscv64-musl@1.9.1': - resolution: {integrity: sha512-RAAszxImSOFLk44aLwnSqpcOdce8sBcxASledSzuFAd8Q5ZhhVck472SisspnzHdc7THCvGXiUeZ2hOC7NUoBQ==} + '@unrs/resolver-binding-linux-riscv64-musl@1.11.0': + resolution: + { + integrity: sha512-Ckxy76A5xgjWa4FNrzcKul5qFMWgP5JSQ5YKd0XakmWOddPLSkQT+uAvUpQNnFGNbgKzv90DyQlxPDYPQ4nd6A==, + } cpu: [riscv64] os: [linux] - '@unrs/resolver-binding-linux-s390x-gnu@1.9.1': - resolution: {integrity: sha512-QoP9vkY+THuQdZi05bA6s6XwFd6HIz3qlx82v9bTOgxeqin/3C12Ye7f7EOD00RQ36OtOPWnhEMMm84sv7d1XQ==} + '@unrs/resolver-binding-linux-s390x-gnu@1.11.0': + resolution: + { + integrity: sha512-HfO0PUCCRte2pMJmVyxPI+eqT7KuV3Fnvn2RPvMe5mOzb2BJKf4/Vth8sSt9cerQboMaTVpbxyYjjLBWIuI5BQ==, + } cpu: [s390x] os: [linux] - '@unrs/resolver-binding-linux-x64-gnu@1.9.1': - resolution: {integrity: sha512-/p77cGN/h9zbsfCseAP5gY7tK+7+DdM8fkPfr9d1ye1fsF6bmtGbtZN6e/8j4jCZ9NEIBBkT0GhdgixSelTK9g==} + '@unrs/resolver-binding-linux-x64-gnu@1.11.0': + resolution: + { + integrity: sha512-9PZdjP7tLOEjpXHS6+B/RNqtfVUyDEmaViPOuSqcbomLdkJnalt5RKQ1tr2m16+qAufV0aDkfhXtoO7DQos/jg==, + } cpu: [x64] os: [linux] - '@unrs/resolver-binding-linux-x64-musl@1.9.1': - resolution: {integrity: sha512-wInTqT3Bu9u50mDStEig1v8uxEL2Ht+K8pir/YhyyrM5ordJtxoqzsL1vR/CQzOJuDunUTrDkMM0apjW/d7/PA==} + '@unrs/resolver-binding-linux-x64-musl@1.11.0': + resolution: + { + integrity: sha512-qkE99ieiSKMnFJY/EfyGKVtNra52/k+lVF/PbO4EL5nU6AdvG4XhtJ+WHojAJP7ID9BNIra/yd75EHndewNRfA==, + } cpu: [x64] os: [linux] - '@unrs/resolver-binding-wasm32-wasi@1.9.1': - resolution: {integrity: sha512-eNwqO5kUa+1k7yFIircwwiniKWA0UFHo2Cfm8LYgkh9km7uMad+0x7X7oXbQonJXlqfitBTSjhA0un+DsHIrhw==} - engines: {node: '>=14.0.0'} + '@unrs/resolver-binding-wasm32-wasi@1.11.0': + resolution: + { + integrity: sha512-MjXek8UL9tIX34gymvQLecz2hMaQzOlaqYJJBomwm1gsvK2F7hF+YqJJ2tRyBDTv9EZJGMt4KlKkSD/gZWCOiw==, + } + engines: { node: '>=14.0.0' } cpu: [wasm32] - '@unrs/resolver-binding-win32-arm64-msvc@1.9.1': - resolution: {integrity: sha512-Eaz1xMUnoa2mFqh20mPqSdbYl6crnk8HnIXDu6nsla9zpgZJZO8w3c1gvNN/4Eb0RXRq3K9OG6mu8vw14gIqiA==} + '@unrs/resolver-binding-win32-arm64-msvc@1.11.0': + resolution: + { + integrity: sha512-9LT6zIGO7CHybiQSh7DnQGwFMZvVr0kUjah6qQfkH2ghucxPV6e71sUXJdSM4Ba0MaGE6DC/NwWf7mJmc3DAng==, + } cpu: [arm64] os: [win32] - '@unrs/resolver-binding-win32-ia32-msvc@1.9.1': - resolution: {integrity: sha512-H/+d+5BGlnEQif0gnwWmYbYv7HJj563PUKJfn8PlmzF8UmF+8KxdvXdwCsoOqh4HHnENnoLrav9NYBrv76x1wQ==} + '@unrs/resolver-binding-win32-ia32-msvc@1.11.0': + resolution: + { + integrity: sha512-HYchBYOZ7WN266VjoGm20xFv5EonG/ODURRgwl9EZT7Bq1nLEs6VKJddzfFdXEAho0wfFlt8L/xIiE29Pmy1RA==, + } cpu: [ia32] os: [win32] - '@unrs/resolver-binding-win32-x64-msvc@1.9.1': - resolution: {integrity: sha512-rS86wI4R6cknYM3is3grCb/laE8XBEbpWAMSIPjYfmYp75KL5dT87jXF2orDa4tQYg5aajP5G8Fgh34dRyR+Rw==} + '@unrs/resolver-binding-win32-x64-msvc@1.11.0': + resolution: + { + integrity: sha512-+oLKLHw3I1UQo4MeHfoLYF+e6YBa8p5vYUw3Rgt7IDzCs+57vIZqQlIo62NDpYM0VG6BjWOwnzBczMvbtH8hag==, + } cpu: [x64] os: [win32] '@vitest/coverage-v8@3.2.4': - resolution: {integrity: sha512-EyF9SXU6kS5Ku/U82E259WSnvg6c8KTjppUncuNdm5QHpe17mwREHnjDzozC8x9MZ0xfBUFSaLkRv4TMA75ALQ==} + resolution: + { + integrity: sha512-EyF9SXU6kS5Ku/U82E259WSnvg6c8KTjppUncuNdm5QHpe17mwREHnjDzozC8x9MZ0xfBUFSaLkRv4TMA75ALQ==, + } peerDependencies: '@vitest/browser': 3.2.4 vitest: 3.2.4 @@ -2826,14 +4744,17 @@ packages: '@vitest/browser': optional: true - '@vitest/expect@3.0.9': - resolution: {integrity: sha512-5eCqRItYgIML7NNVgJj6TVCmdzE7ZVgJhruW0ziSQV4V7PvLkDL1bBkBdcTs/VuIz0IxPb5da1IDSqc1TR9eig==} - '@vitest/expect@3.2.4': - resolution: {integrity: sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==} + resolution: + { + integrity: sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==, + } '@vitest/mocker@3.2.4': - resolution: {integrity: sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==} + resolution: + { + integrity: sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==, + } peerDependencies: msw: ^2.4.9 vite: ^5.0.0 || ^6.0.0 || ^7.0.0-0 @@ -2843,60 +4764,96 @@ packages: vite: optional: true - '@vitest/pretty-format@3.0.9': - resolution: {integrity: sha512-OW9F8t2J3AwFEwENg3yMyKWweF7oRJlMyHOMIhO5F3n0+cgQAJZBjNgrF8dLwFTEXl5jUqBLXd9QyyKv8zEcmA==} - '@vitest/pretty-format@3.2.4': - resolution: {integrity: sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==} + resolution: + { + integrity: sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==, + } '@vitest/runner@3.2.4': - resolution: {integrity: sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==} + resolution: + { + integrity: sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==, + } '@vitest/snapshot@3.2.4': - resolution: {integrity: sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==} - - '@vitest/spy@3.0.9': - resolution: {integrity: sha512-/CcK2UDl0aQ2wtkp3YVWldrpLRNCfVcIOFGlVGKO4R5eajsH393Z1yiXLVQ7vWsj26JOEjeZI0x5sm5P4OGUNQ==} + resolution: + { + integrity: sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==, + } '@vitest/spy@3.2.4': - resolution: {integrity: sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==} - - '@vitest/utils@3.0.9': - resolution: {integrity: sha512-ilHM5fHhZ89MCp5aAaM9uhfl1c2JdxVxl3McqsdVyVNN6JffnEen8UMCdRTzOhGXNQGo5GNL9QugHrz727Wnng==} + resolution: + { + integrity: sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==, + } '@vitest/utils@3.2.4': - resolution: {integrity: sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==} - - '@walletconnect/core@2.21.3': - resolution: {integrity: sha512-kMjo5bI6VOsFe/DmxgeTMxCdAIfSzUzG8kCDrpxUXrTnMgaU4H2JBW+tGn7KP/YY1x49+lErZsN5JiQsE5n6Rw==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==, + } + + '@walletconnect/core@2.21.4': + resolution: + { + integrity: sha512-XtwPUCj3bCNX/2yjYGlQyvcsn32wkzixCjyWOD4pdKFVk7opZPAdF4xr85rmo6nJ7AiBYxjV1IH0bemTPEdE6Q==, + } + engines: { node: '>=18' } '@walletconnect/environment@1.0.1': - resolution: {integrity: sha512-T426LLZtHj8e8rYnKfzsw1aG6+M0BT1ZxayMdv/p8yM0MU+eJDISqNY3/bccxRr4LrF9csq02Rhqt08Ibl0VRg==} + resolution: + { + integrity: sha512-T426LLZtHj8e8rYnKfzsw1aG6+M0BT1ZxayMdv/p8yM0MU+eJDISqNY3/bccxRr4LrF9csq02Rhqt08Ibl0VRg==, + } '@walletconnect/events@1.0.1': - resolution: {integrity: sha512-NPTqaoi0oPBVNuLv7qPaJazmGHs5JGyO8eEAk5VGKmJzDR7AHzD4k6ilox5kxk1iwiOnFopBOOMLs86Oa76HpQ==} + resolution: + { + integrity: sha512-NPTqaoi0oPBVNuLv7qPaJazmGHs5JGyO8eEAk5VGKmJzDR7AHzD4k6ilox5kxk1iwiOnFopBOOMLs86Oa76HpQ==, + } '@walletconnect/heartbeat@1.2.2': - resolution: {integrity: sha512-uASiRmC5MwhuRuf05vq4AT48Pq8RMi876zV8rr8cV969uTOzWdB/k+Lj5yI2PBtB1bGQisGen7MM1GcZlQTBXw==} + resolution: + { + integrity: sha512-uASiRmC5MwhuRuf05vq4AT48Pq8RMi876zV8rr8cV969uTOzWdB/k+Lj5yI2PBtB1bGQisGen7MM1GcZlQTBXw==, + } '@walletconnect/jsonrpc-http-connection@1.0.8': - resolution: {integrity: sha512-+B7cRuaxijLeFDJUq5hAzNyef3e3tBDIxyaCNmFtjwnod5AGis3RToNqzFU33vpVcxFhofkpE7Cx+5MYejbMGw==} + resolution: + { + integrity: sha512-+B7cRuaxijLeFDJUq5hAzNyef3e3tBDIxyaCNmFtjwnod5AGis3RToNqzFU33vpVcxFhofkpE7Cx+5MYejbMGw==, + } '@walletconnect/jsonrpc-provider@1.0.14': - resolution: {integrity: sha512-rtsNY1XqHvWj0EtITNeuf8PHMvlCLiS3EjQL+WOkxEOA4KPxsohFnBDeyPYiNm4ZvkQdLnece36opYidmtbmow==} + resolution: + { + integrity: sha512-rtsNY1XqHvWj0EtITNeuf8PHMvlCLiS3EjQL+WOkxEOA4KPxsohFnBDeyPYiNm4ZvkQdLnece36opYidmtbmow==, + } '@walletconnect/jsonrpc-types@1.0.4': - resolution: {integrity: sha512-P6679fG/M+wuWg9TY8mh6xFSdYnFyFjwFelxyISxMDrlbXokorEVXYOxiqEbrU3x1BmBoCAJJ+vtEaEoMlpCBQ==} + resolution: + { + integrity: sha512-P6679fG/M+wuWg9TY8mh6xFSdYnFyFjwFelxyISxMDrlbXokorEVXYOxiqEbrU3x1BmBoCAJJ+vtEaEoMlpCBQ==, + } '@walletconnect/jsonrpc-utils@1.0.8': - resolution: {integrity: sha512-vdeb03bD8VzJUL6ZtzRYsFMq1eZQcM3EAzT0a3st59dyLfJ0wq+tKMpmGH7HlB7waD858UWgfIcudbPFsbzVdw==} + resolution: + { + integrity: sha512-vdeb03bD8VzJUL6ZtzRYsFMq1eZQcM3EAzT0a3st59dyLfJ0wq+tKMpmGH7HlB7waD858UWgfIcudbPFsbzVdw==, + } '@walletconnect/jsonrpc-ws-connection@1.0.16': - resolution: {integrity: sha512-G81JmsMqh5nJheE1mPst1W0WfVv0SG3N7JggwLLGnI7iuDZJq8cRJvQwLGKHn5H1WTW7DEPCo00zz5w62AbL3Q==} + resolution: + { + integrity: sha512-G81JmsMqh5nJheE1mPst1W0WfVv0SG3N7JggwLLGnI7iuDZJq8cRJvQwLGKHn5H1WTW7DEPCo00zz5w62AbL3Q==, + } '@walletconnect/keyvaluestorage@1.1.1': - resolution: {integrity: sha512-V7ZQq2+mSxAq7MrRqDxanTzu2RcElfK1PfNYiaVnJgJ7Q7G7hTVwF8voIBx92qsRyGHZihrwNPHuZd1aKkd0rA==} + resolution: + { + integrity: sha512-V7ZQq2+mSxAq7MrRqDxanTzu2RcElfK1PfNYiaVnJgJ7Q7G7hTVwF8voIBx92qsRyGHZihrwNPHuZd1aKkd0rA==, + } peerDependencies: '@react-native-async-storage/async-storage': 1.x peerDependenciesMeta: @@ -2904,106 +4861,202 @@ packages: optional: true '@walletconnect/logger@2.1.2': - resolution: {integrity: sha512-aAb28I3S6pYXZHQm5ESB+V6rDqIYfsnHaQyzFbwUUBFY4H0OXx/YtTl8lvhUNhMMfb9UxbwEBS253TlXUYJWSw==} + resolution: + { + integrity: sha512-aAb28I3S6pYXZHQm5ESB+V6rDqIYfsnHaQyzFbwUUBFY4H0OXx/YtTl8lvhUNhMMfb9UxbwEBS253TlXUYJWSw==, + } '@walletconnect/modal-core@2.7.0': - resolution: {integrity: sha512-oyMIfdlNdpyKF2kTJowTixZSo0PGlCJRdssUN/EZdA6H6v03hZnf09JnwpljZNfir2M65Dvjm/15nGrDQnlxSA==} + resolution: + { + integrity: sha512-oyMIfdlNdpyKF2kTJowTixZSo0PGlCJRdssUN/EZdA6H6v03hZnf09JnwpljZNfir2M65Dvjm/15nGrDQnlxSA==, + } '@walletconnect/modal-ui@2.7.0': - resolution: {integrity: sha512-gERYvU7D7K1ANCN/8vUgsE0d2hnRemfAFZ2novm9aZBg7TEd/4EgB+AqbJ+1dc7GhOL6dazckVq78TgccHb7mQ==} + resolution: + { + integrity: sha512-gERYvU7D7K1ANCN/8vUgsE0d2hnRemfAFZ2novm9aZBg7TEd/4EgB+AqbJ+1dc7GhOL6dazckVq78TgccHb7mQ==, + } '@walletconnect/modal@2.7.0': - resolution: {integrity: sha512-RQVt58oJ+rwqnPcIvRFeMGKuXb9qkgSmwz4noF8JZGUym3gUAzVs+uW2NQ1Owm9XOJAV+sANrtJ+VoVq1ftElw==} + resolution: + { + integrity: sha512-RQVt58oJ+rwqnPcIvRFeMGKuXb9qkgSmwz4noF8JZGUym3gUAzVs+uW2NQ1Owm9XOJAV+sANrtJ+VoVq1ftElw==, + } deprecated: Please follow the migration guide on https://docs.reown.com/appkit/upgrade/wcm '@walletconnect/relay-api@1.0.11': - resolution: {integrity: sha512-tLPErkze/HmC9aCmdZOhtVmYZq1wKfWTJtygQHoWtgg722Jd4homo54Cs4ak2RUFUZIGO2RsOpIcWipaua5D5Q==} + resolution: + { + integrity: sha512-tLPErkze/HmC9aCmdZOhtVmYZq1wKfWTJtygQHoWtgg722Jd4homo54Cs4ak2RUFUZIGO2RsOpIcWipaua5D5Q==, + } '@walletconnect/relay-auth@1.1.0': - resolution: {integrity: sha512-qFw+a9uRz26jRCDgL7Q5TA9qYIgcNY8jpJzI1zAWNZ8i7mQjaijRnWFKsCHAU9CyGjvt6RKrRXyFtFOpWTVmCQ==} + resolution: + { + integrity: sha512-qFw+a9uRz26jRCDgL7Q5TA9qYIgcNY8jpJzI1zAWNZ8i7mQjaijRnWFKsCHAU9CyGjvt6RKrRXyFtFOpWTVmCQ==, + } '@walletconnect/safe-json@1.0.2': - resolution: {integrity: sha512-Ogb7I27kZ3LPC3ibn8ldyUr5544t3/STow9+lzz7Sfo808YD7SBWk7SAsdBFlYgP2zDRy2hS3sKRcuSRM0OTmA==} + resolution: + { + integrity: sha512-Ogb7I27kZ3LPC3ibn8ldyUr5544t3/STow9+lzz7Sfo808YD7SBWk7SAsdBFlYgP2zDRy2hS3sKRcuSRM0OTmA==, + } - '@walletconnect/sign-client@2.21.3': - resolution: {integrity: sha512-Z6sTCBrset7u5CNjPWlqQuWxmLL2WlGLZYKoB7g/Nvg8wLWo0VaaNeTtNsuopLfJeqdV9/4nV/qHE4xXs2nMIQ==} + '@walletconnect/sign-client@2.21.4': + resolution: + { + integrity: sha512-v1OJ9IQCZAqaDEUYGFnGLe2fSp8DN9cv7j8tUYm5ngiFK7h6LjP4Ew3gGCca4AHWzMFkHuIRNQ+6Ypep1K/B7g==, + } '@walletconnect/time@1.0.2': - resolution: {integrity: sha512-uzdd9woDcJ1AaBZRhqy5rNC9laqWGErfc4dxA9a87mPdKOgWMD85mcFo9dIYIts/Jwocfwn07EC6EzclKubk/g==} - - '@walletconnect/types@2.21.3': - resolution: {integrity: sha512-4fDchSb6q/YIuUokaIvp+/tpWtmiL+dOWuKUCq0+w81R0unsQzn4Zc57Xh+TkNAlBGSJmZ44ZQPevN4vaTnjwg==} - - '@walletconnect/universal-provider@2.21.3': - resolution: {integrity: sha512-Tlkfbtp5oNvSb9yEUl3Fxs0A1y8kLbGJOq7F3zyjVu2EvG96cMqqmlYlPRsi55VDn3scmw8zr2zN+BMsMAuDPw==} - - '@walletconnect/utils@2.21.3': - resolution: {integrity: sha512-LHxYX69vG7aPCQB9YT1F8ibwAfRNYwqCEBMplrmquAX+l4lMHTpXvsFF/a5NWFT23DKzbWZ4VTfQTDZ//XJKpg==} + resolution: + { + integrity: sha512-uzdd9woDcJ1AaBZRhqy5rNC9laqWGErfc4dxA9a87mPdKOgWMD85mcFo9dIYIts/Jwocfwn07EC6EzclKubk/g==, + } + + '@walletconnect/types@2.21.4': + resolution: + { + integrity: sha512-6O61esDSW8FZNdFezgB4bX2S35HM6tCwBEjGHNB8JeoKCfpXG33hw2raU/SBgBL/jmM57QRW4M1aFH7v1u9z7g==, + } + + '@walletconnect/universal-provider@2.21.4': + resolution: + { + integrity: sha512-ZSYU5H7Zi/nEy3L21kw5l3ovMagrbXDRKBG8vjPpGQAkflQocRj6d0SesFOCBEdJS16nt+6dKI2f5blpOGzyTQ==, + } + + '@walletconnect/utils@2.21.4': + resolution: + { + integrity: sha512-LuSyBXvRLiDqIu4uMFei5eJ/WPhkIkdW58fmDlRnryatIuBPCho3dlrNSbOjVSdsID+OvxjOlpPLi+5h4oTbaA==, + } '@walletconnect/window-getters@1.0.1': - resolution: {integrity: sha512-vHp+HqzGxORPAN8gY03qnbTMnhqIwjeRJNOMOAzePRg4xVEEE2WvYsI9G2NMjOknA8hnuYbU3/hwLcKbjhc8+Q==} + resolution: + { + integrity: sha512-vHp+HqzGxORPAN8gY03qnbTMnhqIwjeRJNOMOAzePRg4xVEEE2WvYsI9G2NMjOknA8hnuYbU3/hwLcKbjhc8+Q==, + } '@walletconnect/window-metadata@1.0.1': - resolution: {integrity: sha512-9koTqyGrM2cqFRW517BPY/iEtUDx2r1+Pwwu5m7sJ7ka79wi3EyqhqcICk/yDmv6jAS1rjKgTKXlEhanYjijcA==} + resolution: + { + integrity: sha512-9koTqyGrM2cqFRW517BPY/iEtUDx2r1+Pwwu5m7sJ7ka79wi3EyqhqcICk/yDmv6jAS1rjKgTKXlEhanYjijcA==, + } '@webassemblyjs/ast@1.14.1': - resolution: {integrity: sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==} + resolution: + { + integrity: sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==, + } '@webassemblyjs/floating-point-hex-parser@1.13.2': - resolution: {integrity: sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==} + resolution: + { + integrity: sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==, + } '@webassemblyjs/helper-api-error@1.13.2': - resolution: {integrity: sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==} + resolution: + { + integrity: sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==, + } '@webassemblyjs/helper-buffer@1.14.1': - resolution: {integrity: sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==} + resolution: + { + integrity: sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==, + } '@webassemblyjs/helper-numbers@1.13.2': - resolution: {integrity: sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==} + resolution: + { + integrity: sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==, + } '@webassemblyjs/helper-wasm-bytecode@1.13.2': - resolution: {integrity: sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==} + resolution: + { + integrity: sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==, + } '@webassemblyjs/helper-wasm-section@1.14.1': - resolution: {integrity: sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==} + resolution: + { + integrity: sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==, + } '@webassemblyjs/ieee754@1.13.2': - resolution: {integrity: sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==} + resolution: + { + integrity: sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==, + } '@webassemblyjs/leb128@1.13.2': - resolution: {integrity: sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==} + resolution: + { + integrity: sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==, + } '@webassemblyjs/utf8@1.13.2': - resolution: {integrity: sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==} + resolution: + { + integrity: sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==, + } '@webassemblyjs/wasm-edit@1.14.1': - resolution: {integrity: sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==} + resolution: + { + integrity: sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==, + } '@webassemblyjs/wasm-gen@1.14.1': - resolution: {integrity: sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==} + resolution: + { + integrity: sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==, + } '@webassemblyjs/wasm-opt@1.14.1': - resolution: {integrity: sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==} + resolution: + { + integrity: sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==, + } '@webassemblyjs/wasm-parser@1.14.1': - resolution: {integrity: sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==} + resolution: + { + integrity: sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==, + } '@webassemblyjs/wast-printer@1.14.1': - resolution: {integrity: sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==} + resolution: + { + integrity: sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==, + } '@webpack-cli/configtest@1.2.0': - resolution: {integrity: sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg==} + resolution: + { + integrity: sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg==, + } peerDependencies: webpack: 4.x.x || 5.x.x webpack-cli: 4.x.x '@webpack-cli/info@1.5.0': - resolution: {integrity: sha512-e8tSXZpw2hPl2uMJY6fsMswaok5FdlGNRTktvFk2sD8RjH0hE2+XistawJx1vmKteh4NmGmNUrp+Tb2w+udPcQ==} + resolution: + { + integrity: sha512-e8tSXZpw2hPl2uMJY6fsMswaok5FdlGNRTktvFk2sD8RjH0hE2+XistawJx1vmKteh4NmGmNUrp+Tb2w+udPcQ==, + } peerDependencies: webpack-cli: 4.x.x '@webpack-cli/serve@1.7.0': - resolution: {integrity: sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q==} + resolution: + { + integrity: sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q==, + } peerDependencies: webpack-cli: 4.x.x webpack-dev-server: '*' @@ -3012,22 +5065,37 @@ packages: optional: true '@welldone-software/why-did-you-render@8.0.3': - resolution: {integrity: sha512-bb5bKPMStYnocyTBVBu4UTegZdBqzV1mPhxc0UIV/S43KFUSRflux9gvzJfu2aM4EWLJ3egTvdjOi+viK+LKGA==} + resolution: + { + integrity: sha512-bb5bKPMStYnocyTBVBu4UTegZdBqzV1mPhxc0UIV/S43KFUSRflux9gvzJfu2aM4EWLJ3egTvdjOi+viK+LKGA==, + } peerDependencies: react: ^18 '@xtuc/ieee754@1.2.0': - resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} + resolution: + { + integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==, + } '@xtuc/long@4.2.2': - resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} - - abab@2.0.6: - resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} - deprecated: Use your platform's native atob() and btoa() methods instead + resolution: + { + integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==, + } + + JSONStream@1.3.5: + resolution: + { + integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==, + } + hasBin: true abitype@0.7.1: - resolution: {integrity: sha512-VBkRHTDZf9Myaek/dO3yMmOzB/y2s3Zo6nVU7yaw1G+TvCHAjwaJzNGN9yo4K5D8bU/VZXKP1EJpRhFr862PlQ==} + resolution: + { + integrity: sha512-VBkRHTDZf9Myaek/dO3yMmOzB/y2s3Zo6nVU7yaw1G+TvCHAjwaJzNGN9yo4K5D8bU/VZXKP1EJpRhFr862PlQ==, + } peerDependencies: typescript: '>=4.9.4' zod: ^3 >=3.19.1 @@ -3036,7 +5104,10 @@ packages: optional: true abitype@1.0.8: - resolution: {integrity: sha512-ZeiI6h3GnW06uYDLx0etQtX/p8E24UaHHBj57RSjK7YBFe7iuVn07EDpOeP451D06sF27VOz9JJPlIKJmXgkEg==} + resolution: + { + integrity: sha512-ZeiI6h3GnW06uYDLx0etQtX/p8E24UaHHBj57RSjK7YBFe7iuVn07EDpOeP451D06sF27VOz9JJPlIKJmXgkEg==, + } peerDependencies: typescript: '>=5.0.4' zod: ^3 >=3.22.0 @@ -3047,47 +5118,52 @@ packages: optional: true abort-controller@3.0.0: - resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} - engines: {node: '>=6.5'} - - acorn-globals@6.0.0: - resolution: {integrity: sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==} + resolution: + { + integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==, + } + engines: { node: '>=6.5' } acorn-jsx@5.3.2: - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + resolution: + { + integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==, + } peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - acorn-walk@7.2.0: - resolution: {integrity: sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==} - engines: {node: '>=0.4.0'} - acorn-walk@8.3.4: - resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==} - engines: {node: '>=0.4.0'} - - acorn@7.4.1: - resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} - engines: {node: '>=0.4.0'} - hasBin: true + resolution: + { + integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==, + } + engines: { node: '>=0.4.0' } acorn@8.15.0: - resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} - engines: {node: '>=0.4.0'} + resolution: + { + integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==, + } + engines: { node: '>=0.4.0' } hasBin: true aes-js@3.1.2: - resolution: {integrity: sha512-e5pEa2kBnBOgR4Y/p20pskXI74UEz7de8ZGVo58asOtvSVG5YAbJeELPZxOmt+Bnz3rX753YKhfIn4X4l1PPRQ==} + resolution: + { + integrity: sha512-e5pEa2kBnBOgR4Y/p20pskXI74UEz7de8ZGVo58asOtvSVG5YAbJeELPZxOmt+Bnz3rX753YKhfIn4X4l1PPRQ==, + } aes-js@4.0.0-beta.5: - resolution: {integrity: sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==} - - agent-base@6.0.2: - resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} - engines: {node: '>= 6.0.0'} + resolution: + { + integrity: sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==, + } ajv-formats@2.1.1: - resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} + resolution: + { + integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==, + } peerDependencies: ajv: ^8.0.0 peerDependenciesMeta: @@ -3095,432 +5171,779 @@ packages: optional: true ajv-keywords@3.5.2: - resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} + resolution: + { + integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==, + } peerDependencies: ajv: ^6.9.1 ajv-keywords@5.1.0: - resolution: {integrity: sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==} + resolution: + { + integrity: sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==, + } peerDependencies: ajv: ^8.8.2 ajv@6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + resolution: + { + integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==, + } ajv@8.17.1: - resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} + resolution: + { + integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==, + } ansi-align@2.0.0: - resolution: {integrity: sha512-TdlOggdA/zURfMYa7ABC66j+oqfMew58KpJMbUlH3bcZP1b+cBHIHDDn5uH9INsxrHBPjsqM0tDB4jPTF/vgJA==} + resolution: + { + integrity: sha512-TdlOggdA/zURfMYa7ABC66j+oqfMew58KpJMbUlH3bcZP1b+cBHIHDDn5uH9INsxrHBPjsqM0tDB4jPTF/vgJA==, + } ansi-colors@4.1.3: - resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==, + } + engines: { node: '>=6' } ansi-escapes@7.0.0: - resolution: {integrity: sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==, + } + engines: { node: '>=18' } ansi-html-community@0.0.8: - resolution: {integrity: sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==} - engines: {'0': node >= 0.8.0} + resolution: + { + integrity: sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==, + } + engines: { '0': node >= 0.8.0 } hasBin: true ansi-regex@3.0.1: - resolution: {integrity: sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==, + } + engines: { node: '>=4' } ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==, + } + engines: { node: '>=8' } ansi-regex@6.1.0: - resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==, + } + engines: { node: '>=12' } ansi-styles@3.2.1: - resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==, + } + engines: { node: '>=4' } ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==, + } + engines: { node: '>=8' } ansi-styles@5.2.0: - resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==, + } + engines: { node: '>=10' } ansi-styles@6.2.1: - resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==, + } + engines: { node: '>=12' } any-promise@1.3.0: - resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + resolution: + { + integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==, + } anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} + resolution: + { + integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==, + } + engines: { node: '>= 8' } arg@4.1.3: - resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + resolution: + { + integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==, + } arg@5.0.2: - resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} + resolution: + { + integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==, + } argparse@1.0.10: - resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + resolution: + { + integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==, + } argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + resolution: + { + integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==, + } aria-query@5.3.0: - resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} + resolution: + { + integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==, + } aria-query@5.3.2: - resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==, + } + engines: { node: '>= 0.4' } array-buffer-byte-length@1.0.2: - resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==, + } + engines: { node: '>= 0.4' } array-find-index@1.0.2: - resolution: {integrity: sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw==, + } + engines: { node: '>=0.10.0' } array-from@2.1.1: - resolution: {integrity: sha512-GQTc6Uupx1FCavi5mPzBvVT7nEOeWMmUA9P95wpfpW1XwMSKs+KaymD5C2Up7KAUKg/mYwbsUYzdZWcoajlNZg==} + resolution: + { + integrity: sha512-GQTc6Uupx1FCavi5mPzBvVT7nEOeWMmUA9P95wpfpW1XwMSKs+KaymD5C2Up7KAUKg/mYwbsUYzdZWcoajlNZg==, + } + + array-ify@1.0.0: + resolution: + { + integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==, + } array-includes@3.1.9: - resolution: {integrity: sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==, + } + engines: { node: '>= 0.4' } array.prototype.findlast@1.2.5: - resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==, + } + engines: { node: '>= 0.4' } array.prototype.findlastindex@1.2.6: - resolution: {integrity: sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==, + } + engines: { node: '>= 0.4' } array.prototype.flat@1.3.3: - resolution: {integrity: sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==, + } + engines: { node: '>= 0.4' } array.prototype.flatmap@1.3.3: - resolution: {integrity: sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==, + } + engines: { node: '>= 0.4' } array.prototype.reduce@1.0.8: - resolution: {integrity: sha512-DwuEqgXFBwbmZSRqt3BpQigWNUoqw9Ml2dTWdF3B2zQlQX4OeUE0zyuzX0fX0IbTvjdkZbcBTU3idgpO78qkTw==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-DwuEqgXFBwbmZSRqt3BpQigWNUoqw9Ml2dTWdF3B2zQlQX4OeUE0zyuzX0fX0IbTvjdkZbcBTU3idgpO78qkTw==, + } + engines: { node: '>= 0.4' } array.prototype.tosorted@1.1.4: - resolution: {integrity: sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==, + } + engines: { node: '>= 0.4' } arraybuffer.prototype.slice@1.0.4: - resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==, + } + engines: { node: '>= 0.4' } arrify@1.0.1: - resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==, + } + engines: { node: '>=0.10.0' } asn1.js@4.10.1: - resolution: {integrity: sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==} + resolution: + { + integrity: sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==, + } assert@2.1.0: - resolution: {integrity: sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==} + resolution: + { + integrity: sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==, + } assertion-error@2.0.1: - resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==, + } + engines: { node: '>=12' } ast-types@0.16.1: - resolution: {integrity: sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==, + } + engines: { node: '>=4' } ast-v8-to-istanbul@0.3.3: - resolution: {integrity: sha512-MuXMrSLVVoA6sYN/6Hke18vMzrT4TZNbZIj/hvh0fnYFpO+/kFXcLIaiPwXXWaQUPg4yJD8fj+lfJ7/1EBconw==} + resolution: + { + integrity: sha512-MuXMrSLVVoA6sYN/6Hke18vMzrT4TZNbZIj/hvh0fnYFpO+/kFXcLIaiPwXXWaQUPg4yJD8fj+lfJ7/1EBconw==, + } astral-regex@2.0.0: - resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==, + } + engines: { node: '>=8' } async-function@1.0.0: - resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==, + } + engines: { node: '>= 0.4' } async@3.2.6: - resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} - - asynckit@0.4.0: - resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + resolution: + { + integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==, + } atomic-sleep@1.0.0: - resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} - engines: {node: '>=8.0.0'} + resolution: + { + integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==, + } + engines: { node: '>=8.0.0' } autoprefixer@10.4.21: - resolution: {integrity: sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==} - engines: {node: ^10 || ^12 || >=14} + resolution: + { + integrity: sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==, + } + engines: { node: ^10 || ^12 || >=14 } hasBin: true peerDependencies: postcss: ^8.1.0 available-typed-arrays@1.0.7: - resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==, + } + engines: { node: '>= 0.4' } babel-plugin-macros@3.1.0: - resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} - engines: {node: '>=10', npm: '>=6'} - - babel-plugin-polyfill-corejs2@0.4.13: - resolution: {integrity: sha512-3sX/eOms8kd3q2KZ6DAhKPc0dgm525Gqq5NtWKZ7QYYZEv57OQ54KtblzJzH1lQF/eQxO8KjWGIK9IPUJNus5g==} + resolution: + { + integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==, + } + engines: { node: '>=10', npm: '>=6' } + + babel-plugin-polyfill-corejs2@0.4.14: + resolution: + { + integrity: sha512-Co2Y9wX854ts6U8gAAPXfn0GmAyctHuK8n0Yhfjd6t30g7yvKjspvvOo9yG+z52PZRgFErt7Ka2pYnXCjLKEpg==, + } peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - babel-plugin-polyfill-corejs3@0.11.1: - resolution: {integrity: sha512-yGCqvBT4rwMczo28xkH/noxJ6MZ4nJfkVYdoDaC/utLtWrXxv27HVrzAeSbqR8SxDsp46n0YF47EbHoixy6rXQ==} + babel-plugin-polyfill-corejs3@0.13.0: + resolution: + { + integrity: sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A==, + } peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - babel-plugin-polyfill-regenerator@0.6.4: - resolution: {integrity: sha512-7gD3pRadPrbjhjLyxebmx/WrFYcuSjZ0XbdUujQMZ/fcE9oeewk2U/7PCvez84UeuK3oSjmPZ0Ch0dlupQvGzw==} + babel-plugin-polyfill-regenerator@0.6.5: + resolution: + { + integrity: sha512-ISqQ2frbiNU9vIJkzg7dlPpznPZ4jOiUQ1uSmB0fEHeowtN3COYRsXr/xexn64NpU13P06jc/L5TgiJXOgrbEg==, + } peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + resolution: + { + integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==, + } base-x@3.0.11: - resolution: {integrity: sha512-xz7wQ8xDhdyP7tQxwdteLYeFfS68tSMNCZ/Y37WJ4bhGfKPpqEIlmIyueQHqOyoPhE6xNUqjzRr8ra0eF9VRvA==} + resolution: + { + integrity: sha512-xz7wQ8xDhdyP7tQxwdteLYeFfS68tSMNCZ/Y37WJ4bhGfKPpqEIlmIyueQHqOyoPhE6xNUqjzRr8ra0eF9VRvA==, + } base-x@5.0.1: - resolution: {integrity: sha512-M7uio8Zt++eg3jPj+rHMfCC+IuygQHHCOU+IYsVtik6FWjuYpVt/+MRKcgsAMHh8mMFAwnB+Bs+mTrFiXjMzKg==} + resolution: + { + integrity: sha512-M7uio8Zt++eg3jPj+rHMfCC+IuygQHHCOU+IYsVtik6FWjuYpVt/+MRKcgsAMHh8mMFAwnB+Bs+mTrFiXjMzKg==, + } base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + resolution: + { + integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==, + } better-opn@3.0.2: - resolution: {integrity: sha512-aVNobHnJqLiUelTaHat9DZ1qM2w0C0Eym4LPI/3JxOnSokGVdsl1T1kN7TFvsEAD8G47A6VKQ0TVHqbBnYMJlQ==} - engines: {node: '>=12.0.0'} + resolution: + { + integrity: sha512-aVNobHnJqLiUelTaHat9DZ1qM2w0C0Eym4LPI/3JxOnSokGVdsl1T1kN7TFvsEAD8G47A6VKQ0TVHqbBnYMJlQ==, + } + engines: { node: '>=12.0.0' } big.js@5.2.2: - resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} + resolution: + { + integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==, + } bignumber.js@9.3.0: - resolution: {integrity: sha512-EM7aMFTXbptt/wZdMlBv2t8IViwQL+h6SLHosp8Yf0dqJMTnY6iL32opnAB6kAdL0SZPuvcAzFr31o0c/R3/RA==} + resolution: + { + integrity: sha512-EM7aMFTXbptt/wZdMlBv2t8IViwQL+h6SLHosp8Yf0dqJMTnY6iL32opnAB6kAdL0SZPuvcAzFr31o0c/R3/RA==, + } binary-extensions@2.3.0: - resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==, + } + engines: { node: '>=8' } bindings@1.5.0: - resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} + resolution: + { + integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==, + } bip39@3.1.0: - resolution: {integrity: sha512-c9kiwdk45Do5GL0vJMe7tS95VjCii65mYAH7DfWl3uW8AVzXKQVUm64i3hzVybBDMp9r7j9iNxR85+ul8MdN/A==} + resolution: + { + integrity: sha512-c9kiwdk45Do5GL0vJMe7tS95VjCii65mYAH7DfWl3uW8AVzXKQVUm64i3hzVybBDMp9r7j9iNxR85+ul8MdN/A==, + } bip66@1.1.5: - resolution: {integrity: sha512-nemMHz95EmS38a26XbbdxIYj5csHd3RMP3H5bwQknX0WYHF01qhpufP42mLOwVICuH2JmhIhXiWs89MfUGL7Xw==} + resolution: + { + integrity: sha512-nemMHz95EmS38a26XbbdxIYj5csHd3RMP3H5bwQknX0WYHF01qhpufP42mLOwVICuH2JmhIhXiWs89MfUGL7Xw==, + } blakejs@1.2.1: - resolution: {integrity: sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==} + resolution: + { + integrity: sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==, + } bn.js@4.12.2: - resolution: {integrity: sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==} + resolution: + { + integrity: sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==, + } bn.js@5.2.2: - resolution: {integrity: sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==} + resolution: + { + integrity: sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==, + } boolbase@1.0.0: - resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + resolution: + { + integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==, + } boolean@3.2.0: - resolution: {integrity: sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==} + resolution: + { + integrity: sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==, + } deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. boxen@1.3.0: - resolution: {integrity: sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==, + } + engines: { node: '>=4' } brace-expansion@1.1.12: - resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} + resolution: + { + integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==, + } brace-expansion@2.0.2: - resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} + resolution: + { + integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==, + } braces@3.0.3: - resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==, + } + engines: { node: '>=8' } brorand@1.1.0: - resolution: {integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==} + resolution: + { + integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==, + } browser-headers@0.4.1: - resolution: {integrity: sha512-CA9hsySZVo9371qEHjHZtYxV2cFtVj5Wj/ZHi8ooEsrtm4vOnl9Y9HmyYWk9q+05d7K3rdoAE0j3MVEFVvtQtg==} + resolution: + { + integrity: sha512-CA9hsySZVo9371qEHjHZtYxV2cFtVj5Wj/ZHi8ooEsrtm4vOnl9Y9HmyYWk9q+05d7K3rdoAE0j3MVEFVvtQtg==, + } browser-passworder@2.0.3: - resolution: {integrity: sha512-8mTcGjsVqYkRW0qLmdussBjf/5joBUpvZfR8jUojITBJVVZIS5BL41Qt/xehS+n2ChA2YJHHLPhlkXziK+gvsw==} - - browser-process-hrtime@1.0.0: - resolution: {integrity: sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==} + resolution: + { + integrity: sha512-8mTcGjsVqYkRW0qLmdussBjf/5joBUpvZfR8jUojITBJVVZIS5BL41Qt/xehS+n2ChA2YJHHLPhlkXziK+gvsw==, + } browserify-aes@1.2.0: - resolution: {integrity: sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==} + resolution: + { + integrity: sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==, + } browserify-cipher@1.0.1: - resolution: {integrity: sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==} + resolution: + { + integrity: sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==, + } browserify-des@1.0.2: - resolution: {integrity: sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==} + resolution: + { + integrity: sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==, + } browserify-rsa@4.1.1: - resolution: {integrity: sha512-YBjSAiTqM04ZVei6sXighu679a3SqWORA3qZTEqZImnlkDIFtKc6pNutpjyZ8RJTjQtuYfeetkxM11GwoYXMIQ==} - engines: {node: '>= 0.10'} + resolution: + { + integrity: sha512-YBjSAiTqM04ZVei6sXighu679a3SqWORA3qZTEqZImnlkDIFtKc6pNutpjyZ8RJTjQtuYfeetkxM11GwoYXMIQ==, + } + engines: { node: '>= 0.10' } browserify-sign@4.2.3: - resolution: {integrity: sha512-JWCZW6SKhfhjJxO8Tyiiy+XYB7cqd2S5/+WeYHsKdNKFlCBhKbblba1A/HN/90YwtxKc8tCErjffZl++UNmGiw==} - engines: {node: '>= 0.12'} + resolution: + { + integrity: sha512-JWCZW6SKhfhjJxO8Tyiiy+XYB7cqd2S5/+WeYHsKdNKFlCBhKbblba1A/HN/90YwtxKc8tCErjffZl++UNmGiw==, + } + engines: { node: '>= 0.12' } browserify-unibabel@3.0.0: - resolution: {integrity: sha512-j3MX0k2dC1/DEo9jSUyj7zpv5wLd1+klpFwYlM0E5mr7MX6LblQOWb+jkBEKV2iRszmhJuLHAtNuqranlGnpNQ==} - - browserslist@4.25.0: - resolution: {integrity: sha512-PJ8gYKeS5e/whHBh8xrwYK+dAvEj7JXtz6uTucnMRB8OiGTsKccFekoRrjajPBHV8oOY+2tI4uxeceSimKwMFA==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + resolution: + { + integrity: sha512-j3MX0k2dC1/DEo9jSUyj7zpv5wLd1+klpFwYlM0E5mr7MX6LblQOWb+jkBEKV2iRszmhJuLHAtNuqranlGnpNQ==, + } + + browserslist@4.25.1: + resolution: + { + integrity: sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw==, + } + engines: { node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7 } hasBin: true bs58@2.0.1: - resolution: {integrity: sha512-77ld2g7Hn1GyIUpuUVfbZdhO1q9R9gv/GYam4HAeAW/tzhQDrbJ2ZttN1tIe4hmKrWFE+oUtAhBNx/EA5SVdTg==} + resolution: + { + integrity: sha512-77ld2g7Hn1GyIUpuUVfbZdhO1q9R9gv/GYam4HAeAW/tzhQDrbJ2ZttN1tIe4hmKrWFE+oUtAhBNx/EA5SVdTg==, + } bs58@4.0.1: - resolution: {integrity: sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==} + resolution: + { + integrity: sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==, + } bs58@6.0.0: - resolution: {integrity: sha512-PD0wEnEYg6ijszw/u8s+iI3H17cTymlrwkKhDhPZq+Sokl3AU4htyBFTjAeNAlCCmg0f53g6ih3jATyCKftTfw==} + resolution: + { + integrity: sha512-PD0wEnEYg6ijszw/u8s+iI3H17cTymlrwkKhDhPZq+Sokl3AU4htyBFTjAeNAlCCmg0f53g6ih3jATyCKftTfw==, + } bs58check@2.1.2: - resolution: {integrity: sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==} + resolution: + { + integrity: sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==, + } buffer-crc32@0.2.13: - resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} + resolution: + { + integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==, + } buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + resolution: + { + integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==, + } buffer-xor@1.0.3: - resolution: {integrity: sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==} + resolution: + { + integrity: sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==, + } buffer@6.0.3: - resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} - - bufferutil@4.0.9: - resolution: {integrity: sha512-WDtdLmJvAuNNPzByAYpRo2rF1Mmradw6gvWsQKf63476DDXmomT9zUiGypLcG4ibIM67vhAj8jJRdbmEws2Aqw==} - engines: {node: '>=6.14.2'} + resolution: + { + integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==, + } builtin-status-codes@3.0.0: - resolution: {integrity: sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==} + resolution: + { + integrity: sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==, + } + + bundle-require@5.1.0: + resolution: + { + integrity: sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==, + } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + peerDependencies: + esbuild: '>=0.18' cac@6.7.14: - resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==, + } + engines: { node: '>=8' } cacheable-lookup@5.0.4: - resolution: {integrity: sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==} - engines: {node: '>=10.6.0'} + resolution: + { + integrity: sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==, + } + engines: { node: '>=10.6.0' } cacheable-request@7.0.4: - resolution: {integrity: sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==, + } + engines: { node: '>=8' } call-bind-apply-helpers@1.0.2: - resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==, + } + engines: { node: '>= 0.4' } call-bind@1.0.8: - resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==, + } + engines: { node: '>= 0.4' } call-bound@1.0.4: - resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==, + } + engines: { node: '>= 0.4' } callsites@3.1.0: - resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==, + } + engines: { node: '>=6' } camel-case@4.1.2: - resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==} + resolution: + { + integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==, + } camelcase-css@2.0.1: - resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} - engines: {node: '>= 6'} + resolution: + { + integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==, + } + engines: { node: '>= 6' } camelcase-keys@4.2.0: - resolution: {integrity: sha512-Ej37YKYbFUI8QiYlvj9YHb6/Z60dZyPJW0Cs8sFilMbd2lP0bw3ylAq9yJkK4lcTA2dID5fG8LjmJYbO7kWb7Q==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-Ej37YKYbFUI8QiYlvj9YHb6/Z60dZyPJW0Cs8sFilMbd2lP0bw3ylAq9yJkK4lcTA2dID5fG8LjmJYbO7kWb7Q==, + } + engines: { node: '>=4' } camelcase@4.1.0: - resolution: {integrity: sha512-FxAv7HpHrXbh3aPo4o2qxHay2lkLY3x5Mw3KeE4KQE8ysVfziWeRZDwcjauvwBSGEC/nXUPzZy8zeh4HokqOnw==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-FxAv7HpHrXbh3aPo4o2qxHay2lkLY3x5Mw3KeE4KQE8ysVfziWeRZDwcjauvwBSGEC/nXUPzZy8zeh4HokqOnw==, + } + engines: { node: '>=4' } camelcase@5.3.1: - resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==, + } + engines: { node: '>=6' } camelcase@6.3.0: - resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} - engines: {node: '>=10'} - - caniuse-lite@1.0.30001724: - resolution: {integrity: sha512-WqJo7p0TbHDOythNTqYujmaJTvtYRZrjpP8TCvH6Vb9CYJerJNKamKzIWOM4BkQatWj9H2lYulpdAQNBe7QhNA==} + resolution: + { + integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==, + } + engines: { node: '>=10' } + + caniuse-lite@1.0.30001727: + resolution: + { + integrity: sha512-pB68nIHmbN6L/4C6MH1DokyR3bYqFwjaSs/sWDHGj4CTcFtQUQMuJftVwWkXq7mNWOybD3KhUv3oWHoGxgP14Q==, + } capture-stack-trace@1.0.2: - resolution: {integrity: sha512-X/WM2UQs6VMHUtjUDnZTRI+i1crWteJySFzr9UpGoQa4WQffXVTTXuekjl7TjZRlcF2XfjgITT0HxZ9RnxeT0w==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-X/WM2UQs6VMHUtjUDnZTRI+i1crWteJySFzr9UpGoQa4WQffXVTTXuekjl7TjZRlcF2XfjgITT0HxZ9RnxeT0w==, + } + engines: { node: '>=0.10.0' } case-sensitive-paths-webpack-plugin@2.4.0: - resolution: {integrity: sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw==} - engines: {node: '>=4'} - - chai@5.2.0: - resolution: {integrity: sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw==, + } + engines: { node: '>=4' } + + chai@5.2.1: + resolution: + { + integrity: sha512-5nFxhUrX0PqtyogoYOA8IPswy5sZFTOsBFl/9bNsmDLgsxYTzSZQJDPppDnZPTQbzSEm0hqGjWPzRemQCYbD6A==, + } + engines: { node: '>=18' } chalk@2.4.2: - resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==, + } + engines: { node: '>=4' } chalk@3.0.0: - resolution: {integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==, + } + engines: { node: '>=8' } chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==, + } + engines: { node: '>=10' } chalk@5.4.1: - resolution: {integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + resolution: + { + integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==, + } + engines: { node: ^12.17.0 || ^14.13 || >=16.0.0 } check-error@2.1.1: - resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} - engines: {node: '>= 16'} + resolution: + { + integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==, + } + engines: { node: '>= 16' } chokidar@3.6.0: - resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} - engines: {node: '>= 8.10.0'} + resolution: + { + integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==, + } + engines: { node: '>= 8.10.0' } chokidar@4.0.3: - resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} - engines: {node: '>= 14.16.0'} + resolution: + { + integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==, + } + engines: { node: '>= 14.16.0' } chromatic@12.2.0: - resolution: {integrity: sha512-GswmBW9ZptAoTns1BMyjbm55Z7EsIJnUvYKdQqXIBZIKbGErmpA+p4c0BYA+nzw5B0M+rb3Iqp1IaH8TFwIQew==} + resolution: + { + integrity: sha512-GswmBW9ZptAoTns1BMyjbm55Z7EsIJnUvYKdQqXIBZIKbGErmpA+p4c0BYA+nzw5B0M+rb3Iqp1IaH8TFwIQew==, + } hasBin: true peerDependencies: '@chromatic-com/cypress': ^0.*.* || ^1.0.0 @@ -3532,188 +5955,422 @@ packages: optional: true chrome-trace-event@1.0.4: - resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==} - engines: {node: '>=6.0'} + resolution: + { + integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==, + } + engines: { node: '>=6.0' } ci-info@1.6.0: - resolution: {integrity: sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==} + resolution: + { + integrity: sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==, + } cipher-base@1.0.6: - resolution: {integrity: sha512-3Ek9H3X6pj5TgenXYtNWdaBon1tgYCaebd+XPg0keyjEbEfkD4KkmAxkQ/i1vYvxdcT5nscLBfq9VJRmCBcFSw==} - engines: {node: '>= 0.10'} + resolution: + { + integrity: sha512-3Ek9H3X6pj5TgenXYtNWdaBon1tgYCaebd+XPg0keyjEbEfkD4KkmAxkQ/i1vYvxdcT5nscLBfq9VJRmCBcFSw==, + } + engines: { node: '>= 0.10' } cjs-module-lexer@1.4.3: - resolution: {integrity: sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==} + resolution: + { + integrity: sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==, + } clean-css@5.3.3: - resolution: {integrity: sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==} - engines: {node: '>= 10.0'} + resolution: + { + integrity: sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==, + } + engines: { node: '>= 10.0' } cli-boxes@1.0.0: - resolution: {integrity: sha512-3Fo5wu8Ytle8q9iCzS4D2MWVL2X7JVWRiS1BnXbTFDhS9c/REkM9vd1AmabsoZoY5/dGi5TT9iKL8Kb6DeBRQg==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-3Fo5wu8Ytle8q9iCzS4D2MWVL2X7JVWRiS1BnXbTFDhS9c/REkM9vd1AmabsoZoY5/dGi5TT9iKL8Kb6DeBRQg==, + } + engines: { node: '>=0.10.0' } cli-cursor@5.0.0: - resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==, + } + engines: { node: '>=18' } cli-truncate@4.0.0: - resolution: {integrity: sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==, + } + engines: { node: '>=18' } cliui@6.0.0: - resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} + resolution: + { + integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==, + } cliui@8.0.1: - resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==, + } + engines: { node: '>=12' } clone-deep@4.0.1: - resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==, + } + engines: { node: '>=6' } clone-response@1.0.3: - resolution: {integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==} + resolution: + { + integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==, + } clsx@2.1.1: - resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==, + } + engines: { node: '>=6' } coa@2.0.2: - resolution: {integrity: sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==} - engines: {node: '>= 4.0'} + resolution: + { + integrity: sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==, + } + engines: { node: '>= 4.0' } coinstring@2.3.1: - resolution: {integrity: sha512-gLvivqtntteG2kOd7jpVQzKbIirJP7ijDEU+boVZTLj6V4tjVLBlUXGlijhBOcoWM7S/epqHVikQCD6x2J+E/Q==} + resolution: + { + integrity: sha512-gLvivqtntteG2kOd7jpVQzKbIirJP7ijDEU+boVZTLj6V4tjVLBlUXGlijhBOcoWM7S/epqHVikQCD6x2J+E/Q==, + } color-convert@1.9.3: - resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + resolution: + { + integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==, + } color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} + resolution: + { + integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==, + } + engines: { node: '>=7.0.0' } color-name@1.1.3: - resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + resolution: + { + integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==, + } color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + resolution: + { + integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==, + } colorette@2.0.20: - resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} - - combined-stream@1.0.8: - resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} - engines: {node: '>= 0.8'} + resolution: + { + integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==, + } commander@13.1.0: - resolution: {integrity: sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==, + } + engines: { node: '>=18' } commander@2.20.3: - resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + resolution: + { + integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==, + } commander@4.1.1: - resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} - engines: {node: '>= 6'} + resolution: + { + integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==, + } + engines: { node: '>= 6' } commander@7.2.0: - resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} - engines: {node: '>= 10'} + resolution: + { + integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==, + } + engines: { node: '>= 10' } commander@8.3.0: - resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} - engines: {node: '>= 12'} + resolution: + { + integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==, + } + engines: { node: '>= 12' } commondir@1.0.1: - resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} + resolution: + { + integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==, + } + + compare-func@2.0.0: + resolution: + { + integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==, + } compare-versions@4.1.4: - resolution: {integrity: sha512-FemMreK9xNyL8gQevsdRMrvO4lFCkQP7qbuktn1q8ndcNk1+0mz7lgE7b/sNvbhVgY4w6tMN1FDp6aADjqw2rw==} + resolution: + { + integrity: sha512-FemMreK9xNyL8gQevsdRMrvO4lFCkQP7qbuktn1q8ndcNk1+0mz7lgE7b/sNvbhVgY4w6tMN1FDp6aADjqw2rw==, + } + + compare-versions@6.1.1: + resolution: + { + integrity: sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==, + } concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + resolution: + { + integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==, + } + + confbox@0.1.8: + resolution: + { + integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==, + } configstore@3.1.5: - resolution: {integrity: sha512-nlOhI4+fdzoK5xmJ+NY+1gZK56bwEaWZr8fYuXohZ9Vkc1o3a4T/R3M+yE/w7x/ZVJ1zF8c+oaOvF0dztdUgmA==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-nlOhI4+fdzoK5xmJ+NY+1gZK56bwEaWZr8fYuXohZ9Vkc1o3a4T/R3M+yE/w7x/ZVJ1zF8c+oaOvF0dztdUgmA==, + } + engines: { node: '>=4' } + + consola@3.4.2: + resolution: + { + integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==, + } + engines: { node: ^14.18.0 || >=16.10.0 } + + conventional-changelog-angular@7.0.0: + resolution: + { + integrity: sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ==, + } + engines: { node: '>=16' } + + conventional-changelog-conventionalcommits@7.0.2: + resolution: + { + integrity: sha512-NKXYmMR/Hr1DevQegFB4MwfM5Vv0m4UIxKZTTYuD98lpTknaZlSRrDOG4X7wIXpGkfsYxZTghUN+Qq+T0YQI7w==, + } + engines: { node: '>=16' } + + conventional-commits-parser@5.0.0: + resolution: + { + integrity: sha512-ZPMl0ZJbw74iS9LuX9YIAiW8pfM5p3yh2o/NbXHbkFuZzY5jvdi5jFycEOkmBW5H5I7nA+D6f3UcsCLP2vvSEA==, + } + engines: { node: '>=16' } + hasBin: true convert-source-map@1.9.0: - resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} + resolution: + { + integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==, + } convert-source-map@2.0.0: - resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + resolution: + { + integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==, + } cookie-es@1.2.2: - resolution: {integrity: sha512-+W7VmiVINB+ywl1HGXJXmrqkOhpKrIiVZV6tQuV54ZyQC7MMuBt81Vc336GMLoHBq5hV/F9eXgt5Mnx0Rha5Fg==} + resolution: + { + integrity: sha512-+W7VmiVINB+ywl1HGXJXmrqkOhpKrIiVZV6tQuV54ZyQC7MMuBt81Vc336GMLoHBq5hV/F9eXgt5Mnx0Rha5Fg==, + } + + cookie@1.0.2: + resolution: + { + integrity: sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==, + } + engines: { node: '>=18' } copy-webpack-plugin@12.0.2: - resolution: {integrity: sha512-SNwdBeHyII+rWvee/bTnAYyO8vfVdcSTud4EIb6jcZ8inLeWucJE0DnxXQBjlQ5zlteuuvooGQy3LIyGxhvlOA==} - engines: {node: '>= 18.12.0'} + resolution: + { + integrity: sha512-SNwdBeHyII+rWvee/bTnAYyO8vfVdcSTud4EIb6jcZ8inLeWucJE0DnxXQBjlQ5zlteuuvooGQy3LIyGxhvlOA==, + } + engines: { node: '>= 18.12.0' } peerDependencies: webpack: ^5.1.0 - core-js-compat@3.43.0: - resolution: {integrity: sha512-2GML2ZsCc5LR7hZYz4AXmjQw8zuy2T//2QntwdnpuYI7jteT6GVYJL7F6C2C57R7gSYrcqVW3lAALefdbhBLDA==} + core-js-compat@3.44.0: + resolution: + { + integrity: sha512-JepmAj2zfl6ogy34qfWtcE7nHKAJnKsQFRn++scjVS2bZFllwptzw61BZcZFYBPpUznLfAvh0LGhxKppk04ClA==, + } core-util-is@1.0.3: - resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + resolution: + { + integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==, + } + + cosmiconfig-typescript-loader@6.1.0: + resolution: + { + integrity: sha512-tJ1w35ZRUiM5FeTzT7DtYWAFFv37ZLqSRkGi2oeCK1gPhvaWjkAtfXvLmvE1pRfxxp9aQo6ba/Pvg1dKj05D4g==, + } + engines: { node: '>=v18' } + peerDependencies: + '@types/node': '*' + cosmiconfig: '>=9' + typescript: '>=5' cosmiconfig@7.1.0: - resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==, + } + engines: { node: '>=10' } + + cosmiconfig@9.0.0: + resolution: + { + integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==, + } + engines: { node: '>=14' } + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true crc-32@1.2.2: - resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} - engines: {node: '>=0.8'} + resolution: + { + integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==, + } + engines: { node: '>=0.8' } hasBin: true create-ecdh@4.0.4: - resolution: {integrity: sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==} + resolution: + { + integrity: sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==, + } create-error-class@3.0.2: - resolution: {integrity: sha512-gYTKKexFO3kh200H1Nit76sRwRtOY32vQd3jpAQKpLtZqyNsSQNfI4N7o3eP2wUjV35pTWKRYqFUDBvUha/Pkw==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-gYTKKexFO3kh200H1Nit76sRwRtOY32vQd3jpAQKpLtZqyNsSQNfI4N7o3eP2wUjV35pTWKRYqFUDBvUha/Pkw==, + } + engines: { node: '>=0.10.0' } create-hash@1.1.3: - resolution: {integrity: sha512-snRpch/kwQhcdlnZKYanNF1m0RDlrCdSKQaH87w1FCFPVPNCQ/Il9QJKAX2jVBZddRdaHBMC+zXa9Gw9tmkNUA==} + resolution: + { + integrity: sha512-snRpch/kwQhcdlnZKYanNF1m0RDlrCdSKQaH87w1FCFPVPNCQ/Il9QJKAX2jVBZddRdaHBMC+zXa9Gw9tmkNUA==, + } create-hash@1.2.0: - resolution: {integrity: sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==} + resolution: + { + integrity: sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==, + } create-hmac@1.1.7: - resolution: {integrity: sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==} + resolution: + { + integrity: sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==, + } create-require@1.1.1: - resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + resolution: + { + integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==, + } + + cross-env@7.0.3: + resolution: + { + integrity: sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==, + } + engines: { node: '>=10.14', npm: '>=6', yarn: '>=1' } + hasBin: true cross-fetch@3.2.0: - resolution: {integrity: sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q==} + resolution: + { + integrity: sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q==, + } cross-fetch@4.1.0: - resolution: {integrity: sha512-uKm5PU+MHTootlWEY+mZ4vvXoCn4fLQxT9dSc1sXVMSFkINTJVN8cAQROpwcKm8bJ/c7rgZVIBWzH5T78sNZZw==} + resolution: + { + integrity: sha512-uKm5PU+MHTootlWEY+mZ4vvXoCn4fLQxT9dSc1sXVMSFkINTJVN8cAQROpwcKm8bJ/c7rgZVIBWzH5T78sNZZw==, + } cross-spawn@5.1.0: - resolution: {integrity: sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==} + resolution: + { + integrity: sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==, + } cross-spawn@7.0.6: - resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} - engines: {node: '>= 8'} + resolution: + { + integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==, + } + engines: { node: '>= 8' } crossws@0.3.5: - resolution: {integrity: sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA==} + resolution: + { + integrity: sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA==, + } crypto-browserify@3.12.1: - resolution: {integrity: sha512-r4ESw/IlusD17lgQi1O20Fa3qNnsckR126TdUuBgAu7GBYSIPvdNyONd3Zrxh0xCwA4+6w/TDArBPsMvhur+KQ==} - engines: {node: '>= 0.10'} + resolution: + { + integrity: sha512-r4ESw/IlusD17lgQi1O20Fa3qNnsckR126TdUuBgAu7GBYSIPvdNyONd3Zrxh0xCwA4+6w/TDArBPsMvhur+KQ==, + } + engines: { node: '>= 0.10' } crypto-random-string@1.0.0: - resolution: {integrity: sha512-GsVpkFPlycH7/fRR7Dhcmnoii54gV1nz7y4CWyeFS14N+JVBBhY+r8amRHE4BwSYal7BPTDp8isvAlCxyFt3Hg==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-GsVpkFPlycH7/fRR7Dhcmnoii54gV1nz7y4CWyeFS14N+JVBBhY+r8amRHE4BwSYal7BPTDp8isvAlCxyFt3Hg==, + } + engines: { node: '>=4' } css-loader@6.11.0: - resolution: {integrity: sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g==} - engines: {node: '>= 12.13.0'} + resolution: + { + integrity: sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g==, + } + engines: { node: '>= 12.13.0' } peerDependencies: '@rspack/core': 0.x || 1.x webpack: ^5.0.0 @@ -3724,8 +6381,11 @@ packages: optional: true css-loader@7.1.2: - resolution: {integrity: sha512-6WvYYn7l/XEGN8Xu2vWFt9nVzrCn39vKyTEFf/ExEyoksJjjSZV/0/35XPlMbpnr6VGhZIUg5yJrL8tGfes/FA==} - engines: {node: '>= 18.12.0'} + resolution: + { + integrity: sha512-6WvYYn7l/XEGN8Xu2vWFt9nVzrCn39vKyTEFf/ExEyoksJjjSZV/0/35XPlMbpnr6VGhZIUg5yJrL8tGfes/FA==, + } + engines: { node: '>= 18.12.0' } peerDependencies: '@rspack/core': 0.x || 1.x webpack: ^5.27.0 @@ -3736,128 +6396,208 @@ packages: optional: true css-select-base-adapter@0.1.1: - resolution: {integrity: sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==} + resolution: + { + integrity: sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==, + } css-select@2.1.0: - resolution: {integrity: sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==} + resolution: + { + integrity: sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==, + } css-select@4.3.0: - resolution: {integrity: sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==} + resolution: + { + integrity: sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==, + } css-tree@1.0.0-alpha.37: - resolution: {integrity: sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==} - engines: {node: '>=8.0.0'} + resolution: + { + integrity: sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==, + } + engines: { node: '>=8.0.0' } css-tree@1.1.3: - resolution: {integrity: sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==} - engines: {node: '>=8.0.0'} + resolution: + { + integrity: sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==, + } + engines: { node: '>=8.0.0' } css-what@3.4.2: - resolution: {integrity: sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==} - engines: {node: '>= 6'} - - css-what@6.1.0: - resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} - engines: {node: '>= 6'} + resolution: + { + integrity: sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==, + } + engines: { node: '>= 6' } + + css-what@6.2.2: + resolution: + { + integrity: sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==, + } + engines: { node: '>= 6' } css.escape@1.5.1: - resolution: {integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==} + resolution: + { + integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==, + } cssesc@3.0.0: - resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==, + } + engines: { node: '>=4' } hasBin: true csso@4.2.0: - resolution: {integrity: sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==} - engines: {node: '>=8.0.0'} - - cssom@0.3.8: - resolution: {integrity: sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==} - - cssom@0.4.4: - resolution: {integrity: sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==} - - cssstyle@2.3.0: - resolution: {integrity: sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==, + } + engines: { node: '>=8.0.0' } csstype@3.1.3: - resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + resolution: + { + integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==, + } currently-unhandled@0.4.1: - resolution: {integrity: sha512-/fITjgjGU50vjQ4FH6eUoYu+iUoUKIXws2hL15JJpIR+BbTxaXQsMuuyjtNh2WqsSBS5nsaZHFsFecyw5CCAng==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-/fITjgjGU50vjQ4FH6eUoYu+iUoUKIXws2hL15JJpIR+BbTxaXQsMuuyjtNh2WqsSBS5nsaZHFsFecyw5CCAng==, + } + engines: { node: '>=0.10.0' } d3-array@3.2.4: - resolution: {integrity: sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==, + } + engines: { node: '>=12' } d3-color@3.1.0: - resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==, + } + engines: { node: '>=12' } d3-ease@3.0.1: - resolution: {integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==, + } + engines: { node: '>=12' } d3-format@3.1.0: - resolution: {integrity: sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==, + } + engines: { node: '>=12' } d3-interpolate@3.0.1: - resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==, + } + engines: { node: '>=12' } d3-path@3.1.0: - resolution: {integrity: sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==, + } + engines: { node: '>=12' } d3-scale@4.0.2: - resolution: {integrity: sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==, + } + engines: { node: '>=12' } d3-shape@3.2.0: - resolution: {integrity: sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==, + } + engines: { node: '>=12' } d3-time-format@4.1.0: - resolution: {integrity: sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==, + } + engines: { node: '>=12' } d3-time@3.1.0: - resolution: {integrity: sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==, + } + engines: { node: '>=12' } d3-timer@3.0.1: - resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==} - engines: {node: '>=12'} - - data-urls@2.0.0: - resolution: {integrity: sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==, + } + engines: { node: '>=12' } + + dargs@8.1.0: + resolution: + { + integrity: sha512-wAV9QHOsNbwnWdNW2FYvE1P56wtgSbM+3SZcdGiWQILwVjACCXDCI3Ai8QlCjMDB8YK5zySiXZYBiwGmNY3lnw==, + } + engines: { node: '>=12' } data-view-buffer@1.0.2: - resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==, + } + engines: { node: '>= 0.4' } data-view-byte-length@1.0.2: - resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==, + } + engines: { node: '>= 0.4' } data-view-byte-offset@1.0.1: - resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==, + } + engines: { node: '>= 0.4' } dayjs@1.11.13: - resolution: {integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==} + resolution: + { + integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==, + } debounce@2.2.0: - resolution: {integrity: sha512-Xks6RUDLZFdz8LIdR6q0MTH44k7FikOmnh5xkSjMig6ch45afc8sjTjRQf3P6ax8dMgcQrYO/AR2RGWURrruqw==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-Xks6RUDLZFdz8LIdR6q0MTH44k7FikOmnh5xkSjMig6ch45afc8sjTjRQf3P6ax8dMgcQrYO/AR2RGWURrruqw==, + } + engines: { node: '>=18' } debug@3.2.7: - resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + resolution: + { + integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==, + } peerDependencies: supports-color: '*' peerDependenciesMeta: @@ -3865,8 +6605,11 @@ packages: optional: true debug@4.4.1: - resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} - engines: {node: '>=6.0'} + resolution: + { + integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==, + } + engines: { node: '>=6.0' } peerDependencies: supports-color: '*' peerDependenciesMeta: @@ -3874,337 +6617,609 @@ packages: optional: true decamelize-keys@1.1.1: - resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==, + } + engines: { node: '>=0.10.0' } decamelize@1.2.0: - resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==, + } + engines: { node: '>=0.10.0' } decimal.js-light@2.5.1: - resolution: {integrity: sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==} - - decimal.js@10.5.0: - resolution: {integrity: sha512-8vDa8Qxvr/+d94hSh5P3IJwI5t8/c0KsMp+g8bNw9cY2icONa5aPfvKeieW1WlG0WQYwwhJ7mjui2xtiePQSXw==} + resolution: + { + integrity: sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==, + } decode-uri-component@0.2.2: - resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==} - engines: {node: '>=0.10'} + resolution: + { + integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==, + } + engines: { node: '>=0.10' } decompress-response@6.0.0: - resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==, + } + engines: { node: '>=10' } dedent@0.7.0: - resolution: {integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==} + resolution: + { + integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==, + } deep-eql@5.0.2: - resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==, + } + engines: { node: '>=6' } deep-extend@0.6.0: - resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} - engines: {node: '>=4.0.0'} + resolution: + { + integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==, + } + engines: { node: '>=4.0.0' } deep-is@0.1.4: - resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + resolution: + { + integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==, + } deepmerge@4.3.1: - resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==, + } + engines: { node: '>=0.10.0' } default-gateway@6.0.3: - resolution: {integrity: sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==} - engines: {node: '>= 10'} + resolution: + { + integrity: sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==, + } + engines: { node: '>= 10' } defer-to-connect@2.0.1: - resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==, + } + engines: { node: '>=10' } define-data-property@1.1.4: - resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==, + } + engines: { node: '>= 0.4' } define-lazy-prop@2.0.0: - resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==, + } + engines: { node: '>=8' } define-properties@1.2.1: - resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==, + } + engines: { node: '>= 0.4' } defu@6.1.4: - resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} - - delayed-stream@1.0.0: - resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} - engines: {node: '>=0.4.0'} + resolution: + { + integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==, + } dependency-graph@1.0.0: - resolution: {integrity: sha512-cW3gggJ28HZ/LExwxP2B++aiKxhJXMSIt9K48FOXQkm+vuG5gyatXnLsONRJdzO/7VfjDIiaOOa/bs4l464Lwg==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-cW3gggJ28HZ/LExwxP2B++aiKxhJXMSIt9K48FOXQkm+vuG5gyatXnLsONRJdzO/7VfjDIiaOOa/bs4l464Lwg==, + } + engines: { node: '>=4' } dequal@2.0.3: - resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==, + } + engines: { node: '>=6' } des.js@1.1.0: - resolution: {integrity: sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==} + resolution: + { + integrity: sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==, + } destr@2.0.5: - resolution: {integrity: sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==} + resolution: + { + integrity: sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==, + } detect-browser@5.3.0: - resolution: {integrity: sha512-53rsFbGdwMwlF7qvCt0ypLM5V5/Mbl0szB7GPN8y9NCcbknYOeVVXdrXEq+90IwAfrrzt6Hd+u2E2ntakICU8w==} + resolution: + { + integrity: sha512-53rsFbGdwMwlF7qvCt0ypLM5V5/Mbl0szB7GPN8y9NCcbknYOeVVXdrXEq+90IwAfrrzt6Hd+u2E2ntakICU8w==, + } detect-node@2.1.0: - resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} + resolution: + { + integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==, + } didyoumean@1.2.2: - resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} + resolution: + { + integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==, + } diff@3.5.0: - resolution: {integrity: sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==} - engines: {node: '>=0.3.1'} + resolution: + { + integrity: sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==, + } + engines: { node: '>=0.3.1' } diff@4.0.2: - resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} - engines: {node: '>=0.3.1'} + resolution: + { + integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==, + } + engines: { node: '>=0.3.1' } diffie-hellman@5.0.3: - resolution: {integrity: sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==} + resolution: + { + integrity: sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==, + } dijkstrajs@1.0.3: - resolution: {integrity: sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA==} + resolution: + { + integrity: sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA==, + } dlv@1.1.3: - resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} + resolution: + { + integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==, + } doctrine@2.1.0: - resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==, + } + engines: { node: '>=0.10.0' } doctrine@3.0.0: - resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} - engines: {node: '>=6.0.0'} + resolution: + { + integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==, + } + engines: { node: '>=6.0.0' } dom-accessibility-api@0.5.16: - resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} + resolution: + { + integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==, + } dom-accessibility-api@0.6.3: - resolution: {integrity: sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==} + resolution: + { + integrity: sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==, + } dom-converter@0.2.0: - resolution: {integrity: sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==} + resolution: + { + integrity: sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==, + } dom-helpers@5.2.1: - resolution: {integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==} + resolution: + { + integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==, + } dom-serializer@0.2.2: - resolution: {integrity: sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==} + resolution: + { + integrity: sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==, + } dom-serializer@1.4.1: - resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==} + resolution: + { + integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==, + } domelementtype@1.3.1: - resolution: {integrity: sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==} + resolution: + { + integrity: sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==, + } domelementtype@2.3.0: - resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} - - domexception@2.0.1: - resolution: {integrity: sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==} - engines: {node: '>=8'} - deprecated: Use your platform's native DOMException instead + resolution: + { + integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==, + } domhandler@4.3.1: - resolution: {integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==} - engines: {node: '>= 4'} + resolution: + { + integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==, + } + engines: { node: '>= 4' } domutils@1.7.0: - resolution: {integrity: sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==} + resolution: + { + integrity: sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==, + } domutils@2.8.0: - resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==} + resolution: + { + integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==, + } dot-case@3.0.4: - resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} + resolution: + { + integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==, + } dot-prop@4.2.1: - resolution: {integrity: sha512-l0p4+mIuJIua0mhxGoh4a+iNL9bmeK5DvnSVQa6T0OhrVmaEa1XScX5Etc673FePCJOArq/4Pa2cLGODUWTPOQ==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-l0p4+mIuJIua0mhxGoh4a+iNL9bmeK5DvnSVQa6T0OhrVmaEa1XScX5Etc673FePCJOArq/4Pa2cLGODUWTPOQ==, + } + engines: { node: '>=4' } + + dot-prop@5.3.0: + resolution: + { + integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==, + } + engines: { node: '>=8' } dotenv-defaults@2.0.2: - resolution: {integrity: sha512-iOIzovWfsUHU91L5i8bJce3NYK5JXeAwH50Jh6+ARUdLiiGlYWfGw6UkzsYqaXZH/hjE/eCd/PlfM/qqyK0AMg==} - - dotenv-webpack@8.1.0: - resolution: {integrity: sha512-owK1JcsPkIobeqjVrk6h7jPED/W6ZpdFsMPR+5ursB7/SdgDyO+VzAU+szK8C8u3qUhtENyYnj8eyXMR5kkGag==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-iOIzovWfsUHU91L5i8bJce3NYK5JXeAwH50Jh6+ARUdLiiGlYWfGw6UkzsYqaXZH/hjE/eCd/PlfM/qqyK0AMg==, + } + + dotenv-webpack@8.1.1: + resolution: + { + integrity: sha512-+TY/AJ2k9bU2EML3mxgLmaAvEcqs1Wbv6deCIUSI3eW3Xeo8LBQumYib6puyaSwbjC9JCzg/y5Pwjd/lePX04w==, + } + engines: { node: '>=10' } peerDependencies: webpack: ^4 || ^5 - dotenv@16.5.0: - resolution: {integrity: sha512-m/C+AwOAr9/W1UOIZUo232ejMNnJAJtYQjUbHoNTBNTJSvqzzDh7vnrei3o3r3m9blf6ZoDkvcw0VmozNRFJxg==} - engines: {node: '>=12'} + dotenv@16.6.1: + resolution: + { + integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==, + } + engines: { node: '>=12' } dotenv@8.6.0: - resolution: {integrity: sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==, + } + engines: { node: '>=10' } drbg.js@1.0.1: - resolution: {integrity: sha512-F4wZ06PvqxYLFEZKkFxTDcns9oFNk34hvmJSEwdzsxVQ8YI5YaxtACgQatkYgv2VI2CFkUd2Y+xosPQnHv809g==} - engines: {node: '>=0.10'} + resolution: + { + integrity: sha512-F4wZ06PvqxYLFEZKkFxTDcns9oFNk34hvmJSEwdzsxVQ8YI5YaxtACgQatkYgv2VI2CFkUd2Y+xosPQnHv809g==, + } + engines: { node: '>=0.10' } dunder-proto@1.0.1: - resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==, + } + engines: { node: '>= 0.4' } duplexer3@0.1.5: - resolution: {integrity: sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==} + resolution: + { + integrity: sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==, + } duplexify@4.1.3: - resolution: {integrity: sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==} + resolution: + { + integrity: sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==, + } eastasianwidth@0.2.0: - resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + resolution: + { + integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==, + } - electron-to-chromium@1.5.171: - resolution: {integrity: sha512-scWpzXEJEMrGJa4Y6m/tVotb0WuvNmasv3wWVzUAeCgKU0ToFOhUW6Z+xWnRQANMYGxN4ngJXIThgBJOqzVPCQ==} + electron-to-chromium@1.5.180: + resolution: + { + integrity: sha512-ED+GEyEh3kYMwt2faNmgMB0b8O5qtATGgR4RmRsIp4T6p7B8vdMbIedYndnvZfsaXvSzegtpfqRMDNCjjiSduA==, + } electron@23.3.13: - resolution: {integrity: sha512-BaXtHEb+KYKLouUXlUVDa/lj9pj4F5kiE0kwFdJV84Y2EU7euIDgPthfKtchhr5MVHmjtavRMIV/zAwEiSQ9rQ==} - engines: {node: '>= 12.20.55'} + resolution: + { + integrity: sha512-BaXtHEb+KYKLouUXlUVDa/lj9pj4F5kiE0kwFdJV84Y2EU7euIDgPthfKtchhr5MVHmjtavRMIV/zAwEiSQ9rQ==, + } + engines: { node: '>= 12.20.55' } hasBin: true elliptic@6.6.1: - resolution: {integrity: sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==} + resolution: + { + integrity: sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==, + } emoji-regex@10.4.0: - resolution: {integrity: sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==} + resolution: + { + integrity: sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==, + } emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + resolution: + { + integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==, + } emoji-regex@9.2.2: - resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + resolution: + { + integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==, + } emojis-list@3.0.0: - resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==} - engines: {node: '>= 4'} + resolution: + { + integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==, + } + engines: { node: '>= 4' } encode-utf8@1.0.3: - resolution: {integrity: sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw==} + resolution: + { + integrity: sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw==, + } end-of-stream@1.4.5: - resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} + resolution: + { + integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==, + } endent@2.1.0: - resolution: {integrity: sha512-r8VyPX7XL8U01Xgnb1CjZ3XV+z90cXIJ9JPE/R9SEC9vpw2P6CfsRPJmp20DppC5N7ZAMCmjYkJIa744Iyg96w==} - - enhanced-resolve@5.18.1: - resolution: {integrity: sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==} - engines: {node: '>=10.13.0'} + resolution: + { + integrity: sha512-r8VyPX7XL8U01Xgnb1CjZ3XV+z90cXIJ9JPE/R9SEC9vpw2P6CfsRPJmp20DppC5N7ZAMCmjYkJIa744Iyg96w==, + } + + enhanced-resolve@5.18.2: + resolution: + { + integrity: sha512-6Jw4sE1maoRJo3q8MsSIn2onJFbLTOjY9hlx4DZXmOKvLRd1Ok2kXmAGXaafL2+ijsJZ1ClYbl/pmqr9+k4iUQ==, + } + engines: { node: '>=10.13.0' } enquirer@2.4.1: - resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} - engines: {node: '>=8.6'} + resolution: + { + integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==, + } + engines: { node: '>=8.6' } entities@2.2.0: - resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} + resolution: + { + integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==, + } env-paths@2.2.1: - resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==, + } + engines: { node: '>=6' } envinfo@7.14.0: - resolution: {integrity: sha512-CO40UI41xDQzhLB1hWyqUKgFhs250pNcGbyGKe1l/e4FSaI/+YE4IMG76GDt0In67WLPACIITC+sOi08x4wIvg==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-CO40UI41xDQzhLB1hWyqUKgFhs250pNcGbyGKe1l/e4FSaI/+YE4IMG76GDt0In67WLPACIITC+sOi08x4wIvg==, + } + engines: { node: '>=4' } hasBin: true environment@1.1.0: - resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==, + } + engines: { node: '>=18' } error-ex@1.3.2: - resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + resolution: + { + integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==, + } es-abstract@1.24.0: - resolution: {integrity: sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==, + } + engines: { node: '>= 0.4' } es-array-method-boxes-properly@1.0.0: - resolution: {integrity: sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==} + resolution: + { + integrity: sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==, + } es-define-property@1.0.1: - resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==, + } + engines: { node: '>= 0.4' } es-errors@1.3.0: - resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==, + } + engines: { node: '>= 0.4' } es-iterator-helpers@1.2.1: - resolution: {integrity: sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==, + } + engines: { node: '>= 0.4' } es-module-lexer@1.7.0: - resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} + resolution: + { + integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==, + } es-object-atoms@1.1.1: - resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==, + } + engines: { node: '>= 0.4' } es-set-tostringtag@2.1.0: - resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==, + } + engines: { node: '>= 0.4' } es-shim-unscopables@1.1.0: - resolution: {integrity: sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==, + } + engines: { node: '>= 0.4' } es-to-primitive@1.3.0: - resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==, + } + engines: { node: '>= 0.4' } es-toolkit@1.39.3: - resolution: {integrity: sha512-Qb/TCFCldgOy8lZ5uC7nLGdqJwSabkQiYQShmw4jyiPk1pZzaYWTwaYKYP7EgLccWYgZocMrtItrwh683voaww==} + resolution: + { + integrity: sha512-Qb/TCFCldgOy8lZ5uC7nLGdqJwSabkQiYQShmw4jyiPk1pZzaYWTwaYKYP7EgLccWYgZocMrtItrwh683voaww==, + } es6-error@4.1.1: - resolution: {integrity: sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==} + resolution: + { + integrity: sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==, + } esbuild-register@3.6.0: - resolution: {integrity: sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg==} + resolution: + { + integrity: sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg==, + } peerDependencies: esbuild: '>=0.12 <1' - esbuild@0.25.5: - resolution: {integrity: sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ==} - engines: {node: '>=18'} + esbuild@0.25.6: + resolution: + { + integrity: sha512-GVuzuUwtdsghE3ocJ9Bs8PNoF13HNQ5TXbEi2AhvVb8xU1Iwt9Fos9FEamfoee+u/TOsn7GUWc04lz46n2bbTg==, + } + engines: { node: '>=18' } hasBin: true escalade@3.2.0: - resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==, + } + engines: { node: '>=6' } escape-string-regexp@1.0.5: - resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} - engines: {node: '>=0.8.0'} + resolution: + { + integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==, + } + engines: { node: '>=0.8.0' } escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - - escodegen@2.1.0: - resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} - engines: {node: '>=6.0'} + resolution: + { + integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==, + } + engines: { node: '>=10' } + + eslint-config-prettier@9.1.0: + resolution: + { + integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==, + } hasBin: true + peerDependencies: + eslint: '>=7.0.0' + + eslint-import-resolver-alias@1.1.2: + resolution: + { + integrity: sha512-WdviM1Eu834zsfjHtcGHtGfcu+F30Od3V7I9Fi57uhBEwPkjDcii7/yW8jAT+gOhn4P/vOxxNAXbFAKsrrc15w==, + } + engines: { node: '>= 4' } + peerDependencies: + eslint-plugin-import: '>=1.4.0' eslint-import-resolver-node@0.3.9: - resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} + resolution: + { + integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==, + } eslint-import-resolver-typescript@3.10.1: - resolution: {integrity: sha512-A1rHYb06zjMGAxdLSkN2fXPBwuSaQ0iO5M/hdyS0Ajj1VBaRp0sPD3dn1FhME3c/JluGFbwSxyCfqdSbtQLAHQ==} - engines: {node: ^14.18.0 || >=16.0.0} + resolution: + { + integrity: sha512-A1rHYb06zjMGAxdLSkN2fXPBwuSaQ0iO5M/hdyS0Ajj1VBaRp0sPD3dn1FhME3c/JluGFbwSxyCfqdSbtQLAHQ==, + } + engines: { node: ^14.18.0 || >=16.0.0 } peerDependencies: eslint: '*' eslint-plugin-import: '*' @@ -4216,8 +7231,11 @@ packages: optional: true eslint-module-utils@2.12.1: - resolution: {integrity: sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==, + } + engines: { node: '>=4' } peerDependencies: '@typescript-eslint/parser': '*' eslint: '*' @@ -4237,8 +7255,11 @@ packages: optional: true eslint-plugin-import@2.32.0: - resolution: {integrity: sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==, + } + engines: { node: '>=4' } peerDependencies: '@typescript-eslint/parser': '*' eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9 @@ -4246,44 +7267,106 @@ packages: '@typescript-eslint/parser': optional: true + eslint-plugin-prettier@5.5.1: + resolution: + { + integrity: sha512-dobTkHT6XaEVOo8IO90Q4DOSxnm3Y151QxPJlM/vKC0bVy+d6cVWQZLlFiuZPP0wS6vZwSKeJgKkcS+KfMBlRw==, + } + engines: { node: ^14.18.0 || >=16.0.0 } + peerDependencies: + '@types/eslint': '>=8.0.0' + eslint: '>=8.0.0' + eslint-config-prettier: '>= 7.0.0 <10.0.0 || >=10.1.0' + prettier: '>=3.0.0' + peerDependenciesMeta: + '@types/eslint': + optional: true + eslint-config-prettier: + optional: true + eslint-plugin-react-hooks@5.2.0: - resolution: {integrity: sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==, + } + engines: { node: '>=10' } peerDependencies: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 eslint-plugin-react@7.37.5: - resolution: {integrity: sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==, + } + engines: { node: '>=4' } peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 - eslint-plugin-storybook@9.0.12: - resolution: {integrity: sha512-dSzcozoI7tQRqfMODWfxahrRmKWsK88yKSUcO0+s361oYcX7nf8nEu99TQ/wuDLRHh+Zi7E2j43cPMH8gFo8OA==} - engines: {node: '>=20.0.0'} + eslint-plugin-storybook@0.11.6: + resolution: + { + integrity: sha512-3WodYD6Bs9ACqnB+TP2TuLh774c/nacAjxSKOP9bHJ2c8rf+nrhocxjjeAWNmO9IPkFIzTKlcl0vNXI2yYpVOw==, + } + engines: { node: '>= 18' } + peerDependencies: + eslint: '>=8' + + eslint-plugin-storybook@9.0.16: + resolution: + { + integrity: sha512-A9kJaYBGYswo11t9coo1rpY5i8qPJx9JX5/6YWK3L3zT9lCxJWkYFAed/1Jt92yk7EkOzLrwrIIjMj/+7erlgw==, + } + engines: { node: '>=20.0.0' } peerDependencies: eslint: '>=8' - storybook: ^9.0.12 + storybook: ^9.0.16 + + eslint-plugin-unused-imports@4.1.4: + resolution: + { + integrity: sha512-YptD6IzQjDardkl0POxnnRBhU1OEePMV0nd6siHaRBbd+lyh6NAhFEobiznKU7kTsSsDeSD62Pe7kAM1b7dAZQ==, + } + peerDependencies: + '@typescript-eslint/eslint-plugin': ^8.0.0-0 || ^7.0.0 || ^6.0.0 || ^5.0.0 + eslint: ^9.0.0 || ^8.0.0 + peerDependenciesMeta: + '@typescript-eslint/eslint-plugin': + optional: true eslint-scope@5.1.1: - resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} - engines: {node: '>=8.0.0'} + resolution: + { + integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==, + } + engines: { node: '>=8.0.0' } eslint-scope@8.4.0: - resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + resolution: + { + integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } eslint-visitor-keys@3.4.3: - resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + resolution: + { + integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } eslint-visitor-keys@4.2.1: - resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - eslint@9.29.0: - resolution: {integrity: sha512-GsGizj2Y1rCWDu6XoEekL3RLilp0voSePurjZIkxL3wlm5o5EC9VpgaP7lrCvjnkuLvzFBQWB3vWB3K5KQTveQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + resolution: + { + integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + + eslint@9.30.1: + resolution: + { + integrity: sha512-zmxXPNMOXmwm9E0yQLi5uqXHs7uq2UIiqEKo3Gq+3fwo1XrJ+hijAZImyF7hclW3E6oHz43Yk3RP8at6OTKflQ==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } hasBin: true peerDependencies: jiti: '*' @@ -4292,167 +7375,308 @@ packages: optional: true espree@10.4.0: - resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + resolution: + { + integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } esprima@4.0.1: - resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==, + } + engines: { node: '>=4' } hasBin: true esquery@1.6.0: - resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} - engines: {node: '>=0.10'} + resolution: + { + integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==, + } + engines: { node: '>=0.10' } esrecurse@4.3.0: - resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} - engines: {node: '>=4.0'} + resolution: + { + integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==, + } + engines: { node: '>=4.0' } estraverse@4.3.0: - resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} - engines: {node: '>=4.0'} + resolution: + { + integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==, + } + engines: { node: '>=4.0' } estraverse@5.3.0: - resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} - engines: {node: '>=4.0'} + resolution: + { + integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==, + } + engines: { node: '>=4.0' } estree-walker@3.0.3: - resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + resolution: + { + integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==, + } esutils@2.0.3: - resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==, + } + engines: { node: '>=0.10.0' } eth-rpc-errors@4.0.3: - resolution: {integrity: sha512-Z3ymjopaoft7JDoxZcEb3pwdGh7yiYMhOwm2doUt6ASXlMavpNlK6Cre0+IMl2VSGyEU9rkiperQhp5iRxn5Pg==} + resolution: + { + integrity: sha512-Z3ymjopaoft7JDoxZcEb3pwdGh7yiYMhOwm2doUt6ASXlMavpNlK6Cre0+IMl2VSGyEU9rkiperQhp5iRxn5Pg==, + } ethereum-checksum-address@0.0.5: - resolution: {integrity: sha512-JCuVfBpG1QdtaBrklMaemC7ofTegq8FcL2eAQhGTibHvljnj/tJKksqhBs0fuktyOo48GfYMXWvqOviqnRTDKQ==} + resolution: + { + integrity: sha512-JCuVfBpG1QdtaBrklMaemC7ofTegq8FcL2eAQhGTibHvljnj/tJKksqhBs0fuktyOo48GfYMXWvqOviqnRTDKQ==, + } hasBin: true ethereum-common@0.0.18: - resolution: {integrity: sha512-EoltVQTRNg2Uy4o84qpa2aXymXDJhxm7eos/ACOg0DG4baAbMjhbdAEsx9GeE8sC3XCxnYvrrzZDH8D8MtA2iQ==} + resolution: + { + integrity: sha512-EoltVQTRNg2Uy4o84qpa2aXymXDJhxm7eos/ACOg0DG4baAbMjhbdAEsx9GeE8sC3XCxnYvrrzZDH8D8MtA2iQ==, + } ethereum-cryptography@0.1.3: - resolution: {integrity: sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==} + resolution: + { + integrity: sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==, + } ethereum-cryptography@2.2.1: - resolution: {integrity: sha512-r/W8lkHSiTLxUxW8Rf3u4HGB0xQweG2RyETjywylKZSzLWoWAijRz8WCuOtJ6wah+avllXBqZuk29HCCvhEIRg==} + resolution: + { + integrity: sha512-r/W8lkHSiTLxUxW8Rf3u4HGB0xQweG2RyETjywylKZSzLWoWAijRz8WCuOtJ6wah+avllXBqZuk29HCCvhEIRg==, + } ethereum-hdwallet@0.0.26: - resolution: {integrity: sha512-mQbpkz//k5+RupT2mHleeUfecntotS5ybKSG5ZL3UYgWUExIZJYGsLAMxrqO+lNsKtOrxAHpI1ulScj6Nw4W1w==} + resolution: + { + integrity: sha512-mQbpkz//k5+RupT2mHleeUfecntotS5ybKSG5ZL3UYgWUExIZJYGsLAMxrqO+lNsKtOrxAHpI1ulScj6Nw4W1w==, + } hasBin: true ethereumjs-tx@1.3.7: - resolution: {integrity: sha512-wvLMxzt1RPhAQ9Yi3/HKZTn0FZYpnsmQdbKYfUUpi4j1SEIcbkd9tndVjcPrufY3V7j2IebOpC00Zp2P/Ay2kA==} + resolution: + { + integrity: sha512-wvLMxzt1RPhAQ9Yi3/HKZTn0FZYpnsmQdbKYfUUpi4j1SEIcbkd9tndVjcPrufY3V7j2IebOpC00Zp2P/Ay2kA==, + } deprecated: 'New package name format for new versions: @ethereumjs/tx. Please update.' ethereumjs-util@5.2.1: - resolution: {integrity: sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ==} + resolution: + { + integrity: sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ==, + } ethereumjs-util@6.2.1: - resolution: {integrity: sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==} + resolution: + { + integrity: sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==, + } ethereumjs-util@7.1.5: - resolution: {integrity: sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==} - engines: {node: '>=10.0.0'} + resolution: + { + integrity: sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==, + } + engines: { node: '>=10.0.0' } ethereumjs-wallet@0.6.5: - resolution: {integrity: sha512-MDwjwB9VQVnpp/Dc1XzA6J1a3wgHQ4hSvA1uWNatdpOrtCbPVuQSKSyRnjLvS0a+KKMw2pvQ9Ybqpb3+eW8oNA==} + resolution: + { + integrity: sha512-MDwjwB9VQVnpp/Dc1XzA6J1a3wgHQ4hSvA1uWNatdpOrtCbPVuQSKSyRnjLvS0a+KKMw2pvQ9Ybqpb3+eW8oNA==, + } deprecated: 'New package name format for new versions: @ethereumjs/wallet. Please update.' - ethers@6.14.4: - resolution: {integrity: sha512-Jm/dzRs2Z9iBrT6e9TvGxyb5YVKAPLlpna7hjxH7KH/++DSh2T/JVmQUv7iHI5E55hDbp/gEVvstWYXVxXFzsA==} - engines: {node: '>=14.0.0'} + ethers@6.15.0: + resolution: + { + integrity: sha512-Kf/3ZW54L4UT0pZtsY/rf+EkBU7Qi5nnhonjUb8yTXcxH3cdcWrV2cRyk0Xk/4jK6OoHhxxZHriyhje20If2hQ==, + } + engines: { node: '>=14.0.0' } ethjs-util@0.1.6: - resolution: {integrity: sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==} - engines: {node: '>=6.5.0', npm: '>=3'} + resolution: + { + integrity: sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==, + } + engines: { node: '>=6.5.0', npm: '>=3' } event-target-shim@5.0.1: - resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==, + } + engines: { node: '>=6' } eventemitter3@4.0.7: - resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} + resolution: + { + integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==, + } eventemitter3@5.0.1: - resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} + resolution: + { + integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==, + } events@3.3.0: - resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} - engines: {node: '>=0.8.x'} + resolution: + { + integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==, + } + engines: { node: '>=0.8.x' } evp_bytestokey@1.0.3: - resolution: {integrity: sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==} + resolution: + { + integrity: sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==, + } execa@0.7.0: - resolution: {integrity: sha512-RztN09XglpYI7aBBrJCPW95jEH7YF1UEPOoX9yDhUTPdp7mK+CQvnLTuD10BNXZ3byLTu2uehZ8EcKT/4CGiFw==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-RztN09XglpYI7aBBrJCPW95jEH7YF1UEPOoX9yDhUTPdp7mK+CQvnLTuD10BNXZ3byLTu2uehZ8EcKT/4CGiFw==, + } + engines: { node: '>=4' } execa@5.1.1: - resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==, + } + engines: { node: '>=10' } execa@8.0.1: - resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} - engines: {node: '>=16.17'} - - expect-type@1.2.1: - resolution: {integrity: sha512-/kP8CAwxzLVEeFrMm4kMmy4CCDlpipyA7MYLVrdJIkV0fYF0UaigQHRsxHiuY/GEea+bh4KSv3TIlgr+2UL6bw==} - engines: {node: '>=12.0.0'} + resolution: + { + integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==, + } + engines: { node: '>=16.17' } + + expect-type@1.2.2: + resolution: + { + integrity: sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA==, + } + engines: { node: '>=12.0.0' } extract-zip@2.0.1: - resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==} - engines: {node: '>= 10.17.0'} + resolution: + { + integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==, + } + engines: { node: '>= 10.17.0' } hasBin: true fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + resolution: + { + integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==, + } + + fast-diff@1.3.0: + resolution: + { + integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==, + } fast-equals@5.2.2: - resolution: {integrity: sha512-V7/RktU11J3I36Nwq2JnZEM7tNm17eBJz+u25qdxBZeCKiX6BkVSZQjwWIr+IobgnZy+ag73tTZgZi7tr0LrBw==} - engines: {node: '>=6.0.0'} + resolution: + { + integrity: sha512-V7/RktU11J3I36Nwq2JnZEM7tNm17eBJz+u25qdxBZeCKiX6BkVSZQjwWIr+IobgnZy+ag73tTZgZi7tr0LrBw==, + } + engines: { node: '>=6.0.0' } fast-glob@3.3.3: - resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} - engines: {node: '>=8.6.0'} + resolution: + { + integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==, + } + engines: { node: '>=8.6.0' } fast-json-parse@1.0.3: - resolution: {integrity: sha512-FRWsaZRWEJ1ESVNbDWmsAlqDk96gPQezzLghafp5J4GUKjbCz3OkAHuZs5TuPEtkbVQERysLp9xv6c24fBm8Aw==} + resolution: + { + integrity: sha512-FRWsaZRWEJ1ESVNbDWmsAlqDk96gPQezzLghafp5J4GUKjbCz3OkAHuZs5TuPEtkbVQERysLp9xv6c24fBm8Aw==, + } fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + resolution: + { + integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==, + } fast-levenshtein@2.0.6: - resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + resolution: + { + integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==, + } fast-redact@3.5.0: - resolution: {integrity: sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==, + } + engines: { node: '>=6' } fast-safe-stringify@2.1.1: - resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} + resolution: + { + integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==, + } fast-uri@3.0.6: - resolution: {integrity: sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==} + resolution: + { + integrity: sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==, + } fastest-levenshtein@1.0.16: - resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==} - engines: {node: '>= 4.9.1'} + resolution: + { + integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==, + } + engines: { node: '>= 4.9.1' } fastq@1.19.1: - resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} + resolution: + { + integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==, + } faye-websocket@0.11.4: - resolution: {integrity: sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==} - engines: {node: '>=0.8.0'} + resolution: + { + integrity: sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==, + } + engines: { node: '>=0.8.0' } fd-slicer@1.1.0: - resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} + resolution: + { + integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==, + } fdir@6.4.6: - resolution: {integrity: sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==} + resolution: + { + integrity: sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==, + } peerDependencies: picomatch: ^3 || ^4 peerDependenciesMeta: @@ -4460,331 +7684,600 @@ packages: optional: true file-entry-cache@8.0.0: - resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} - engines: {node: '>=16.0.0'} + resolution: + { + integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==, + } + engines: { node: '>=16.0.0' } file-loader@6.2.0: - resolution: {integrity: sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==} - engines: {node: '>= 10.13.0'} + resolution: + { + integrity: sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==, + } + engines: { node: '>= 10.13.0' } peerDependencies: webpack: ^4.0.0 || ^5.0.0 file-saver@2.0.5: - resolution: {integrity: sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA==} + resolution: + { + integrity: sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA==, + } file-uri-to-path@1.0.0: - resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} + resolution: + { + integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==, + } fill-range@7.1.1: - resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==, + } + engines: { node: '>=8' } filter-obj@1.1.0: - resolution: {integrity: sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==, + } + engines: { node: '>=0.10.0' } find-cache-dir@3.3.2: - resolution: {integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==, + } + engines: { node: '>=8' } find-root@1.1.0: - resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} + resolution: + { + integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==, + } find-up@2.1.0: - resolution: {integrity: sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==, + } + engines: { node: '>=4' } find-up@4.1.0: - resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==, + } + engines: { node: '>=8' } find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==, + } + engines: { node: '>=10' } find-up@7.0.0: - resolution: {integrity: sha512-YyZM99iHrqLKjmt4LJDj58KI+fYyufRLBSYcqycxf//KpBk9FoewoGX0450m9nB44qrZnovzC2oeP5hUibxc/g==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-YyZM99iHrqLKjmt4LJDj58KI+fYyufRLBSYcqycxf//KpBk9FoewoGX0450m9nB44qrZnovzC2oeP5hUibxc/g==, + } + engines: { node: '>=18' } firebase@10.14.1: - resolution: {integrity: sha512-0KZxU+Ela9rUCULqFsUUOYYkjh7OM1EWdIfG6///MtXd0t2/uUIf0iNV5i0KariMhRQ5jve/OY985nrAXFaZeQ==} + resolution: + { + integrity: sha512-0KZxU+Ela9rUCULqFsUUOYYkjh7OM1EWdIfG6///MtXd0t2/uUIf0iNV5i0KariMhRQ5jve/OY985nrAXFaZeQ==, + } + + fix-dts-default-cjs-exports@1.0.1: + resolution: + { + integrity: sha512-pVIECanWFC61Hzl2+oOCtoJ3F17kglZC/6N94eRWycFgBH35hHx0Li604ZIzhseh97mf2p0cv7vVrOZGoqhlEg==, + } flat-cache@3.2.0: - resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} - engines: {node: ^10.12.0 || >=12.0.0} + resolution: + { + integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==, + } + engines: { node: ^10.12.0 || >=12.0.0 } flat-cache@4.0.1: - resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} - engines: {node: '>=16'} + resolution: + { + integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==, + } + engines: { node: '>=16' } flat@5.0.2: - resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} + resolution: + { + integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==, + } hasBin: true flatted@3.3.3: - resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} + resolution: + { + integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==, + } for-each@0.3.5: - resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==, + } + engines: { node: '>= 0.4' } foreground-child@3.3.1: - resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} - engines: {node: '>=14'} + resolution: + { + integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==, + } + engines: { node: '>=14' } fork-ts-checker-webpack-plugin@8.0.0: - resolution: {integrity: sha512-mX3qW3idpueT2klaQXBzrIM/pHw+T0B/V9KHEvNrqijTq9NFnMZU6oreVxDYcf33P8a5cW+67PjodNHthGnNVg==} - engines: {node: '>=12.13.0', yarn: '>=1.0.0'} + resolution: + { + integrity: sha512-mX3qW3idpueT2klaQXBzrIM/pHw+T0B/V9KHEvNrqijTq9NFnMZU6oreVxDYcf33P8a5cW+67PjodNHthGnNVg==, + } + engines: { node: '>=12.13.0', yarn: '>=1.0.0' } peerDependencies: typescript: '>3.6.0' webpack: ^5.11.0 - form-data@3.0.3: - resolution: {integrity: sha512-q5YBMeWy6E2Un0nMGWMgI65MAKtaylxfNJGJxpGh45YDciZB4epbWpaAfImil6CPAPTYB4sh0URQNDRIZG5F2w==} - engines: {node: '>= 6'} - fraction.js@4.3.7: - resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} + resolution: + { + integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==, + } fs-extra@10.1.0: - resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==, + } + engines: { node: '>=12' } fs-extra@11.3.0: - resolution: {integrity: sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==} - engines: {node: '>=14.14'} + resolution: + { + integrity: sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==, + } + engines: { node: '>=14.14' } fs-extra@8.1.0: - resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} - engines: {node: '>=6 <7 || >=8'} + resolution: + { + integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==, + } + engines: { node: '>=6 <7 || >=8' } fs-monkey@1.0.6: - resolution: {integrity: sha512-b1FMfwetIKymC0eioW7mTywihSQE4oLzQn1dB6rZB5fx/3NpNEdAWeCSMB+60/AeT0TCXsxzAlcYVEFCTAksWg==} + resolution: + { + integrity: sha512-b1FMfwetIKymC0eioW7mTywihSQE4oLzQn1dB6rZB5fx/3NpNEdAWeCSMB+60/AeT0TCXsxzAlcYVEFCTAksWg==, + } fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + resolution: + { + integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==, + } fsevents@2.3.2: - resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + resolution: + { + integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==, + } + engines: { node: ^8.16.0 || ^10.6.0 || >=11.0.0 } os: [darwin] fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + resolution: + { + integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==, + } + engines: { node: ^8.16.0 || ^10.6.0 || >=11.0.0 } os: [darwin] function-bind@1.1.2: - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + resolution: + { + integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==, + } function.prototype.name@1.1.8: - resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==, + } + engines: { node: '>= 0.4' } functions-have-names@1.2.3: - resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + resolution: + { + integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==, + } gensync@1.0.0-beta.2: - resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==, + } + engines: { node: '>=6.9.0' } get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} + resolution: + { + integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==, + } + engines: { node: 6.* || 8.* || >= 10.* } get-east-asian-width@1.3.0: - resolution: {integrity: sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==, + } + engines: { node: '>=18' } get-intrinsic@1.3.0: - resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==, + } + engines: { node: '>= 0.4' } get-proto@1.0.1: - resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==, + } + engines: { node: '>= 0.4' } get-stream@3.0.0: - resolution: {integrity: sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==, + } + engines: { node: '>=4' } get-stream@5.2.0: - resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==, + } + engines: { node: '>=8' } get-stream@6.0.1: - resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==, + } + engines: { node: '>=10' } get-stream@8.0.1: - resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} - engines: {node: '>=16'} + resolution: + { + integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==, + } + engines: { node: '>=16' } get-symbol-description@1.1.0: - resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==, + } + engines: { node: '>= 0.4' } get-tsconfig@4.10.1: - resolution: {integrity: sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==} + resolution: + { + integrity: sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==, + } + + git-raw-commits@4.0.0: + resolution: + { + integrity: sha512-ICsMM1Wk8xSGMowkOmPrzo2Fgmfo4bMHLNX6ytHjajRJUqvHOw/TFapQ+QG75c3X/tTDDhOSRPGC52dDbNM8FQ==, + } + engines: { node: '>=16' } + hasBin: true glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} + resolution: + { + integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==, + } + engines: { node: '>= 6' } glob-parent@6.0.2: - resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} - engines: {node: '>=10.13.0'} + resolution: + { + integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==, + } + engines: { node: '>=10.13.0' } glob-to-regexp@0.4.1: - resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} + resolution: + { + integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==, + } glob@10.4.5: - resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} + resolution: + { + integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==, + } + hasBin: true + + glob@11.0.3: + resolution: + { + integrity: sha512-2Nim7dha1KVkaiF4q6Dj+ngPPMdfvLJEOpZk/jKiUAkqKebpGAWQXAq9z1xu9HKu5lWfqw/FASuccEjyznjPaA==, + } + engines: { node: 20 || >=22 } hasBin: true glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + resolution: + { + integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==, + } deprecated: Glob versions prior to v9 are no longer supported global-agent@3.0.0: - resolution: {integrity: sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==} - engines: {node: '>=10.0'} + resolution: + { + integrity: sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==, + } + engines: { node: '>=10.0' } + + global-directory@4.0.1: + resolution: + { + integrity: sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==, + } + engines: { node: '>=18' } global-dirs@0.1.1: - resolution: {integrity: sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==} - engines: {node: '>=4'} - - globals@11.12.0: - resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==, + } + engines: { node: '>=4' } globals@14.0.0: - resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==, + } + engines: { node: '>=18' } globals@15.15.0: - resolution: {integrity: sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==, + } + engines: { node: '>=18' } globalthis@1.0.4: - resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==, + } + engines: { node: '>= 0.4' } globby@14.1.0: - resolution: {integrity: sha512-0Ia46fDOaT7k4og1PDW4YbodWWr3scS2vAr2lTbsplOt2WkKp0vQbkI9wKis/T5LV/dqPjO3bpS/z6GTJB82LA==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-0Ia46fDOaT7k4og1PDW4YbodWWr3scS2vAr2lTbsplOt2WkKp0vQbkI9wKis/T5LV/dqPjO3bpS/z6GTJB82LA==, + } + engines: { node: '>=18' } google-protobuf@3.21.4: - resolution: {integrity: sha512-MnG7N936zcKTco4Jd2PX2U96Kf9PxygAPKBug+74LHzmHXmceN16MmRcdgZv+DGef/S9YvQAfRsNCn4cjf9yyQ==} + resolution: + { + integrity: sha512-MnG7N936zcKTco4Jd2PX2U96Kf9PxygAPKBug+74LHzmHXmceN16MmRcdgZv+DGef/S9YvQAfRsNCn4cjf9yyQ==, + } gopd@1.2.0: - resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==, + } + engines: { node: '>= 0.4' } got@11.8.6: - resolution: {integrity: sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==} - engines: {node: '>=10.19.0'} + resolution: + { + integrity: sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==, + } + engines: { node: '>=10.19.0' } got@6.7.1: - resolution: {integrity: sha512-Y/K3EDuiQN9rTZhBvPRWMLXIKdeD1Rj0nzunfoi0Yyn5WBEbzxXKU9Ub2X41oZBagVWOBU3MuDonFMgPWQFnwg==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-Y/K3EDuiQN9rTZhBvPRWMLXIKdeD1Rj0nzunfoi0Yyn5WBEbzxXKU9Ub2X41oZBagVWOBU3MuDonFMgPWQFnwg==, + } + engines: { node: '>=4' } graceful-fs@4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + resolution: + { + integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==, + } graphemer@1.4.0: - resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + resolution: + { + integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==, + } h3@1.15.3: - resolution: {integrity: sha512-z6GknHqyX0h9aQaTx22VZDf6QyZn+0Nh+Ym8O/u0SGSkyF5cuTJYKlc8MkzW3Nzf9LE1ivcpmYC3FUGpywhuUQ==} + resolution: + { + integrity: sha512-z6GknHqyX0h9aQaTx22VZDf6QyZn+0Nh+Ym8O/u0SGSkyF5cuTJYKlc8MkzW3Nzf9LE1ivcpmYC3FUGpywhuUQ==, + } has-bigints@1.1.0: - resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==, + } + engines: { node: '>= 0.4' } has-flag@3.0.0: - resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==, + } + engines: { node: '>=4' } has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==, + } + engines: { node: '>=8' } has-property-descriptors@1.0.2: - resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + resolution: + { + integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==, + } has-proto@1.2.0: - resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==, + } + engines: { node: '>= 0.4' } has-symbols@1.1.0: - resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==, + } + engines: { node: '>= 0.4' } has-tostringtag@1.0.2: - resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==, + } + engines: { node: '>= 0.4' } hash-base@2.0.2: - resolution: {integrity: sha512-0TROgQ1/SxE6KmxWSvXHvRj90/Xo1JvZShofnYF+f6ZsGtR4eES7WfrQzPalmyagfKZCXpVnitiRebZulWsbiw==} + resolution: + { + integrity: sha512-0TROgQ1/SxE6KmxWSvXHvRj90/Xo1JvZShofnYF+f6ZsGtR4eES7WfrQzPalmyagfKZCXpVnitiRebZulWsbiw==, + } hash-base@3.0.5: - resolution: {integrity: sha512-vXm0l45VbcHEVlTCzs8M+s0VeYsB2lnlAaThoLKGXr3bE/VWDOelNUnycUPEhKEaXARL2TEFjBOyUiM6+55KBg==} - engines: {node: '>= 0.10'} + resolution: + { + integrity: sha512-vXm0l45VbcHEVlTCzs8M+s0VeYsB2lnlAaThoLKGXr3bE/VWDOelNUnycUPEhKEaXARL2TEFjBOyUiM6+55KBg==, + } + engines: { node: '>= 0.10' } hash.js@1.1.7: - resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==} + resolution: + { + integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==, + } hasown@2.0.2: - resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==, + } + engines: { node: '>= 0.4' } hdkey@0.8.0: - resolution: {integrity: sha512-oYsdlK22eobT68N5faWI3776f6tOLyqxLLYwxMx+TP0rkWzuCs0oiOm2VbLWcxdpHFP4LtiRR8udaIX8VkEaZQ==} + resolution: + { + integrity: sha512-oYsdlK22eobT68N5faWI3776f6tOLyqxLLYwxMx+TP0rkWzuCs0oiOm2VbLWcxdpHFP4LtiRR8udaIX8VkEaZQ==, + } he@1.2.0: - resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + resolution: + { + integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==, + } hasBin: true hey-listen@1.0.8: - resolution: {integrity: sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q==} + resolution: + { + integrity: sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q==, + } highlight.js@10.7.3: - resolution: {integrity: sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==} + resolution: + { + integrity: sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==, + } history@4.10.1: - resolution: {integrity: sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==} + resolution: + { + integrity: sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==, + } hmac-drbg@1.0.1: - resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==} + resolution: + { + integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==, + } hoist-non-react-statics@3.3.2: - resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} + resolution: + { + integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==, + } hosted-git-info@2.8.9: - resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} - - html-encoding-sniffer@2.0.1: - resolution: {integrity: sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==, + } html-entities@2.6.0: - resolution: {integrity: sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==} + resolution: + { + integrity: sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==, + } html-escaper@2.0.2: - resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + resolution: + { + integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==, + } html-minifier-terser@6.1.0: - resolution: {integrity: sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==, + } + engines: { node: '>=12' } hasBin: true html-parse-stringify@3.0.1: - resolution: {integrity: sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg==} + resolution: + { + integrity: sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg==, + } html-webpack-plugin@5.6.3: - resolution: {integrity: sha512-QSf1yjtSAsmf7rYBV7XX86uua4W/vkhIt0xNXKbsi2foEeW7vjJQz4bhnpL3xH+l1ryl1680uNv968Z+X6jSYg==} - engines: {node: '>=10.13.0'} + resolution: + { + integrity: sha512-QSf1yjtSAsmf7rYBV7XX86uua4W/vkhIt0xNXKbsi2foEeW7vjJQz4bhnpL3xH+l1ryl1680uNv968Z+X6jSYg==, + } + engines: { node: '>=10.13.0' } peerDependencies: '@rspack/core': 0.x || 1.x webpack: ^5.20.0 @@ -4795,836 +8288,1592 @@ packages: optional: true htmlparser2@6.1.0: - resolution: {integrity: sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==} + resolution: + { + integrity: sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==, + } http-cache-semantics@4.2.0: - resolution: {integrity: sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==} + resolution: + { + integrity: sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==, + } http-parser-js@0.5.10: - resolution: {integrity: sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA==} - - http-proxy-agent@4.0.1: - resolution: {integrity: sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==} - engines: {node: '>= 6'} + resolution: + { + integrity: sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA==, + } http2-wrapper@1.0.3: - resolution: {integrity: sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==} - engines: {node: '>=10.19.0'} - - https-proxy-agent@5.0.1: - resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} - engines: {node: '>= 6'} + resolution: + { + integrity: sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==, + } + engines: { node: '>=10.19.0' } human-signals@2.1.0: - resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} - engines: {node: '>=10.17.0'} + resolution: + { + integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==, + } + engines: { node: '>=10.17.0' } human-signals@5.0.0: - resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} - engines: {node: '>=16.17.0'} + resolution: + { + integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==, + } + engines: { node: '>=16.17.0' } husky@9.1.7: - resolution: {integrity: sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==, + } + engines: { node: '>=18' } hasBin: true i18next@24.2.3: - resolution: {integrity: sha512-lfbf80OzkocvX7nmZtu7nSTNbrTYR52sLWxPtlXX1zAhVw8WEnFk4puUkCR4B1dNQwbSpEHHHemcZu//7EcB7A==} + resolution: + { + integrity: sha512-lfbf80OzkocvX7nmZtu7nSTNbrTYR52sLWxPtlXX1zAhVw8WEnFk4puUkCR4B1dNQwbSpEHHHemcZu//7EcB7A==, + } peerDependencies: typescript: ^5 peerDependenciesMeta: typescript: optional: true - iconv-lite@0.4.24: - resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} - engines: {node: '>=0.10.0'} - icss-utils@5.1.0: - resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==} - engines: {node: ^10 || ^12 || >= 14} + resolution: + { + integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==, + } + engines: { node: ^10 || ^12 || >= 14 } peerDependencies: postcss: ^8.1.0 idb-keyval@6.2.2: - resolution: {integrity: sha512-yjD9nARJ/jb1g+CvD0tlhUHOrJ9Sy0P8T9MF3YaLlHnSRpwPfpTX0XIvpmw3gAJUmEu3FiICLBDPXVwyEvrleg==} + resolution: + { + integrity: sha512-yjD9nARJ/jb1g+CvD0tlhUHOrJ9Sy0P8T9MF3YaLlHnSRpwPfpTX0XIvpmw3gAJUmEu3FiICLBDPXVwyEvrleg==, + } idb@7.1.1: - resolution: {integrity: sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==} + resolution: + { + integrity: sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==, + } ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + resolution: + { + integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==, + } ignore@5.3.2: - resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} - engines: {node: '>= 4'} + resolution: + { + integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==, + } + engines: { node: '>= 4' } ignore@7.0.5: - resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} - engines: {node: '>= 4'} + resolution: + { + integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==, + } + engines: { node: '>= 4' } immediate@3.0.6: - resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} + resolution: + { + integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==, + } import-fresh@3.3.1: - resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==, + } + engines: { node: '>=6' } import-lazy@2.1.0: - resolution: {integrity: sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A==, + } + engines: { node: '>=4' } import-local@3.2.0: - resolution: {integrity: sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==, + } + engines: { node: '>=8' } hasBin: true + import-meta-resolve@4.1.0: + resolution: + { + integrity: sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==, + } + imurmurhash@0.1.4: - resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} - engines: {node: '>=0.8.19'} + resolution: + { + integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==, + } + engines: { node: '>=0.8.19' } indent-string@3.2.0: - resolution: {integrity: sha512-BYqTHXTGUIvg7t1r4sJNKcbDZkL92nkXA8YtRpbjFHRHGDL/NtUeiBJMeE60kIFN/Mg8ESaWQvftaYMGJzQZCQ==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-BYqTHXTGUIvg7t1r4sJNKcbDZkL92nkXA8YtRpbjFHRHGDL/NtUeiBJMeE60kIFN/Mg8ESaWQvftaYMGJzQZCQ==, + } + engines: { node: '>=4' } indent-string@4.0.0: - resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==, + } + engines: { node: '>=8' } inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + resolution: + { + integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==, + } deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + resolution: + { + integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==, + } ini@1.3.8: - resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + resolution: + { + integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==, + } + + ini@4.1.1: + resolution: + { + integrity: sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } internal-ip@6.2.0: - resolution: {integrity: sha512-D8WGsR6yDt8uq7vDMu7mjcR+yRMm3dW8yufyChmszWRjcSHuxLBkR3GdS2HZAjodsaGuCvXeEJpueisXJULghg==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-D8WGsR6yDt8uq7vDMu7mjcR+yRMm3dW8yufyChmszWRjcSHuxLBkR3GdS2HZAjodsaGuCvXeEJpueisXJULghg==, + } + engines: { node: '>=10' } internal-slot@1.1.0: - resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==, + } + engines: { node: '>= 0.4' } internmap@2.0.3: - resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==, + } + engines: { node: '>=12' } interpret@1.4.0: - resolution: {integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==} - engines: {node: '>= 0.10'} + resolution: + { + integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==, + } + engines: { node: '>= 0.10' } interpret@2.2.0: - resolution: {integrity: sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==} - engines: {node: '>= 0.10'} + resolution: + { + integrity: sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==, + } + engines: { node: '>= 0.10' } ip-regex@4.3.0: - resolution: {integrity: sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q==, + } + engines: { node: '>=8' } ipaddr.js@1.9.1: - resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} - engines: {node: '>= 0.10'} + resolution: + { + integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==, + } + engines: { node: '>= 0.10' } iron-webcrypto@1.2.1: - resolution: {integrity: sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==} + resolution: + { + integrity: sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==, + } is-arguments@1.2.0: - resolution: {integrity: sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==, + } + engines: { node: '>= 0.4' } is-array-buffer@3.0.5: - resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==, + } + engines: { node: '>= 0.4' } is-arrayish@0.2.1: - resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + resolution: + { + integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==, + } is-async-function@2.1.1: - resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==, + } + engines: { node: '>= 0.4' } is-bigint@1.1.0: - resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==, + } + engines: { node: '>= 0.4' } is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==, + } + engines: { node: '>=8' } is-boolean-object@1.2.2: - resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==, + } + engines: { node: '>= 0.4' } is-buffer@2.0.5: - resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==, + } + engines: { node: '>=4' } is-bun-module@2.0.0: - resolution: {integrity: sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ==} + resolution: + { + integrity: sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ==, + } is-callable@1.2.7: - resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==, + } + engines: { node: '>= 0.4' } is-ci@1.2.1: - resolution: {integrity: sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==} + resolution: + { + integrity: sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==, + } hasBin: true is-core-module@2.16.1: - resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==, + } + engines: { node: '>= 0.4' } is-data-view@1.0.2: - resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==, + } + engines: { node: '>= 0.4' } is-date-object@1.1.0: - resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==, + } + engines: { node: '>= 0.4' } is-docker@2.2.1: - resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==, + } + engines: { node: '>=8' } hasBin: true is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==, + } + engines: { node: '>=0.10.0' } is-finalizationregistry@1.1.1: - resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==, + } + engines: { node: '>= 0.4' } is-fullwidth-code-point@2.0.0: - resolution: {integrity: sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==, + } + engines: { node: '>=4' } is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==, + } + engines: { node: '>=8' } is-fullwidth-code-point@4.0.0: - resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==, + } + engines: { node: '>=12' } is-fullwidth-code-point@5.0.0: - resolution: {integrity: sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==, + } + engines: { node: '>=18' } is-generator-function@1.1.0: - resolution: {integrity: sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==, + } + engines: { node: '>= 0.4' } is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==, + } + engines: { node: '>=0.10.0' } is-hex-prefixed@1.0.0: - resolution: {integrity: sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA==} - engines: {node: '>=6.5.0', npm: '>=3'} + resolution: + { + integrity: sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA==, + } + engines: { node: '>=6.5.0', npm: '>=3' } is-installed-globally@0.1.0: - resolution: {integrity: sha512-ERNhMg+i/XgDwPIPF3u24qpajVreaiSuvpb1Uu0jugw7KKcxGyCX8cgp8P5fwTmAuXku6beDHHECdKArjlg7tw==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-ERNhMg+i/XgDwPIPF3u24qpajVreaiSuvpb1Uu0jugw7KKcxGyCX8cgp8P5fwTmAuXku6beDHHECdKArjlg7tw==, + } + engines: { node: '>=4' } is-ip@3.1.0: - resolution: {integrity: sha512-35vd5necO7IitFPjd/YBeqwWnyDWbuLH9ZXQdMfDA8TEo7pv5X8yfrvVO3xbJbLUlERCMvf6X0hTUamQxCYJ9Q==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-35vd5necO7IitFPjd/YBeqwWnyDWbuLH9ZXQdMfDA8TEo7pv5X8yfrvVO3xbJbLUlERCMvf6X0hTUamQxCYJ9Q==, + } + engines: { node: '>=8' } is-map@2.0.3: - resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==, + } + engines: { node: '>= 0.4' } is-nan@1.3.2: - resolution: {integrity: sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==, + } + engines: { node: '>= 0.4' } is-negative-zero@2.0.3: - resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==, + } + engines: { node: '>= 0.4' } is-npm@1.0.0: - resolution: {integrity: sha512-9r39FIr3d+KD9SbX0sfMsHzb5PP3uimOiwr3YupUaUFG4W0l1U57Rx3utpttV7qz5U3jmrO5auUa04LU9pyHsg==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-9r39FIr3d+KD9SbX0sfMsHzb5PP3uimOiwr3YupUaUFG4W0l1U57Rx3utpttV7qz5U3jmrO5auUa04LU9pyHsg==, + } + engines: { node: '>=0.10.0' } is-number-object@1.1.1: - resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==, + } + engines: { node: '>= 0.4' } is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} + resolution: + { + integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==, + } + engines: { node: '>=0.12.0' } is-obj@1.0.1: - resolution: {integrity: sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==, + } + engines: { node: '>=0.10.0' } + + is-obj@2.0.0: + resolution: + { + integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==, + } + engines: { node: '>=8' } is-path-inside@1.0.1: - resolution: {integrity: sha512-qhsCR/Esx4U4hg/9I19OVUAJkGWtjRYHMRgUMZE2TDdj+Ag+kttZanLupfddNyglzz50cUlmWzUaI37GDfNx/g==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-qhsCR/Esx4U4hg/9I19OVUAJkGWtjRYHMRgUMZE2TDdj+Ag+kttZanLupfddNyglzz50cUlmWzUaI37GDfNx/g==, + } + engines: { node: '>=0.10.0' } is-plain-obj@1.1.0: - resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==, + } + engines: { node: '>=0.10.0' } is-plain-object@2.0.4: - resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} - engines: {node: '>=0.10.0'} - - is-potential-custom-element-name@1.0.1: - resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} + resolution: + { + integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==, + } + engines: { node: '>=0.10.0' } is-redirect@1.0.0: - resolution: {integrity: sha512-cr/SlUEe5zOGmzvj9bUyC4LVvkNVAXu4GytXLNMr1pny+a65MpQ9IJzFHD5vi7FyJgb4qt27+eS3TuQnqB+RQw==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-cr/SlUEe5zOGmzvj9bUyC4LVvkNVAXu4GytXLNMr1pny+a65MpQ9IJzFHD5vi7FyJgb4qt27+eS3TuQnqB+RQw==, + } + engines: { node: '>=0.10.0' } is-regex@1.2.1: - resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==, + } + engines: { node: '>= 0.4' } is-retry-allowed@1.2.0: - resolution: {integrity: sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==, + } + engines: { node: '>=0.10.0' } is-set@2.0.3: - resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==, + } + engines: { node: '>= 0.4' } is-shared-array-buffer@1.0.4: - resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==, + } + engines: { node: '>= 0.4' } is-stream@1.1.0: - resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==, + } + engines: { node: '>=0.10.0' } is-stream@2.0.1: - resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==, + } + engines: { node: '>=8' } is-stream@3.0.0: - resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + resolution: + { + integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==, + } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } is-string@1.1.1: - resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==, + } + engines: { node: '>= 0.4' } is-symbol@1.1.1: - resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==, + } + engines: { node: '>= 0.4' } + + is-text-path@2.0.0: + resolution: + { + integrity: sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw==, + } + engines: { node: '>=8' } is-typed-array@1.1.15: - resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==, + } + engines: { node: '>= 0.4' } is-weakmap@2.0.2: - resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==, + } + engines: { node: '>= 0.4' } is-weakref@1.1.1: - resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==, + } + engines: { node: '>= 0.4' } is-weakset@2.0.4: - resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==, + } + engines: { node: '>= 0.4' } is-wsl@2.2.0: - resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==, + } + engines: { node: '>=8' } isarray@0.0.1: - resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} + resolution: + { + integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==, + } isarray@1.0.0: - resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + resolution: + { + integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==, + } isarray@2.0.5: - resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + resolution: + { + integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==, + } isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + resolution: + { + integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==, + } isobject@3.0.1: - resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==, + } + engines: { node: '>=0.10.0' } isomorphic-ws@5.0.0: - resolution: {integrity: sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw==} + resolution: + { + integrity: sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw==, + } peerDependencies: ws: '*' isows@1.0.7: - resolution: {integrity: sha512-I1fSfDCZL5P0v33sVqeTDSpcstAg/N+wF5HS033mogOVIp4B+oHC7oOCsA3axAbBSGTJ8QubbNmnIRN/h8U7hg==} + resolution: + { + integrity: sha512-I1fSfDCZL5P0v33sVqeTDSpcstAg/N+wF5HS033mogOVIp4B+oHC7oOCsA3axAbBSGTJ8QubbNmnIRN/h8U7hg==, + } peerDependencies: ws: '*' istanbul-lib-coverage@3.2.2: - resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==, + } + engines: { node: '>=8' } istanbul-lib-report@3.0.1: - resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==, + } + engines: { node: '>=10' } istanbul-lib-source-maps@5.0.6: - resolution: {integrity: sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==, + } + engines: { node: '>=10' } istanbul-reports@3.1.7: - resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==, + } + engines: { node: '>=8' } iterator.prototype@1.1.5: - resolution: {integrity: sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==, + } + engines: { node: '>= 0.4' } jackspeak@3.4.3: - resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + resolution: + { + integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==, + } + + jackspeak@4.1.1: + resolution: + { + integrity: sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==, + } + engines: { node: 20 || >=22 } jest-worker@27.5.1: - resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} - engines: {node: '>= 10.13.0'} + resolution: + { + integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==, + } + engines: { node: '>= 10.13.0' } jiti@1.21.7: - resolution: {integrity: sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==} + resolution: + { + integrity: sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==, + } hasBin: true jiti@2.4.2: - resolution: {integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==} + resolution: + { + integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==, + } hasBin: true + joycon@3.1.1: + resolution: + { + integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==, + } + engines: { node: '>=10' } + js-tokens@4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + resolution: + { + integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==, + } js-tokens@9.0.1: - resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} + resolution: + { + integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==, + } js-yaml@3.14.1: - resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + resolution: + { + integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==, + } hasBin: true js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + resolution: + { + integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==, + } hasBin: true - jsdom@16.7.0: - resolution: {integrity: sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==} - engines: {node: '>=10'} - peerDependencies: - canvas: ^2.5.0 - peerDependenciesMeta: - canvas: - optional: true - jsesc@3.0.2: - resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==, + } + engines: { node: '>=6' } hasBin: true jsesc@3.1.0: - resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==, + } + engines: { node: '>=6' } hasBin: true json-buffer@3.0.1: - resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + resolution: + { + integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==, + } json-parse-better-errors@1.0.2: - resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} + resolution: + { + integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==, + } json-parse-even-better-errors@2.3.1: - resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + resolution: + { + integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==, + } json-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + resolution: + { + integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==, + } json-schema-traverse@1.0.0: - resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + resolution: + { + integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==, + } json-stable-stringify-without-jsonify@1.0.1: - resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + resolution: + { + integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==, + } json-stringify-safe@5.0.1: - resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} + resolution: + { + integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==, + } json5@1.0.2: - resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} + resolution: + { + integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==, + } hasBin: true json5@2.2.3: - resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==, + } + engines: { node: '>=6' } hasBin: true jsonfile@4.0.0: - resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + resolution: + { + integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==, + } jsonfile@6.1.0: - resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + resolution: + { + integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==, + } + + jsonparse@1.3.1: + resolution: + { + integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==, + } + engines: { '0': node >= 0.2.0 } jsx-ast-utils@3.3.5: - resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} - engines: {node: '>=4.0'} + resolution: + { + integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==, + } + engines: { node: '>=4.0' } jszip@3.10.1: - resolution: {integrity: sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==} + resolution: + { + integrity: sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==, + } just-extend@4.2.1: - resolution: {integrity: sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==} + resolution: + { + integrity: sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==, + } keccak256@1.0.6: - resolution: {integrity: sha512-8GLiM01PkdJVGUhR1e6M/AvWnSqYS0HaERI+K/QtStGDGlSTx2B1zTqZk4Zlqu5TxHJNTxWAdP9Y+WI50OApUw==} + resolution: + { + integrity: sha512-8GLiM01PkdJVGUhR1e6M/AvWnSqYS0HaERI+K/QtStGDGlSTx2B1zTqZk4Zlqu5TxHJNTxWAdP9Y+WI50OApUw==, + } keccak@3.0.4: - resolution: {integrity: sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q==} - engines: {node: '>=10.0.0'} + resolution: + { + integrity: sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q==, + } + engines: { node: '>=10.0.0' } keyv@4.5.4: - resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + resolution: + { + integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==, + } keyvaluestorage-interface@1.0.0: - resolution: {integrity: sha512-8t6Q3TclQ4uZynJY9IGr2+SsIGwK9JHcO6ootkHCGA0CrQCRy+VkouYNO2xicET6b9al7QKzpebNow+gkpCL8g==} + resolution: + { + integrity: sha512-8t6Q3TclQ4uZynJY9IGr2+SsIGwK9JHcO6ootkHCGA0CrQCRy+VkouYNO2xicET6b9al7QKzpebNow+gkpCL8g==, + } kind-of@6.0.3: - resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==, + } + engines: { node: '>=0.10.0' } klona@2.0.6: - resolution: {integrity: sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==} - engines: {node: '>= 8'} + resolution: + { + integrity: sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==, + } + engines: { node: '>= 8' } koa-compose@4.1.0: - resolution: {integrity: sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw==} + resolution: + { + integrity: sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw==, + } latest-version@3.1.0: - resolution: {integrity: sha512-Be1YRHWWlZaSsrz2U+VInk+tO0EwLIyV+23RhWLINJYwg/UIikxjlj3MhH37/6/EDCAusjajvMkMMUXRaMWl/w==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-Be1YRHWWlZaSsrz2U+VInk+tO0EwLIyV+23RhWLINJYwg/UIikxjlj3MhH37/6/EDCAusjajvMkMMUXRaMWl/w==, + } + engines: { node: '>=4' } levn@0.4.1: - resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} - engines: {node: '>= 0.8.0'} + resolution: + { + integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==, + } + engines: { node: '>= 0.8.0' } lie@3.3.0: - resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==} + resolution: + { + integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==, + } lilconfig@3.1.3: - resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} - engines: {node: '>=14'} + resolution: + { + integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==, + } + engines: { node: '>=14' } lines-and-columns@1.2.4: - resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + resolution: + { + integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==, + } lint-staged@15.5.2: - resolution: {integrity: sha512-YUSOLq9VeRNAo/CTaVmhGDKG+LBtA8KF1X4K5+ykMSwWST1vDxJRB2kv2COgLb1fvpCo+A/y9A0G0znNVmdx4w==} - engines: {node: '>=18.12.0'} + resolution: + { + integrity: sha512-YUSOLq9VeRNAo/CTaVmhGDKG+LBtA8KF1X4K5+ykMSwWST1vDxJRB2kv2COgLb1fvpCo+A/y9A0G0znNVmdx4w==, + } + engines: { node: '>=18.12.0' } hasBin: true listr2@8.3.3: - resolution: {integrity: sha512-LWzX2KsqcB1wqQ4AHgYb4RsDXauQiqhjLk+6hjbaeHG4zpjjVAB6wC/gz6X0l+Du1cN3pUB5ZlrvTbhGSNnUQQ==} - engines: {node: '>=18.0.0'} + resolution: + { + integrity: sha512-LWzX2KsqcB1wqQ4AHgYb4RsDXauQiqhjLk+6hjbaeHG4zpjjVAB6wC/gz6X0l+Du1cN3pUB5ZlrvTbhGSNnUQQ==, + } + engines: { node: '>=18.0.0' } lit-element@3.3.3: - resolution: {integrity: sha512-XbeRxmTHubXENkV4h8RIPyr8lXc+Ff28rkcQzw3G6up2xg5E8Zu1IgOWIwBLEQsu3cOVFqdYwiVi0hv0SlpqUA==} + resolution: + { + integrity: sha512-XbeRxmTHubXENkV4h8RIPyr8lXc+Ff28rkcQzw3G6up2xg5E8Zu1IgOWIwBLEQsu3cOVFqdYwiVi0hv0SlpqUA==, + } lit-html@2.8.0: - resolution: {integrity: sha512-o9t+MQM3P4y7M7yNzqAyjp7z+mQGa4NS4CxiyLqFPyFWyc4O+nodLrkrxSaCTrla6M5YOLaT3RpbbqjszB5g3Q==} + resolution: + { + integrity: sha512-o9t+MQM3P4y7M7yNzqAyjp7z+mQGa4NS4CxiyLqFPyFWyc4O+nodLrkrxSaCTrla6M5YOLaT3RpbbqjszB5g3Q==, + } lit@2.8.0: - resolution: {integrity: sha512-4Sc3OFX9QHOJaHbmTMk28SYgVxLN3ePDjg7hofEft2zWlehFL3LiAuapWc4U/kYwMYJSh2hTCPZ6/LIC7ii0MA==} + resolution: + { + integrity: sha512-4Sc3OFX9QHOJaHbmTMk28SYgVxLN3ePDjg7hofEft2zWlehFL3LiAuapWc4U/kYwMYJSh2hTCPZ6/LIC7ii0MA==, + } load-json-file@4.0.0: - resolution: {integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==, + } + engines: { node: '>=4' } + + load-tsconfig@0.2.5: + resolution: + { + integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==, + } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } loader-runner@4.3.0: - resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} - engines: {node: '>=6.11.5'} + resolution: + { + integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==, + } + engines: { node: '>=6.11.5' } loader-utils@2.0.4: - resolution: {integrity: sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==} - engines: {node: '>=8.9.0'} + resolution: + { + integrity: sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==, + } + engines: { node: '>=8.9.0' } locate-path@2.0.0: - resolution: {integrity: sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==, + } + engines: { node: '>=4' } locate-path@5.0.0: - resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==, + } + engines: { node: '>=8' } locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==, + } + engines: { node: '>=10' } locate-path@7.2.0: - resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + resolution: + { + integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==, + } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } lodash.camelcase@4.3.0: - resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + resolution: + { + integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==, + } lodash.debounce@4.0.8: - resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} + resolution: + { + integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==, + } lodash.isequal@4.5.0: - resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} + resolution: + { + integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==, + } deprecated: This package is deprecated. Use require('node:util').isDeepStrictEqual instead. + lodash.isplainobject@4.0.6: + resolution: + { + integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==, + } + + lodash.kebabcase@4.1.1: + resolution: + { + integrity: sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==, + } + + lodash.memoize@4.1.2: + resolution: + { + integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==, + } + lodash.merge@4.6.2: - resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + resolution: + { + integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==, + } + + lodash.mergewith@4.6.2: + resolution: + { + integrity: sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==, + } + + lodash.snakecase@4.1.1: + resolution: + { + integrity: sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==, + } + + lodash.sortby@4.7.0: + resolution: + { + integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==, + } + + lodash.startcase@4.4.0: + resolution: + { + integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==, + } lodash.truncate@4.4.2: - resolution: {integrity: sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==} + resolution: + { + integrity: sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==, + } + + lodash.uniq@4.5.0: + resolution: + { + integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==, + } + + lodash.upperfirst@4.3.1: + resolution: + { + integrity: sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==, + } lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + resolution: + { + integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==, + } log-update@6.1.0: - resolution: {integrity: sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==, + } + engines: { node: '>=18' } loglevel@1.9.2: - resolution: {integrity: sha512-HgMmCqIJSAKqo68l0rS2AanEWfkxaZ5wNiEFb5ggm08lDs9Xl2KxBlX3PTcaD2chBM1gXAYf491/M2Rv8Jwayg==} - engines: {node: '>= 0.6.0'} + resolution: + { + integrity: sha512-HgMmCqIJSAKqo68l0rS2AanEWfkxaZ5wNiEFb5ggm08lDs9Xl2KxBlX3PTcaD2chBM1gXAYf491/M2Rv8Jwayg==, + } + engines: { node: '>= 0.6.0' } lolex@4.2.0: - resolution: {integrity: sha512-gKO5uExCXvSm6zbF562EvM+rd1kQDnB9AZBbiQVzf1ZmdDpxUSvpnAaVOP83N/31mRK8Ml8/VE8DMvsAZQ+7wg==} + resolution: + { + integrity: sha512-gKO5uExCXvSm6zbF562EvM+rd1kQDnB9AZBbiQVzf1ZmdDpxUSvpnAaVOP83N/31mRK8Ml8/VE8DMvsAZQ+7wg==, + } lolex@5.1.2: - resolution: {integrity: sha512-h4hmjAvHTmd+25JSwrtTIuwbKdwg5NzZVRMLn9saij4SZaepCrTCxPr35H/3bjwfMJtN+t3CX8672UIkglz28A==} + resolution: + { + integrity: sha512-h4hmjAvHTmd+25JSwrtTIuwbKdwg5NzZVRMLn9saij4SZaepCrTCxPr35H/3bjwfMJtN+t3CX8672UIkglz28A==, + } long@5.3.2: - resolution: {integrity: sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==} + resolution: + { + integrity: sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==, + } loose-envify@1.4.0: - resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + resolution: + { + integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==, + } hasBin: true loud-rejection@1.6.0: - resolution: {integrity: sha512-RPNliZOFkqFumDhvYqOaNY4Uz9oJM2K9tC6JWsJJsNdhuONW4LQHRBpb0qf4pJApVffI5N39SwzWZJuEhfd7eQ==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-RPNliZOFkqFumDhvYqOaNY4Uz9oJM2K9tC6JWsJJsNdhuONW4LQHRBpb0qf4pJApVffI5N39SwzWZJuEhfd7eQ==, + } + engines: { node: '>=0.10.0' } loupe@3.1.4: - resolution: {integrity: sha512-wJzkKwJrheKtknCOKNEtDK4iqg/MxmZheEMtSTYvnzRdEYaZzmgH976nenp8WdJRdx5Vc1X/9MO0Oszl6ezeXg==} + resolution: + { + integrity: sha512-wJzkKwJrheKtknCOKNEtDK4iqg/MxmZheEMtSTYvnzRdEYaZzmgH976nenp8WdJRdx5Vc1X/9MO0Oszl6ezeXg==, + } lower-case@2.0.2: - resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} + resolution: + { + integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==, + } lowercase-keys@1.0.1: - resolution: {integrity: sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==, + } + engines: { node: '>=0.10.0' } lowercase-keys@2.0.0: - resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==, + } + engines: { node: '>=8' } lru-cache@10.4.3: - resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + resolution: + { + integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==, + } + + lru-cache@11.1.0: + resolution: + { + integrity: sha512-QIXZUBJUx+2zHUdQujWejBkcD9+cs94tLn0+YL8UrCh+D5sCXZ4c7LaEH48pNwRY3MLDgqUFyhlCyjJPf1WP0A==, + } + engines: { node: 20 || >=22 } lru-cache@4.1.5: - resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} + resolution: + { + integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==, + } lru-cache@5.1.1: - resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} - - lru-cache@6.0.0: - resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==, + } lz-string@1.5.0: - resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} + resolution: + { + integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==, + } hasBin: true magic-string@0.30.17: - resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} + resolution: + { + integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==, + } magicast@0.3.5: - resolution: {integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==} + resolution: + { + integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==, + } make-dir@1.3.0: - resolution: {integrity: sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==, + } + engines: { node: '>=4' } make-dir@3.1.0: - resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==, + } + engines: { node: '>=8' } make-dir@4.0.0: - resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==, + } + engines: { node: '>=10' } make-error@1.3.6: - resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + resolution: + { + integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==, + } map-obj@1.0.1: - resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==, + } + engines: { node: '>=0.10.0' } map-obj@2.0.0: - resolution: {integrity: sha512-TzQSV2DiMYgoF5RycneKVUzIa9bQsj/B3tTgsE3dOGqlzHnGIDaC7XBE7grnA+8kZPnfqSGFe95VHc2oc0VFUQ==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-TzQSV2DiMYgoF5RycneKVUzIa9bQsj/B3tTgsE3dOGqlzHnGIDaC7XBE7grnA+8kZPnfqSGFe95VHc2oc0VFUQ==, + } + engines: { node: '>=4' } matcher@3.0.0: - resolution: {integrity: sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==, + } + engines: { node: '>=10' } math-intrinsics@1.1.0: - resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==, + } + engines: { node: '>= 0.4' } md5.js@1.3.5: - resolution: {integrity: sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==} + resolution: + { + integrity: sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==, + } mdn-data@2.0.14: - resolution: {integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==} + resolution: + { + integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==, + } mdn-data@2.0.4: - resolution: {integrity: sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==} + resolution: + { + integrity: sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==, + } memfs@3.5.3: - resolution: {integrity: sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==} - engines: {node: '>= 4.0.0'} + resolution: + { + integrity: sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==, + } + engines: { node: '>= 4.0.0' } + + meow@12.1.1: + resolution: + { + integrity: sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==, + } + engines: { node: '>=16.10' } meow@5.0.0: - resolution: {integrity: sha512-CbTqYU17ABaLefO8vCU153ZZlprKYWDljcndKKDCFcYQITzWCXZAVk4QMFZPgvzrnUQ3uItnIE/LoUOwrT15Ig==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-CbTqYU17ABaLefO8vCU153ZZlprKYWDljcndKKDCFcYQITzWCXZAVk4QMFZPgvzrnUQ3uItnIE/LoUOwrT15Ig==, + } + engines: { node: '>=6' } merge-stream@2.0.0: - resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + resolution: + { + integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==, + } merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} + resolution: + { + integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==, + } + engines: { node: '>= 8' } micro-ftch@0.3.1: - resolution: {integrity: sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg==} + resolution: + { + integrity: sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg==, + } micromatch@4.0.8: - resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} - engines: {node: '>=8.6'} + resolution: + { + integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==, + } + engines: { node: '>=8.6' } miller-rabin@4.0.1: - resolution: {integrity: sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==} + resolution: + { + integrity: sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==, + } hasBin: true mime-db@1.52.0: - resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} - engines: {node: '>= 0.6'} + resolution: + { + integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==, + } + engines: { node: '>= 0.6' } mime-types@2.1.35: - resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} - engines: {node: '>= 0.6'} + resolution: + { + integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==, + } + engines: { node: '>= 0.6' } mimic-fn@2.1.0: - resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==, + } + engines: { node: '>=6' } mimic-fn@4.0.0: - resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==, + } + engines: { node: '>=12' } mimic-function@5.0.1: - resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==, + } + engines: { node: '>=18' } mimic-response@1.0.1: - resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==, + } + engines: { node: '>=4' } mimic-response@3.1.0: - resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==, + } + engines: { node: '>=10' } min-indent@1.0.1: - resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==, + } + engines: { node: '>=4' } minimalistic-assert@1.0.1: - resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} + resolution: + { + integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==, + } minimalistic-crypto-utils@1.0.1: - resolution: {integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==} + resolution: + { + integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==, + } + + minimatch@10.0.3: + resolution: + { + integrity: sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==, + } + engines: { node: 20 || >=22 } minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + resolution: + { + integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==, + } minimatch@9.0.5: - resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} - engines: {node: '>=16 || 14 >=14.17'} + resolution: + { + integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==, + } + engines: { node: '>=16 || 14 >=14.17' } minimist-options@3.0.2: - resolution: {integrity: sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ==} - engines: {node: '>= 4'} + resolution: + { + integrity: sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ==, + } + engines: { node: '>= 4' } minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + resolution: + { + integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==, + } minipass@7.1.2: - resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} - engines: {node: '>=16 || 14 >=14.17'} + resolution: + { + integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==, + } + engines: { node: '>=16 || 14 >=14.17' } mkdirp@0.5.6: - resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} + resolution: + { + integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==, + } hasBin: true + mlly@1.7.4: + resolution: + { + integrity: sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==, + } + motion@10.16.2: - resolution: {integrity: sha512-p+PurYqfUdcJZvtnmAqu5fJgV2kR0uLFQuBKtLeFVTrYEVllI99tiOTSefVNYuip9ELTEkepIIDftNdze76NAQ==} + resolution: + { + integrity: sha512-p+PurYqfUdcJZvtnmAqu5fJgV2kR0uLFQuBKtLeFVTrYEVllI99tiOTSefVNYuip9ELTEkepIIDftNdze76NAQ==, + } ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + resolution: + { + integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==, + } multiformats@9.9.0: - resolution: {integrity: sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==} + resolution: + { + integrity: sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==, + } mz@2.7.0: - resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + resolution: + { + integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==, + } nan@2.22.2: - resolution: {integrity: sha512-DANghxFkS1plDdRsX0X9pm0Z6SJNN6gBdtXfanwoZ8hooC5gosGFSBGRYHUVPz1asKA/kMRqDRdHrluZ61SpBQ==} + resolution: + { + integrity: sha512-DANghxFkS1plDdRsX0X9pm0Z6SJNN6gBdtXfanwoZ8hooC5gosGFSBGRYHUVPz1asKA/kMRqDRdHrluZ61SpBQ==, + } nanoid@3.3.11: - resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + resolution: + { + integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==, + } + engines: { node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1 } hasBin: true - napi-postinstall@0.2.4: - resolution: {integrity: sha512-ZEzHJwBhZ8qQSbknHqYcdtQVr8zUgGyM/q6h6qAyhtyVMNrSgDhrC4disf03dYW0e+czXyLnZINnCTEkWy0eJg==} - engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + napi-postinstall@0.3.0: + resolution: + { + integrity: sha512-M7NqKyhODKV1gRLdkwE7pDsZP2/SC2a2vHkOYh9MCpKMbWVfyVfUw5MaH83Fv6XMjxr5jryUp3IDDL9rlxsTeA==, + } + engines: { node: ^12.20.0 || ^14.18.0 || >=16.0.0 } hasBin: true natural-compare@1.4.0: - resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + resolution: + { + integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==, + } neo-async@2.6.2: - resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + resolution: + { + integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==, + } nise@1.5.3: - resolution: {integrity: sha512-Ymbac/94xeIrMf59REBPOv0thr+CJVFMhrlAkW/gjCIE58BGQdCj0x7KRCb3yz+Ga2Rz3E9XXSvUyyxqqhjQAQ==} + resolution: + { + integrity: sha512-Ymbac/94xeIrMf59REBPOv0thr+CJVFMhrlAkW/gjCIE58BGQdCj0x7KRCb3yz+Ga2Rz3E9XXSvUyyxqqhjQAQ==, + } no-case@3.0.4: - resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} + resolution: + { + integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==, + } node-abort-controller@3.1.1: - resolution: {integrity: sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==} + resolution: + { + integrity: sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==, + } node-addon-api@2.0.2: - resolution: {integrity: sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==} + resolution: + { + integrity: sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==, + } node-addon-api@5.1.0: - resolution: {integrity: sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==} + resolution: + { + integrity: sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==, + } node-fetch-native@1.6.6: - resolution: {integrity: sha512-8Mc2HhqPdlIfedsuZoc3yioPuzp6b+L5jRCRY1QzuWZh2EGJVQrGppC6V6cF0bLdbW0+O2YpqCA25aF/1lvipQ==} + resolution: + { + integrity: sha512-8Mc2HhqPdlIfedsuZoc3yioPuzp6b+L5jRCRY1QzuWZh2EGJVQrGppC6V6cF0bLdbW0+O2YpqCA25aF/1lvipQ==, + } node-fetch@2.7.0: - resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} - engines: {node: 4.x || >=6.0.0} + resolution: + { + integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==, + } + engines: { node: 4.x || >=6.0.0 } peerDependencies: encoding: ^0.1.0 peerDependenciesMeta: @@ -5632,136 +9881,238 @@ packages: optional: true node-gyp-build@4.8.4: - resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} + resolution: + { + integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==, + } hasBin: true - node-mock-http@1.0.0: - resolution: {integrity: sha512-0uGYQ1WQL1M5kKvGRXWQ3uZCHtLTO8hln3oBjIusM75WoesZ909uQJs/Hb946i2SS+Gsrhkaa6iAO17jRIv6DQ==} + node-mock-http@1.0.1: + resolution: + { + integrity: sha512-0gJJgENizp4ghds/Ywu2FCmcRsgBTmRQzYPZm61wy+Em2sBarSka0OhQS5huLBg6od1zkNpnWMCZloQDFVvOMQ==, + } node-releases@2.0.19: - resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} + resolution: + { + integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==, + } normalize-package-data@2.5.0: - resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} + resolution: + { + integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==, + } normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==, + } + engines: { node: '>=0.10.0' } normalize-range@0.1.2: - resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==, + } + engines: { node: '>=0.10.0' } normalize-url@6.1.0: - resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==, + } + engines: { node: '>=10' } npm-run-path@2.0.2: - resolution: {integrity: sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==, + } + engines: { node: '>=4' } npm-run-path@4.0.1: - resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==, + } + engines: { node: '>=8' } npm-run-path@5.3.0: - resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + resolution: + { + integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==, + } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } nth-check@1.0.2: - resolution: {integrity: sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==} + resolution: + { + integrity: sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==, + } nth-check@2.1.1: - resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} - - nwsapi@2.2.20: - resolution: {integrity: sha512-/ieB+mDe4MrrKMT8z+mQL8klXydZWGR5Dowt4RAGKbJ3kIGEx3X4ljUo+6V73IXtUPWgfOlU5B9MlGxFO5T+cA==} + resolution: + { + integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==, + } object-assign@4.1.1: - resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==, + } + engines: { node: '>=0.10.0' } object-hash@3.0.0: - resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} - engines: {node: '>= 6'} + resolution: + { + integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==, + } + engines: { node: '>= 6' } object-inspect@1.13.4: - resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==, + } + engines: { node: '>= 0.4' } object-is@1.1.6: - resolution: {integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==, + } + engines: { node: '>= 0.4' } object-keys@1.1.1: - resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==, + } + engines: { node: '>= 0.4' } object.assign@4.1.7: - resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==, + } + engines: { node: '>= 0.4' } object.entries@1.1.9: - resolution: {integrity: sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==, + } + engines: { node: '>= 0.4' } object.fromentries@2.0.8: - resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==, + } + engines: { node: '>= 0.4' } object.getownpropertydescriptors@2.1.8: - resolution: {integrity: sha512-qkHIGe4q0lSYMv0XI4SsBTJz3WaURhLvd0lKSgtVuOsJ2krg4SgMw3PIRQFMp07yi++UR3se2mkcLqsBNpBb/A==} - engines: {node: '>= 0.8'} + resolution: + { + integrity: sha512-qkHIGe4q0lSYMv0XI4SsBTJz3WaURhLvd0lKSgtVuOsJ2krg4SgMw3PIRQFMp07yi++UR3se2mkcLqsBNpBb/A==, + } + engines: { node: '>= 0.8' } object.groupby@1.0.3: - resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==, + } + engines: { node: '>= 0.4' } object.values@1.2.1: - resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==, + } + engines: { node: '>= 0.4' } objectorarray@1.0.5: - resolution: {integrity: sha512-eJJDYkhJFFbBBAxeh8xW+weHlkI28n2ZdQV/J/DNfWfSKlGEf2xcfAbZTv3riEXHAhL9SVOTs2pRmXiSTf78xg==} + resolution: + { + integrity: sha512-eJJDYkhJFFbBBAxeh8xW+weHlkI28n2ZdQV/J/DNfWfSKlGEf2xcfAbZTv3riEXHAhL9SVOTs2pRmXiSTf78xg==, + } ofetch@1.4.1: - resolution: {integrity: sha512-QZj2DfGplQAr2oj9KzceK9Hwz6Whxazmn85yYeVuS3u9XTMOGMRx0kO95MQ+vLsj/S/NwBDMMLU5hpxvI6Tklw==} + resolution: + { + integrity: sha512-QZj2DfGplQAr2oj9KzceK9Hwz6Whxazmn85yYeVuS3u9XTMOGMRx0kO95MQ+vLsj/S/NwBDMMLU5hpxvI6Tklw==, + } on-exit-leak-free@0.2.0: - resolution: {integrity: sha512-dqaz3u44QbRXQooZLTUKU41ZrzYrcvLISVgbrzbyCMxpmSLJvZ3ZamIJIZ29P6OhZIkNIQKosdeM6t1LYbA9hg==} + resolution: + { + integrity: sha512-dqaz3u44QbRXQooZLTUKU41ZrzYrcvLISVgbrzbyCMxpmSLJvZ3ZamIJIZ29P6OhZIkNIQKosdeM6t1LYbA9hg==, + } once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + resolution: + { + integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==, + } onetime@5.1.2: - resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==, + } + engines: { node: '>=6' } onetime@6.0.0: - resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==, + } + engines: { node: '>=12' } onetime@7.0.0: - resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==, + } + engines: { node: '>=18' } open@8.4.2: - resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==, + } + engines: { node: '>=12' } optionator@0.9.4: - resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} - engines: {node: '>= 0.8.0'} + resolution: + { + integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==, + } + engines: { node: '>= 0.8.0' } os-browserify@0.3.0: - resolution: {integrity: sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==} + resolution: + { + integrity: sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==, + } own-keys@1.0.1: - resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==, + } + engines: { node: '>= 0.4' } ox@0.7.1: - resolution: {integrity: sha512-+k9fY9PRNuAMHRFIUbiK9Nt5seYHHzSQs9Bj+iMETcGtlpS7SmBzcGSVUQO3+nqGLEiNK4598pHNFlVRaZbRsg==} + resolution: + { + integrity: sha512-+k9fY9PRNuAMHRFIUbiK9Nt5seYHHzSQs9Bj+iMETcGtlpS7SmBzcGSVUQO3+nqGLEiNK4598pHNFlVRaZbRsg==, + } peerDependencies: typescript: '>=5.4.0' peerDependenciesMeta: @@ -5769,269 +10120,474 @@ packages: optional: true p-cancelable@2.1.1: - resolution: {integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==, + } + engines: { node: '>=8' } p-event@4.2.0: - resolution: {integrity: sha512-KXatOjCRXXkSePPb1Nbi0p0m+gQAwdlbhi4wQKJPI1HsMQS9g+Sqp2o+QHziPr7eYJyOZet836KoHEVM1mwOrQ==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-KXatOjCRXXkSePPb1Nbi0p0m+gQAwdlbhi4wQKJPI1HsMQS9g+Sqp2o+QHziPr7eYJyOZet836KoHEVM1mwOrQ==, + } + engines: { node: '>=8' } p-finally@1.0.0: - resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==, + } + engines: { node: '>=4' } p-limit@1.3.0: - resolution: {integrity: sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==, + } + engines: { node: '>=4' } p-limit@2.3.0: - resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==, + } + engines: { node: '>=6' } p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==, + } + engines: { node: '>=10' } p-limit@4.0.0: - resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + resolution: + { + integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==, + } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } p-locate@2.0.0: - resolution: {integrity: sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==, + } + engines: { node: '>=4' } p-locate@4.1.0: - resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==, + } + engines: { node: '>=8' } p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==, + } + engines: { node: '>=10' } p-locate@6.0.0: - resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + resolution: + { + integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==, + } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } p-timeout@3.2.0: - resolution: {integrity: sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==, + } + engines: { node: '>=8' } p-try@1.0.0: - resolution: {integrity: sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==, + } + engines: { node: '>=4' } p-try@2.2.0: - resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==, + } + engines: { node: '>=6' } package-json-from-dist@1.0.1: - resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + resolution: + { + integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==, + } package-json@4.0.1: - resolution: {integrity: sha512-q/R5GrMek0vzgoomq6rm9OX+3PQve8sLwTirmK30YB3Cu0Bbt9OX9M/SIUnroN5BGJkzwGsFwDaRGD9EwBOlCA==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-q/R5GrMek0vzgoomq6rm9OX+3PQve8sLwTirmK30YB3Cu0Bbt9OX9M/SIUnroN5BGJkzwGsFwDaRGD9EwBOlCA==, + } + engines: { node: '>=4' } pako@1.0.11: - resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} + resolution: + { + integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==, + } param-case@3.0.4: - resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==} + resolution: + { + integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==, + } parent-module@1.0.1: - resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==, + } + engines: { node: '>=6' } parse-asn1@5.1.7: - resolution: {integrity: sha512-CTM5kuWR3sx9IFamcl5ErfPl6ea/N8IYwiJ+vpeB2g+1iknv7zBl5uPwbMbRVznRVbrNY6lGuDoE5b30grmbqg==} - engines: {node: '>= 0.10'} + resolution: + { + integrity: sha512-CTM5kuWR3sx9IFamcl5ErfPl6ea/N8IYwiJ+vpeB2g+1iknv7zBl5uPwbMbRVznRVbrNY6lGuDoE5b30grmbqg==, + } + engines: { node: '>= 0.10' } parse-json@4.0.0: - resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==, + } + engines: { node: '>=4' } parse-json@5.2.0: - resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} - engines: {node: '>=8'} - - parse5@6.0.1: - resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} + resolution: + { + integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==, + } + engines: { node: '>=8' } pascal-case@3.1.2: - resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} + resolution: + { + integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==, + } path-browserify@1.0.1: - resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + resolution: + { + integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==, + } path-exists@3.0.0: - resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==, + } + engines: { node: '>=4' } path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==, + } + engines: { node: '>=8' } path-exists@5.0.0: - resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + resolution: + { + integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==, + } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==, + } + engines: { node: '>=0.10.0' } path-is-inside@1.0.2: - resolution: {integrity: sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==} + resolution: + { + integrity: sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==, + } path-key@2.0.1: - resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==, + } + engines: { node: '>=4' } path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==, + } + engines: { node: '>=8' } path-key@4.0.0: - resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==, + } + engines: { node: '>=12' } path-parse@1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + resolution: + { + integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==, + } path-scurry@1.11.1: - resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} - engines: {node: '>=16 || 14 >=14.18'} + resolution: + { + integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==, + } + engines: { node: '>=16 || 14 >=14.18' } + + path-scurry@2.0.0: + resolution: + { + integrity: sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==, + } + engines: { node: 20 || >=22 } path-to-regexp@1.9.0: - resolution: {integrity: sha512-xIp7/apCFJuUHdDLWe8O1HIkb0kQrOMb/0u6FXQjemHn/ii5LrIzU6bdECnsiTF/GjZkMEKg1xdiZwNqDYlZ6g==} + resolution: + { + integrity: sha512-xIp7/apCFJuUHdDLWe8O1HIkb0kQrOMb/0u6FXQjemHn/ii5LrIzU6bdECnsiTF/GjZkMEKg1xdiZwNqDYlZ6g==, + } path-type@3.0.0: - resolution: {integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==, + } + engines: { node: '>=4' } path-type@4.0.0: - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==, + } + engines: { node: '>=8' } path-type@6.0.0: - resolution: {integrity: sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ==, + } + engines: { node: '>=18' } pathe@2.0.3: - resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} - - pathval@2.0.0: - resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} - engines: {node: '>= 14.16'} + resolution: + { + integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==, + } + + pathval@2.0.1: + resolution: + { + integrity: sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==, + } + engines: { node: '>= 14.16' } pbkdf2@3.1.3: - resolution: {integrity: sha512-wfRLBZ0feWRhCIkoMB6ete7czJcnNnqRpcoWQBLqatqXXmelSRqfdDK4F3u9T2s2cXas/hQJcryI/4lAL+XTlA==} - engines: {node: '>=0.12'} + resolution: + { + integrity: sha512-wfRLBZ0feWRhCIkoMB6ete7czJcnNnqRpcoWQBLqatqXXmelSRqfdDK4F3u9T2s2cXas/hQJcryI/4lAL+XTlA==, + } + engines: { node: '>=0.12' } pend@1.2.0: - resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} + resolution: + { + integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==, + } picocolors@1.1.1: - resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + resolution: + { + integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==, + } picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} + resolution: + { + integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==, + } + engines: { node: '>=8.6' } picomatch@4.0.2: - resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==, + } + engines: { node: '>=12' } pidtree@0.6.0: - resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==} - engines: {node: '>=0.10'} + resolution: + { + integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==, + } + engines: { node: '>=0.10' } hasBin: true pify@2.3.0: - resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==, + } + engines: { node: '>=0.10.0' } pify@3.0.0: - resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==, + } + engines: { node: '>=4' } pino-abstract-transport@0.5.0: - resolution: {integrity: sha512-+KAgmVeqXYbTtU2FScx1XS3kNyfZ5TrXY07V96QnUSFqo2gAqlvmaxH67Lj7SWazqsMabf+58ctdTcBgnOLUOQ==} + resolution: + { + integrity: sha512-+KAgmVeqXYbTtU2FScx1XS3kNyfZ5TrXY07V96QnUSFqo2gAqlvmaxH67Lj7SWazqsMabf+58ctdTcBgnOLUOQ==, + } pino-std-serializers@4.0.0: - resolution: {integrity: sha512-cK0pekc1Kjy5w9V2/n+8MkZwusa6EyyxfeQCB799CQRhRt/CqYKiWs5adeu8Shve2ZNffvfC/7J64A2PJo1W/Q==} + resolution: + { + integrity: sha512-cK0pekc1Kjy5w9V2/n+8MkZwusa6EyyxfeQCB799CQRhRt/CqYKiWs5adeu8Shve2ZNffvfC/7J64A2PJo1W/Q==, + } pino@7.11.0: - resolution: {integrity: sha512-dMACeu63HtRLmCG8VKdy4cShCPKaYDR4youZqoSWLxl5Gu99HUw8bw75thbPv9Nip+H+QYX8o3ZJbTdVZZ2TVg==} + resolution: + { + integrity: sha512-dMACeu63HtRLmCG8VKdy4cShCPKaYDR4youZqoSWLxl5Gu99HUw8bw75thbPv9Nip+H+QYX8o3ZJbTdVZZ2TVg==, + } hasBin: true pinst@3.0.0: - resolution: {integrity: sha512-cengSmBxtCyaJqtRSvJorIIZXMXg+lJ3sIljGmtBGUVonMnMsVJbnzl6jGN1HkOWwxNuJynCJ2hXxxqCQrFDdw==} - engines: {node: '>=12.0.0'} + resolution: + { + integrity: sha512-cengSmBxtCyaJqtRSvJorIIZXMXg+lJ3sIljGmtBGUVonMnMsVJbnzl6jGN1HkOWwxNuJynCJ2hXxxqCQrFDdw==, + } + engines: { node: '>=12.0.0' } hasBin: true pirates@4.0.7: - resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} - engines: {node: '>= 6'} + resolution: + { + integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==, + } + engines: { node: '>= 6' } pkg-dir@4.2.0: - resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} - engines: {node: '>=8'} - - playwright-core@1.53.1: - resolution: {integrity: sha512-Z46Oq7tLAyT0lGoFx4DOuB1IA9D1TPj0QkYxpPVUnGDqHHvDpCftu1J2hM2PiWsNMoZh8+LQaarAWcDfPBc6zg==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==, + } + engines: { node: '>=8' } + + pkg-types@1.3.1: + resolution: + { + integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==, + } + + playwright-core@1.53.2: + resolution: + { + integrity: sha512-ox/OytMy+2w1jcYEYlOo1Hhp8hZkLCximMTUTMBXjGUA1KoFfiSZ+DU+3a739jsPY0yoKH2TFy9S2fsJas8yAw==, + } + engines: { node: '>=18' } hasBin: true - playwright@1.53.1: - resolution: {integrity: sha512-LJ13YLr/ocweuwxyGf1XNFWIU4M2zUSo149Qbp+A4cpwDjsxRPj7k6H25LBrEHiEwxvRbD8HdwvQmRMSvquhYw==} - engines: {node: '>=18'} + playwright@1.53.2: + resolution: + { + integrity: sha512-6K/qQxVFuVQhRQhFsVZ9fGeatxirtrpPgxzBYWyZLEXJzqYwuL4fuNmfOfD5et1tJE4GScKyPNeLhZeRwuTU3A==, + } + engines: { node: '>=18' } hasBin: true pngjs@5.0.0: - resolution: {integrity: sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==} - engines: {node: '>=10.13.0'} + resolution: + { + integrity: sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==, + } + engines: { node: '>=10.13.0' } pony-cause@2.1.11: - resolution: {integrity: sha512-M7LhCsdNbNgiLYiP4WjsfLUuFmCfnjdF6jKe2R9NKl4WFN+HZPGHJZ9lnLP7f9ZnKe3U9nuWD0szirmj+migUg==} - engines: {node: '>=12.0.0'} + resolution: + { + integrity: sha512-M7LhCsdNbNgiLYiP4WjsfLUuFmCfnjdF6jKe2R9NKl4WFN+HZPGHJZ9lnLP7f9ZnKe3U9nuWD0szirmj+migUg==, + } + engines: { node: '>=12.0.0' } possible-typed-array-names@1.1.0: - resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==, + } + engines: { node: '>= 0.4' } postcss-cli@11.0.1: - resolution: {integrity: sha512-0UnkNPSayHKRe/tc2YGW6XnSqqOA9eqpiRMgRlV1S6HdGi16vwJBx7lviARzbV1HpQHqLLRH3o8vTcB0cLc+5g==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-0UnkNPSayHKRe/tc2YGW6XnSqqOA9eqpiRMgRlV1S6HdGi16vwJBx7lviARzbV1HpQHqLLRH3o8vTcB0cLc+5g==, + } + engines: { node: '>=18' } hasBin: true peerDependencies: postcss: ^8.0.0 postcss-custom-properties@14.0.6: - resolution: {integrity: sha512-fTYSp3xuk4BUeVhxCSJdIPhDLpJfNakZKoiTDx7yRGCdlZrSJR7mWKVOBS4sBF+5poPQFMj2YdXx1VHItBGihQ==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-fTYSp3xuk4BUeVhxCSJdIPhDLpJfNakZKoiTDx7yRGCdlZrSJR7mWKVOBS4sBF+5poPQFMj2YdXx1VHItBGihQ==, + } + engines: { node: '>=18' } peerDependencies: postcss: ^8.4 postcss-import@15.1.0: - resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} - engines: {node: '>=14.0.0'} + resolution: + { + integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==, + } + engines: { node: '>=14.0.0' } peerDependencies: postcss: ^8.0.0 postcss-import@16.1.1: - resolution: {integrity: sha512-2xVS1NCZAfjtVdvXiyegxzJ447GyqCeEI5V7ApgQVOWnros1p5lGNovJNapwPpMombyFBfqDwt7AD3n2l0KOfQ==} - engines: {node: '>=18.0.0'} + resolution: + { + integrity: sha512-2xVS1NCZAfjtVdvXiyegxzJ447GyqCeEI5V7ApgQVOWnros1p5lGNovJNapwPpMombyFBfqDwt7AD3n2l0KOfQ==, + } + engines: { node: '>=18.0.0' } peerDependencies: postcss: ^8.0.0 postcss-js@4.0.1: - resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} - engines: {node: ^12 || ^14 || >= 16} + resolution: + { + integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==, + } + engines: { node: ^12 || ^14 || >= 16 } peerDependencies: postcss: ^8.4.21 postcss-load-config@4.0.2: - resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} - engines: {node: '>= 14'} + resolution: + { + integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==, + } + engines: { node: '>= 14' } peerDependencies: postcss: '>=8.0.9' ts-node: '>=9.0.0' @@ -6042,12 +10598,34 @@ packages: optional: true postcss-load-config@5.1.0: - resolution: {integrity: sha512-G5AJ+IX0aD0dygOE0yFZQ/huFFMSNneyfp0e3/bT05a8OfPC5FUoZRPfGijUdGOJNMewJiwzcHJXFafFzeKFVA==} - engines: {node: '>= 18'} + resolution: + { + integrity: sha512-G5AJ+IX0aD0dygOE0yFZQ/huFFMSNneyfp0e3/bT05a8OfPC5FUoZRPfGijUdGOJNMewJiwzcHJXFafFzeKFVA==, + } + engines: { node: '>= 18' } + peerDependencies: + jiti: '>=1.21.0' + postcss: '>=8.0.9' + tsx: ^4.8.1 + peerDependenciesMeta: + jiti: + optional: true + postcss: + optional: true + tsx: + optional: true + + postcss-load-config@6.0.1: + resolution: + { + integrity: sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==, + } + engines: { node: '>= 18' } peerDependencies: jiti: '>=1.21.0' postcss: '>=8.0.9' tsx: ^4.8.1 + yaml: ^2.4.2 peerDependenciesMeta: jiti: optional: true @@ -6055,237 +10633,402 @@ packages: optional: true tsx: optional: true + yaml: + optional: true postcss-loader@5.3.0: - resolution: {integrity: sha512-/+Z1RAmssdiSLgIZwnJHwBMnlABPgF7giYzTN2NOfr9D21IJZ4mQC1R2miwp80zno9M4zMD/umGI8cR+2EL5zw==} - engines: {node: '>= 10.13.0'} + resolution: + { + integrity: sha512-/+Z1RAmssdiSLgIZwnJHwBMnlABPgF7giYzTN2NOfr9D21IJZ4mQC1R2miwp80zno9M4zMD/umGI8cR+2EL5zw==, + } + engines: { node: '>= 10.13.0' } peerDependencies: postcss: ^7.0.0 || ^8.0.1 webpack: ^5.0.0 postcss-modules-extract-imports@3.1.0: - resolution: {integrity: sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==} - engines: {node: ^10 || ^12 || >= 14} + resolution: + { + integrity: sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==, + } + engines: { node: ^10 || ^12 || >= 14 } peerDependencies: postcss: ^8.1.0 postcss-modules-local-by-default@4.2.0: - resolution: {integrity: sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==} - engines: {node: ^10 || ^12 || >= 14} + resolution: + { + integrity: sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==, + } + engines: { node: ^10 || ^12 || >= 14 } peerDependencies: postcss: ^8.1.0 postcss-modules-scope@3.2.1: - resolution: {integrity: sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==} - engines: {node: ^10 || ^12 || >= 14} + resolution: + { + integrity: sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==, + } + engines: { node: ^10 || ^12 || >= 14 } peerDependencies: postcss: ^8.1.0 postcss-modules-values@4.0.0: - resolution: {integrity: sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==} - engines: {node: ^10 || ^12 || >= 14} + resolution: + { + integrity: sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==, + } + engines: { node: ^10 || ^12 || >= 14 } peerDependencies: postcss: ^8.1.0 postcss-nested@6.2.0: - resolution: {integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==} - engines: {node: '>=12.0'} + resolution: + { + integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==, + } + engines: { node: '>=12.0' } peerDependencies: postcss: ^8.2.14 postcss-nested@7.0.2: - resolution: {integrity: sha512-5osppouFc0VR9/VYzYxO03VaDa3e8F23Kfd6/9qcZTUI8P58GIYlArOET2Wq0ywSl2o2PjELhYOFI4W7l5QHKw==} - engines: {node: '>=18.0'} + resolution: + { + integrity: sha512-5osppouFc0VR9/VYzYxO03VaDa3e8F23Kfd6/9qcZTUI8P58GIYlArOET2Wq0ywSl2o2PjELhYOFI4W7l5QHKw==, + } + engines: { node: '>=18.0' } peerDependencies: postcss: ^8.2.14 postcss-reporter@7.1.0: - resolution: {integrity: sha512-/eoEylGWyy6/DOiMP5lmFRdmDKThqgn7D6hP2dXKJI/0rJSO1ADFNngZfDzxL0YAxFvws+Rtpuji1YIHj4mySA==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-/eoEylGWyy6/DOiMP5lmFRdmDKThqgn7D6hP2dXKJI/0rJSO1ADFNngZfDzxL0YAxFvws+Rtpuji1YIHj4mySA==, + } + engines: { node: '>=10' } peerDependencies: postcss: ^8.1.0 postcss-selector-parser@6.1.2: - resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==, + } + engines: { node: '>=4' } postcss-selector-parser@7.1.0: - resolution: {integrity: sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==, + } + engines: { node: '>=4' } postcss-value-parser@4.2.0: - resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + resolution: + { + integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==, + } postcss@8.5.6: - resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} - engines: {node: ^10 || ^12 || >=14} + resolution: + { + integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==, + } + engines: { node: ^10 || ^12 || >=14 } preact@10.26.9: - resolution: {integrity: sha512-SSjF9vcnF27mJK1XyFMNJzFd5u3pQiATFqoaDy03XuN00u4ziveVVEGt5RKJrDR8MHE/wJo9Nnad56RLzS2RMA==} + resolution: + { + integrity: sha512-SSjF9vcnF27mJK1XyFMNJzFd5u3pQiATFqoaDy03XuN00u4ziveVVEGt5RKJrDR8MHE/wJo9Nnad56RLzS2RMA==, + } prelude-ls@1.2.1: - resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} - engines: {node: '>= 0.8.0'} + resolution: + { + integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==, + } + engines: { node: '>= 0.8.0' } prepend-http@1.0.4: - resolution: {integrity: sha512-PhmXi5XmoyKw1Un4E+opM2KcsJInDvKyuOumcjjw3waw86ZNjHwVUOOWLc4bCzLdcKNaWBH9e99sbWzDQsVaYg==} - engines: {node: '>=0.10.0'} - - prettier@3.5.3: - resolution: {integrity: sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==} - engines: {node: '>=14'} + resolution: + { + integrity: sha512-PhmXi5XmoyKw1Un4E+opM2KcsJInDvKyuOumcjjw3waw86ZNjHwVUOOWLc4bCzLdcKNaWBH9e99sbWzDQsVaYg==, + } + engines: { node: '>=0.10.0' } + + prettier-linter-helpers@1.0.0: + resolution: + { + integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==, + } + engines: { node: '>=6.0.0' } + + prettier@3.6.2: + resolution: + { + integrity: sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==, + } + engines: { node: '>=14' } hasBin: true pretty-error@4.0.0: - resolution: {integrity: sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==} + resolution: + { + integrity: sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==, + } pretty-format@27.5.1: - resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + resolution: + { + integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==, + } + engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } pretty-hrtime@1.0.3: - resolution: {integrity: sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A==} - engines: {node: '>= 0.8'} + resolution: + { + integrity: sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A==, + } + engines: { node: '>= 0.8' } process-nextick-args@2.0.1: - resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + resolution: + { + integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==, + } process-warning@1.0.0: - resolution: {integrity: sha512-du4wfLyj4yCZq1VupnVSZmRsPJsNuxoDQFdCFHLaYiEbFBD7QE0a+I4D7hOxrVnh78QE/YipFAj9lXHiXocV+Q==} + resolution: + { + integrity: sha512-du4wfLyj4yCZq1VupnVSZmRsPJsNuxoDQFdCFHLaYiEbFBD7QE0a+I4D7hOxrVnh78QE/YipFAj9lXHiXocV+Q==, + } process@0.11.10: - resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} - engines: {node: '>= 0.6.0'} + resolution: + { + integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==, + } + engines: { node: '>= 0.6.0' } progress@2.0.3: - resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} - engines: {node: '>=0.4.0'} + resolution: + { + integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==, + } + engines: { node: '>=0.4.0' } prop-types@15.8.1: - resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + resolution: + { + integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==, + } protobufjs@7.5.3: - resolution: {integrity: sha512-sildjKwVqOI2kmFDiXQ6aEB0fjYTafpEvIBs8tOR8qI4spuL9OPROLVu2qZqi/xgCfsHIwVqlaF8JBjWFHnKbw==} - engines: {node: '>=12.0.0'} + resolution: + { + integrity: sha512-sildjKwVqOI2kmFDiXQ6aEB0fjYTafpEvIBs8tOR8qI4spuL9OPROLVu2qZqi/xgCfsHIwVqlaF8JBjWFHnKbw==, + } + engines: { node: '>=12.0.0' } proxy-compare@2.5.1: - resolution: {integrity: sha512-oyfc0Tx87Cpwva5ZXezSp5V9vht1c7dZBhvuV/y3ctkgMVUmiAGDVeeB0dKhGSyT0v1ZTEQYpe/RXlBVBNuCLA==} + resolution: + { + integrity: sha512-oyfc0Tx87Cpwva5ZXezSp5V9vht1c7dZBhvuV/y3ctkgMVUmiAGDVeeB0dKhGSyT0v1ZTEQYpe/RXlBVBNuCLA==, + } pseudomap@1.0.2: - resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} - - psl@1.15.0: - resolution: {integrity: sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==} + resolution: + { + integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==, + } public-encrypt@4.0.3: - resolution: {integrity: sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==} + resolution: + { + integrity: sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==, + } pump@3.0.3: - resolution: {integrity: sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==} + resolution: + { + integrity: sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==, + } punycode@2.3.1: - resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==, + } + engines: { node: '>=6' } q@1.5.1: - resolution: {integrity: sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==} - engines: {node: '>=0.6.0', teleport: '>=0.2.0'} + resolution: + { + integrity: sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==, + } + engines: { node: '>=0.6.0', teleport: '>=0.2.0' } deprecated: |- You or someone you depend on is using Q, the JavaScript Promise library that gave JavaScript developers strong feelings about promises. They can almost certainly migrate to the native JavaScript promise now. Thank you literally everyone for joining me in this bet against the odds. Be excellent to each other. (For a CapTP with native promises, see @endo/eventual-send and @endo/captp) qr-code-styling@1.9.2: - resolution: {integrity: sha512-RgJaZJ1/RrXJ6N0j7a+pdw3zMBmzZU4VN2dtAZf8ZggCfRB5stEQ3IoDNGaNhYY3nnZKYlYSLl5YkfWN5dPutg==} - engines: {node: '>=18.18.0'} + resolution: + { + integrity: sha512-RgJaZJ1/RrXJ6N0j7a+pdw3zMBmzZU4VN2dtAZf8ZggCfRB5stEQ3IoDNGaNhYY3nnZKYlYSLl5YkfWN5dPutg==, + } + engines: { node: '>=18.18.0' } qr-scanner@1.4.2: - resolution: {integrity: sha512-kV1yQUe2FENvn59tMZW6mOVfpq9mGxGf8l6+EGaXUOd4RBOLg7tRC83OrirM5AtDvZRpdjdlXURsHreAOSPOUw==} + resolution: + { + integrity: sha512-kV1yQUe2FENvn59tMZW6mOVfpq9mGxGf8l6+EGaXUOd4RBOLg7tRC83OrirM5AtDvZRpdjdlXURsHreAOSPOUw==, + } - qrcode-generator@1.5.0: - resolution: {integrity: sha512-sqo7otiDq5rA4djRkFI7IjLQqxRrLpIou0d3rqr03JJLUGf5raPh91xCio+lFFbQf0SlcVckStz0EmDEX3EeZA==} + qrcode-generator@1.5.2: + resolution: + { + integrity: sha512-pItrW0Z9HnDBnFmgiNrY1uxRdri32Uh9EjNYLPVC2zZ3ZRIIEqBoDgm4DkvDwNNDHTK7FNkmr8zAa77BYc9xNw==, + } qrcode@1.5.3: - resolution: {integrity: sha512-puyri6ApkEHYiVl4CFzo1tDkAZ+ATcnbJrJ6RiBM1Fhctdn/ix9MTE3hRph33omisEbC/2fcfemsseiKgBPKZg==} - engines: {node: '>=10.13.0'} + resolution: + { + integrity: sha512-puyri6ApkEHYiVl4CFzo1tDkAZ+ATcnbJrJ6RiBM1Fhctdn/ix9MTE3hRph33omisEbC/2fcfemsseiKgBPKZg==, + } + engines: { node: '>=10.13.0' } hasBin: true query-string@7.1.3: - resolution: {integrity: sha512-hh2WYhq4fi8+b+/2Kg9CEge4fDPvHS534aOOvOZeQ3+Vf2mCFsaFBYj0i+iXcAq6I9Vzp5fjMFBlONvayDC1qg==} - engines: {node: '>=6'} - - querystringify@2.2.0: - resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} + resolution: + { + integrity: sha512-hh2WYhq4fi8+b+/2Kg9CEge4fDPvHS534aOOvOZeQ3+Vf2mCFsaFBYj0i+iXcAq6I9Vzp5fjMFBlONvayDC1qg==, + } + engines: { node: '>=6' } queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + resolution: + { + integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==, + } quick-format-unescaped@4.0.4: - resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} + resolution: + { + integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==, + } quick-lru@1.1.0: - resolution: {integrity: sha512-tRS7sTgyxMXtLum8L65daJnHUhfDUgboRdcWW2bR9vBfrj2+O5HSMbQOJfJJjIVSPFqbBCF37FpwWXGitDc5tA==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-tRS7sTgyxMXtLum8L65daJnHUhfDUgboRdcWW2bR9vBfrj2+O5HSMbQOJfJJjIVSPFqbBCF37FpwWXGitDc5tA==, + } + engines: { node: '>=4' } quick-lru@5.1.1: - resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==, + } + engines: { node: '>=10' } radix3@1.1.2: - resolution: {integrity: sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==} + resolution: + { + integrity: sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==, + } randombytes@2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + resolution: + { + integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==, + } randomfill@1.0.4: - resolution: {integrity: sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==} + resolution: + { + integrity: sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==, + } range-parser@1.2.1: - resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} - engines: {node: '>= 0.6'} + resolution: + { + integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==, + } + engines: { node: '>= 0.6' } raw-loader@4.0.2: - resolution: {integrity: sha512-ZnScIV3ag9A4wPX/ZayxL/jZH+euYb6FcUinPcgiQW0+UBtEv0O6Q3lGd3cqJ+GHH+rksEv3Pj99oxJ3u3VIKA==} - engines: {node: '>= 10.13.0'} + resolution: + { + integrity: sha512-ZnScIV3ag9A4wPX/ZayxL/jZH+euYb6FcUinPcgiQW0+UBtEv0O6Q3lGd3cqJ+GHH+rksEv3Pj99oxJ3u3VIKA==, + } + engines: { node: '>= 10.13.0' } peerDependencies: webpack: ^4.0.0 || ^5.0.0 rc@1.2.8: - resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} + resolution: + { + integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==, + } hasBin: true - react-devtools-core@6.1.2: - resolution: {integrity: sha512-ldFwzufLletzCikNJVYaxlxMLu7swJ3T2VrGfzXlMsVhZhPDKXA38DEROidaYZVgMAmQnIjymrmqto5pyfrwPA==} - - react-devtools@6.1.2: - resolution: {integrity: sha512-7HiulH8kuMLD9zwHKO0j+TrEgx9/MtK8+cG5jMYq6B1dSztO+154h0FBWD67n45FJ1pZ9FmJh92lmX4EwzGPew==} + react-devtools-core@6.1.5: + resolution: + { + integrity: sha512-ePrwPfxAnB+7hgnEr8vpKxL9cmnp7F322t8oqcPshbIQQhDKgFDW4tjhF2wjVbdXF9O/nyuy3sQWd9JGpiLPvA==, + } + + react-devtools@6.1.5: + resolution: + { + integrity: sha512-yp7kADDET5neqMMBtwRIPqJ1tcVXWP88RsSCdOrwYsxGGL/pS5Za4jOCYekiZb0m7nzTbSH158ugGyNnBaDJvQ==, + } hasBin: true react-docgen-typescript@2.4.0: - resolution: {integrity: sha512-ZtAp5XTO5HRzQctjPU0ybY0RRCQO19X/8fxn3w7y2VVTUbGHDKULPTL4ky3vB05euSgG5NpALhEhDPvQ56wvXg==} + resolution: + { + integrity: sha512-ZtAp5XTO5HRzQctjPU0ybY0RRCQO19X/8fxn3w7y2VVTUbGHDKULPTL4ky3vB05euSgG5NpALhEhDPvQ56wvXg==, + } peerDependencies: typescript: '>= 4.3.x' react-docgen@7.1.1: - resolution: {integrity: sha512-hlSJDQ2synMPKFZOsKo9Hi8WWZTC7POR8EmWvTSjow+VDgKzkmjQvFm2fk0tmRw+f0vTOIYKlarR0iL4996pdg==} - engines: {node: '>=16.14.0'} + resolution: + { + integrity: sha512-hlSJDQ2synMPKFZOsKo9Hi8WWZTC7POR8EmWvTSjow+VDgKzkmjQvFm2fk0tmRw+f0vTOIYKlarR0iL4996pdg==, + } + engines: { node: '>=16.14.0' } react-dom@18.3.1: - resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} + resolution: + { + integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==, + } peerDependencies: react: ^18.3.1 react-highlight@0.15.0: - resolution: {integrity: sha512-5uV/b/N4Z421GSVVe05fz+OfTsJtFzx/fJBdafZyw4LS70XjIZwgEx3Lrkfc01W/RzZ2Dtfb0DApoaJFAIKBtA==} - - react-hook-form@7.58.1: - resolution: {integrity: sha512-Lml/KZYEEFfPhUVgE0RdCVpnC4yhW+PndRhbiTtdvSlQTL8IfVR+iQkBjLIvmmc6+GGoVeM11z37ktKFPAb0FA==} - engines: {node: '>=18.0.0'} + resolution: + { + integrity: sha512-5uV/b/N4Z421GSVVe05fz+OfTsJtFzx/fJBdafZyw4LS70XjIZwgEx3Lrkfc01W/RzZ2Dtfb0DApoaJFAIKBtA==, + } + + react-hook-form@7.60.0: + resolution: + { + integrity: sha512-SBrYOvMbDB7cV8ZfNpaiLcgjH/a1c7aK0lK+aNigpf4xWLO8q+o4tcvVurv3c4EOyzn/3dCsYt4GKD42VvJ/+A==, + } + engines: { node: '>=18.0.0' } peerDependencies: react: ^16.8.0 || ^17 || ^18 || ^19 - react-i18next@15.5.3: - resolution: {integrity: sha512-ypYmOKOnjqPEJZO4m1BI0kS8kWqkBNsKYyhVUfij0gvjy9xJNoG/VcGkxq5dRlVwzmrmY1BQMAmpbbUBLwC4Kw==} + react-i18next@15.6.0: + resolution: + { + integrity: sha512-W135dB0rDfiFmbMipC17nOhGdttO5mzH8BivY+2ybsQBbXvxWIwl3cmeH3T9d+YPBSJu/ouyJKFJTtkK7rJofw==, + } peerDependencies: i18next: '>= 23.2.3' react: '>= 16.8.0' @@ -6301,507 +11044,927 @@ packages: optional: true react-infinite-scroll-component@6.1.0: - resolution: {integrity: sha512-SQu5nCqy8DxQWpnUVLx7V7b7LcA37aM7tvoWjTLZp1dk6EJibM5/4EJKzOnl07/BsM1Y40sKLuqjCwwH/xV0TQ==} + resolution: + { + integrity: sha512-SQu5nCqy8DxQWpnUVLx7V7b7LcA37aM7tvoWjTLZp1dk6EJibM5/4EJKzOnl07/BsM1Y40sKLuqjCwwH/xV0TQ==, + } peerDependencies: react: '>=16.0.0' + react-inspector@6.0.2: + resolution: + { + integrity: sha512-x+b7LxhmHXjHoU/VrFAzw5iutsILRoYyDq97EDYdFpPLcvqtEzk4ZSZSQjnFPbr5T57tLXnHcqFYoN1pI6u8uQ==, + } + peerDependencies: + react: ^16.8.4 || ^17.0.0 || ^18.0.0 + react-is@16.13.1: - resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + resolution: + { + integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==, + } react-is@17.0.2: - resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} + resolution: + { + integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==, + } react-is@18.3.1: - resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} + resolution: + { + integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==, + } react-is@19.1.0: - resolution: {integrity: sha512-Oe56aUPnkHyyDxxkvqtd7KkdQP5uIUfHxd5XTb3wE9d/kRnZLmKbDB0GWk919tdQ+mxxPtG6EAs6RMT6i1qtHg==} + resolution: + { + integrity: sha512-Oe56aUPnkHyyDxxkvqtd7KkdQP5uIUfHxd5XTb3wE9d/kRnZLmKbDB0GWk919tdQ+mxxPtG6EAs6RMT6i1qtHg==, + } react-qrcode-logo@3.0.0: - resolution: {integrity: sha512-2+vZ3GNBdUpYxIKyt6SFZsDGXa0xniyUQ0wPI4O0hJTzRjttPIx1pPnH9IWQmp/4nDMoN47IBhi3Breu1KudYw==} + resolution: + { + integrity: sha512-2+vZ3GNBdUpYxIKyt6SFZsDGXa0xniyUQ0wPI4O0hJTzRjttPIx1pPnH9IWQmp/4nDMoN47IBhi3Breu1KudYw==, + } peerDependencies: react: '>=18.0.0' react-dom: '>=18.0.0' - react-router-dom@5.3.4: - resolution: {integrity: sha512-m4EqFMHv/Ih4kpcBCONHbkT68KoAeHN4p3lAGoNryfHi0dMy0kCzEZakiKRsvg5wHZ/JLrLW8o8KomWiz/qbYQ==} - peerDependencies: - react: '>=15' - - react-router@5.3.4: - resolution: {integrity: sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA==} + react-router@7.6.3: + resolution: + { + integrity: sha512-zf45LZp5skDC6I3jDLXQUu0u26jtuP4lEGbc7BbdyxenBN1vJSTA18czM2D+h5qyMBuMrD+9uB+mU37HIoKGRA==, + } + engines: { node: '>=20.0.0' } peerDependencies: - react: '>=15' + react: '>=18' + react-dom: '>=18' + peerDependenciesMeta: + react-dom: + optional: true react-smooth@4.0.4: - resolution: {integrity: sha512-gnGKTpYwqL0Iii09gHobNolvX4Kiq4PKx6eWBCYYix+8cdw+cGo3do906l1NBPKkSWx1DghC1dlWG9L2uGd61Q==} + resolution: + { + integrity: sha512-gnGKTpYwqL0Iii09gHobNolvX4Kiq4PKx6eWBCYYix+8cdw+cGo3do906l1NBPKkSWx1DghC1dlWG9L2uGd61Q==, + } peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-transition-group@4.4.5: - resolution: {integrity: sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==} + resolution: + { + integrity: sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==, + } peerDependencies: react: '>=16.6.0' react-dom: '>=16.6.0' react@18.3.1: - resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==, + } + engines: { node: '>=0.10.0' } read-cache@1.0.0: - resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} + resolution: + { + integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==, + } read-pkg-up@3.0.0: - resolution: {integrity: sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw==, + } + engines: { node: '>=4' } read-pkg@3.0.0: - resolution: {integrity: sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==, + } + engines: { node: '>=4' } readable-stream@2.3.8: - resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + resolution: + { + integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==, + } readable-stream@3.6.2: - resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} - engines: {node: '>= 6'} + resolution: + { + integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==, + } + engines: { node: '>= 6' } readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} + resolution: + { + integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==, + } + engines: { node: '>=8.10.0' } readdirp@4.1.2: - resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} - engines: {node: '>= 14.18.0'} + resolution: + { + integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==, + } + engines: { node: '>= 14.18.0' } real-require@0.1.0: - resolution: {integrity: sha512-r/H9MzAWtrv8aSVjPCMFpDMl5q66GqtmmRkRjpHTsp4zBAa+snZyiQNlMONiUmEJcsnaw0wCauJ2GWODr/aFkg==} - engines: {node: '>= 12.13.0'} + resolution: + { + integrity: sha512-r/H9MzAWtrv8aSVjPCMFpDMl5q66GqtmmRkRjpHTsp4zBAa+snZyiQNlMONiUmEJcsnaw0wCauJ2GWODr/aFkg==, + } + engines: { node: '>= 12.13.0' } recast@0.23.11: - resolution: {integrity: sha512-YTUo+Flmw4ZXiWfQKGcwwc11KnoRAYgzAE2E7mXKCjSviTKShtxBsN6YUUBB2gtaBzKzeKunxhUwNHQuRryhWA==} - engines: {node: '>= 4'} + resolution: + { + integrity: sha512-YTUo+Flmw4ZXiWfQKGcwwc11KnoRAYgzAE2E7mXKCjSviTKShtxBsN6YUUBB2gtaBzKzeKunxhUwNHQuRryhWA==, + } + engines: { node: '>= 4' } recharts-scale@0.4.5: - resolution: {integrity: sha512-kivNFO+0OcUNu7jQquLXAxz1FIwZj8nrj+YkOKc5694NbjCvcT6aSZiIzNzd2Kul4o4rTto8QVR9lMNtxD4G1w==} + resolution: + { + integrity: sha512-kivNFO+0OcUNu7jQquLXAxz1FIwZj8nrj+YkOKc5694NbjCvcT6aSZiIzNzd2Kul4o4rTto8QVR9lMNtxD4G1w==, + } recharts@2.15.4: - resolution: {integrity: sha512-UT/q6fwS3c1dHbXv2uFgYJ9BMFHu3fwnd7AYZaEQhXuYQ4hgsxLvsUXzGdKeZrW5xopzDCvuA2N41WJ88I7zIw==} - engines: {node: '>=14'} + resolution: + { + integrity: sha512-UT/q6fwS3c1dHbXv2uFgYJ9BMFHu3fwnd7AYZaEQhXuYQ4hgsxLvsUXzGdKeZrW5xopzDCvuA2N41WJ88I7zIw==, + } + engines: { node: '>=14' } peerDependencies: react: ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 rechoir@0.6.2: - resolution: {integrity: sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==} - engines: {node: '>= 0.10'} + resolution: + { + integrity: sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==, + } + engines: { node: '>= 0.10' } rechoir@0.7.1: - resolution: {integrity: sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==} - engines: {node: '>= 0.10'} + resolution: + { + integrity: sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==, + } + engines: { node: '>= 0.10' } redent@2.0.0: - resolution: {integrity: sha512-XNwrTx77JQCEMXTeb8movBKuK75MgH0RZkujNuDKCezemx/voapl9i2gCSi8WWm8+ox5ycJi1gxF22fR7c0Ciw==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-XNwrTx77JQCEMXTeb8movBKuK75MgH0RZkujNuDKCezemx/voapl9i2gCSi8WWm8+ox5ycJi1gxF22fR7c0Ciw==, + } + engines: { node: '>=4' } redent@3.0.0: - resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==, + } + engines: { node: '>=8' } reflect-metadata@0.1.14: - resolution: {integrity: sha512-ZhYeb6nRaXCfhnndflDK8qI6ZQ/YcWZCISRAWICW9XYqMUwjZM9Z0DveWX/ABN01oxSHwVxKQmxeYZSsm0jh5A==} + resolution: + { + integrity: sha512-ZhYeb6nRaXCfhnndflDK8qI6ZQ/YcWZCISRAWICW9XYqMUwjZM9Z0DveWX/ABN01oxSHwVxKQmxeYZSsm0jh5A==, + } reflect.getprototypeof@1.0.10: - resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==, + } + engines: { node: '>= 0.4' } regenerate-unicode-properties@10.2.0: - resolution: {integrity: sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==, + } + engines: { node: '>=4' } regenerate@1.4.2: - resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} - - regenerator-runtime@0.13.11: - resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} + resolution: + { + integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==, + } regexp.prototype.flags@1.5.4: - resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==, + } + engines: { node: '>= 0.4' } regexpu-core@6.2.0: - resolution: {integrity: sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==, + } + engines: { node: '>=4' } registry-auth-token@3.4.0: - resolution: {integrity: sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A==} + resolution: + { + integrity: sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A==, + } registry-url@3.1.0: - resolution: {integrity: sha512-ZbgR5aZEdf4UKZVBPYIgaglBmSF2Hi94s2PcIHhRGFjKYu+chjJdYfHn4rt3hB6eCKLJ8giVIIfgMa1ehDfZKA==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-ZbgR5aZEdf4UKZVBPYIgaglBmSF2Hi94s2PcIHhRGFjKYu+chjJdYfHn4rt3hB6eCKLJ8giVIIfgMa1ehDfZKA==, + } + engines: { node: '>=0.10.0' } regjsgen@0.8.0: - resolution: {integrity: sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==} + resolution: + { + integrity: sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==, + } regjsparser@0.12.0: - resolution: {integrity: sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==} + resolution: + { + integrity: sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==, + } hasBin: true relateurl@0.2.7: - resolution: {integrity: sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==} - engines: {node: '>= 0.10'} + resolution: + { + integrity: sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==, + } + engines: { node: '>= 0.10' } renderkid@3.0.0: - resolution: {integrity: sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==} + resolution: + { + integrity: sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==, + } require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==, + } + engines: { node: '>=0.10.0' } require-from-string@2.0.2: - resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==, + } + engines: { node: '>=0.10.0' } require-main-filename@2.0.0: - resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} - - requires-port@1.0.0: - resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} + resolution: + { + integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==, + } resolve-alpn@1.2.1: - resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} + resolution: + { + integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==, + } resolve-cwd@3.0.0: - resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==, + } + engines: { node: '>=8' } resolve-from@4.0.0: - resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==, + } + engines: { node: '>=4' } resolve-from@5.0.0: - resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==, + } + engines: { node: '>=8' } resolve-pathname@3.0.0: - resolution: {integrity: sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==} + resolution: + { + integrity: sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==, + } resolve-pkg-maps@1.0.0: - resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + resolution: + { + integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==, + } resolve@1.22.10: - resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==, + } + engines: { node: '>= 0.4' } hasBin: true resolve@2.0.0-next.5: - resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} + resolution: + { + integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==, + } hasBin: true responselike@2.0.1: - resolution: {integrity: sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==} + resolution: + { + integrity: sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==, + } restore-cursor@5.1.0: - resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==, + } + engines: { node: '>=18' } reusify@1.1.0: - resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + resolution: + { + integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==, + } + engines: { iojs: '>=1.0.0', node: '>=0.10.0' } rfdc@1.4.1: - resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} + resolution: + { + integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==, + } rimraf@3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + resolution: + { + integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==, + } deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true + rimraf@6.0.1: + resolution: + { + integrity: sha512-9dkvaxAsk/xNXSJzMgFqqMCuFgt2+KsOFek3TMLfo8NCPfWpBmqwyNn5Y+NX56QUYfCtsyhF3ayiboEoUmJk/A==, + } + engines: { node: 20 || >=22 } + hasBin: true + ripemd160@2.0.1: - resolution: {integrity: sha512-J7f4wutN8mdbV08MJnXibYpCOPHR+yzy+iQ/AsjMv2j8cLavQ8VGagDFUwwTAdF8FmRKVeNpbTTEwNHCW1g94w==} + resolution: + { + integrity: sha512-J7f4wutN8mdbV08MJnXibYpCOPHR+yzy+iQ/AsjMv2j8cLavQ8VGagDFUwwTAdF8FmRKVeNpbTTEwNHCW1g94w==, + } ripemd160@2.0.2: - resolution: {integrity: sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==} + resolution: + { + integrity: sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==, + } rlp@2.2.7: - resolution: {integrity: sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ==} + resolution: + { + integrity: sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ==, + } hasBin: true rlp@3.0.0: - resolution: {integrity: sha512-PD6U2PGk6Vq2spfgiWZdomLvRGDreBLxi5jv5M8EpRo3pU6VEm31KO+HFxE18Q3vgqfDrQ9pZA3FP95rkijNKw==} + resolution: + { + integrity: sha512-PD6U2PGk6Vq2spfgiWZdomLvRGDreBLxi5jv5M8EpRo3pU6VEm31KO+HFxE18Q3vgqfDrQ9pZA3FP95rkijNKw==, + } hasBin: true roarr@2.15.4: - resolution: {integrity: sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==} - engines: {node: '>=8.0'} - - rollup@4.44.0: - resolution: {integrity: sha512-qHcdEzLCiktQIfwBq420pn2dP+30uzqYxv9ETm91wdt2R9AFcWfjNAmje4NWlnCIQ5RMTzVf0ZyisOKqHR6RwA==} - engines: {node: '>=18.0.0', npm: '>=8.0.0'} + resolution: + { + integrity: sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==, + } + engines: { node: '>=8.0' } + + rollup@4.44.2: + resolution: + { + integrity: sha512-PVoapzTwSEcelaWGth3uR66u7ZRo6qhPHc0f2uRO9fX6XDVNrIiGYS0Pj9+R8yIIYSD/mCx2b16Ws9itljKSPg==, + } + engines: { node: '>=18.0.0', npm: '>=8.0.0' } hasBin: true run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + resolution: + { + integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==, + } safe-array-concat@1.1.3: - resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} - engines: {node: '>=0.4'} + resolution: + { + integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==, + } + engines: { node: '>=0.4' } safe-buffer@5.1.2: - resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + resolution: + { + integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==, + } safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + resolution: + { + integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==, + } safe-push-apply@1.0.0: - resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==, + } + engines: { node: '>= 0.4' } safe-regex-test@1.1.0: - resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==, + } + engines: { node: '>= 0.4' } safe-stable-stringify@2.5.0: - resolution: {integrity: sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==} - engines: {node: '>=10'} - - safer-buffer@2.1.2: - resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + resolution: + { + integrity: sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==, + } + engines: { node: '>=10' } sax@1.2.4: - resolution: {integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==} - - saxes@5.0.1: - resolution: {integrity: sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==, + } scheduler@0.23.2: - resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} + resolution: + { + integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==, + } schema-utils@3.3.0: - resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} - engines: {node: '>= 10.13.0'} + resolution: + { + integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==, + } + engines: { node: '>= 10.13.0' } schema-utils@4.3.2: - resolution: {integrity: sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==} - engines: {node: '>= 10.13.0'} + resolution: + { + integrity: sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==, + } + engines: { node: '>= 10.13.0' } scrypt-js@3.0.1: - resolution: {integrity: sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==} + resolution: + { + integrity: sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==, + } scryptsy@1.2.1: - resolution: {integrity: sha512-aldIRgMozSJ/Gl6K6qmJZysRP82lz83Wb42vl4PWN8SaLFHIaOzLPc9nUUW2jQN88CuGm5q5HefJ9jZ3nWSmTw==} + resolution: + { + integrity: sha512-aldIRgMozSJ/Gl6K6qmJZysRP82lz83Wb42vl4PWN8SaLFHIaOzLPc9nUUW2jQN88CuGm5q5HefJ9jZ3nWSmTw==, + } secp256k1@3.8.1: - resolution: {integrity: sha512-tArjQw2P0RTdY7QmkNehgp6TVvQXq6ulIhxv8gaH6YubKG/wxxAoNKcbuXjDhybbc+b2Ihc7e0xxiGN744UIiQ==} - engines: {node: '>=4.0.0'} + resolution: + { + integrity: sha512-tArjQw2P0RTdY7QmkNehgp6TVvQXq6ulIhxv8gaH6YubKG/wxxAoNKcbuXjDhybbc+b2Ihc7e0xxiGN744UIiQ==, + } + engines: { node: '>=4.0.0' } secp256k1@4.0.4: - resolution: {integrity: sha512-6JfvwvjUOn8F/jUoBY2Q1v5WY5XS+rj8qSe0v8Y4ezH4InLgTEeOOPQsRll9OV429Pvo6BCHGavIyJfr3TAhsw==} - engines: {node: '>=18.0.0'} + resolution: + { + integrity: sha512-6JfvwvjUOn8F/jUoBY2Q1v5WY5XS+rj8qSe0v8Y4ezH4InLgTEeOOPQsRll9OV429Pvo6BCHGavIyJfr3TAhsw==, + } + engines: { node: '>=18.0.0' } semver-compare@1.0.0: - resolution: {integrity: sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==} + resolution: + { + integrity: sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==, + } semver-diff@2.1.0: - resolution: {integrity: sha512-gL8F8L4ORwsS0+iQ34yCYv///jsOq0ZL7WP55d1HnJ32o7tyFYEFQZQA22mrLIacZdU6xecaBBZ+uEiffGNyXw==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-gL8F8L4ORwsS0+iQ34yCYv///jsOq0ZL7WP55d1HnJ32o7tyFYEFQZQA22mrLIacZdU6xecaBBZ+uEiffGNyXw==, + } + engines: { node: '>=0.10.0' } semver@5.7.2: - resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} + resolution: + { + integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==, + } hasBin: true semver@6.3.1: - resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + resolution: + { + integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==, + } hasBin: true semver@7.7.2: - resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==, + } + engines: { node: '>=10' } hasBin: true serialize-error@7.0.1: - resolution: {integrity: sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==, + } + engines: { node: '>=10' } serialize-javascript@6.0.2: - resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} + resolution: + { + integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==, + } set-blocking@2.0.0: - resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + resolution: + { + integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==, + } + + set-cookie-parser@2.7.1: + resolution: + { + integrity: sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==, + } set-function-length@1.2.2: - resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==, + } + engines: { node: '>= 0.4' } set-function-name@2.0.2: - resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==, + } + engines: { node: '>= 0.4' } set-proto@1.0.0: - resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==, + } + engines: { node: '>= 0.4' } setimmediate@1.0.5: - resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} - - sha.js@2.4.11: - resolution: {integrity: sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==} + resolution: + { + integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==, + } + + sha.js@2.4.12: + resolution: + { + integrity: sha512-8LzC5+bvI45BjpfXU8V5fdU2mfeKiQe1D1gIMn7XUlF3OTUrpdJpPPH4EMAnF0DsHHdSZqCdSss5qCmJKuiO3w==, + } + engines: { node: '>= 0.10' } hasBin: true sha3@2.1.4: - resolution: {integrity: sha512-S8cNxbyb0UGUM2VhRD4Poe5N58gJnJsLJ5vC7FYWGUmGhcsj4++WaIOBFVDxlG0W3To6xBuiRh+i0Qp2oNCOtg==} + resolution: + { + integrity: sha512-S8cNxbyb0UGUM2VhRD4Poe5N58gJnJsLJ5vC7FYWGUmGhcsj4++WaIOBFVDxlG0W3To6xBuiRh+i0Qp2oNCOtg==, + } shallow-clone@3.0.1: - resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==, + } + engines: { node: '>=8' } shebang-command@1.2.0: - resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==, + } + engines: { node: '>=0.10.0' } shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==, + } + engines: { node: '>=8' } shebang-regex@1.0.0: - resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==, + } + engines: { node: '>=0.10.0' } shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==, + } + engines: { node: '>=8' } shell-quote@1.8.3: - resolution: {integrity: sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==, + } + engines: { node: '>= 0.4' } shelljs@0.8.5: - resolution: {integrity: sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==, + } + engines: { node: '>=4' } hasBin: true side-channel-list@1.0.0: - resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==, + } + engines: { node: '>= 0.4' } side-channel-map@1.0.1: - resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==, + } + engines: { node: '>= 0.4' } side-channel-weakmap@1.0.2: - resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==, + } + engines: { node: '>= 0.4' } side-channel@1.1.0: - resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==, + } + engines: { node: '>= 0.4' } siginfo@2.0.0: - resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + resolution: + { + integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==, + } signal-exit@3.0.7: - resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + resolution: + { + integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==, + } signal-exit@4.1.0: - resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} - engines: {node: '>=14'} + resolution: + { + integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==, + } + engines: { node: '>=14' } sinon-chrome@3.0.1: - resolution: {integrity: sha512-NTEFhyuiWEMnRmIqldUiA2DhKn2EqnZxyEk5Ez5rBXj+Nl54aJ0MEmF4wjltrxecxd8zlNLxyE0HyLabev9JsQ==} + resolution: + { + integrity: sha512-NTEFhyuiWEMnRmIqldUiA2DhKn2EqnZxyEk5Ez5rBXj+Nl54aJ0MEmF4wjltrxecxd8zlNLxyE0HyLabev9JsQ==, + } sinon@7.5.0: - resolution: {integrity: sha512-AoD0oJWerp0/rY9czP/D6hDTTUYGpObhZjMpd7Cl/A6+j0xBE+ayL/ldfggkBXUs0IkvIiM1ljM8+WkOc5k78Q==} + resolution: + { + integrity: sha512-AoD0oJWerp0/rY9czP/D6hDTTUYGpObhZjMpd7Cl/A6+j0xBE+ayL/ldfggkBXUs0IkvIiM1ljM8+WkOc5k78Q==, + } deprecated: 16.1.1 slash@5.1.0: - resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==} - engines: {node: '>=14.16'} + resolution: + { + integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==, + } + engines: { node: '>=14.16' } slice-ansi@1.0.0: - resolution: {integrity: sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==, + } + engines: { node: '>=4' } slice-ansi@4.0.0: - resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==, + } + engines: { node: '>=10' } slice-ansi@5.0.0: - resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==, + } + engines: { node: '>=12' } slice-ansi@7.1.0: - resolution: {integrity: sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==, + } + engines: { node: '>=18' } sonic-boom@2.8.0: - resolution: {integrity: sha512-kuonw1YOYYNOve5iHdSahXPOK49GqwA+LZhI6Wz/l0rP57iKyXXIHaRagOBHAPmGwJC6od2Z9zgvZ5loSgMlVg==} + resolution: + { + integrity: sha512-kuonw1YOYYNOve5iHdSahXPOK49GqwA+LZhI6Wz/l0rP57iKyXXIHaRagOBHAPmGwJC6od2Z9zgvZ5loSgMlVg==, + } source-map-js@1.2.1: - resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==, + } + engines: { node: '>=0.10.0' } source-map-support@0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + resolution: + { + integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==, + } source-map@0.5.7: - resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==, + } + engines: { node: '>=0.10.0' } source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==, + } + engines: { node: '>=0.10.0' } source-map@0.7.4: - resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} - engines: {node: '>= 8'} + resolution: + { + integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==, + } + engines: { node: '>= 8' } + + source-map@0.8.0-beta.0: + resolution: + { + integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==, + } + engines: { node: '>= 8' } spdx-correct@3.2.0: - resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + resolution: + { + integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==, + } spdx-exceptions@2.5.0: - resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} + resolution: + { + integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==, + } spdx-expression-parse@3.0.1: - resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + resolution: + { + integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==, + } spdx-license-ids@3.0.21: - resolution: {integrity: sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==} + resolution: + { + integrity: sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==, + } split-on-first@1.1.0: - resolution: {integrity: sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==, + } + engines: { node: '>=6' } split2@4.2.0: - resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} - engines: {node: '>= 10.x'} + resolution: + { + integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==, + } + engines: { node: '>= 10.x' } sprintf-js@1.0.3: - resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + resolution: + { + integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==, + } sprintf-js@1.1.3: - resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} + resolution: + { + integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==, + } stable-hash@0.0.5: - resolution: {integrity: sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA==} + resolution: + { + integrity: sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA==, + } stable@0.1.8: - resolution: {integrity: sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==} + resolution: + { + integrity: sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==, + } deprecated: 'Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility' stackback@0.0.2: - resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + resolution: + { + integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==, + } std-env@3.9.0: - resolution: {integrity: sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==} + resolution: + { + integrity: sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==, + } stop-iteration-iterator@1.1.0: - resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==, + } + engines: { node: '>= 0.4' } + + storybook-addon-remix-react-router@5.0.0: + resolution: + { + integrity: sha512-XjNGLD8vhI7DhjPgkjkU9rjqjF6YSRvRjBignwo2kCGiz5HIR4TZTDRRABuwYo35/GoC2aMtxFs7zybJ4pVlsg==, + } + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-router: ^7.0.2 + storybook: ^9.0.0 + peerDependenciesMeta: + react: + optional: true + react-dom: + optional: true - storybook@9.0.12: - resolution: {integrity: sha512-mpACe6BMd/M5sqcOiA8NmWIm2zdx0t4ujnA4NTcq4aErdK/KKuU255UM4pO3DIf5zWR5VrDfNV5UaMi/VgE2mA==} + storybook@9.0.16: + resolution: + { + integrity: sha512-DzjzeggdzlXKKBK1L9iqNKqqNpyfeaL1hxxeAOmqgeMezwy5d5mCJmjNcZEmx+prsRmvj1OWm4ZZAg6iP/wABg==, + } hasBin: true peerDependencies: prettier: ^2 || ^3 @@ -6810,200 +11973,348 @@ packages: optional: true stream-browserify@3.0.0: - resolution: {integrity: sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==} + resolution: + { + integrity: sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==, + } stream-http@3.2.0: - resolution: {integrity: sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A==} + resolution: + { + integrity: sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A==, + } stream-shift@1.0.3: - resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==} + resolution: + { + integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==, + } strict-uri-encode@2.0.0: - resolution: {integrity: sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==, + } + engines: { node: '>=4' } string-argv@0.3.2: - resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} - engines: {node: '>=0.6.19'} + resolution: + { + integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==, + } + engines: { node: '>=0.6.19' } string-width@2.1.1: - resolution: {integrity: sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==, + } + engines: { node: '>=4' } string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==, + } + engines: { node: '>=8' } string-width@5.1.2: - resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==, + } + engines: { node: '>=12' } string-width@7.2.0: - resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==, + } + engines: { node: '>=18' } string.prototype.matchall@4.0.12: - resolution: {integrity: sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==, + } + engines: { node: '>= 0.4' } string.prototype.repeat@1.0.0: - resolution: {integrity: sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==} + resolution: + { + integrity: sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==, + } string.prototype.trim@1.2.10: - resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==, + } + engines: { node: '>= 0.4' } string.prototype.trimend@1.0.9: - resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==, + } + engines: { node: '>= 0.4' } string.prototype.trimstart@1.0.8: - resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==, + } + engines: { node: '>= 0.4' } string_decoder@1.1.1: - resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + resolution: + { + integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==, + } string_decoder@1.3.0: - resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + resolution: + { + integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==, + } strip-ansi@4.0.0: - resolution: {integrity: sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==, + } + engines: { node: '>=4' } strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==, + } + engines: { node: '>=8' } strip-ansi@7.1.0: - resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==, + } + engines: { node: '>=12' } strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==, + } + engines: { node: '>=4' } strip-eof@1.0.0: - resolution: {integrity: sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==, + } + engines: { node: '>=0.10.0' } strip-final-newline@2.0.0: - resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==, + } + engines: { node: '>=6' } strip-final-newline@3.0.0: - resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==, + } + engines: { node: '>=12' } strip-hex-prefix@1.0.0: - resolution: {integrity: sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A==} - engines: {node: '>=6.5.0', npm: '>=3'} + resolution: + { + integrity: sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A==, + } + engines: { node: '>=6.5.0', npm: '>=3' } strip-indent@2.0.0: - resolution: {integrity: sha512-RsSNPLpq6YUL7QYy44RnPVTn/lcVZtb48Uof3X5JLbF4zD/Gs7ZFDv2HWol+leoQN2mT86LAzSshGfkTlSOpsA==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-RsSNPLpq6YUL7QYy44RnPVTn/lcVZtb48Uof3X5JLbF4zD/Gs7ZFDv2HWol+leoQN2mT86LAzSshGfkTlSOpsA==, + } + engines: { node: '>=4' } strip-indent@3.0.0: - resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==, + } + engines: { node: '>=8' } strip-indent@4.0.0: - resolution: {integrity: sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==, + } + engines: { node: '>=12' } strip-json-comments@2.0.1: - resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==, + } + engines: { node: '>=0.10.0' } strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==, + } + engines: { node: '>=8' } strip-literal@3.0.0: - resolution: {integrity: sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA==} + resolution: + { + integrity: sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA==, + } style-loader@3.3.4: - resolution: {integrity: sha512-0WqXzrsMTyb8yjZJHDqwmnwRJvhALK9LfRtRc6B4UTWe8AijYLZYZ9thuJTZc2VfQWINADW/j+LiJnfy2RoC1w==} - engines: {node: '>= 12.13.0'} + resolution: + { + integrity: sha512-0WqXzrsMTyb8yjZJHDqwmnwRJvhALK9LfRtRc6B4UTWe8AijYLZYZ9thuJTZc2VfQWINADW/j+LiJnfy2RoC1w==, + } + engines: { node: '>= 12.13.0' } peerDependencies: webpack: ^5.0.0 style-loader@4.0.0: - resolution: {integrity: sha512-1V4WqhhZZgjVAVJyt7TdDPZoPBPNHbekX4fWnCJL1yQukhCeZhJySUL+gL9y6sNdN95uEOS83Y55SqHcP7MzLA==} - engines: {node: '>= 18.12.0'} + resolution: + { + integrity: sha512-1V4WqhhZZgjVAVJyt7TdDPZoPBPNHbekX4fWnCJL1yQukhCeZhJySUL+gL9y6sNdN95uEOS83Y55SqHcP7MzLA==, + } + engines: { node: '>= 18.12.0' } peerDependencies: webpack: ^5.27.0 stylis@4.2.0: - resolution: {integrity: sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==} + resolution: + { + integrity: sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==, + } sucrase@3.35.0: - resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} - engines: {node: '>=16 || 14 >=14.17'} + resolution: + { + integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==, + } + engines: { node: '>=16 || 14 >=14.17' } hasBin: true sumchecker@3.0.1: - resolution: {integrity: sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==} - engines: {node: '>= 8.0'} + resolution: + { + integrity: sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==, + } + engines: { node: '>= 8.0' } supports-color@5.5.0: - resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==, + } + engines: { node: '>=4' } supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==, + } + engines: { node: '>=8' } supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==, + } + engines: { node: '>=10' } supports-preserve-symlinks-flag@1.0.0: - resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==, + } + engines: { node: '>= 0.4' } svg-parser@2.0.4: - resolution: {integrity: sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==} + resolution: + { + integrity: sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==, + } svgo@1.3.2: - resolution: {integrity: sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==} - engines: {node: '>=4.0.0'} + resolution: + { + integrity: sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==, + } + engines: { node: '>=4.0.0' } deprecated: This SVGO version is no longer supported. Upgrade to v2.x.x. hasBin: true swc-loader@0.2.6: - resolution: {integrity: sha512-9Zi9UP2YmDpgmQVbyOPJClY0dwf58JDyDMQ7uRc4krmc72twNI2fvlBWHLqVekBpPc7h5NJkGVT1zNDxFrqhvg==} + resolution: + { + integrity: sha512-9Zi9UP2YmDpgmQVbyOPJClY0dwf58JDyDMQ7uRc4krmc72twNI2fvlBWHLqVekBpPc7h5NJkGVT1zNDxFrqhvg==, + } peerDependencies: '@swc/core': ^1.2.147 webpack: '>=2' - symbol-tree@3.2.4: - resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} + synckit@0.11.8: + resolution: + { + integrity: sha512-+XZ+r1XGIJGeQk3VvXhT6xx/VpbHsRzsTkGgF6E5RX9TTXD0118l87puaEBZ566FhqblC6U0d4XnubznJDm30A==, + } + engines: { node: ^14.18.0 || >=16.0.0 } table@4.0.3: - resolution: {integrity: sha512-S7rnFITmBH1EnyKcvxBh1LjYeQMmnZtCXSEbHcH6S0NoKit24ZuFO/T1vDcLdYsLQkM188PVVhQmzKIuThNkKg==} - engines: {node: '>=4.0.0'} + resolution: + { + integrity: sha512-S7rnFITmBH1EnyKcvxBh1LjYeQMmnZtCXSEbHcH6S0NoKit24ZuFO/T1vDcLdYsLQkM188PVVhQmzKIuThNkKg==, + } + engines: { node: '>=4.0.0' } table@6.9.0: - resolution: {integrity: sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==} - engines: {node: '>=10.0.0'} + resolution: + { + integrity: sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==, + } + engines: { node: '>=10.0.0' } tailwindcss@3.4.17: - resolution: {integrity: sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==} - engines: {node: '>=14.0.0'} + resolution: + { + integrity: sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==, + } + engines: { node: '>=14.0.0' } hasBin: true tapable@2.2.2: - resolution: {integrity: sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg==, + } + engines: { node: '>=6' } term-size@1.2.0: - resolution: {integrity: sha512-7dPUZQGy/+m3/wjVz3ZW5dobSoD/02NxJpoXUX0WIyjfVS3l0c+b/+9phIDFA7FHzkYtwtMFgeGZ/Y8jVTeqQQ==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-7dPUZQGy/+m3/wjVz3ZW5dobSoD/02NxJpoXUX0WIyjfVS3l0c+b/+9phIDFA7FHzkYtwtMFgeGZ/Y8jVTeqQQ==, + } + engines: { node: '>=4' } terser-webpack-plugin@5.3.14: - resolution: {integrity: sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==} - engines: {node: '>= 10.13.0'} + resolution: + { + integrity: sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==, + } + engines: { node: '>= 10.13.0' } peerDependencies: '@swc/core': '*' esbuild: '*' @@ -7018,112 +12329,207 @@ packages: optional: true terser@5.43.1: - resolution: {integrity: sha512-+6erLbBm0+LROX2sPXlUYx/ux5PyE9K/a92Wrt6oA+WDAoFTdpHE5tCYCI5PNzq2y8df4rA+QgHLJuR4jNymsg==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-+6erLbBm0+LROX2sPXlUYx/ux5PyE9K/a92Wrt6oA+WDAoFTdpHE5tCYCI5PNzq2y8df4rA+QgHLJuR4jNymsg==, + } + engines: { node: '>=10' } hasBin: true test-exclude@7.0.1: - resolution: {integrity: sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==, + } + engines: { node: '>=18' } + + text-extensions@2.4.0: + resolution: + { + integrity: sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g==, + } + engines: { node: '>=8' } thenby@1.3.4: - resolution: {integrity: sha512-89Gi5raiWA3QZ4b2ePcEwswC3me9JIg+ToSgtE0JWeCynLnLxNr/f9G+xfo9K+Oj4AFdom8YNJjibIARTJmapQ==} + resolution: + { + integrity: sha512-89Gi5raiWA3QZ4b2ePcEwswC3me9JIg+ToSgtE0JWeCynLnLxNr/f9G+xfo9K+Oj4AFdom8YNJjibIARTJmapQ==, + } thenify-all@1.6.0: - resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} - engines: {node: '>=0.8'} + resolution: + { + integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==, + } + engines: { node: '>=0.8' } thenify@3.3.1: - resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + resolution: + { + integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==, + } thread-stream@0.15.2: - resolution: {integrity: sha512-UkEhKIg2pD+fjkHQKyJO3yoIvAP3N6RlNFt2dUhcS1FGvCD1cQa1M/PGknCLFIyZdtJOWQjejp7bdNqmN7zwdA==} + resolution: + { + integrity: sha512-UkEhKIg2pD+fjkHQKyJO3yoIvAP3N6RlNFt2dUhcS1FGvCD1cQa1M/PGknCLFIyZdtJOWQjejp7bdNqmN7zwdA==, + } throttle-debounce@2.3.0: - resolution: {integrity: sha512-H7oLPV0P7+jgvrk+6mwwwBDmxTaxnu9HMXmloNLXwnNO0ZxZ31Orah2n8lU1eMPvsaowP2CX+USCgyovXfdOFQ==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-H7oLPV0P7+jgvrk+6mwwwBDmxTaxnu9HMXmloNLXwnNO0ZxZ31Orah2n8lU1eMPvsaowP2CX+USCgyovXfdOFQ==, + } + engines: { node: '>=8' } + + through@2.3.8: + resolution: + { + integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==, + } timed-out@4.0.1: - resolution: {integrity: sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA==, + } + engines: { node: '>=0.10.0' } tiny-invariant@1.3.3: - resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} + resolution: + { + integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==, + } tiny-warning@1.0.3: - resolution: {integrity: sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==} + resolution: + { + integrity: sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==, + } tinybench@2.9.0: - resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} + resolution: + { + integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==, + } tinyexec@0.3.2: - resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} + resolution: + { + integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==, + } + + tinyexec@1.0.1: + resolution: + { + integrity: sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw==, + } tinyglobby@0.2.14: - resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==} - engines: {node: '>=12.0.0'} + resolution: + { + integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==, + } + engines: { node: '>=12.0.0' } tinypool@1.1.1: - resolution: {integrity: sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==} - engines: {node: ^18.0.0 || >=20.0.0} + resolution: + { + integrity: sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==, + } + engines: { node: ^18.0.0 || >=20.0.0 } tinyrainbow@2.0.0: - resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} - engines: {node: '>=14.0.0'} - - tinyspy@3.0.2: - resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==} - engines: {node: '>=14.0.0'} + resolution: + { + integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==, + } + engines: { node: '>=14.0.0' } tinyspy@4.0.3: - resolution: {integrity: sha512-t2T/WLB2WRgZ9EpE4jgPJ9w+i66UZfDc8wHh0xrwiRNN+UwH98GIJkTeZqX9rg0i0ptwzqW+uYeIF0T4F8LR7A==} - engines: {node: '>=14.0.0'} + resolution: + { + integrity: sha512-t2T/WLB2WRgZ9EpE4jgPJ9w+i66UZfDc8wHh0xrwiRNN+UwH98GIJkTeZqX9rg0i0ptwzqW+uYeIF0T4F8LR7A==, + } + engines: { node: '>=14.0.0' } to-buffer@1.2.1: - resolution: {integrity: sha512-tB82LpAIWjhLYbqjx3X4zEeHN6M8CiuOEy2JY8SEQVdYRe3CCHOFaqrBW1doLDrfpWhplcW7BL+bO3/6S3pcDQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-tB82LpAIWjhLYbqjx3X4zEeHN6M8CiuOEy2JY8SEQVdYRe3CCHOFaqrBW1doLDrfpWhplcW7BL+bO3/6S3pcDQ==, + } + engines: { node: '>= 0.4' } to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - - tough-cookie@4.1.4: - resolution: {integrity: sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==, + } + engines: { node: '>=8.0' } tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - - tr46@2.1.0: - resolution: {integrity: sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==, + } + + tr46@1.0.1: + resolution: + { + integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==, + } + + tree-kill@1.2.2: + resolution: + { + integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==, + } + hasBin: true trim-newlines@2.0.0: - resolution: {integrity: sha512-MTBWv3jhVjTU7XR3IQHllbiJs8sc75a80OEhB6or/q7pLTWgQ0bMGQXXYQSrSuXe6WiKWDZ5txXY5P59a/coVA==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-MTBWv3jhVjTU7XR3IQHllbiJs8sc75a80OEhB6or/q7pLTWgQ0bMGQXXYQSrSuXe6WiKWDZ5txXY5P59a/coVA==, + } + engines: { node: '>=4' } ts-api-utils@2.1.0: - resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==} - engines: {node: '>=18.12'} + resolution: + { + integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==, + } + engines: { node: '>=18.12' } peerDependencies: typescript: '>=4.8.4' ts-dedent@2.2.0: - resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==} - engines: {node: '>=6.10'} + resolution: + { + integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==, + } + engines: { node: '>=6.10' } ts-interface-checker@0.1.13: - resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + resolution: + { + integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==, + } ts-loader@9.5.2: - resolution: {integrity: sha512-Qo4piXvOTWcMGIgRiuFa6nHNm+54HbYaZCKqc9eeZCLRy3XqafQgwX2F7mofrbJG3g7EEb+lkiR+z2Lic2s3Zw==} - engines: {node: '>=12.0.0'} + resolution: + { + integrity: sha512-Qo4piXvOTWcMGIgRiuFa6nHNm+54HbYaZCKqc9eeZCLRy3XqafQgwX2F7mofrbJG3g7EEb+lkiR+z2Lic2s3Zw==, + } + engines: { node: '>=12.0.0' } peerDependencies: typescript: '*' webpack: ^5.0.0 ts-node@10.9.2: - resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} + resolution: + { + integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==, + } hasBin: true peerDependencies: '@swc/core': '>=1.2.50' @@ -7137,155 +12543,303 @@ packages: optional: true ts-toolbelt@9.6.0: - resolution: {integrity: sha512-nsZd8ZeNUzukXPlJmTBwUAuABDe/9qtVDelJeT/qW0ow3ZS3BsQJtNkan1802aM9Uf68/Y8ljw86Hu0h5IUW3w==} + resolution: + { + integrity: sha512-nsZd8ZeNUzukXPlJmTBwUAuABDe/9qtVDelJeT/qW0ow3ZS3BsQJtNkan1802aM9Uf68/Y8ljw86Hu0h5IUW3w==, + } tsconfig-paths@3.15.0: - resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} + resolution: + { + integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==, + } tsconfig-paths@4.2.0: - resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==, + } + engines: { node: '>=6' } tslib@1.14.1: - resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + resolution: + { + integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==, + } tslib@2.7.0: - resolution: {integrity: sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==} + resolution: + { + integrity: sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==, + } tslib@2.8.1: - resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + resolution: + { + integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==, + } tsparticles@3.6.0: - resolution: {integrity: sha512-Rn5MEgooQtFSqUOmBtwFYsStUeldv+8cJ0TTeHT5xKb4B3VnyU3ic1bw9ueTP19UNnBIIzs0jfdrC5Utfpo6JA==} + resolution: + { + integrity: sha512-Rn5MEgooQtFSqUOmBtwFYsStUeldv+8cJ0TTeHT5xKb4B3VnyU3ic1bw9ueTP19UNnBIIzs0jfdrC5Utfpo6JA==, + } + + tsup@8.5.0: + resolution: + { + integrity: sha512-VmBp77lWNQq6PfuMqCHD3xWl22vEoWsKajkF8t+yMBawlUS8JzEI+vOVMeuNZIuMML8qXRizFKi9oD5glKQVcQ==, + } + engines: { node: '>=18' } + hasBin: true + peerDependencies: + '@microsoft/api-extractor': ^7.36.0 + '@swc/core': ^1 + postcss: ^8.4.12 + typescript: '>=4.5.0' + peerDependenciesMeta: + '@microsoft/api-extractor': + optional: true + '@swc/core': + optional: true + postcss: + optional: true + typescript: + optional: true tsx@4.20.3: - resolution: {integrity: sha512-qjbnuR9Tr+FJOMBqJCW5ehvIo/buZq7vH7qD7JziU98h6l3qGy0a/yPFjwO+y0/T7GFpNgNAvEcPPVfyT8rrPQ==} - engines: {node: '>=18.0.0'} + resolution: + { + integrity: sha512-qjbnuR9Tr+FJOMBqJCW5ehvIo/buZq7vH7qD7JziU98h6l3qGy0a/yPFjwO+y0/T7GFpNgNAvEcPPVfyT8rrPQ==, + } + engines: { node: '>=18.0.0' } hasBin: true tweetnacl@1.0.3: - resolution: {integrity: sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==} + resolution: + { + integrity: sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==, + } type-check@0.4.0: - resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} - engines: {node: '>= 0.8.0'} + resolution: + { + integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==, + } + engines: { node: '>= 0.8.0' } type-detect@4.0.8: - resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==, + } + engines: { node: '>=4' } type-fest@0.13.1: - resolution: {integrity: sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==, + } + engines: { node: '>=10' } + + type-fest@2.19.0: + resolution: + { + integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==, + } + engines: { node: '>=12.20' } typed-array-buffer@1.0.3: - resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==, + } + engines: { node: '>= 0.4' } typed-array-byte-length@1.0.3: - resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==, + } + engines: { node: '>= 0.4' } typed-array-byte-offset@1.0.4: - resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==, + } + engines: { node: '>= 0.4' } typed-array-length@1.0.7: - resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} - engines: {node: '>= 0.4'} - - typescript-eslint@8.34.1: - resolution: {integrity: sha512-XjS+b6Vg9oT1BaIUfkW3M3LvqZE++rbzAMEHuccCfO/YkP43ha6w3jTEMilQxMF92nVOYCcdjv1ZUhAa1D/0ow==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + resolution: + { + integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==, + } + engines: { node: '>= 0.4' } + + typescript-eslint@8.36.0: + resolution: + { + integrity: sha512-fTCqxthY+h9QbEgSIBfL9iV6CvKDFuoxg6bHPNpJ9HIUzS+jy2lCEyCmGyZRWEBSaykqcDPf1SJ+BfCI8DRopA==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' typescript-transform-paths@3.5.5: - resolution: {integrity: sha512-RMK86wKe/4+ad+3kMT9SKAs3K0tUHLe7hF+MLbD6VpC9VUmFuKorhf3pHz+qO5GdS4mUp2ncNUo14j6ws9UvBQ==} + resolution: + { + integrity: sha512-RMK86wKe/4+ad+3kMT9SKAs3K0tUHLe7hF+MLbD6VpC9VUmFuKorhf3pHz+qO5GdS4mUp2ncNUo14j6ws9UvBQ==, + } peerDependencies: typescript: '>=3.6.5' typescript@5.8.3: - resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} - engines: {node: '>=14.17'} + resolution: + { + integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==, + } + engines: { node: '>=14.17' } hasBin: true ufo@1.6.1: - resolution: {integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==} + resolution: + { + integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==, + } uint8arrays@3.1.1: - resolution: {integrity: sha512-+QJa8QRnbdXVpHYjLoTpJIdCTiw9Ir62nocClWuXIq2JIh4Uta0cQsTSpFL678p2CN8B+XSApwcU+pQEqVpKWg==} + resolution: + { + integrity: sha512-+QJa8QRnbdXVpHYjLoTpJIdCTiw9Ir62nocClWuXIq2JIh4Uta0cQsTSpFL678p2CN8B+XSApwcU+pQEqVpKWg==, + } unbox-primitive@1.1.0: - resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==, + } + engines: { node: '>= 0.4' } uncrypto@0.1.3: - resolution: {integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==} + resolution: + { + integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==, + } undici-types@6.19.8: - resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} + resolution: + { + integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==, + } undici-types@6.21.0: - resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + resolution: + { + integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==, + } + + undici-types@7.8.0: + resolution: + { + integrity: sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==, + } undici@6.19.7: - resolution: {integrity: sha512-HR3W/bMGPSr90i8AAp2C4DM3wChFdJPLrWYpIS++LxS8K+W535qftjt+4MyjNYHeWabMj1nvtmLIi7l++iq91A==} - engines: {node: '>=18.17'} + resolution: + { + integrity: sha512-HR3W/bMGPSr90i8AAp2C4DM3wChFdJPLrWYpIS++LxS8K+W535qftjt+4MyjNYHeWabMj1nvtmLIi7l++iq91A==, + } + engines: { node: '>=18.17' } unicode-canonical-property-names-ecmascript@2.0.1: - resolution: {integrity: sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==, + } + engines: { node: '>=4' } unicode-match-property-ecmascript@2.0.0: - resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==, + } + engines: { node: '>=4' } unicode-match-property-value-ecmascript@2.2.0: - resolution: {integrity: sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==, + } + engines: { node: '>=4' } unicode-property-aliases-ecmascript@2.1.0: - resolution: {integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==, + } + engines: { node: '>=4' } unicorn-magic@0.1.0: - resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==, + } + engines: { node: '>=18' } unicorn-magic@0.3.0: - resolution: {integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==, + } + engines: { node: '>=18' } unique-string@1.0.0: - resolution: {integrity: sha512-ODgiYu03y5g76A1I9Gt0/chLCzQjvzDy7DsZGsLOE/1MrF6wriEskSncj1+/C58Xk/kPZDppSctDybCwOSaGAg==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-ODgiYu03y5g76A1I9Gt0/chLCzQjvzDy7DsZGsLOE/1MrF6wriEskSncj1+/C58Xk/kPZDppSctDybCwOSaGAg==, + } + engines: { node: '>=4' } universalify@0.1.2: - resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} - engines: {node: '>= 4.0.0'} - - universalify@0.2.0: - resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} - engines: {node: '>= 4.0.0'} + resolution: + { + integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==, + } + engines: { node: '>= 4.0.0' } universalify@2.0.1: - resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} - engines: {node: '>= 10.0.0'} + resolution: + { + integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==, + } + engines: { node: '>= 10.0.0' } unplugin@1.16.1: - resolution: {integrity: sha512-4/u/j4FrCKdi17jaxuJA0jClGxB1AvU2hw/IuayPc4ay1XGaJs/rbb4v5WKwAjNifjmXK9PIFyuPiaK8azyR9w==} - engines: {node: '>=14.0.0'} + resolution: + { + integrity: sha512-4/u/j4FrCKdi17jaxuJA0jClGxB1AvU2hw/IuayPc4ay1XGaJs/rbb4v5WKwAjNifjmXK9PIFyuPiaK8azyR9w==, + } + engines: { node: '>=14.0.0' } unquote@1.1.1: - resolution: {integrity: sha512-vRCqFv6UhXpWxZPyGDh/F3ZpNv8/qo7w6iufLpQg9aKnQ71qM4B5KiI7Mia9COcjEhrO9LueHpMYjYzsWH3OIg==} + resolution: + { + integrity: sha512-vRCqFv6UhXpWxZPyGDh/F3ZpNv8/qo7w6iufLpQg9aKnQ71qM4B5KiI7Mia9COcjEhrO9LueHpMYjYzsWH3OIg==, + } - unrs-resolver@1.9.1: - resolution: {integrity: sha512-4AZVxP05JGN6DwqIkSP4VKLOcwQa5l37SWHF/ahcuqBMbfxbpN1L1QKafEhWCziHhzKex9H/AR09H0OuVyU+9g==} + unrs-resolver@1.11.0: + resolution: + { + integrity: sha512-uw3hCGO/RdAEAb4zgJ3C/v6KIAFFOtBoxR86b2Ejc5TnH7HrhTWJR2o0A9ullC3eWMegKQCw/arQ/JivywQzkg==, + } unstorage@1.16.0: - resolution: {integrity: sha512-WQ37/H5A7LcRPWfYOrDa1Ys02xAbpPJq6q5GkO88FBXVSQzHd7+BjEwfRqyaSWCv9MbsJy058GWjjPjcJ16GGA==} + resolution: + { + integrity: sha512-WQ37/H5A7LcRPWfYOrDa1Ys02xAbpPJq6q5GkO88FBXVSQzHd7+BjEwfRqyaSWCv9MbsJy058GWjjPjcJ16GGA==, + } peerDependencies: '@azure/app-configuration': ^1.8.0 '@azure/cosmos': ^4.2.0 @@ -7344,28 +12898,46 @@ packages: optional: true unzip-response@2.0.1: - resolution: {integrity: sha512-N0XH6lqDtFH84JxptQoZYmloF4nzrQqqrAymNj+/gW60AO2AZgOcf4O/nUXJcYfyQkqvMo9lSupBZmmgvuVXlw==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-N0XH6lqDtFH84JxptQoZYmloF4nzrQqqrAymNj+/gW60AO2AZgOcf4O/nUXJcYfyQkqvMo9lSupBZmmgvuVXlw==, + } + engines: { node: '>=4' } update-browserslist-db@1.1.3: - resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} + resolution: + { + integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==, + } hasBin: true peerDependencies: browserslist: '>= 4.21.0' update-notifier@2.5.0: - resolution: {integrity: sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==, + } + engines: { node: '>=4' } uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + resolution: + { + integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==, + } urijs@1.19.11: - resolution: {integrity: sha512-HXgFDgDommxn5/bIv0cnQZsPhHDA90NPHD6+c/v21U5+Sx5hoP8+dP9IZXBU1gIfvdRfhG8cel9QNPeionfcCQ==} + resolution: + { + integrity: sha512-HXgFDgDommxn5/bIv0cnQZsPhHDA90NPHD6+c/v21U5+Sx5hoP8+dP9IZXBU1gIfvdRfhG8cel9QNPeionfcCQ==, + } url-loader@4.1.1: - resolution: {integrity: sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==} - engines: {node: '>= 10.13.0'} + resolution: + { + integrity: sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==, + } + engines: { node: '>= 10.13.0' } peerDependencies: file-loader: '*' webpack: ^4.0.0 || ^5.0.0 @@ -7374,64 +12946,99 @@ packages: optional: true url-parse-lax@1.0.0: - resolution: {integrity: sha512-BVA4lR5PIviy2PMseNd2jbFQ+jwSwQGdJejf5ctd1rEXt0Ypd7yanUK9+lYechVlN5VaTJGsu2U/3MDDu6KgBA==} - engines: {node: '>=0.10.0'} - - url-parse@1.5.10: - resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} + resolution: + { + integrity: sha512-BVA4lR5PIviy2PMseNd2jbFQ+jwSwQGdJejf5ctd1rEXt0Ypd7yanUK9+lYechVlN5VaTJGsu2U/3MDDu6KgBA==, + } + engines: { node: '>=0.10.0' } use-debounce@10.0.5: - resolution: {integrity: sha512-Q76E3lnIV+4YT9AHcrHEHYmAd9LKwUAbPXDm7FlqVGDHiSOhX3RDjT8dm0AxbJup6WgOb1YEcKyCr11kBJR5KQ==} - engines: {node: '>= 16.0.0'} + resolution: + { + integrity: sha512-Q76E3lnIV+4YT9AHcrHEHYmAd9LKwUAbPXDm7FlqVGDHiSOhX3RDjT8dm0AxbJup6WgOb1YEcKyCr11kBJR5KQ==, + } + engines: { node: '>= 16.0.0' } peerDependencies: react: '*' use-sync-external-store@1.2.0: - resolution: {integrity: sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==} + resolution: + { + integrity: sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==, + } peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 - utf-8-validate@5.0.10: - resolution: {integrity: sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==} - engines: {node: '>=6.14.2'} - utf8@3.0.0: - resolution: {integrity: sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==} + resolution: + { + integrity: sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==, + } util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + resolution: + { + integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==, + } util.promisify@1.0.1: - resolution: {integrity: sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==} + resolution: + { + integrity: sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==, + } util@0.12.5: - resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} + resolution: + { + integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==, + } utila@0.4.0: - resolution: {integrity: sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==} + resolution: + { + integrity: sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==, + } uuid@11.1.0: - resolution: {integrity: sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==} + resolution: + { + integrity: sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==, + } hasBin: true uuid@3.4.0: - resolution: {integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==} + resolution: + { + integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==, + } deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. hasBin: true uuid@9.0.1: - resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} + resolution: + { + integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==, + } hasBin: true v8-compile-cache-lib@3.0.1: - resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + resolution: + { + integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==, + } validate-npm-package-license@3.0.4: - resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + resolution: + { + integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==, + } valtio@1.11.2: - resolution: {integrity: sha512-1XfIxnUXzyswPAPXo1P3Pdx2mq/pIqZICkWN60Hby0d9Iqb+MEIpqgYVlbflvHdrp2YR/q3jyKWRPJJ100yxaw==} - engines: {node: '>=12.20.0'} + resolution: + { + integrity: sha512-1XfIxnUXzyswPAPXo1P3Pdx2mq/pIqZICkWN60Hby0d9Iqb+MEIpqgYVlbflvHdrp2YR/q3jyKWRPJJ100yxaw==, + } + engines: { node: '>=12.20.0' } peerDependencies: '@types/react': '>=16.8' react: '>=16.8' @@ -7442,13 +13049,22 @@ packages: optional: true value-equal@1.0.1: - resolution: {integrity: sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==} + resolution: + { + integrity: sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==, + } victory-vendor@36.9.2: - resolution: {integrity: sha512-PnpQQMuxlwYdocC8fIJqVXvkeViHYzotI+NJrCuav0ZYFoq912ZHBk3mCeuj+5/VpodOjPe1z0Fk2ihgzlXqjQ==} + resolution: + { + integrity: sha512-PnpQQMuxlwYdocC8fIJqVXvkeViHYzotI+NJrCuav0ZYFoq912ZHBk3mCeuj+5/VpodOjPe1z0Fk2ihgzlXqjQ==, + } viem@2.31.0: - resolution: {integrity: sha512-U7OMQ6yqK+bRbEIarf2vqxL7unSEQvNxvML/1zG7suAmKuJmipqdVTVJGKBCJiYsm/EremyO2FS4dHIPpGv+eA==} + resolution: + { + integrity: sha512-U7OMQ6yqK+bRbEIarf2vqxL7unSEQvNxvML/1zG7suAmKuJmipqdVTVJGKBCJiYsm/EremyO2FS4dHIPpGv+eA==, + } peerDependencies: typescript: '>=5.0.4' peerDependenciesMeta: @@ -7456,23 +13072,29 @@ packages: optional: true vite-node@3.2.4: - resolution: {integrity: sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==} - engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + resolution: + { + integrity: sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==, + } + engines: { node: ^18.0.0 || ^20.0.0 || >=22.0.0 } hasBin: true - vite@6.3.5: - resolution: {integrity: sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==} - engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + vite@7.0.3: + resolution: + { + integrity: sha512-y2L5oJZF7bj4c0jgGYgBNSdIu+5HF+m68rn2cQXFbGoShdhV1phX9rbnxy9YXj82aS8MMsCLAAFkRxZeWdldrQ==, + } + engines: { node: ^20.19.0 || >=22.12.0 } hasBin: true peerDependencies: - '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + '@types/node': ^20.19.0 || >=22.12.0 jiti: '>=1.21.0' - less: '*' + less: ^4.0.0 lightningcss: ^1.21.0 - sass: '*' - sass-embedded: '*' - stylus: '*' - sugarss: '*' + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: '>=0.54.8' + sugarss: ^5.0.0 terser: ^5.16.0 tsx: ^4.8.1 yaml: ^2.4.2 @@ -7501,8 +13123,11 @@ packages: optional: true vitest@3.2.4: - resolution: {integrity: sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==} - engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + resolution: + { + integrity: sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==, + } + engines: { node: ^18.0.0 || ^20.0.0 || >=22.0.0 } hasBin: true peerDependencies: '@edge-runtime/vm': '*' @@ -7529,117 +13154,182 @@ packages: optional: true vm-browserify@1.1.2: - resolution: {integrity: sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==} + resolution: + { + integrity: sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==, + } void-elements@3.1.0: - resolution: {integrity: sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==} - engines: {node: '>=0.10.0'} - - w3c-hr-time@1.0.2: - resolution: {integrity: sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==} - deprecated: Use your platform's native performance.now() and performance.timeOrigin. - - w3c-xmlserializer@2.0.0: - resolution: {integrity: sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==, + } + engines: { node: '>=0.10.0' } watchpack@2.4.4: - resolution: {integrity: sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA==} - engines: {node: '>=10.13.0'} + resolution: + { + integrity: sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA==, + } + engines: { node: '>=10.13.0' } web3-core@4.7.1: - resolution: {integrity: sha512-9KSeASCb/y6BG7rwhgtYC4CvYY66JfkmGNEYb7q1xgjt9BWfkf09MJPaRyoyT5trdOxYDHkT9tDlypvQWaU8UQ==} - engines: {node: '>=14', npm: '>=6.12.0'} + resolution: + { + integrity: sha512-9KSeASCb/y6BG7rwhgtYC4CvYY66JfkmGNEYb7q1xgjt9BWfkf09MJPaRyoyT5trdOxYDHkT9tDlypvQWaU8UQ==, + } + engines: { node: '>=14', npm: '>=6.12.0' } web3-errors@1.3.1: - resolution: {integrity: sha512-w3NMJujH+ZSW4ltIZZKtdbkbyQEvBzyp3JRn59Ckli0Nz4VMsVq8aF1bLWM7A2kuQ+yVEm3ySeNU+7mSRwx7RQ==} - engines: {node: '>=14', npm: '>=6.12.0'} + resolution: + { + integrity: sha512-w3NMJujH+ZSW4ltIZZKtdbkbyQEvBzyp3JRn59Ckli0Nz4VMsVq8aF1bLWM7A2kuQ+yVEm3ySeNU+7mSRwx7RQ==, + } + engines: { node: '>=14', npm: '>=6.12.0' } web3-eth-abi@4.4.1: - resolution: {integrity: sha512-60ecEkF6kQ9zAfbTY04Nc9q4eEYM0++BySpGi8wZ2PD1tw/c0SDvsKhV6IKURxLJhsDlb08dATc3iD6IbtWJmg==} - engines: {node: '>=14', npm: '>=6.12.0'} + resolution: + { + integrity: sha512-60ecEkF6kQ9zAfbTY04Nc9q4eEYM0++BySpGi8wZ2PD1tw/c0SDvsKhV6IKURxLJhsDlb08dATc3iD6IbtWJmg==, + } + engines: { node: '>=14', npm: '>=6.12.0' } web3-eth-accounts@4.3.1: - resolution: {integrity: sha512-rTXf+H9OKze6lxi7WMMOF1/2cZvJb2AOnbNQxPhBDssKOllAMzLhg1FbZ4Mf3lWecWfN6luWgRhaeSqO1l+IBQ==} - engines: {node: '>=14', npm: '>=6.12.0'} + resolution: + { + integrity: sha512-rTXf+H9OKze6lxi7WMMOF1/2cZvJb2AOnbNQxPhBDssKOllAMzLhg1FbZ4Mf3lWecWfN6luWgRhaeSqO1l+IBQ==, + } + engines: { node: '>=14', npm: '>=6.12.0' } web3-eth-contract@4.7.2: - resolution: {integrity: sha512-3ETqs2pMNPEAc7BVY/C3voOhTUeJdkf2aM3X1v+edbngJLHAxbvxKpOqrcO0cjXzC4uc2Q8Zpf8n8zT5r0eLnA==} - engines: {node: '>=14', npm: '>=6.12.0'} + resolution: + { + integrity: sha512-3ETqs2pMNPEAc7BVY/C3voOhTUeJdkf2aM3X1v+edbngJLHAxbvxKpOqrcO0cjXzC4uc2Q8Zpf8n8zT5r0eLnA==, + } + engines: { node: '>=14', npm: '>=6.12.0' } web3-eth-ens@4.4.0: - resolution: {integrity: sha512-DeyVIS060hNV9g8dnTx92syqvgbvPricE3MerCxe/DquNZT3tD8aVgFfq65GATtpCgDDJffO2bVeHp3XBemnSQ==} - engines: {node: '>=14', npm: '>=6.12.0'} + resolution: + { + integrity: sha512-DeyVIS060hNV9g8dnTx92syqvgbvPricE3MerCxe/DquNZT3tD8aVgFfq65GATtpCgDDJffO2bVeHp3XBemnSQ==, + } + engines: { node: '>=14', npm: '>=6.12.0' } web3-eth-iban@4.0.7: - resolution: {integrity: sha512-8weKLa9KuKRzibC87vNLdkinpUE30gn0IGY027F8doeJdcPUfsa4IlBgNC4k4HLBembBB2CTU0Kr/HAOqMeYVQ==} - engines: {node: '>=14', npm: '>=6.12.0'} + resolution: + { + integrity: sha512-8weKLa9KuKRzibC87vNLdkinpUE30gn0IGY027F8doeJdcPUfsa4IlBgNC4k4HLBembBB2CTU0Kr/HAOqMeYVQ==, + } + engines: { node: '>=14', npm: '>=6.12.0' } web3-eth-personal@4.1.0: - resolution: {integrity: sha512-RFN83uMuvA5cu1zIwwJh9A/bAj0OBxmGN3tgx19OD/9ygeUZbifOL06jgFzN0t+1ekHqm3DXYQM8UfHpXi7yDQ==} - engines: {node: '>=14', npm: '>=6.12.0'} + resolution: + { + integrity: sha512-RFN83uMuvA5cu1zIwwJh9A/bAj0OBxmGN3tgx19OD/9ygeUZbifOL06jgFzN0t+1ekHqm3DXYQM8UfHpXi7yDQ==, + } + engines: { node: '>=14', npm: '>=6.12.0' } web3-eth@4.11.1: - resolution: {integrity: sha512-q9zOkzHnbLv44mwgLjLXuyqszHuUgZWsQayD2i/rus2uk0G7hMn11bE2Q3hOVnJS4ws4VCtUznlMxwKQ+38V2w==} - engines: {node: '>=14', npm: '>=6.12.0'} + resolution: + { + integrity: sha512-q9zOkzHnbLv44mwgLjLXuyqszHuUgZWsQayD2i/rus2uk0G7hMn11bE2Q3hOVnJS4ws4VCtUznlMxwKQ+38V2w==, + } + engines: { node: '>=14', npm: '>=6.12.0' } web3-net@4.1.0: - resolution: {integrity: sha512-WWmfvHVIXWEoBDWdgKNYKN8rAy6SgluZ0abyRyXOL3ESr7ym7pKWbfP4fjApIHlYTh8tNqkrdPfM4Dyi6CA0SA==} - engines: {node: '>=14', npm: '>=6.12.0'} + resolution: + { + integrity: sha512-WWmfvHVIXWEoBDWdgKNYKN8rAy6SgluZ0abyRyXOL3ESr7ym7pKWbfP4fjApIHlYTh8tNqkrdPfM4Dyi6CA0SA==, + } + engines: { node: '>=14', npm: '>=6.12.0' } web3-providers-http@4.2.0: - resolution: {integrity: sha512-IPMnDtHB7dVwaB7/mMxAZzyq7d5ezfO1+Vw0bNfAeIi7gaDlJiggp85SdyAfOgov8AMUA/dyiY72kQ0KmjXKvQ==} - engines: {node: '>=14', npm: '>=6.12.0'} + resolution: + { + integrity: sha512-IPMnDtHB7dVwaB7/mMxAZzyq7d5ezfO1+Vw0bNfAeIi7gaDlJiggp85SdyAfOgov8AMUA/dyiY72kQ0KmjXKvQ==, + } + engines: { node: '>=14', npm: '>=6.12.0' } web3-providers-ipc@4.0.7: - resolution: {integrity: sha512-YbNqY4zUvIaK2MHr1lQFE53/8t/ejHtJchrWn9zVbFMGXlTsOAbNoIoZWROrg1v+hCBvT2c9z8xt7e/+uz5p1g==} - engines: {node: '>=14', npm: '>=6.12.0'} + resolution: + { + integrity: sha512-YbNqY4zUvIaK2MHr1lQFE53/8t/ejHtJchrWn9zVbFMGXlTsOAbNoIoZWROrg1v+hCBvT2c9z8xt7e/+uz5p1g==, + } + engines: { node: '>=14', npm: '>=6.12.0' } web3-providers-ws@4.0.8: - resolution: {integrity: sha512-goJdgata7v4pyzHRsg9fSegUG4gVnHZSHODhNnn6J93ykHkBI1nz4fjlGpcQLUMi4jAMz6SHl9Ibzs2jj9xqPw==} - engines: {node: '>=14', npm: '>=6.12.0'} + resolution: + { + integrity: sha512-goJdgata7v4pyzHRsg9fSegUG4gVnHZSHODhNnn6J93ykHkBI1nz4fjlGpcQLUMi4jAMz6SHl9Ibzs2jj9xqPw==, + } + engines: { node: '>=14', npm: '>=6.12.0' } web3-rpc-methods@1.3.0: - resolution: {integrity: sha512-/CHmzGN+IYgdBOme7PdqzF+FNeMleefzqs0LVOduncSaqsppeOEoskLXb2anSpzmQAP3xZJPaTrkQPWSJMORig==} - engines: {node: '>=14', npm: '>=6.12.0'} + resolution: + { + integrity: sha512-/CHmzGN+IYgdBOme7PdqzF+FNeMleefzqs0LVOduncSaqsppeOEoskLXb2anSpzmQAP3xZJPaTrkQPWSJMORig==, + } + engines: { node: '>=14', npm: '>=6.12.0' } web3-rpc-providers@1.0.0-rc.4: - resolution: {integrity: sha512-PXosCqHW0EADrYzgmueNHP3Y5jcSmSwH+Dkqvn7EYD0T2jcsdDAIHqk6szBiwIdhumM7gv9Raprsu/s/f7h1fw==} - engines: {node: '>=14', npm: '>=6.12.0'} + resolution: + { + integrity: sha512-PXosCqHW0EADrYzgmueNHP3Y5jcSmSwH+Dkqvn7EYD0T2jcsdDAIHqk6szBiwIdhumM7gv9Raprsu/s/f7h1fw==, + } + engines: { node: '>=14', npm: '>=6.12.0' } web3-types@1.10.0: - resolution: {integrity: sha512-0IXoaAFtFc8Yin7cCdQfB9ZmjafrbP6BO0f0KT/khMhXKUpoJ6yShrVhiNpyRBo8QQjuOagsWzwSK2H49I7sbw==} - engines: {node: '>=14', npm: '>=6.12.0'} + resolution: + { + integrity: sha512-0IXoaAFtFc8Yin7cCdQfB9ZmjafrbP6BO0f0KT/khMhXKUpoJ6yShrVhiNpyRBo8QQjuOagsWzwSK2H49I7sbw==, + } + engines: { node: '>=14', npm: '>=6.12.0' } web3-utils@4.3.3: - resolution: {integrity: sha512-kZUeCwaQm+RNc2Bf1V3BYbF29lQQKz28L0y+FA4G0lS8IxtJVGi5SeDTUkpwqqkdHHC7JcapPDnyyzJ1lfWlOw==} - engines: {node: '>=14', npm: '>=6.12.0'} + resolution: + { + integrity: sha512-kZUeCwaQm+RNc2Bf1V3BYbF29lQQKz28L0y+FA4G0lS8IxtJVGi5SeDTUkpwqqkdHHC7JcapPDnyyzJ1lfWlOw==, + } + engines: { node: '>=14', npm: '>=6.12.0' } web3-validator@2.0.6: - resolution: {integrity: sha512-qn9id0/l1bWmvH4XfnG/JtGKKwut2Vokl6YXP5Kfg424npysmtRLe9DgiNBM9Op7QL/aSiaA0TVXibuIuWcizg==} - engines: {node: '>=14', npm: '>=6.12.0'} + resolution: + { + integrity: sha512-qn9id0/l1bWmvH4XfnG/JtGKKwut2Vokl6YXP5Kfg424npysmtRLe9DgiNBM9Op7QL/aSiaA0TVXibuIuWcizg==, + } + engines: { node: '>=14', npm: '>=6.12.0' } web3@4.16.0: - resolution: {integrity: sha512-SgoMSBo6EsJ5GFCGar2E/pR2lcR/xmUSuQ61iK6yDqzxmm42aPPxSqZfJz2z/UCR6pk03u77pU8TGV6lgMDdIQ==} - engines: {node: '>=14.0.0', npm: '>=6.12.0'} + resolution: + { + integrity: sha512-SgoMSBo6EsJ5GFCGar2E/pR2lcR/xmUSuQ61iK6yDqzxmm42aPPxSqZfJz2z/UCR6pk03u77pU8TGV6lgMDdIQ==, + } + engines: { node: '>=14.0.0', npm: '>=6.12.0' } webextension-polyfill@0.12.0: - resolution: {integrity: sha512-97TBmpoWJEE+3nFBQ4VocyCdLKfw54rFaJ6EVQYLBCXqCIpLSZkwGgASpv4oPt9gdKCJ80RJlcmNzNn008Ag6Q==} + resolution: + { + integrity: sha512-97TBmpoWJEE+3nFBQ4VocyCdLKfw54rFaJ6EVQYLBCXqCIpLSZkwGgASpv4oPt9gdKCJ80RJlcmNzNn008Ag6Q==, + } webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - - webidl-conversions@5.0.0: - resolution: {integrity: sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==, + } - webidl-conversions@6.1.0: - resolution: {integrity: sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==} - engines: {node: '>=10.4'} + webidl-conversions@4.0.2: + resolution: + { + integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==, + } webpack-cli@4.10.0: - resolution: {integrity: sha512-NLhDfH/h4O6UOy+0LSso42xvYypClINuMNBVVzX4vX98TmTaTUxwRbXdhucbFMd2qLaCTcLq/PdYrvi8onw90w==} - engines: {node: '>=10.13.0'} + resolution: + { + integrity: sha512-NLhDfH/h4O6UOy+0LSso42xvYypClINuMNBVVzX4vX98TmTaTUxwRbXdhucbFMd2qLaCTcLq/PdYrvi8onw90w==, + } + engines: { node: '>=10.13.0' } hasBin: true peerDependencies: '@webpack-cli/generators': '*' @@ -7658,8 +13348,11 @@ packages: optional: true webpack-dev-middleware@6.1.3: - resolution: {integrity: sha512-A4ChP0Qj8oGociTs6UdlRUGANIGrCDL3y+pmQMc+dSsraXHCatFpmMey4mYELA+juqwUqwQsUgJJISXl1KWmiw==} - engines: {node: '>= 14.15.0'} + resolution: + { + integrity: sha512-A4ChP0Qj8oGociTs6UdlRUGANIGrCDL3y+pmQMc+dSsraXHCatFpmMey4mYELA+juqwUqwQsUgJJISXl1KWmiw==, + } + engines: { node: '>= 14.15.0' } peerDependencies: webpack: ^5.0.0 peerDependenciesMeta: @@ -7667,22 +13360,37 @@ packages: optional: true webpack-hot-middleware@2.26.1: - resolution: {integrity: sha512-khZGfAeJx6I8K9zKohEWWYN6KDlVw2DHownoe+6Vtwj1LP9WFgegXnVMSkZ/dBEBtXFwrkkydsaPFlB7f8wU2A==} + resolution: + { + integrity: sha512-khZGfAeJx6I8K9zKohEWWYN6KDlVw2DHownoe+6Vtwj1LP9WFgegXnVMSkZ/dBEBtXFwrkkydsaPFlB7f8wU2A==, + } webpack-merge@5.10.0: - resolution: {integrity: sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==} - engines: {node: '>=10.0.0'} + resolution: + { + integrity: sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==, + } + engines: { node: '>=10.0.0' } webpack-sources@3.3.3: - resolution: {integrity: sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==} - engines: {node: '>=10.13.0'} + resolution: + { + integrity: sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==, + } + engines: { node: '>=10.13.0' } webpack-virtual-modules@0.6.2: - resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} + resolution: + { + integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==, + } webpack@5.99.9: - resolution: {integrity: sha512-brOPwM3JnmOa+7kd3NsmOUOwbDAj8FT9xDsG3IW0MgbN9yZV7Oi/s/+MNQ/EcSMqw7qfoRyXPoeEWT8zLVdVGg==} - engines: {node: '>=10.13.0'} + resolution: + { + integrity: sha512-brOPwM3JnmOa+7kd3NsmOUOwbDAj8FT9xDsG3IW0MgbN9yZV7Oi/s/+MNQ/EcSMqw7qfoRyXPoeEWT8zLVdVGg==, + } + engines: { node: '>=10.13.0' } hasBin: true peerDependencies: webpack-cli: '*' @@ -7691,95 +13399,154 @@ packages: optional: true websocket-driver@0.7.4: - resolution: {integrity: sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==} - engines: {node: '>=0.8.0'} + resolution: + { + integrity: sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==, + } + engines: { node: '>=0.8.0' } websocket-extensions@0.1.4: - resolution: {integrity: sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==} - engines: {node: '>=0.8.0'} - - whatwg-encoding@1.0.5: - resolution: {integrity: sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==} - - whatwg-mimetype@2.3.0: - resolution: {integrity: sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==} + resolution: + { + integrity: sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==, + } + engines: { node: '>=0.8.0' } whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + resolution: + { + integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==, + } - whatwg-url@8.7.0: - resolution: {integrity: sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==} - engines: {node: '>=10'} + whatwg-url@7.1.0: + resolution: + { + integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==, + } which-boxed-primitive@1.1.1: - resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==, + } + engines: { node: '>= 0.4' } which-builtin-type@1.2.1: - resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==, + } + engines: { node: '>= 0.4' } which-collection@1.0.2: - resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==, + } + engines: { node: '>= 0.4' } which-module@2.0.1: - resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} + resolution: + { + integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==, + } which-typed-array@1.1.19: - resolution: {integrity: sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==, + } + engines: { node: '>= 0.4' } which@1.3.1: - resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} + resolution: + { + integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==, + } hasBin: true which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} + resolution: + { + integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==, + } + engines: { node: '>= 8' } hasBin: true why-is-node-running@2.3.0: - resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==, + } + engines: { node: '>=8' } hasBin: true widest-line@2.0.1: - resolution: {integrity: sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==, + } + engines: { node: '>=4' } wildcard@2.0.1: - resolution: {integrity: sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==} + resolution: + { + integrity: sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==, + } word-wrap@1.2.5: - resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==, + } + engines: { node: '>=0.10.0' } wrap-ansi@6.2.0: - resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==, + } + engines: { node: '>=8' } wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==, + } + engines: { node: '>=10' } wrap-ansi@8.1.0: - resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==, + } + engines: { node: '>=12' } wrap-ansi@9.0.0: - resolution: {integrity: sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==, + } + engines: { node: '>=18' } wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + resolution: + { + integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==, + } write-file-atomic@2.4.3: - resolution: {integrity: sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==} + resolution: + { + integrity: sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==, + } ws@7.5.10: - resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} - engines: {node: '>=8.3.0'} + resolution: + { + integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==, + } + engines: { node: '>=8.3.0' } peerDependencies: bufferutil: ^4.0.1 utf-8-validate: ^5.0.2 @@ -7790,8 +13557,11 @@ packages: optional: true ws@8.17.1: - resolution: {integrity: sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==} - engines: {node: '>=10.0.0'} + resolution: + { + integrity: sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==, + } + engines: { node: '>=10.0.0' } peerDependencies: bufferutil: ^4.0.1 utf-8-validate: '>=5.0.2' @@ -7802,8 +13572,11 @@ packages: optional: true ws@8.18.2: - resolution: {integrity: sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==} - engines: {node: '>=10.0.0'} + resolution: + { + integrity: sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==, + } + engines: { node: '>=10.0.0' } peerDependencies: bufferutil: ^4.0.1 utf-8-validate: '>=5.0.2' @@ -7813,90 +13586,155 @@ packages: utf-8-validate: optional: true - xdg-basedir@3.0.0: - resolution: {integrity: sha512-1Dly4xqlulvPD3fZUQJLY+FUIeqN3N2MM3uqe4rCJftAvOjFa3jFGfctOgluGx4ahPbUCsZkmJILiP0Vi4T6lQ==} - engines: {node: '>=4'} - - xml-name-validator@3.0.0: - resolution: {integrity: sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==} + ws@8.18.3: + resolution: + { + integrity: sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==, + } + engines: { node: '>=10.0.0' } + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true - xmlchars@2.2.0: - resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} + xdg-basedir@3.0.0: + resolution: + { + integrity: sha512-1Dly4xqlulvPD3fZUQJLY+FUIeqN3N2MM3uqe4rCJftAvOjFa3jFGfctOgluGx4ahPbUCsZkmJILiP0Vi4T6lQ==, + } + engines: { node: '>=4' } xtend@4.0.2: - resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} - engines: {node: '>=0.4'} + resolution: + { + integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==, + } + engines: { node: '>=0.4' } y18n@4.0.3: - resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} + resolution: + { + integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==, + } y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==, + } + engines: { node: '>=10' } yallist@2.1.2: - resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==} + resolution: + { + integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==, + } yallist@3.1.1: - resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} - - yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + resolution: + { + integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==, + } yaml@1.10.2: - resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} - engines: {node: '>= 6'} + resolution: + { + integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==, + } + engines: { node: '>= 6' } yaml@2.8.0: - resolution: {integrity: sha512-4lLa/EcQCB0cJkyts+FpIRx5G/llPxfP6VQU5KByHEhLxY3IJCH0f0Hy1MHI8sClTvsIb8qwRJ6R/ZdlDJ/leQ==} - engines: {node: '>= 14.6'} + resolution: + { + integrity: sha512-4lLa/EcQCB0cJkyts+FpIRx5G/llPxfP6VQU5KByHEhLxY3IJCH0f0Hy1MHI8sClTvsIb8qwRJ6R/ZdlDJ/leQ==, + } + engines: { node: '>= 14.6' } hasBin: true yargs-parser@10.1.0: - resolution: {integrity: sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==} + resolution: + { + integrity: sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==, + } yargs-parser@18.1.3: - resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==, + } + engines: { node: '>=6' } yargs-parser@21.1.1: - resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==, + } + engines: { node: '>=12' } yargs@15.4.1: - resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==, + } + engines: { node: '>=8' } yargs@17.7.2: - resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==, + } + engines: { node: '>=12' } yauzl@2.10.0: - resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} + resolution: + { + integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==, + } yn@3.1.1: - resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==, + } + engines: { node: '>=6' } yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==, + } + engines: { node: '>=10' } yocto-queue@1.2.1: - resolution: {integrity: sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg==} - engines: {node: '>=12.20'} + resolution: + { + integrity: sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg==, + } + engines: { node: '>=12.20' } zip-dir@2.0.0: - resolution: {integrity: sha512-uhlsJZWz26FLYXOD6WVuq+fIcZ3aBPGo/cFdiLlv3KNwpa52IF3ISV8fLhQLiqVu5No3VhlqlgthN6gehil1Dg==} + resolution: + { + integrity: sha512-uhlsJZWz26FLYXOD6WVuq+fIcZ3aBPGo/cFdiLlv3KNwpa52IF3ISV8fLhQLiqVu5No3VhlqlgthN6gehil1Dg==, + } - zod@3.25.67: - resolution: {integrity: sha512-idA2YXwpCdqUSKRCACDE6ItZD9TZzy3OZMtpfLoh6oPR47lipysRrJfjzMqFxQ3uJuUPyUeWe1r9vLH33xO/Qw==} + zod@3.25.76: + resolution: + { + integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==, + } zxcvbn@4.4.2: - resolution: {integrity: sha512-Bq0B+ixT/DMyG8kgX2xWcI5jUvCwqrMxSFam7m0lAf78nf04hv6lNCsyLYdyYTrCVMqNDY/206K7eExYCeSyUQ==} + resolution: + { + integrity: sha512-Bq0B+ixT/DMyG8kgX2xWcI5jUvCwqrMxSFam7m0lAf78nf04hv6lNCsyLYdyYTrCVMqNDY/206K7eExYCeSyUQ==, + } snapshots: - '@adobe/css-tools@4.4.3': {} '@adraffy/ens-normalize@1.10.1': {} @@ -7907,8 +13745,8 @@ snapshots: '@ampproject/remapping@2.3.0': dependencies: - '@jridgewell/gen-mapping': 0.3.8 - '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/gen-mapping': 0.3.12 + '@jridgewell/trace-mapping': 0.3.29 '@babel/code-frame@7.27.1': dependencies: @@ -7916,20 +13754,20 @@ snapshots: js-tokens: 4.0.0 picocolors: 1.1.1 - '@babel/compat-data@7.27.5': {} + '@babel/compat-data@7.28.0': {} - '@babel/core@7.27.4': + '@babel/core@7.28.0': dependencies: '@ampproject/remapping': 2.3.0 '@babel/code-frame': 7.27.1 - '@babel/generator': 7.27.5 + '@babel/generator': 7.28.0 '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-module-transforms': 7.27.3(@babel/core@7.27.4) + '@babel/helper-module-transforms': 7.27.3(@babel/core@7.28.0) '@babel/helpers': 7.27.6 - '@babel/parser': 7.27.5 + '@babel/parser': 7.28.0 '@babel/template': 7.27.2 - '@babel/traverse': 7.27.4 - '@babel/types': 7.27.6 + '@babel/traverse': 7.28.0 + '@babel/types': 7.28.0 convert-source-map: 2.0.0 debug: 4.4.1 gensync: 1.0.0-beta.2 @@ -7938,49 +13776,49 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/generator@7.27.5': + '@babel/generator@7.28.0': dependencies: - '@babel/parser': 7.27.5 - '@babel/types': 7.27.6 - '@jridgewell/gen-mapping': 0.3.8 - '@jridgewell/trace-mapping': 0.3.25 + '@babel/parser': 7.28.0 + '@babel/types': 7.28.0 + '@jridgewell/gen-mapping': 0.3.12 + '@jridgewell/trace-mapping': 0.3.29 jsesc: 3.1.0 '@babel/helper-annotate-as-pure@7.27.3': dependencies: - '@babel/types': 7.27.6 + '@babel/types': 7.28.0 '@babel/helper-compilation-targets@7.27.2': dependencies: - '@babel/compat-data': 7.27.5 + '@babel/compat-data': 7.28.0 '@babel/helper-validator-option': 7.27.1 - browserslist: 4.25.0 + browserslist: 4.25.1 lru-cache: 5.1.1 semver: 6.3.1 - '@babel/helper-create-class-features-plugin@7.27.1(@babel/core@7.27.4)': + '@babel/helper-create-class-features-plugin@7.27.1(@babel/core@7.28.0)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.0 '@babel/helper-annotate-as-pure': 7.27.3 '@babel/helper-member-expression-to-functions': 7.27.1 '@babel/helper-optimise-call-expression': 7.27.1 - '@babel/helper-replace-supers': 7.27.1(@babel/core@7.27.4) + '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.0) '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - '@babel/traverse': 7.27.4 + '@babel/traverse': 7.28.0 semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/helper-create-regexp-features-plugin@7.27.1(@babel/core@7.27.4)': + '@babel/helper-create-regexp-features-plugin@7.27.1(@babel/core@7.28.0)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.0 '@babel/helper-annotate-as-pure': 7.27.3 regexpu-core: 6.2.0 semver: 6.3.1 - '@babel/helper-define-polyfill-provider@0.6.4(@babel/core@7.27.4)': + '@babel/helper-define-polyfill-provider@0.6.5(@babel/core@7.28.0)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.0 '@babel/helper-compilation-targets': 7.27.2 '@babel/helper-plugin-utils': 7.27.1 debug: 4.4.1 @@ -7989,57 +13827,59 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/helper-globals@7.28.0': {} + '@babel/helper-member-expression-to-functions@7.27.1': dependencies: - '@babel/traverse': 7.27.4 - '@babel/types': 7.27.6 + '@babel/traverse': 7.28.0 + '@babel/types': 7.28.0 transitivePeerDependencies: - supports-color '@babel/helper-module-imports@7.27.1': dependencies: - '@babel/traverse': 7.27.4 - '@babel/types': 7.27.6 + '@babel/traverse': 7.28.0 + '@babel/types': 7.28.0 transitivePeerDependencies: - supports-color - '@babel/helper-module-transforms@7.27.3(@babel/core@7.27.4)': + '@babel/helper-module-transforms@7.27.3(@babel/core@7.28.0)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.0 '@babel/helper-module-imports': 7.27.1 '@babel/helper-validator-identifier': 7.27.1 - '@babel/traverse': 7.27.4 + '@babel/traverse': 7.28.0 transitivePeerDependencies: - supports-color '@babel/helper-optimise-call-expression@7.27.1': dependencies: - '@babel/types': 7.27.6 + '@babel/types': 7.28.0 '@babel/helper-plugin-utils@7.27.1': {} - '@babel/helper-remap-async-to-generator@7.27.1(@babel/core@7.27.4)': + '@babel/helper-remap-async-to-generator@7.27.1(@babel/core@7.28.0)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.0 '@babel/helper-annotate-as-pure': 7.27.3 '@babel/helper-wrap-function': 7.27.1 - '@babel/traverse': 7.27.4 + '@babel/traverse': 7.28.0 transitivePeerDependencies: - supports-color - '@babel/helper-replace-supers@7.27.1(@babel/core@7.27.4)': + '@babel/helper-replace-supers@7.27.1(@babel/core@7.28.0)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.0 '@babel/helper-member-expression-to-functions': 7.27.1 '@babel/helper-optimise-call-expression': 7.27.1 - '@babel/traverse': 7.27.4 + '@babel/traverse': 7.28.0 transitivePeerDependencies: - supports-color '@babel/helper-skip-transparent-expression-wrappers@7.27.1': dependencies: - '@babel/traverse': 7.27.4 - '@babel/types': 7.27.6 + '@babel/traverse': 7.28.0 + '@babel/types': 7.28.0 transitivePeerDependencies: - supports-color @@ -8052,524 +13892,539 @@ snapshots: '@babel/helper-wrap-function@7.27.1': dependencies: '@babel/template': 7.27.2 - '@babel/traverse': 7.27.4 - '@babel/types': 7.27.6 + '@babel/traverse': 7.28.0 + '@babel/types': 7.28.0 transitivePeerDependencies: - supports-color '@babel/helpers@7.27.6': dependencies: '@babel/template': 7.27.2 - '@babel/types': 7.27.6 + '@babel/types': 7.28.0 - '@babel/parser@7.27.5': + '@babel/parser@7.28.0': dependencies: - '@babel/types': 7.27.6 + '@babel/types': 7.28.0 - '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.27.1(@babel/core@7.28.0)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - '@babel/traverse': 7.27.4 + '@babel/traverse': 7.28.0 transitivePeerDependencies: - supports-color - '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.27.1(@babel/core@7.28.0)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.27.1(@babel/core@7.28.0)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.27.1(@babel/core@7.28.0)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - '@babel/plugin-transform-optional-chaining': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-optional-chaining': 7.27.1(@babel/core@7.28.0) transitivePeerDependencies: - supports-color - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.27.1(@babel/core@7.28.0)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - '@babel/traverse': 7.27.4 + '@babel/traverse': 7.28.0 transitivePeerDependencies: - supports-color - '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.27.4)': + '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.28.0)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.0 - '@babel/plugin-syntax-import-assertions@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-syntax-import-assertions@7.27.1(@babel/core@7.28.0)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-import-attributes@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-syntax-import-attributes@7.27.1(@babel/core@7.28.0)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.28.0)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.27.4)': + '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.28.0)': dependencies: - '@babel/core': 7.27.4 - '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.27.4) + '@babel/core': 7.28.0 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.0) '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-arrow-functions@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-arrow-functions@7.27.1(@babel/core@7.28.0)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-async-generator-functions@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-async-generator-functions@7.28.0(@babel/core@7.28.0)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.27.4) - '@babel/traverse': 7.27.4 + '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.28.0) + '@babel/traverse': 7.28.0 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-async-to-generator@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-async-to-generator@7.27.1(@babel/core@7.28.0)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.0 '@babel/helper-module-imports': 7.27.1 '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.27.4) + '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.28.0) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-block-scoped-functions@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-block-scoped-functions@7.27.1(@babel/core@7.28.0)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-block-scoping@7.27.5(@babel/core@7.27.4)': + '@babel/plugin-transform-block-scoping@7.28.0(@babel/core@7.28.0)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-class-properties@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-class-properties@7.27.1(@babel/core@7.28.0)': dependencies: - '@babel/core': 7.27.4 - '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.27.4) + '@babel/core': 7.28.0 + '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.28.0) '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-class-static-block@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-class-static-block@7.27.1(@babel/core@7.28.0)': dependencies: - '@babel/core': 7.27.4 - '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.27.4) + '@babel/core': 7.28.0 + '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.28.0) '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-classes@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-classes@7.28.0(@babel/core@7.28.0)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.0 '@babel/helper-annotate-as-pure': 7.27.3 '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-globals': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-replace-supers': 7.27.1(@babel/core@7.27.4) - '@babel/traverse': 7.27.4 - globals: 11.12.0 + '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.0) + '@babel/traverse': 7.28.0 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-computed-properties@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-computed-properties@7.27.1(@babel/core@7.28.0)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 '@babel/template': 7.27.2 - '@babel/plugin-transform-destructuring@7.27.3(@babel/core@7.27.4)': + '@babel/plugin-transform-destructuring@7.28.0(@babel/core@7.28.0)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/traverse': 7.28.0 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-dotall-regex@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.0) '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-dotall-regex@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-duplicate-keys@7.27.1(@babel/core@7.28.0)': dependencies: - '@babel/core': 7.27.4 - '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.27.4) + '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-duplicate-keys@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.27.1(@babel/core@7.28.0)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.0 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.0) '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-dynamic-import@7.27.1(@babel/core@7.28.0)': dependencies: - '@babel/core': 7.27.4 - '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.27.4) + '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-dynamic-import@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-explicit-resource-management@7.28.0(@babel/core@7.28.0)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-transform-destructuring': 7.28.0(@babel/core@7.28.0) + transitivePeerDependencies: + - supports-color - '@babel/plugin-transform-exponentiation-operator@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-exponentiation-operator@7.27.1(@babel/core@7.28.0)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-export-namespace-from@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-export-namespace-from@7.27.1(@babel/core@7.28.0)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-for-of@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-for-of@7.27.1(@babel/core@7.28.0)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-function-name@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-function-name@7.27.1(@babel/core@7.28.0)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.0 '@babel/helper-compilation-targets': 7.27.2 '@babel/helper-plugin-utils': 7.27.1 - '@babel/traverse': 7.27.4 + '@babel/traverse': 7.28.0 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-json-strings@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-json-strings@7.27.1(@babel/core@7.28.0)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-literals@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-literals@7.27.1(@babel/core@7.28.0)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-logical-assignment-operators@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-logical-assignment-operators@7.27.1(@babel/core@7.28.0)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-member-expression-literals@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-member-expression-literals@7.27.1(@babel/core@7.28.0)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-modules-amd@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-modules-amd@7.27.1(@babel/core@7.28.0)': dependencies: - '@babel/core': 7.27.4 - '@babel/helper-module-transforms': 7.27.3(@babel/core@7.27.4) + '@babel/core': 7.28.0 + '@babel/helper-module-transforms': 7.27.3(@babel/core@7.28.0) '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-modules-commonjs@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-modules-commonjs@7.27.1(@babel/core@7.28.0)': dependencies: - '@babel/core': 7.27.4 - '@babel/helper-module-transforms': 7.27.3(@babel/core@7.27.4) + '@babel/core': 7.28.0 + '@babel/helper-module-transforms': 7.27.3(@babel/core@7.28.0) '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-modules-systemjs@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-modules-systemjs@7.27.1(@babel/core@7.28.0)': dependencies: - '@babel/core': 7.27.4 - '@babel/helper-module-transforms': 7.27.3(@babel/core@7.27.4) + '@babel/core': 7.28.0 + '@babel/helper-module-transforms': 7.27.3(@babel/core@7.28.0) '@babel/helper-plugin-utils': 7.27.1 '@babel/helper-validator-identifier': 7.27.1 - '@babel/traverse': 7.27.4 + '@babel/traverse': 7.28.0 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-modules-umd@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-modules-umd@7.27.1(@babel/core@7.28.0)': dependencies: - '@babel/core': 7.27.4 - '@babel/helper-module-transforms': 7.27.3(@babel/core@7.27.4) + '@babel/core': 7.28.0 + '@babel/helper-module-transforms': 7.27.3(@babel/core@7.28.0) '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-named-capturing-groups-regex@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-named-capturing-groups-regex@7.27.1(@babel/core@7.28.0)': dependencies: - '@babel/core': 7.27.4 - '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.27.4) + '@babel/core': 7.28.0 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.0) '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-new-target@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-new-target@7.27.1(@babel/core@7.28.0)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-nullish-coalescing-operator@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-nullish-coalescing-operator@7.27.1(@babel/core@7.28.0)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-numeric-separator@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-numeric-separator@7.27.1(@babel/core@7.28.0)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-object-rest-spread@7.27.3(@babel/core@7.27.4)': + '@babel/plugin-transform-object-rest-spread@7.28.0(@babel/core@7.28.0)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.0 '@babel/helper-compilation-targets': 7.27.2 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-destructuring': 7.27.3(@babel/core@7.27.4) - '@babel/plugin-transform-parameters': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-destructuring': 7.28.0(@babel/core@7.28.0) + '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.28.0) + '@babel/traverse': 7.28.0 + transitivePeerDependencies: + - supports-color - '@babel/plugin-transform-object-super@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-object-super@7.27.1(@babel/core@7.28.0)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-replace-supers': 7.27.1(@babel/core@7.27.4) + '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.0) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-optional-catch-binding@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-optional-catch-binding@7.27.1(@babel/core@7.28.0)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-optional-chaining@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-optional-chaining@7.27.1(@babel/core@7.28.0)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-parameters@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-parameters@7.27.7(@babel/core@7.28.0)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-private-methods@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-private-methods@7.27.1(@babel/core@7.28.0)': dependencies: - '@babel/core': 7.27.4 - '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.27.4) + '@babel/core': 7.28.0 + '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.28.0) '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-private-property-in-object@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-private-property-in-object@7.27.1(@babel/core@7.28.0)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.0 '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.27.4) + '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.28.0) '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-property-literals@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-property-literals@7.27.1(@babel/core@7.28.0)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-react-constant-elements@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-react-constant-elements@7.27.1(@babel/core@7.28.0)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-react-display-name@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-react-display-name@7.28.0(@babel/core@7.28.0)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-react-jsx-development@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-react-jsx-development@7.27.1(@babel/core@7.28.0)': dependencies: - '@babel/core': 7.27.4 - '@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.27.4) + '@babel/core': 7.28.0 + '@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.28.0) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-react-jsx@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-react-jsx@7.27.1(@babel/core@7.28.0)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.0 '@babel/helper-annotate-as-pure': 7.27.3 '@babel/helper-module-imports': 7.27.1 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.27.4) - '@babel/types': 7.27.6 + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.0) + '@babel/types': 7.28.0 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-react-pure-annotations@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-react-pure-annotations@7.27.1(@babel/core@7.28.0)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.0 '@babel/helper-annotate-as-pure': 7.27.3 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-regenerator@7.27.5(@babel/core@7.27.4)': + '@babel/plugin-transform-regenerator@7.28.0(@babel/core@7.28.0)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-regexp-modifiers@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-regexp-modifiers@7.27.1(@babel/core@7.28.0)': dependencies: - '@babel/core': 7.27.4 - '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.27.4) + '@babel/core': 7.28.0 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.0) '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-reserved-words@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-reserved-words@7.27.1(@babel/core@7.28.0)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-shorthand-properties@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-shorthand-properties@7.27.1(@babel/core@7.28.0)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-spread@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-spread@7.27.1(@babel/core@7.28.0)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-sticky-regex@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-sticky-regex@7.27.1(@babel/core@7.28.0)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-template-literals@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-template-literals@7.27.1(@babel/core@7.28.0)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-typeof-symbol@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-typeof-symbol@7.27.1(@babel/core@7.28.0)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-unicode-escapes@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-unicode-escapes@7.27.1(@babel/core@7.28.0)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-unicode-property-regex@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-unicode-property-regex@7.27.1(@babel/core@7.28.0)': dependencies: - '@babel/core': 7.27.4 - '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.27.4) + '@babel/core': 7.28.0 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.0) '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-unicode-regex@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-unicode-regex@7.27.1(@babel/core@7.28.0)': dependencies: - '@babel/core': 7.27.4 - '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.27.4) + '@babel/core': 7.28.0 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.0) '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-unicode-sets-regex@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-unicode-sets-regex@7.27.1(@babel/core@7.28.0)': dependencies: - '@babel/core': 7.27.4 - '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.27.4) + '@babel/core': 7.28.0 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.0) '@babel/helper-plugin-utils': 7.27.1 - '@babel/preset-env@7.27.2(@babel/core@7.27.4)': + '@babel/preset-env@7.28.0(@babel/core@7.28.0)': dependencies: - '@babel/compat-data': 7.27.5 - '@babel/core': 7.27.4 + '@babel/compat-data': 7.28.0 + '@babel/core': 7.28.0 '@babel/helper-compilation-targets': 7.27.2 '@babel/helper-plugin-utils': 7.27.1 '@babel/helper-validator-option': 7.27.1 - '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.27.4) - '@babel/plugin-syntax-import-assertions': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-syntax-import-attributes': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.27.4) - '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-async-generator-functions': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-async-to-generator': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-block-scoped-functions': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-block-scoping': 7.27.5(@babel/core@7.27.4) - '@babel/plugin-transform-class-properties': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-class-static-block': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-classes': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-computed-properties': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-destructuring': 7.27.3(@babel/core@7.27.4) - '@babel/plugin-transform-dotall-regex': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-duplicate-keys': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-dynamic-import': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-exponentiation-operator': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-export-namespace-from': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-for-of': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-function-name': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-json-strings': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-literals': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-logical-assignment-operators': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-member-expression-literals': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-modules-amd': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-modules-systemjs': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-modules-umd': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-named-capturing-groups-regex': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-new-target': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-nullish-coalescing-operator': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-numeric-separator': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-object-rest-spread': 7.27.3(@babel/core@7.27.4) - '@babel/plugin-transform-object-super': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-optional-catch-binding': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-optional-chaining': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-parameters': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-private-methods': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-private-property-in-object': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-property-literals': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-regenerator': 7.27.5(@babel/core@7.27.4) - '@babel/plugin-transform-regexp-modifiers': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-reserved-words': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-shorthand-properties': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-spread': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-sticky-regex': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-template-literals': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-typeof-symbol': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-unicode-escapes': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-unicode-property-regex': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-unicode-regex': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-unicode-sets-regex': 7.27.1(@babel/core@7.27.4) - '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.27.4) - babel-plugin-polyfill-corejs2: 0.4.13(@babel/core@7.27.4) - babel-plugin-polyfill-corejs3: 0.11.1(@babel/core@7.27.4) - babel-plugin-polyfill-regenerator: 0.6.4(@babel/core@7.27.4) - core-js-compat: 3.43.0 + '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.28.0) + '@babel/plugin-syntax-import-assertions': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-syntax-import-attributes': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.28.0) + '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-async-generator-functions': 7.28.0(@babel/core@7.28.0) + '@babel/plugin-transform-async-to-generator': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-block-scoped-functions': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-block-scoping': 7.28.0(@babel/core@7.28.0) + '@babel/plugin-transform-class-properties': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-class-static-block': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-classes': 7.28.0(@babel/core@7.28.0) + '@babel/plugin-transform-computed-properties': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-destructuring': 7.28.0(@babel/core@7.28.0) + '@babel/plugin-transform-dotall-regex': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-duplicate-keys': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-dynamic-import': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-explicit-resource-management': 7.28.0(@babel/core@7.28.0) + '@babel/plugin-transform-exponentiation-operator': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-export-namespace-from': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-for-of': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-function-name': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-json-strings': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-literals': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-logical-assignment-operators': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-member-expression-literals': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-modules-amd': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-modules-systemjs': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-modules-umd': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-named-capturing-groups-regex': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-new-target': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-nullish-coalescing-operator': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-numeric-separator': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-object-rest-spread': 7.28.0(@babel/core@7.28.0) + '@babel/plugin-transform-object-super': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-optional-catch-binding': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-optional-chaining': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.28.0) + '@babel/plugin-transform-private-methods': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-private-property-in-object': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-property-literals': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-regenerator': 7.28.0(@babel/core@7.28.0) + '@babel/plugin-transform-regexp-modifiers': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-reserved-words': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-shorthand-properties': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-spread': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-sticky-regex': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-template-literals': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-typeof-symbol': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-unicode-escapes': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-unicode-property-regex': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-unicode-regex': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-unicode-sets-regex': 7.27.1(@babel/core@7.28.0) + '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.28.0) + babel-plugin-polyfill-corejs2: 0.4.14(@babel/core@7.28.0) + babel-plugin-polyfill-corejs3: 0.13.0(@babel/core@7.28.0) + babel-plugin-polyfill-regenerator: 0.6.5(@babel/core@7.28.0) + core-js-compat: 3.44.0 semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.27.4)': + '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.28.0)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - '@babel/types': 7.27.6 + '@babel/types': 7.28.0 esutils: 2.0.3 - '@babel/preset-react@7.27.1(@babel/core@7.27.4)': + '@babel/preset-react@7.27.1(@babel/core@7.28.0)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 '@babel/helper-validator-option': 7.27.1 - '@babel/plugin-transform-react-display-name': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-react-jsx-development': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-react-pure-annotations': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-react-display-name': 7.28.0(@babel/core@7.28.0) + '@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-react-jsx-development': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-react-pure-annotations': 7.27.1(@babel/core@7.28.0) transitivePeerDependencies: - supports-color @@ -8578,31 +14433,139 @@ snapshots: '@babel/template@7.27.2': dependencies: '@babel/code-frame': 7.27.1 - '@babel/parser': 7.27.5 - '@babel/types': 7.27.6 + '@babel/parser': 7.28.0 + '@babel/types': 7.28.0 - '@babel/traverse@7.27.4': + '@babel/traverse@7.28.0': dependencies: '@babel/code-frame': 7.27.1 - '@babel/generator': 7.27.5 - '@babel/parser': 7.27.5 + '@babel/generator': 7.28.0 + '@babel/helper-globals': 7.28.0 + '@babel/parser': 7.28.0 '@babel/template': 7.27.2 - '@babel/types': 7.27.6 + '@babel/types': 7.28.0 debug: 4.4.1 - globals: 11.12.0 transitivePeerDependencies: - supports-color - '@babel/types@7.27.6': + '@babel/types@7.28.0': dependencies: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.27.1 '@bcoe/v8-coverage@1.0.2': {} - '@coinbase/cbpay-js@1.10.0(regenerator-runtime@0.13.11)': - optionalDependencies: - regenerator-runtime: 0.13.11 + '@coinbase/cbpay-js@1.10.0': {} + + '@commitlint/cli@19.8.1(@types/node@24.0.12)(typescript@5.8.3)': + dependencies: + '@commitlint/format': 19.8.1 + '@commitlint/lint': 19.8.1 + '@commitlint/load': 19.8.1(@types/node@24.0.12)(typescript@5.8.3) + '@commitlint/read': 19.8.1 + '@commitlint/types': 19.8.1 + tinyexec: 1.0.1 + yargs: 17.7.2 + transitivePeerDependencies: + - '@types/node' + - typescript + + '@commitlint/config-conventional@19.8.1': + dependencies: + '@commitlint/types': 19.8.1 + conventional-changelog-conventionalcommits: 7.0.2 + + '@commitlint/config-validator@19.8.1': + dependencies: + '@commitlint/types': 19.8.1 + ajv: 8.17.1 + + '@commitlint/ensure@19.8.1': + dependencies: + '@commitlint/types': 19.8.1 + lodash.camelcase: 4.3.0 + lodash.kebabcase: 4.1.1 + lodash.snakecase: 4.1.1 + lodash.startcase: 4.4.0 + lodash.upperfirst: 4.3.1 + + '@commitlint/execute-rule@19.8.1': {} + + '@commitlint/format@19.8.1': + dependencies: + '@commitlint/types': 19.8.1 + chalk: 5.4.1 + + '@commitlint/is-ignored@19.8.1': + dependencies: + '@commitlint/types': 19.8.1 + semver: 7.7.2 + + '@commitlint/lint@19.8.1': + dependencies: + '@commitlint/is-ignored': 19.8.1 + '@commitlint/parse': 19.8.1 + '@commitlint/rules': 19.8.1 + '@commitlint/types': 19.8.1 + + '@commitlint/load@19.8.1(@types/node@24.0.12)(typescript@5.8.3)': + dependencies: + '@commitlint/config-validator': 19.8.1 + '@commitlint/execute-rule': 19.8.1 + '@commitlint/resolve-extends': 19.8.1 + '@commitlint/types': 19.8.1 + chalk: 5.4.1 + cosmiconfig: 9.0.0(typescript@5.8.3) + cosmiconfig-typescript-loader: 6.1.0(@types/node@24.0.12)(cosmiconfig@9.0.0(typescript@5.8.3))(typescript@5.8.3) + lodash.isplainobject: 4.0.6 + lodash.merge: 4.6.2 + lodash.uniq: 4.5.0 + transitivePeerDependencies: + - '@types/node' + - typescript + + '@commitlint/message@19.8.1': {} + + '@commitlint/parse@19.8.1': + dependencies: + '@commitlint/types': 19.8.1 + conventional-changelog-angular: 7.0.0 + conventional-commits-parser: 5.0.0 + + '@commitlint/read@19.8.1': + dependencies: + '@commitlint/top-level': 19.8.1 + '@commitlint/types': 19.8.1 + git-raw-commits: 4.0.0 + minimist: 1.2.8 + tinyexec: 1.0.1 + + '@commitlint/resolve-extends@19.8.1': + dependencies: + '@commitlint/config-validator': 19.8.1 + '@commitlint/types': 19.8.1 + global-directory: 4.0.1 + import-meta-resolve: 4.1.0 + lodash.mergewith: 4.6.2 + resolve-from: 5.0.0 + + '@commitlint/rules@19.8.1': + dependencies: + '@commitlint/ensure': 19.8.1 + '@commitlint/message': 19.8.1 + '@commitlint/to-lines': 19.8.1 + '@commitlint/types': 19.8.1 + + '@commitlint/to-lines@19.8.1': {} + + '@commitlint/top-level@19.8.1': + dependencies: + find-up: 7.0.0 + + '@commitlint/types@19.8.1': + dependencies: + '@types/conventional-commits-parser': 5.0.1 + chalk: 5.4.1 '@cspotcode/source-map-support@0.8.1': dependencies: @@ -8641,18 +14604,18 @@ snapshots: transitivePeerDependencies: - supports-color - '@emnapi/core@1.4.3': + '@emnapi/core@1.4.4': dependencies: - '@emnapi/wasi-threads': 1.0.2 + '@emnapi/wasi-threads': 1.0.3 tslib: 2.8.1 optional: true - '@emnapi/runtime@1.4.3': + '@emnapi/runtime@1.4.4': dependencies: tslib: 2.8.1 optional: true - '@emnapi/wasi-threads@1.0.2': + '@emnapi/wasi-threads@1.0.3': dependencies: tslib: 2.8.1 optional: true @@ -8715,7 +14678,7 @@ snapshots: '@emotion/sheet@1.4.0': {} - '@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@18.3.23)(react@18.3.1))(@types/react@18.3.23)(react@18.3.1)': + '@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.23)(react@18.3.1))(@types/react@18.3.23)(react@18.3.1)': dependencies: '@babel/runtime': 7.27.6 '@emotion/babel-plugin': 11.13.5 @@ -8740,89 +14703,92 @@ snapshots: '@emotion/weak-memoize@0.4.0': {} - '@esbuild/aix-ppc64@0.25.5': + '@esbuild/aix-ppc64@0.25.6': + optional: true + + '@esbuild/android-arm64@0.25.6': optional: true - '@esbuild/android-arm64@0.25.5': + '@esbuild/android-arm@0.25.6': optional: true - '@esbuild/android-arm@0.25.5': + '@esbuild/android-x64@0.25.6': optional: true - '@esbuild/android-x64@0.25.5': + '@esbuild/darwin-arm64@0.25.6': optional: true - '@esbuild/darwin-arm64@0.25.5': + '@esbuild/darwin-x64@0.25.6': optional: true - '@esbuild/darwin-x64@0.25.5': + '@esbuild/freebsd-arm64@0.25.6': optional: true - '@esbuild/freebsd-arm64@0.25.5': + '@esbuild/freebsd-x64@0.25.6': optional: true - '@esbuild/freebsd-x64@0.25.5': + '@esbuild/linux-arm64@0.25.6': optional: true - '@esbuild/linux-arm64@0.25.5': + '@esbuild/linux-arm@0.25.6': optional: true - '@esbuild/linux-arm@0.25.5': + '@esbuild/linux-ia32@0.25.6': optional: true - '@esbuild/linux-ia32@0.25.5': + '@esbuild/linux-loong64@0.25.6': optional: true - '@esbuild/linux-loong64@0.25.5': + '@esbuild/linux-mips64el@0.25.6': optional: true - '@esbuild/linux-mips64el@0.25.5': + '@esbuild/linux-ppc64@0.25.6': optional: true - '@esbuild/linux-ppc64@0.25.5': + '@esbuild/linux-riscv64@0.25.6': optional: true - '@esbuild/linux-riscv64@0.25.5': + '@esbuild/linux-s390x@0.25.6': optional: true - '@esbuild/linux-s390x@0.25.5': + '@esbuild/linux-x64@0.25.6': optional: true - '@esbuild/linux-x64@0.25.5': + '@esbuild/netbsd-arm64@0.25.6': optional: true - '@esbuild/netbsd-arm64@0.25.5': + '@esbuild/netbsd-x64@0.25.6': optional: true - '@esbuild/netbsd-x64@0.25.5': + '@esbuild/openbsd-arm64@0.25.6': optional: true - '@esbuild/openbsd-arm64@0.25.5': + '@esbuild/openbsd-x64@0.25.6': optional: true - '@esbuild/openbsd-x64@0.25.5': + '@esbuild/openharmony-arm64@0.25.6': optional: true - '@esbuild/sunos-x64@0.25.5': + '@esbuild/sunos-x64@0.25.6': optional: true - '@esbuild/win32-arm64@0.25.5': + '@esbuild/win32-arm64@0.25.6': optional: true - '@esbuild/win32-ia32@0.25.5': + '@esbuild/win32-ia32@0.25.6': optional: true - '@esbuild/win32-x64@0.25.5': + '@esbuild/win32-x64@0.25.6': optional: true - '@eslint-community/eslint-utils@4.7.0(eslint@9.29.0(jiti@2.4.2))': + '@eslint-community/eslint-utils@4.7.0(eslint@9.30.1(jiti@2.4.2))': dependencies: - eslint: 9.29.0(jiti@2.4.2) + eslint: 9.30.1(jiti@2.4.2) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.1': {} - '@eslint/config-array@0.20.1': + '@eslint/config-array@0.21.0': dependencies: '@eslint/object-schema': 2.1.6 debug: 4.4.1 @@ -8830,13 +14796,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/config-helpers@0.2.3': {} + '@eslint/config-helpers@0.3.0': {} '@eslint/core@0.14.0': dependencies: '@types/json-schema': 7.0.15 - '@eslint/core@0.15.0': + '@eslint/core@0.15.1': dependencies: '@types/json-schema': 7.0.15 @@ -8854,13 +14820,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@9.29.0': {} + '@eslint/js@9.30.1': {} '@eslint/object-schema@2.1.6': {} - '@eslint/plugin-kit@0.3.2': + '@eslint/plugin-kit@0.3.3': dependencies: - '@eslint/core': 0.15.0 + '@eslint/core': 0.15.1 levn: 0.4.1 '@ethereumjs/common@3.2.0': @@ -9210,7 +15176,7 @@ snapshots: '@grpc/grpc-js@1.9.15': dependencies: '@grpc/proto-loader': 0.7.15 - '@types/node': 22.15.32 + '@types/node': 22.16.2 '@grpc/proto-loader@0.7.15': dependencies: @@ -9237,6 +15203,12 @@ snapshots: browser-headers: 0.4.1 google-protobuf: 3.21.4 + '@isaacs/balanced-match@4.0.1': {} + + '@isaacs/brace-expansion@5.0.0': + dependencies: + '@isaacs/balanced-match': 4.0.1 + '@isaacs/cliui@8.0.2': dependencies: string-width: 5.1.2 @@ -9248,32 +15220,29 @@ snapshots: '@istanbuljs/schema@0.1.3': {} - '@jridgewell/gen-mapping@0.3.8': + '@jridgewell/gen-mapping@0.3.12': dependencies: - '@jridgewell/set-array': 1.2.1 - '@jridgewell/sourcemap-codec': 1.5.0 - '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/sourcemap-codec': 1.5.4 + '@jridgewell/trace-mapping': 0.3.29 '@jridgewell/resolve-uri@3.1.2': {} - '@jridgewell/set-array@1.2.1': {} - - '@jridgewell/source-map@0.3.6': + '@jridgewell/source-map@0.3.10': dependencies: - '@jridgewell/gen-mapping': 0.3.8 - '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/gen-mapping': 0.3.12 + '@jridgewell/trace-mapping': 0.3.29 - '@jridgewell/sourcemap-codec@1.5.0': {} + '@jridgewell/sourcemap-codec@1.5.4': {} - '@jridgewell/trace-mapping@0.3.25': + '@jridgewell/trace-mapping@0.3.29': dependencies: '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/sourcemap-codec': 1.5.4 '@jridgewell/trace-mapping@0.3.9': dependencies: '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/sourcemap-codec': 1.5.4 '@lit-labs/ssr-dom-shim@1.3.0': {} @@ -9290,7 +15259,7 @@ snapshots: '@metamask/abi-utils@3.0.0': dependencies: '@metamask/superstruct': 3.2.1 - '@metamask/utils': 11.4.0 + '@metamask/utils': 11.4.2 transitivePeerDependencies: - supports-color @@ -9299,7 +15268,7 @@ snapshots: '@ethereumjs/rlp': 4.0.1 '@ethereumjs/util': 8.1.0 '@metamask/abi-utils': 3.0.0 - '@metamask/utils': 11.4.0 + '@metamask/utils': 11.4.2 '@scure/base': 1.1.9 ethereum-cryptography: 2.2.1 tweetnacl: 1.0.3 @@ -9308,7 +15277,7 @@ snapshots: '@metamask/superstruct@3.2.1': {} - '@metamask/utils@11.4.0': + '@metamask/utils@11.4.2': dependencies: '@ethereumjs/tx': 4.2.0 '@metamask/superstruct': 3.2.1 @@ -9316,12 +15285,23 @@ snapshots: '@scure/base': 1.1.9 '@types/debug': 4.1.12 debug: 4.4.1 + lodash.memoize: 4.1.2 pony-cause: 2.1.11 semver: 7.7.2 uuid: 9.0.1 transitivePeerDependencies: - supports-color + '@mjackson/form-data-parser@0.4.0': + dependencies: + '@mjackson/multipart-parser': 0.6.3 + + '@mjackson/headers@0.5.1': {} + + '@mjackson/multipart-parser@0.6.3': + dependencies: + '@mjackson/headers': 0.5.1 + '@motionone/animation@10.18.0': dependencies: '@motionone/easing': 10.18.0 @@ -9369,23 +15349,23 @@ snapshots: '@msgpack/msgpack@3.1.2': {} - '@mui/core-downloads-tracker@7.1.2': {} + '@mui/core-downloads-tracker@7.2.0': {} - '@mui/icons-material@7.1.2(@mui/material@7.1.2(@emotion/react@11.14.0(@types/react@18.3.23)(react@18.3.1))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@18.3.23)(react@18.3.1))(@types/react@18.3.23)(react@18.3.1))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.23)(react@18.3.1)': + '@mui/icons-material@7.2.0(@mui/material@7.2.0(@emotion/react@11.14.0(@types/react@18.3.23)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.23)(react@18.3.1))(@types/react@18.3.23)(react@18.3.1))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.23)(react@18.3.1)': dependencies: '@babel/runtime': 7.27.6 - '@mui/material': 7.1.2(@emotion/react@11.14.0(@types/react@18.3.23)(react@18.3.1))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@18.3.23)(react@18.3.1))(@types/react@18.3.23)(react@18.3.1))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@mui/material': 7.2.0(@emotion/react@11.14.0(@types/react@18.3.23)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.23)(react@18.3.1))(@types/react@18.3.23)(react@18.3.1))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 optionalDependencies: '@types/react': 18.3.23 - '@mui/material@7.1.2(@emotion/react@11.14.0(@types/react@18.3.23)(react@18.3.1))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@18.3.23)(react@18.3.1))(@types/react@18.3.23)(react@18.3.1))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@mui/material@7.2.0(@emotion/react@11.14.0(@types/react@18.3.23)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.23)(react@18.3.1))(@types/react@18.3.23)(react@18.3.1))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.27.6 - '@mui/core-downloads-tracker': 7.1.2 - '@mui/system': 7.1.1(@emotion/react@11.14.0(@types/react@18.3.23)(react@18.3.1))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@18.3.23)(react@18.3.1))(@types/react@18.3.23)(react@18.3.1))(@types/react@18.3.23)(react@18.3.1) - '@mui/types': 7.4.3(@types/react@18.3.23) - '@mui/utils': 7.1.1(@types/react@18.3.23)(react@18.3.1) + '@mui/core-downloads-tracker': 7.2.0 + '@mui/system': 7.2.0(@emotion/react@11.14.0(@types/react@18.3.23)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.23)(react@18.3.1))(@types/react@18.3.23)(react@18.3.1))(@types/react@18.3.23)(react@18.3.1) + '@mui/types': 7.4.4(@types/react@18.3.23) + '@mui/utils': 7.2.0(@types/react@18.3.23)(react@18.3.1) '@popperjs/core': 2.11.8 '@types/react-transition-group': 4.4.12(@types/react@18.3.23) clsx: 2.1.1 @@ -9397,19 +15377,19 @@ snapshots: react-transition-group: 4.4.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) optionalDependencies: '@emotion/react': 11.14.0(@types/react@18.3.23)(react@18.3.1) - '@emotion/styled': 11.14.0(@emotion/react@11.14.0(@types/react@18.3.23)(react@18.3.1))(@types/react@18.3.23)(react@18.3.1) + '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@18.3.23)(react@18.3.1))(@types/react@18.3.23)(react@18.3.1) '@types/react': 18.3.23 - '@mui/private-theming@7.1.1(@types/react@18.3.23)(react@18.3.1)': + '@mui/private-theming@7.2.0(@types/react@18.3.23)(react@18.3.1)': dependencies: '@babel/runtime': 7.27.6 - '@mui/utils': 7.1.1(@types/react@18.3.23)(react@18.3.1) + '@mui/utils': 7.2.0(@types/react@18.3.23)(react@18.3.1) prop-types: 15.8.1 react: 18.3.1 optionalDependencies: '@types/react': 18.3.23 - '@mui/styled-engine@7.1.1(@emotion/react@11.14.0(@types/react@18.3.23)(react@18.3.1))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@18.3.23)(react@18.3.1))(@types/react@18.3.23)(react@18.3.1))(react@18.3.1)': + '@mui/styled-engine@7.2.0(@emotion/react@11.14.0(@types/react@18.3.23)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.23)(react@18.3.1))(@types/react@18.3.23)(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.27.6 '@emotion/cache': 11.14.0 @@ -9420,34 +15400,34 @@ snapshots: react: 18.3.1 optionalDependencies: '@emotion/react': 11.14.0(@types/react@18.3.23)(react@18.3.1) - '@emotion/styled': 11.14.0(@emotion/react@11.14.0(@types/react@18.3.23)(react@18.3.1))(@types/react@18.3.23)(react@18.3.1) + '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@18.3.23)(react@18.3.1))(@types/react@18.3.23)(react@18.3.1) - '@mui/system@7.1.1(@emotion/react@11.14.0(@types/react@18.3.23)(react@18.3.1))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@18.3.23)(react@18.3.1))(@types/react@18.3.23)(react@18.3.1))(@types/react@18.3.23)(react@18.3.1)': + '@mui/system@7.2.0(@emotion/react@11.14.0(@types/react@18.3.23)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.23)(react@18.3.1))(@types/react@18.3.23)(react@18.3.1))(@types/react@18.3.23)(react@18.3.1)': dependencies: '@babel/runtime': 7.27.6 - '@mui/private-theming': 7.1.1(@types/react@18.3.23)(react@18.3.1) - '@mui/styled-engine': 7.1.1(@emotion/react@11.14.0(@types/react@18.3.23)(react@18.3.1))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@18.3.23)(react@18.3.1))(@types/react@18.3.23)(react@18.3.1))(react@18.3.1) - '@mui/types': 7.4.3(@types/react@18.3.23) - '@mui/utils': 7.1.1(@types/react@18.3.23)(react@18.3.1) + '@mui/private-theming': 7.2.0(@types/react@18.3.23)(react@18.3.1) + '@mui/styled-engine': 7.2.0(@emotion/react@11.14.0(@types/react@18.3.23)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.23)(react@18.3.1))(@types/react@18.3.23)(react@18.3.1))(react@18.3.1) + '@mui/types': 7.4.4(@types/react@18.3.23) + '@mui/utils': 7.2.0(@types/react@18.3.23)(react@18.3.1) clsx: 2.1.1 csstype: 3.1.3 prop-types: 15.8.1 react: 18.3.1 optionalDependencies: '@emotion/react': 11.14.0(@types/react@18.3.23)(react@18.3.1) - '@emotion/styled': 11.14.0(@emotion/react@11.14.0(@types/react@18.3.23)(react@18.3.1))(@types/react@18.3.23)(react@18.3.1) + '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@18.3.23)(react@18.3.1))(@types/react@18.3.23)(react@18.3.1) '@types/react': 18.3.23 - '@mui/types@7.4.3(@types/react@18.3.23)': + '@mui/types@7.4.4(@types/react@18.3.23)': dependencies: '@babel/runtime': 7.27.6 optionalDependencies: '@types/react': 18.3.23 - '@mui/utils@7.1.1(@types/react@18.3.23)(react@18.3.1)': + '@mui/utils@7.2.0(@types/react@18.3.23)(react@18.3.1)': dependencies: '@babel/runtime': 7.27.6 - '@mui/types': 7.4.3(@types/react@18.3.23) + '@mui/types': 7.4.4(@types/react@18.3.23) '@types/prop-types': 15.7.15 clsx: 2.1.1 prop-types: 15.8.1 @@ -9458,8 +15438,8 @@ snapshots: '@napi-rs/wasm-runtime@0.2.11': dependencies: - '@emnapi/core': 1.4.3 - '@emnapi/runtime': 1.4.3 + '@emnapi/core': 1.4.4 + '@emnapi/runtime': 1.4.4 '@tybys/wasm-util': 0.9.0 optional: true @@ -9518,15 +15498,15 @@ snapshots: transitivePeerDependencies: - '@onflow/util-config' - '@onflow/fcl-core@1.19.0(bufferutil@4.0.9)(google-protobuf@3.21.4)(utf-8-validate@5.0.10)': + '@onflow/fcl-core@1.20.0(google-protobuf@3.21.4)': dependencies: '@babel/runtime': 7.27.6 '@improbable-eng/grpc-web': 0.15.0(google-protobuf@3.21.4) '@onflow/config': 1.5.2 '@onflow/interaction': 0.0.11 '@onflow/rlp': 1.2.3 - '@onflow/sdk': 1.9.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - '@onflow/transport-http': 1.13.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@onflow/sdk': 1.9.0 + '@onflow/transport-http': 1.13.0 '@onflow/types': 1.4.1 '@onflow/util-actor': 1.3.4 '@onflow/util-address': 1.2.3 @@ -9544,20 +15524,20 @@ snapshots: - google-protobuf - utf-8-validate - '@onflow/fcl-wc@6.0.3(@onflow/fcl-core@1.19.0(bufferutil@4.0.9)(google-protobuf@3.21.4)(utf-8-validate@5.0.10))(@types/react@18.3.23)(bufferutil@4.0.9)(jiti@2.4.2)(postcss@8.5.6)(react@18.3.1)(ts-node@10.9.2(@swc/core@1.12.1)(@types/node@22.15.32)(typescript@5.8.3))(tsx@4.20.3)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67)': + '@onflow/fcl-wc@6.0.4(@onflow/fcl-core@1.20.0(google-protobuf@3.21.4))(@types/react@18.3.23)(jiti@2.4.2)(postcss@8.5.6)(react@18.3.1)(ts-node@10.9.2(@swc/core@1.12.11)(@types/node@22.16.2)(typescript@5.8.3))(tsx@4.20.3)(typescript@5.8.3)(zod@3.25.76)': dependencies: '@babel/runtime': 7.27.6 '@onflow/config': 1.5.2 - '@onflow/fcl-core': 1.19.0(bufferutil@4.0.9)(google-protobuf@3.21.4)(utf-8-validate@5.0.10) + '@onflow/fcl-core': 1.20.0(google-protobuf@3.21.4) '@onflow/util-invariant': 1.2.4 '@onflow/util-logger': 1.3.3 '@walletconnect/modal': 2.7.0(@types/react@18.3.23)(react@18.3.1) - '@walletconnect/types': 2.21.3 - '@walletconnect/universal-provider': 2.21.3(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) - '@walletconnect/utils': 2.21.3(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) + '@walletconnect/types': 2.21.4 + '@walletconnect/universal-provider': 2.21.4(typescript@5.8.3)(zod@3.25.76) + '@walletconnect/utils': 2.21.4(typescript@5.8.3)(zod@3.25.76) postcss-cli: 11.0.1(jiti@2.4.2)(postcss@8.5.6)(tsx@4.20.3) preact: 10.26.9 - tailwindcss: 3.4.17(ts-node@10.9.2(@swc/core@1.12.1)(@types/node@22.15.32)(typescript@5.8.3)) + tailwindcss: 3.4.17(ts-node@10.9.2(@swc/core@1.12.11)(@types/node@22.16.2)(typescript@5.8.3)) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -9590,15 +15570,15 @@ snapshots: - utf-8-validate - zod - '@onflow/fcl@1.18.0(@types/react@18.3.23)(bufferutil@4.0.9)(google-protobuf@3.21.4)(jiti@2.4.2)(postcss@8.5.6)(react@18.3.1)(ts-node@10.9.2(@swc/core@1.12.1)(@types/node@22.15.32)(typescript@5.8.3))(tsx@4.20.3)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67)': + '@onflow/fcl@1.19.0(@types/react@18.3.23)(google-protobuf@3.21.4)(jiti@2.4.2)(postcss@8.5.6)(react@18.3.1)(ts-node@10.9.2(@swc/core@1.12.11)(@types/node@22.16.2)(typescript@5.8.3))(tsx@4.20.3)(typescript@5.8.3)(zod@3.25.76)': dependencies: '@babel/runtime': 7.27.6 '@onflow/config': 1.5.2 - '@onflow/fcl-core': 1.19.0(bufferutil@4.0.9)(google-protobuf@3.21.4)(utf-8-validate@5.0.10) - '@onflow/fcl-wc': 6.0.3(@onflow/fcl-core@1.19.0(bufferutil@4.0.9)(google-protobuf@3.21.4)(utf-8-validate@5.0.10))(@types/react@18.3.23)(bufferutil@4.0.9)(jiti@2.4.2)(postcss@8.5.6)(react@18.3.1)(ts-node@10.9.2(@swc/core@1.12.1)(@types/node@22.15.32)(typescript@5.8.3))(tsx@4.20.3)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) + '@onflow/fcl-core': 1.20.0(google-protobuf@3.21.4) + '@onflow/fcl-wc': 6.0.4(@onflow/fcl-core@1.20.0(google-protobuf@3.21.4))(@types/react@18.3.23)(jiti@2.4.2)(postcss@8.5.6)(react@18.3.1)(ts-node@10.9.2(@swc/core@1.12.11)(@types/node@22.16.2)(typescript@5.8.3))(tsx@4.20.3)(typescript@5.8.3)(zod@3.25.76) '@onflow/interaction': 0.0.11 '@onflow/rlp': 1.2.3 - '@onflow/sdk': 1.9.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@onflow/sdk': 1.9.0 '@onflow/types': 1.4.1 '@onflow/util-actor': 1.3.4 '@onflow/util-address': 1.2.3 @@ -9608,7 +15588,7 @@ snapshots: '@onflow/util-semver': 1.0.3 '@onflow/util-template': 1.2.3 '@onflow/util-uid': 1.2.3 - '@walletconnect/types': 2.21.3 + '@walletconnect/types': 2.21.4 abort-controller: 3.0.0 cross-fetch: 4.1.0 events: 3.3.0 @@ -9653,12 +15633,12 @@ snapshots: '@babel/runtime': 7.27.6 buffer: 6.0.3 - '@onflow/sdk@1.9.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)': + '@onflow/sdk@1.9.0': dependencies: '@babel/runtime': 7.27.6 '@onflow/config': 1.5.2 '@onflow/rlp': 1.2.3 - '@onflow/transport-http': 1.13.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@onflow/transport-http': 1.13.0 '@onflow/typedefs': 1.6.0 '@onflow/types': 1.4.1 '@onflow/util-actor': 1.3.4 @@ -9676,7 +15656,7 @@ snapshots: - encoding - utf-8-validate - '@onflow/transport-http@1.13.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)': + '@onflow/transport-http@1.13.0': dependencies: '@babel/runtime': 7.27.6 '@onflow/util-address': 1.2.3 @@ -9687,8 +15667,8 @@ snapshots: buffer: 6.0.3 cross-fetch: 4.1.0 events: 3.3.0 - isomorphic-ws: 5.0.0(ws@8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)) - ws: 8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10) + isomorphic-ws: 5.0.0(ws@8.18.3) + ws: 8.18.3 transitivePeerDependencies: - '@onflow/util-config' - bufferutil @@ -9745,9 +15725,11 @@ snapshots: '@pkgjs/parseargs@0.11.0': optional: true - '@playwright/test@1.53.1': + '@pkgr/core@0.2.7': {} + + '@playwright/test@1.53.2': dependencies: - playwright: 1.53.1 + playwright: 1.53.2 '@popperjs/core@2.11.8': {} @@ -9774,15 +15756,15 @@ snapshots: '@protobufjs/utf8@1.1.0': {} - '@reown/walletkit@1.2.7(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67)': + '@reown/walletkit@1.2.8(typescript@5.8.3)(zod@3.25.76)': dependencies: - '@walletconnect/core': 2.21.3(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) + '@walletconnect/core': 2.21.4(typescript@5.8.3)(zod@3.25.76) '@walletconnect/jsonrpc-provider': 1.0.14 '@walletconnect/jsonrpc-utils': 1.0.8 '@walletconnect/logger': 2.1.2 - '@walletconnect/sign-client': 2.21.3(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) - '@walletconnect/types': 2.21.3 - '@walletconnect/utils': 2.21.3(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) + '@walletconnect/sign-client': 2.21.4(typescript@5.8.3)(zod@3.25.76) + '@walletconnect/types': 2.21.4 + '@walletconnect/utils': 2.21.4(typescript@5.8.3)(zod@3.25.76) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -9807,64 +15789,64 @@ snapshots: - utf-8-validate - zod - '@rollup/rollup-android-arm-eabi@4.44.0': + '@rollup/rollup-android-arm-eabi@4.44.2': optional: true - '@rollup/rollup-android-arm64@4.44.0': + '@rollup/rollup-android-arm64@4.44.2': optional: true - '@rollup/rollup-darwin-arm64@4.44.0': + '@rollup/rollup-darwin-arm64@4.44.2': optional: true - '@rollup/rollup-darwin-x64@4.44.0': + '@rollup/rollup-darwin-x64@4.44.2': optional: true - '@rollup/rollup-freebsd-arm64@4.44.0': + '@rollup/rollup-freebsd-arm64@4.44.2': optional: true - '@rollup/rollup-freebsd-x64@4.44.0': + '@rollup/rollup-freebsd-x64@4.44.2': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.44.0': + '@rollup/rollup-linux-arm-gnueabihf@4.44.2': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.44.0': + '@rollup/rollup-linux-arm-musleabihf@4.44.2': optional: true - '@rollup/rollup-linux-arm64-gnu@4.44.0': + '@rollup/rollup-linux-arm64-gnu@4.44.2': optional: true - '@rollup/rollup-linux-arm64-musl@4.44.0': + '@rollup/rollup-linux-arm64-musl@4.44.2': optional: true - '@rollup/rollup-linux-loongarch64-gnu@4.44.0': + '@rollup/rollup-linux-loongarch64-gnu@4.44.2': optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.44.0': + '@rollup/rollup-linux-powerpc64le-gnu@4.44.2': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.44.0': + '@rollup/rollup-linux-riscv64-gnu@4.44.2': optional: true - '@rollup/rollup-linux-riscv64-musl@4.44.0': + '@rollup/rollup-linux-riscv64-musl@4.44.2': optional: true - '@rollup/rollup-linux-s390x-gnu@4.44.0': + '@rollup/rollup-linux-s390x-gnu@4.44.2': optional: true - '@rollup/rollup-linux-x64-gnu@4.44.0': + '@rollup/rollup-linux-x64-gnu@4.44.2': optional: true - '@rollup/rollup-linux-x64-musl@4.44.0': + '@rollup/rollup-linux-x64-musl@4.44.2': optional: true - '@rollup/rollup-win32-arm64-msvc@4.44.0': + '@rollup/rollup-win32-arm64-msvc@4.44.2': optional: true - '@rollup/rollup-win32-ia32-msvc@4.44.0': + '@rollup/rollup-win32-ia32-msvc@4.44.2': optional: true - '@rollup/rollup-win32-x64-msvc@4.44.0': + '@rollup/rollup-win32-x64-msvc@4.44.2': optional: true '@rtsao/scc@1.1.0': {} @@ -9916,39 +15898,39 @@ snapshots: '@sinonjs/text-encoding@0.7.3': {} - '@storybook/addon-docs@9.0.12(@types/react@18.3.23)(storybook@9.0.12(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10))': + '@storybook/addon-docs@9.0.16(@types/react@18.3.23)(storybook@9.0.16(@testing-library/dom@10.4.0)(prettier@3.6.2))': dependencies: '@mdx-js/react': 3.1.0(@types/react@18.3.23)(react@18.3.1) - '@storybook/csf-plugin': 9.0.12(storybook@9.0.12(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10)) + '@storybook/csf-plugin': 9.0.16(storybook@9.0.16(@testing-library/dom@10.4.0)(prettier@3.6.2)) '@storybook/icons': 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@storybook/react-dom-shim': 9.0.12(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.0.12(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10)) + '@storybook/react-dom-shim': 9.0.16(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.0.16(@testing-library/dom@10.4.0)(prettier@3.6.2)) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - storybook: 9.0.12(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10) + storybook: 9.0.16(@testing-library/dom@10.4.0)(prettier@3.6.2) ts-dedent: 2.2.0 transitivePeerDependencies: - '@types/react' - '@storybook/addon-onboarding@9.0.12(storybook@9.0.12(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10))': + '@storybook/addon-onboarding@9.0.16(storybook@9.0.16(@testing-library/dom@10.4.0)(prettier@3.6.2))': dependencies: - storybook: 9.0.12(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10) + storybook: 9.0.16(@testing-library/dom@10.4.0)(prettier@3.6.2) - '@storybook/addon-themes@9.0.12(storybook@9.0.12(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10))': + '@storybook/addon-themes@9.0.16(storybook@9.0.16(@testing-library/dom@10.4.0)(prettier@3.6.2))': dependencies: - storybook: 9.0.12(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10) + storybook: 9.0.16(@testing-library/dom@10.4.0)(prettier@3.6.2) ts-dedent: 2.2.0 '@storybook/addon-webpack5-compiler-swc@3.0.0(webpack@5.99.9)': dependencies: - '@swc/core': 1.12.1 - swc-loader: 0.2.6(@swc/core@1.12.1)(webpack@5.99.9) + '@swc/core': 1.12.11 + swc-loader: 0.2.6(@swc/core@1.12.11)(webpack@5.99.9) transitivePeerDependencies: - '@swc/helpers' - webpack - '@storybook/builder-webpack5@9.0.12(@swc/core@1.12.1)(esbuild@0.25.5)(storybook@9.0.12(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10))(typescript@5.8.3)(webpack-cli@4.10.0)': + '@storybook/builder-webpack5@9.0.16(@swc/core@1.12.11)(esbuild@0.25.6)(storybook@9.0.16(@testing-library/dom@10.4.0)(prettier@3.6.2))(typescript@5.8.3)(webpack-cli@4.10.0)': dependencies: - '@storybook/core-webpack': 9.0.12(storybook@9.0.12(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10)) + '@storybook/core-webpack': 9.0.16(storybook@9.0.16(@testing-library/dom@10.4.0)(prettier@3.6.2)) case-sensitive-paths-webpack-plugin: 2.4.0 cjs-module-lexer: 1.4.3 css-loader: 6.11.0(webpack@5.99.9) @@ -9956,11 +15938,11 @@ snapshots: fork-ts-checker-webpack-plugin: 8.0.0(typescript@5.8.3)(webpack@5.99.9) html-webpack-plugin: 5.6.3(webpack@5.99.9) magic-string: 0.30.17 - storybook: 9.0.12(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10) + storybook: 9.0.16(@testing-library/dom@10.4.0)(prettier@3.6.2) style-loader: 3.3.4(webpack@5.99.9) - terser-webpack-plugin: 5.3.14(@swc/core@1.12.1)(esbuild@0.25.5)(webpack@5.99.9) + terser-webpack-plugin: 5.3.14(@swc/core@1.12.11)(esbuild@0.25.6)(webpack@5.99.9) ts-dedent: 2.2.0 - webpack: 5.99.9(@swc/core@1.12.1)(esbuild@0.25.5)(webpack-cli@4.10.0) + webpack: 5.99.9(@swc/core@1.12.11)(esbuild@0.25.6)(webpack-cli@4.10.0) webpack-dev-middleware: 6.1.3(webpack@5.99.9) webpack-hot-middleware: 2.26.1 webpack-virtual-modules: 0.6.2 @@ -9973,16 +15955,20 @@ snapshots: - uglify-js - webpack-cli - '@storybook/core-webpack@9.0.12(storybook@9.0.12(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10))': + '@storybook/core-webpack@9.0.16(storybook@9.0.16(@testing-library/dom@10.4.0)(prettier@3.6.2))': dependencies: - storybook: 9.0.12(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10) + storybook: 9.0.16(@testing-library/dom@10.4.0)(prettier@3.6.2) ts-dedent: 2.2.0 - '@storybook/csf-plugin@9.0.12(storybook@9.0.12(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10))': + '@storybook/csf-plugin@9.0.16(storybook@9.0.16(@testing-library/dom@10.4.0)(prettier@3.6.2))': dependencies: - storybook: 9.0.12(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10) + storybook: 9.0.16(@testing-library/dom@10.4.0)(prettier@3.6.2) unplugin: 1.16.1 + '@storybook/csf@0.1.13': + dependencies: + type-fest: 2.19.0 + '@storybook/global@5.0.0': {} '@storybook/icons@1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': @@ -9990,9 +15976,9 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@storybook/preset-react-webpack@9.0.12(@swc/core@1.12.1)(esbuild@0.25.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.0.12(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10))(typescript@5.8.3)(webpack-cli@4.10.0)': + '@storybook/preset-react-webpack@9.0.16(@swc/core@1.12.11)(esbuild@0.25.6)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.0.16(@testing-library/dom@10.4.0)(prettier@3.6.2))(typescript@5.8.3)(webpack-cli@4.10.0)': dependencies: - '@storybook/core-webpack': 9.0.12(storybook@9.0.12(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10)) + '@storybook/core-webpack': 9.0.16(storybook@9.0.16(@testing-library/dom@10.4.0)(prettier@3.6.2)) '@storybook/react-docgen-typescript-plugin': 1.0.6--canary.9.0c3f3b7.0(typescript@5.8.3)(webpack@5.99.9) '@types/semver': 7.7.0 find-up: 7.0.0 @@ -10002,9 +15988,9 @@ snapshots: react-dom: 18.3.1(react@18.3.1) resolve: 1.22.10 semver: 7.7.2 - storybook: 9.0.12(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10) + storybook: 9.0.16(@testing-library/dom@10.4.0)(prettier@3.6.2) tsconfig-paths: 4.2.0 - webpack: 5.99.9(@swc/core@1.12.1)(esbuild@0.25.5)(webpack-cli@4.10.0) + webpack: 5.99.9(@swc/core@1.12.11)(esbuild@0.25.6)(webpack-cli@4.10.0) optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: @@ -10024,24 +16010,24 @@ snapshots: react-docgen-typescript: 2.4.0(typescript@5.8.3) tslib: 2.8.1 typescript: 5.8.3 - webpack: 5.99.9(@swc/core@1.12.1)(esbuild@0.25.5)(webpack-cli@4.10.0) + webpack: 5.99.9(@swc/core@1.12.11)(esbuild@0.25.6)(webpack-cli@4.10.0) transitivePeerDependencies: - supports-color - '@storybook/react-dom-shim@9.0.12(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.0.12(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10))': + '@storybook/react-dom-shim@9.0.16(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.0.16(@testing-library/dom@10.4.0)(prettier@3.6.2))': dependencies: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - storybook: 9.0.12(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10) + storybook: 9.0.16(@testing-library/dom@10.4.0)(prettier@3.6.2) - '@storybook/react-webpack5@9.0.12(@swc/core@1.12.1)(esbuild@0.25.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.0.12(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10))(typescript@5.8.3)(webpack-cli@4.10.0)': + '@storybook/react-webpack5@9.0.16(@swc/core@1.12.11)(esbuild@0.25.6)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.0.16(@testing-library/dom@10.4.0)(prettier@3.6.2))(typescript@5.8.3)(webpack-cli@4.10.0)': dependencies: - '@storybook/builder-webpack5': 9.0.12(@swc/core@1.12.1)(esbuild@0.25.5)(storybook@9.0.12(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10))(typescript@5.8.3)(webpack-cli@4.10.0) - '@storybook/preset-react-webpack': 9.0.12(@swc/core@1.12.1)(esbuild@0.25.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.0.12(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10))(typescript@5.8.3)(webpack-cli@4.10.0) - '@storybook/react': 9.0.12(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.0.12(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10))(typescript@5.8.3) + '@storybook/builder-webpack5': 9.0.16(@swc/core@1.12.11)(esbuild@0.25.6)(storybook@9.0.16(@testing-library/dom@10.4.0)(prettier@3.6.2))(typescript@5.8.3)(webpack-cli@4.10.0) + '@storybook/preset-react-webpack': 9.0.16(@swc/core@1.12.11)(esbuild@0.25.6)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.0.16(@testing-library/dom@10.4.0)(prettier@3.6.2))(typescript@5.8.3)(webpack-cli@4.10.0) + '@storybook/react': 9.0.16(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.0.16(@testing-library/dom@10.4.0)(prettier@3.6.2))(typescript@5.8.3) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - storybook: 9.0.12(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10) + storybook: 9.0.16(@testing-library/dom@10.4.0)(prettier@3.6.2) optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: @@ -10052,13 +16038,13 @@ snapshots: - uglify-js - webpack-cli - '@storybook/react@9.0.12(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.0.12(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10))(typescript@5.8.3)': + '@storybook/react@9.0.16(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.0.16(@testing-library/dom@10.4.0)(prettier@3.6.2))(typescript@5.8.3)': dependencies: '@storybook/global': 5.0.0 - '@storybook/react-dom-shim': 9.0.12(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.0.12(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10)) + '@storybook/react-dom-shim': 9.0.16(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.0.16(@testing-library/dom@10.4.0)(prettier@3.6.2)) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - storybook: 9.0.12(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10) + storybook: 9.0.16(@testing-library/dom@10.4.0)(prettier@3.6.2) optionalDependencies: typescript: 5.8.3 @@ -10099,11 +16085,11 @@ snapshots: '@svgr/hast-util-to-babel-ast@5.5.0': dependencies: - '@babel/types': 7.27.6 + '@babel/types': 7.28.0 '@svgr/plugin-jsx@5.5.0': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.28.0 '@svgr/babel-preset': 5.5.0 '@svgr/hast-util-to-babel-ast': 5.5.0 svg-parser: 2.0.4 @@ -10118,10 +16104,10 @@ snapshots: '@svgr/webpack@5.5.0': dependencies: - '@babel/core': 7.27.4 - '@babel/plugin-transform-react-constant-elements': 7.27.1(@babel/core@7.27.4) - '@babel/preset-env': 7.27.2(@babel/core@7.27.4) - '@babel/preset-react': 7.27.1(@babel/core@7.27.4) + '@babel/core': 7.28.0 + '@babel/plugin-transform-react-constant-elements': 7.27.1(@babel/core@7.28.0) + '@babel/preset-env': 7.28.0(@babel/core@7.28.0) + '@babel/preset-react': 7.27.1(@babel/core@7.28.0) '@svgr/core': 5.5.0 '@svgr/plugin-jsx': 5.5.0 '@svgr/plugin-svgo': 5.5.0 @@ -10129,51 +16115,51 @@ snapshots: transitivePeerDependencies: - supports-color - '@swc/core-darwin-arm64@1.12.1': + '@swc/core-darwin-arm64@1.12.11': optional: true - '@swc/core-darwin-x64@1.12.1': + '@swc/core-darwin-x64@1.12.11': optional: true - '@swc/core-linux-arm-gnueabihf@1.12.1': + '@swc/core-linux-arm-gnueabihf@1.12.11': optional: true - '@swc/core-linux-arm64-gnu@1.12.1': + '@swc/core-linux-arm64-gnu@1.12.11': optional: true - '@swc/core-linux-arm64-musl@1.12.1': + '@swc/core-linux-arm64-musl@1.12.11': optional: true - '@swc/core-linux-x64-gnu@1.12.1': + '@swc/core-linux-x64-gnu@1.12.11': optional: true - '@swc/core-linux-x64-musl@1.12.1': + '@swc/core-linux-x64-musl@1.12.11': optional: true - '@swc/core-win32-arm64-msvc@1.12.1': + '@swc/core-win32-arm64-msvc@1.12.11': optional: true - '@swc/core-win32-ia32-msvc@1.12.1': + '@swc/core-win32-ia32-msvc@1.12.11': optional: true - '@swc/core-win32-x64-msvc@1.12.1': + '@swc/core-win32-x64-msvc@1.12.11': optional: true - '@swc/core@1.12.1': + '@swc/core@1.12.11': dependencies: '@swc/counter': 0.1.3 '@swc/types': 0.1.23 optionalDependencies: - '@swc/core-darwin-arm64': 1.12.1 - '@swc/core-darwin-x64': 1.12.1 - '@swc/core-linux-arm-gnueabihf': 1.12.1 - '@swc/core-linux-arm64-gnu': 1.12.1 - '@swc/core-linux-arm64-musl': 1.12.1 - '@swc/core-linux-x64-gnu': 1.12.1 - '@swc/core-linux-x64-musl': 1.12.1 - '@swc/core-win32-arm64-msvc': 1.12.1 - '@swc/core-win32-ia32-msvc': 1.12.1 - '@swc/core-win32-x64-msvc': 1.12.1 + '@swc/core-darwin-arm64': 1.12.11 + '@swc/core-darwin-x64': 1.12.11 + '@swc/core-linux-arm-gnueabihf': 1.12.11 + '@swc/core-linux-arm64-gnu': 1.12.11 + '@swc/core-linux-arm64-musl': 1.12.11 + '@swc/core-linux-x64-gnu': 1.12.11 + '@swc/core-linux-x64-musl': 1.12.11 + '@swc/core-win32-arm64-msvc': 1.12.11 + '@swc/core-win32-ia32-msvc': 1.12.11 + '@swc/core-win32-x64-msvc': 1.12.11 '@swc/counter@0.1.3': {} @@ -10210,9 +16196,6 @@ snapshots: dependencies: '@testing-library/dom': 10.4.0 - '@tootallnate/once@1.1.2': - optional: true - '@trustwallet/wallet-core@4.3.6': dependencies: protobufjs: 7.5.3 @@ -10460,49 +16443,49 @@ snapshots: '@types/accepts@1.3.7': dependencies: - '@types/node': 22.15.32 + '@types/node': 22.16.2 '@types/aria-query@5.0.4': {} '@types/babel__core@7.20.5': dependencies: - '@babel/parser': 7.27.5 - '@babel/types': 7.27.6 + '@babel/parser': 7.28.0 + '@babel/types': 7.28.0 '@types/babel__generator': 7.27.0 '@types/babel__template': 7.4.4 '@types/babel__traverse': 7.20.7 '@types/babel__generator@7.27.0': dependencies: - '@babel/types': 7.27.6 + '@babel/types': 7.28.0 '@types/babel__template@7.4.4': dependencies: - '@babel/parser': 7.27.5 - '@babel/types': 7.27.6 + '@babel/parser': 7.28.0 + '@babel/types': 7.28.0 '@types/babel__traverse@7.20.7': dependencies: - '@babel/types': 7.27.6 + '@babel/types': 7.28.0 '@types/bn.js@4.11.6': dependencies: - '@types/node': 22.15.32 + '@types/node': 22.16.2 '@types/bn.js@5.2.0': dependencies: - '@types/node': 22.15.32 + '@types/node': 22.16.2 '@types/body-parser@1.19.6': dependencies: '@types/connect': 3.4.38 - '@types/node': 22.15.32 + '@types/node': 22.16.2 '@types/cacheable-request@6.0.3': dependencies: '@types/http-cache-semantics': 4.0.4 '@types/keyv': 3.1.4 - '@types/node': 22.15.32 + '@types/node': 22.16.2 '@types/responselike': 1.0.3 '@types/chai@5.2.2': @@ -10516,16 +16499,20 @@ snapshots: '@types/connect@3.4.38': dependencies: - '@types/node': 22.15.32 + '@types/node': 22.16.2 '@types/content-disposition@0.5.9': {} + '@types/conventional-commits-parser@5.0.1': + dependencies: + '@types/node': 24.0.12 + '@types/cookies@0.9.1': dependencies: '@types/connect': 3.4.38 '@types/express': 5.0.3 '@types/keygrip': 1.0.6 - '@types/node': 22.15.32 + '@types/node': 22.16.2 '@types/d3-array@3.2.1': {} @@ -10571,9 +16558,9 @@ snapshots: '@types/estree@1.0.8': {} - '@types/express-serve-static-core@5.0.6': + '@types/express-serve-static-core@5.0.7': dependencies: - '@types/node': 22.15.32 + '@types/node': 22.16.2 '@types/qs': 6.14.0 '@types/range-parser': 1.2.7 '@types/send': 0.17.5 @@ -10581,7 +16568,7 @@ snapshots: '@types/express@5.0.3': dependencies: '@types/body-parser': 1.19.6 - '@types/express-serve-static-core': 5.0.6 + '@types/express-serve-static-core': 5.0.7 '@types/serve-static': 1.15.8 '@types/filesystem@0.0.36': @@ -10592,8 +16579,6 @@ snapshots: '@types/har-format@1.2.16': {} - '@types/history@4.7.11': {} - '@types/html-minifier-terser@6.1.0': {} '@types/http-assert@1.5.6': {} @@ -10610,7 +16595,7 @@ snapshots: '@types/keyv@3.1.4': dependencies: - '@types/node': 22.15.32 + '@types/node': 22.16.2 '@types/koa-compose@3.2.8': dependencies: @@ -10625,11 +16610,9 @@ snapshots: '@types/http-errors': 2.0.5 '@types/keygrip': 1.0.6 '@types/koa-compose': 3.2.8 - '@types/node': 22.15.32 - - '@types/lodash@4.17.18': {} + '@types/node': 22.16.2 - '@types/lru-cache@5.1.1': {} + '@types/lodash@4.17.20': {} '@types/mdx@2.0.13': {} @@ -10639,7 +16622,11 @@ snapshots: '@types/node@16.18.126': {} - '@types/node@22.15.32': + '@types/node@22.16.0': + dependencies: + undici-types: 6.21.0 + + '@types/node@22.16.2': dependencies: undici-types: 6.21.0 @@ -10647,13 +16634,17 @@ snapshots: dependencies: undici-types: 6.19.8 + '@types/node@24.0.12': + dependencies: + undici-types: 7.8.0 + '@types/offscreencanvas@2019.7.3': {} '@types/parse-json@4.0.2': {} '@types/pbkdf2@3.1.2': dependencies: - '@types/node': 22.15.32 + '@types/node': 22.16.2 '@types/prop-types@15.7.15': {} @@ -10667,17 +16658,6 @@ snapshots: dependencies: '@types/react': 18.3.23 - '@types/react-router-dom@5.3.3': - dependencies: - '@types/history': 4.7.11 - '@types/react': 18.3.23 - '@types/react-router': 5.1.20 - - '@types/react-router@5.1.20': - dependencies: - '@types/history': 4.7.11 - '@types/react': 18.3.23 - '@types/react-transition-group@4.4.12(@types/react@18.3.23)': dependencies: '@types/react': 18.3.23 @@ -10691,32 +16671,32 @@ snapshots: '@types/responselike@1.0.3': dependencies: - '@types/node': 22.15.32 + '@types/node': 22.16.2 '@types/secp256k1@4.0.6': dependencies: - '@types/node': 22.15.32 + '@types/node': 22.16.2 '@types/semver@7.7.0': {} '@types/send@0.17.5': dependencies: '@types/mime': 1.3.5 - '@types/node': 22.15.32 + '@types/node': 22.16.2 '@types/serve-static@1.15.8': dependencies: '@types/http-errors': 2.0.5 - '@types/node': 22.15.32 + '@types/node': 22.16.2 '@types/send': 0.17.5 '@types/trusted-types@2.0.7': {} - '@types/webpack@5.28.5(@swc/core@1.12.1)(esbuild@0.25.5)(webpack-cli@4.10.0)': + '@types/webpack@5.28.5(@swc/core@1.12.11)(esbuild@0.25.6)(webpack-cli@4.10.0)': dependencies: - '@types/node': 22.15.32 + '@types/node': 22.16.2 tapable: 2.2.2 - webpack: 5.99.9(@swc/core@1.12.1)(esbuild@0.25.5)(webpack-cli@4.10.0) + webpack: 5.99.9(@swc/core@1.12.11)(esbuild@0.25.6)(webpack-cli@4.10.0) transitivePeerDependencies: - '@swc/core' - esbuild @@ -10725,22 +16705,22 @@ snapshots: '@types/ws@8.5.3': dependencies: - '@types/node': 22.15.32 + '@types/node': 22.16.2 '@types/yauzl@2.10.3': dependencies: - '@types/node': 22.15.32 + '@types/node': 22.16.2 optional: true - '@typescript-eslint/eslint-plugin@8.34.1(@typescript-eslint/parser@8.34.1(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3)': + '@typescript-eslint/eslint-plugin@8.36.0(@typescript-eslint/parser@8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3))(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.34.1(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3) - '@typescript-eslint/scope-manager': 8.34.1 - '@typescript-eslint/type-utils': 8.34.1(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3) - '@typescript-eslint/utils': 8.34.1(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3) - '@typescript-eslint/visitor-keys': 8.34.1 - eslint: 9.29.0(jiti@2.4.2) + '@typescript-eslint/parser': 8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/scope-manager': 8.36.0 + '@typescript-eslint/type-utils': 8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/utils': 8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/visitor-keys': 8.36.0 + eslint: 9.30.1(jiti@2.4.2) graphemer: 1.4.0 ignore: 7.0.5 natural-compare: 1.4.0 @@ -10749,55 +16729,55 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.34.1(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3)': + '@typescript-eslint/parser@8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3)': dependencies: - '@typescript-eslint/scope-manager': 8.34.1 - '@typescript-eslint/types': 8.34.1 - '@typescript-eslint/typescript-estree': 8.34.1(typescript@5.8.3) - '@typescript-eslint/visitor-keys': 8.34.1 + '@typescript-eslint/scope-manager': 8.36.0 + '@typescript-eslint/types': 8.36.0 + '@typescript-eslint/typescript-estree': 8.36.0(typescript@5.8.3) + '@typescript-eslint/visitor-keys': 8.36.0 debug: 4.4.1 - eslint: 9.29.0(jiti@2.4.2) + eslint: 9.30.1(jiti@2.4.2) typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.34.1(typescript@5.8.3)': + '@typescript-eslint/project-service@8.36.0(typescript@5.8.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.34.1(typescript@5.8.3) - '@typescript-eslint/types': 8.34.1 + '@typescript-eslint/tsconfig-utils': 8.36.0(typescript@5.8.3) + '@typescript-eslint/types': 8.36.0 debug: 4.4.1 typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.34.1': + '@typescript-eslint/scope-manager@8.36.0': dependencies: - '@typescript-eslint/types': 8.34.1 - '@typescript-eslint/visitor-keys': 8.34.1 + '@typescript-eslint/types': 8.36.0 + '@typescript-eslint/visitor-keys': 8.36.0 - '@typescript-eslint/tsconfig-utils@8.34.1(typescript@5.8.3)': + '@typescript-eslint/tsconfig-utils@8.36.0(typescript@5.8.3)': dependencies: typescript: 5.8.3 - '@typescript-eslint/type-utils@8.34.1(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3)': + '@typescript-eslint/type-utils@8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3)': dependencies: - '@typescript-eslint/typescript-estree': 8.34.1(typescript@5.8.3) - '@typescript-eslint/utils': 8.34.1(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/typescript-estree': 8.36.0(typescript@5.8.3) + '@typescript-eslint/utils': 8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) debug: 4.4.1 - eslint: 9.29.0(jiti@2.4.2) + eslint: 9.30.1(jiti@2.4.2) ts-api-utils: 2.1.0(typescript@5.8.3) typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.34.1': {} + '@typescript-eslint/types@8.36.0': {} - '@typescript-eslint/typescript-estree@8.34.1(typescript@5.8.3)': + '@typescript-eslint/typescript-estree@8.36.0(typescript@5.8.3)': dependencies: - '@typescript-eslint/project-service': 8.34.1(typescript@5.8.3) - '@typescript-eslint/tsconfig-utils': 8.34.1(typescript@5.8.3) - '@typescript-eslint/types': 8.34.1 - '@typescript-eslint/visitor-keys': 8.34.1 + '@typescript-eslint/project-service': 8.36.0(typescript@5.8.3) + '@typescript-eslint/tsconfig-utils': 8.36.0(typescript@5.8.3) + '@typescript-eslint/types': 8.36.0 + '@typescript-eslint/visitor-keys': 8.36.0 debug: 4.4.1 fast-glob: 3.3.3 is-glob: 4.0.3 @@ -10808,82 +16788,82 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.34.1(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3)': + '@typescript-eslint/utils@8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3)': dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.29.0(jiti@2.4.2)) - '@typescript-eslint/scope-manager': 8.34.1 - '@typescript-eslint/types': 8.34.1 - '@typescript-eslint/typescript-estree': 8.34.1(typescript@5.8.3) - eslint: 9.29.0(jiti@2.4.2) + '@eslint-community/eslint-utils': 4.7.0(eslint@9.30.1(jiti@2.4.2)) + '@typescript-eslint/scope-manager': 8.36.0 + '@typescript-eslint/types': 8.36.0 + '@typescript-eslint/typescript-estree': 8.36.0(typescript@5.8.3) + eslint: 9.30.1(jiti@2.4.2) typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.34.1': + '@typescript-eslint/visitor-keys@8.36.0': dependencies: - '@typescript-eslint/types': 8.34.1 + '@typescript-eslint/types': 8.36.0 eslint-visitor-keys: 4.2.1 - '@unrs/resolver-binding-android-arm-eabi@1.9.1': + '@unrs/resolver-binding-android-arm-eabi@1.11.0': optional: true - '@unrs/resolver-binding-android-arm64@1.9.1': + '@unrs/resolver-binding-android-arm64@1.11.0': optional: true - '@unrs/resolver-binding-darwin-arm64@1.9.1': + '@unrs/resolver-binding-darwin-arm64@1.11.0': optional: true - '@unrs/resolver-binding-darwin-x64@1.9.1': + '@unrs/resolver-binding-darwin-x64@1.11.0': optional: true - '@unrs/resolver-binding-freebsd-x64@1.9.1': + '@unrs/resolver-binding-freebsd-x64@1.11.0': optional: true - '@unrs/resolver-binding-linux-arm-gnueabihf@1.9.1': + '@unrs/resolver-binding-linux-arm-gnueabihf@1.11.0': optional: true - '@unrs/resolver-binding-linux-arm-musleabihf@1.9.1': + '@unrs/resolver-binding-linux-arm-musleabihf@1.11.0': optional: true - '@unrs/resolver-binding-linux-arm64-gnu@1.9.1': + '@unrs/resolver-binding-linux-arm64-gnu@1.11.0': optional: true - '@unrs/resolver-binding-linux-arm64-musl@1.9.1': + '@unrs/resolver-binding-linux-arm64-musl@1.11.0': optional: true - '@unrs/resolver-binding-linux-ppc64-gnu@1.9.1': + '@unrs/resolver-binding-linux-ppc64-gnu@1.11.0': optional: true - '@unrs/resolver-binding-linux-riscv64-gnu@1.9.1': + '@unrs/resolver-binding-linux-riscv64-gnu@1.11.0': optional: true - '@unrs/resolver-binding-linux-riscv64-musl@1.9.1': + '@unrs/resolver-binding-linux-riscv64-musl@1.11.0': optional: true - '@unrs/resolver-binding-linux-s390x-gnu@1.9.1': + '@unrs/resolver-binding-linux-s390x-gnu@1.11.0': optional: true - '@unrs/resolver-binding-linux-x64-gnu@1.9.1': + '@unrs/resolver-binding-linux-x64-gnu@1.11.0': optional: true - '@unrs/resolver-binding-linux-x64-musl@1.9.1': + '@unrs/resolver-binding-linux-x64-musl@1.11.0': optional: true - '@unrs/resolver-binding-wasm32-wasi@1.9.1': + '@unrs/resolver-binding-wasm32-wasi@1.11.0': dependencies: '@napi-rs/wasm-runtime': 0.2.11 optional: true - '@unrs/resolver-binding-win32-arm64-msvc@1.9.1': + '@unrs/resolver-binding-win32-arm64-msvc@1.11.0': optional: true - '@unrs/resolver-binding-win32-ia32-msvc@1.9.1': + '@unrs/resolver-binding-win32-ia32-msvc@1.11.0': optional: true - '@unrs/resolver-binding-win32-x64-msvc@1.9.1': + '@unrs/resolver-binding-win32-x64-msvc@1.11.0': optional: true - '@vitest/coverage-v8@3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@22.15.32)(jiti@2.4.2)(jsdom@16.7.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0))': + '@vitest/coverage-v8@3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@22.16.0)(jiti@2.4.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0))': dependencies: '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 1.0.2 @@ -10898,36 +16878,52 @@ snapshots: std-env: 3.9.0 test-exclude: 7.0.1 tinyrainbow: 2.0.0 - vitest: 3.2.4(@types/debug@4.1.12)(@types/node@22.15.32)(jiti@2.4.2)(jsdom@16.7.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0) + vitest: 3.2.4(@types/debug@4.1.12)(@types/node@22.16.0)(jiti@2.4.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0) transitivePeerDependencies: - supports-color - '@vitest/expect@3.0.9': + '@vitest/coverage-v8@3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@22.16.2)(jiti@2.4.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0))': dependencies: - '@vitest/spy': 3.0.9 - '@vitest/utils': 3.0.9 - chai: 5.2.0 + '@ampproject/remapping': 2.3.0 + '@bcoe/v8-coverage': 1.0.2 + ast-v8-to-istanbul: 0.3.3 + debug: 4.4.1 + istanbul-lib-coverage: 3.2.2 + istanbul-lib-report: 3.0.1 + istanbul-lib-source-maps: 5.0.6 + istanbul-reports: 3.1.7 + magic-string: 0.30.17 + magicast: 0.3.5 + std-env: 3.9.0 + test-exclude: 7.0.1 tinyrainbow: 2.0.0 + vitest: 3.2.4(@types/debug@4.1.12)(@types/node@22.16.2)(jiti@2.4.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0) + transitivePeerDependencies: + - supports-color '@vitest/expect@3.2.4': dependencies: '@types/chai': 5.2.2 '@vitest/spy': 3.2.4 '@vitest/utils': 3.2.4 - chai: 5.2.0 + chai: 5.2.1 tinyrainbow: 2.0.0 - '@vitest/mocker@3.2.4(vite@6.3.5(@types/node@22.15.32)(jiti@2.4.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0))': + '@vitest/mocker@3.2.4(vite@7.0.3(@types/node@22.16.0)(jiti@2.4.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0))': dependencies: '@vitest/spy': 3.2.4 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: - vite: 6.3.5(@types/node@22.15.32)(jiti@2.4.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0) + vite: 7.0.3(@types/node@22.16.0)(jiti@2.4.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0) - '@vitest/pretty-format@3.0.9': + '@vitest/mocker@3.2.4(vite@7.0.3(@types/node@22.16.2)(jiti@2.4.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0))': dependencies: - tinyrainbow: 2.0.0 + '@vitest/spy': 3.2.4 + estree-walker: 3.0.3 + magic-string: 0.30.17 + optionalDependencies: + vite: 7.0.3(@types/node@22.16.2)(jiti@2.4.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0) '@vitest/pretty-format@3.2.4': dependencies: @@ -10945,41 +16941,31 @@ snapshots: magic-string: 0.30.17 pathe: 2.0.3 - '@vitest/spy@3.0.9': - dependencies: - tinyspy: 3.0.2 - '@vitest/spy@3.2.4': dependencies: tinyspy: 4.0.3 - '@vitest/utils@3.0.9': - dependencies: - '@vitest/pretty-format': 3.0.9 - loupe: 3.1.4 - tinyrainbow: 2.0.0 - '@vitest/utils@3.2.4': dependencies: '@vitest/pretty-format': 3.2.4 loupe: 3.1.4 tinyrainbow: 2.0.0 - '@walletconnect/core@2.21.3(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67)': + '@walletconnect/core@2.21.4(typescript@5.8.3)(zod@3.25.76)': dependencies: '@walletconnect/heartbeat': 1.2.2 '@walletconnect/jsonrpc-provider': 1.0.14 '@walletconnect/jsonrpc-types': 1.0.4 '@walletconnect/jsonrpc-utils': 1.0.8 - '@walletconnect/jsonrpc-ws-connection': 1.0.16(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@walletconnect/jsonrpc-ws-connection': 1.0.16 '@walletconnect/keyvaluestorage': 1.1.1 '@walletconnect/logger': 2.1.2 '@walletconnect/relay-api': 1.0.11 '@walletconnect/relay-auth': 1.1.0 '@walletconnect/safe-json': 1.0.2 '@walletconnect/time': 1.0.2 - '@walletconnect/types': 2.21.3 - '@walletconnect/utils': 2.21.3(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) + '@walletconnect/types': 2.21.4 + '@walletconnect/utils': 2.21.4(typescript@5.8.3)(zod@3.25.76) '@walletconnect/window-getters': 1.0.1 es-toolkit: 1.39.3 events: 3.3.0 @@ -11049,12 +17035,12 @@ snapshots: '@walletconnect/jsonrpc-types': 1.0.4 tslib: 1.14.1 - '@walletconnect/jsonrpc-ws-connection@1.0.16(bufferutil@4.0.9)(utf-8-validate@5.0.10)': + '@walletconnect/jsonrpc-ws-connection@1.0.16': dependencies: '@walletconnect/jsonrpc-utils': 1.0.8 '@walletconnect/safe-json': 1.0.2 events: 3.3.0 - ws: 7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10) + ws: 7.5.10 transitivePeerDependencies: - bufferutil - utf-8-validate @@ -11129,16 +17115,16 @@ snapshots: dependencies: tslib: 1.14.1 - '@walletconnect/sign-client@2.21.3(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67)': + '@walletconnect/sign-client@2.21.4(typescript@5.8.3)(zod@3.25.76)': dependencies: - '@walletconnect/core': 2.21.3(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) + '@walletconnect/core': 2.21.4(typescript@5.8.3)(zod@3.25.76) '@walletconnect/events': 1.0.1 '@walletconnect/heartbeat': 1.2.2 '@walletconnect/jsonrpc-utils': 1.0.8 '@walletconnect/logger': 2.1.2 '@walletconnect/time': 1.0.2 - '@walletconnect/types': 2.21.3 - '@walletconnect/utils': 2.21.3(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) + '@walletconnect/types': 2.21.4 + '@walletconnect/utils': 2.21.4(typescript@5.8.3)(zod@3.25.76) events: 3.3.0 transitivePeerDependencies: - '@azure/app-configuration' @@ -11168,7 +17154,7 @@ snapshots: dependencies: tslib: 1.14.1 - '@walletconnect/types@2.21.3': + '@walletconnect/types@2.21.4': dependencies: '@walletconnect/events': 1.0.1 '@walletconnect/heartbeat': 1.2.2 @@ -11196,7 +17182,7 @@ snapshots: - ioredis - uploadthing - '@walletconnect/universal-provider@2.21.3(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67)': + '@walletconnect/universal-provider@2.21.4(typescript@5.8.3)(zod@3.25.76)': dependencies: '@walletconnect/events': 1.0.1 '@walletconnect/jsonrpc-http-connection': 1.0.8 @@ -11205,9 +17191,9 @@ snapshots: '@walletconnect/jsonrpc-utils': 1.0.8 '@walletconnect/keyvaluestorage': 1.1.1 '@walletconnect/logger': 2.1.2 - '@walletconnect/sign-client': 2.21.3(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) - '@walletconnect/types': 2.21.3 - '@walletconnect/utils': 2.21.3(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) + '@walletconnect/sign-client': 2.21.4(typescript@5.8.3)(zod@3.25.76) + '@walletconnect/types': 2.21.4 + '@walletconnect/utils': 2.21.4(typescript@5.8.3)(zod@3.25.76) es-toolkit: 1.39.3 events: 3.3.0 transitivePeerDependencies: @@ -11235,7 +17221,7 @@ snapshots: - utf-8-validate - zod - '@walletconnect/utils@2.21.3(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67)': + '@walletconnect/utils@2.21.4(typescript@5.8.3)(zod@3.25.76)': dependencies: '@msgpack/msgpack': 3.1.2 '@noble/ciphers': 1.3.0 @@ -11248,7 +17234,7 @@ snapshots: '@walletconnect/relay-auth': 1.1.0 '@walletconnect/safe-json': 1.0.2 '@walletconnect/time': 1.0.2 - '@walletconnect/types': 2.21.3 + '@walletconnect/types': 2.21.4 '@walletconnect/window-getters': 1.0.1 '@walletconnect/window-metadata': 1.0.1 blakejs: 1.2.1 @@ -11256,7 +17242,7 @@ snapshots: detect-browser: 5.3.0 query-string: 7.1.3 uint8arrays: 3.1.1 - viem: 2.31.0(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) + viem: 2.31.0(typescript@5.8.3)(zod@3.25.76) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -11368,7 +17354,7 @@ snapshots: '@webpack-cli/configtest@1.2.0(webpack-cli@4.10.0)(webpack@5.99.9)': dependencies: - webpack: 5.99.9(@swc/core@1.12.1)(esbuild@0.25.5)(webpack-cli@4.10.0) + webpack: 5.99.9(@swc/core@1.12.11)(esbuild@0.25.6)(webpack-cli@4.10.0) webpack-cli: 4.10.0(webpack@5.99.9) '@webpack-cli/info@1.5.0(webpack-cli@4.10.0)': @@ -11389,57 +17375,40 @@ snapshots: '@xtuc/long@4.2.2': {} - abab@2.0.6: - optional: true + JSONStream@1.3.5: + dependencies: + jsonparse: 1.3.1 + through: 2.3.8 - abitype@0.7.1(typescript@5.8.3)(zod@3.25.67): + abitype@0.7.1(typescript@5.8.3)(zod@3.25.76): dependencies: typescript: 5.8.3 optionalDependencies: - zod: 3.25.67 + zod: 3.25.76 - abitype@1.0.8(typescript@5.8.3)(zod@3.25.67): + abitype@1.0.8(typescript@5.8.3)(zod@3.25.76): optionalDependencies: typescript: 5.8.3 - zod: 3.25.67 + zod: 3.25.76 abort-controller@3.0.0: dependencies: event-target-shim: 5.0.1 - acorn-globals@6.0.0: - dependencies: - acorn: 7.4.1 - acorn-walk: 7.2.0 - optional: true - acorn-jsx@5.3.2(acorn@8.15.0): dependencies: acorn: 8.15.0 - acorn-walk@7.2.0: - optional: true - acorn-walk@8.3.4: dependencies: acorn: 8.15.0 - acorn@7.4.1: - optional: true - acorn@8.15.0: {} aes-js@3.1.2: {} aes-js@4.0.0-beta.5: {} - agent-base@6.0.2: - dependencies: - debug: 4.4.1 - transitivePeerDependencies: - - supports-color - optional: true - ajv-formats@2.1.1(ajv@8.17.1): optionalDependencies: ajv: 8.17.1 @@ -11529,6 +17498,8 @@ snapshots: array-from@2.1.1: {} + array-ify@1.0.0: {} + array-includes@3.1.9: dependencies: call-bind: 1.0.8 @@ -11626,7 +17597,7 @@ snapshots: ast-v8-to-istanbul@0.3.3: dependencies: - '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/trace-mapping': 0.3.29 estree-walker: 3.0.3 js-tokens: 9.0.1 @@ -11636,15 +17607,12 @@ snapshots: async@3.2.6: {} - asynckit@0.4.0: - optional: true - atomic-sleep@1.0.0: {} autoprefixer@10.4.21(postcss@8.5.6): dependencies: - browserslist: 4.25.0 - caniuse-lite: 1.0.30001724 + browserslist: 4.25.1 + caniuse-lite: 1.0.30001727 fraction.js: 4.3.7 normalize-range: 0.1.2 picocolors: 1.1.1 @@ -11661,27 +17629,27 @@ snapshots: cosmiconfig: 7.1.0 resolve: 1.22.10 - babel-plugin-polyfill-corejs2@0.4.13(@babel/core@7.27.4): + babel-plugin-polyfill-corejs2@0.4.14(@babel/core@7.28.0): dependencies: - '@babel/compat-data': 7.27.5 - '@babel/core': 7.27.4 - '@babel/helper-define-polyfill-provider': 0.6.4(@babel/core@7.27.4) + '@babel/compat-data': 7.28.0 + '@babel/core': 7.28.0 + '@babel/helper-define-polyfill-provider': 0.6.5(@babel/core@7.28.0) semver: 6.3.1 transitivePeerDependencies: - supports-color - babel-plugin-polyfill-corejs3@0.11.1(@babel/core@7.27.4): + babel-plugin-polyfill-corejs3@0.13.0(@babel/core@7.28.0): dependencies: - '@babel/core': 7.27.4 - '@babel/helper-define-polyfill-provider': 0.6.4(@babel/core@7.27.4) - core-js-compat: 3.43.0 + '@babel/core': 7.28.0 + '@babel/helper-define-polyfill-provider': 0.6.5(@babel/core@7.28.0) + core-js-compat: 3.44.0 transitivePeerDependencies: - supports-color - babel-plugin-polyfill-regenerator@0.6.4(@babel/core@7.27.4): + babel-plugin-polyfill-regenerator@0.6.5(@babel/core@7.28.0): dependencies: - '@babel/core': 7.27.4 - '@babel/helper-define-polyfill-provider': 0.6.4(@babel/core@7.27.4) + '@babel/core': 7.28.0 + '@babel/helper-define-polyfill-provider': 0.6.5(@babel/core@7.28.0) transitivePeerDependencies: - supports-color @@ -11759,9 +17727,6 @@ snapshots: dependencies: browserify-unibabel: 3.0.0 - browser-process-hrtime@1.0.0: - optional: true - browserify-aes@1.2.0: dependencies: buffer-xor: 1.0.3 @@ -11805,12 +17770,12 @@ snapshots: browserify-unibabel@3.0.0: {} - browserslist@4.25.0: + browserslist@4.25.1: dependencies: - caniuse-lite: 1.0.30001724 - electron-to-chromium: 1.5.171 + caniuse-lite: 1.0.30001727 + electron-to-chromium: 1.5.180 node-releases: 2.0.19 - update-browserslist-db: 1.1.3(browserslist@4.25.0) + update-browserslist-db: 1.1.3(browserslist@4.25.1) bs58@2.0.1: {} @@ -11839,13 +17804,13 @@ snapshots: base64-js: 1.5.1 ieee754: 1.2.1 - bufferutil@4.0.9: - dependencies: - node-gyp-build: 4.8.4 - optional: true - builtin-status-codes@3.0.0: {} + bundle-require@5.1.0(esbuild@0.25.6): + dependencies: + esbuild: 0.25.6 + load-tsconfig: 0.2.5 + cac@6.7.14: {} cacheable-lookup@5.0.4: {} @@ -11898,19 +17863,19 @@ snapshots: camelcase@6.3.0: {} - caniuse-lite@1.0.30001724: {} + caniuse-lite@1.0.30001727: {} capture-stack-trace@1.0.2: {} case-sensitive-paths-webpack-plugin@2.4.0: {} - chai@5.2.0: + chai@5.2.1: dependencies: assertion-error: 2.0.1 check-error: 2.1.1 deep-eql: 5.0.2 loupe: 3.1.4 - pathval: 2.0.0 + pathval: 2.0.1 chalk@2.4.2: dependencies: @@ -12025,11 +17990,6 @@ snapshots: colorette@2.0.20: {} - combined-stream@1.0.8: - dependencies: - delayed-stream: 1.0.0 - optional: true - commander@13.1.0: {} commander@2.20.3: {} @@ -12042,10 +18002,19 @@ snapshots: commondir@1.0.1: {} + compare-func@2.0.0: + dependencies: + array-ify: 1.0.0 + dot-prop: 5.3.0 + compare-versions@4.1.4: {} + compare-versions@6.1.1: {} + concat-map@0.0.1: {} + confbox@0.1.8: {} + configstore@3.1.5: dependencies: dot-prop: 4.2.1 @@ -12055,12 +18024,31 @@ snapshots: write-file-atomic: 2.4.3 xdg-basedir: 3.0.0 + consola@3.4.2: {} + + conventional-changelog-angular@7.0.0: + dependencies: + compare-func: 2.0.0 + + conventional-changelog-conventionalcommits@7.0.2: + dependencies: + compare-func: 2.0.0 + + conventional-commits-parser@5.0.0: + dependencies: + JSONStream: 1.3.5 + is-text-path: 2.0.0 + meow: 12.1.1 + split2: 4.2.0 + convert-source-map@1.9.0: {} convert-source-map@2.0.0: {} cookie-es@1.2.2: {} + cookie@1.0.2: {} + copy-webpack-plugin@12.0.2(webpack@5.99.9): dependencies: fast-glob: 3.3.3 @@ -12069,14 +18057,21 @@ snapshots: normalize-path: 3.0.0 schema-utils: 4.3.2 serialize-javascript: 6.0.2 - webpack: 5.99.9(@swc/core@1.12.1)(esbuild@0.25.5)(webpack-cli@4.10.0) + webpack: 5.99.9(@swc/core@1.12.11)(esbuild@0.25.6)(webpack-cli@4.10.0) - core-js-compat@3.43.0: + core-js-compat@3.44.0: dependencies: - browserslist: 4.25.0 + browserslist: 4.25.1 core-util-is@1.0.3: {} + cosmiconfig-typescript-loader@6.1.0(@types/node@24.0.12)(cosmiconfig@9.0.0(typescript@5.8.3))(typescript@5.8.3): + dependencies: + '@types/node': 24.0.12 + cosmiconfig: 9.0.0(typescript@5.8.3) + jiti: 2.4.2 + typescript: 5.8.3 + cosmiconfig@7.1.0: dependencies: '@types/parse-json': 4.0.2 @@ -12085,6 +18080,15 @@ snapshots: path-type: 4.0.0 yaml: 1.10.2 + cosmiconfig@9.0.0(typescript@5.8.3): + dependencies: + env-paths: 2.2.1 + import-fresh: 3.3.1 + js-yaml: 4.1.0 + parse-json: 5.2.0 + optionalDependencies: + typescript: 5.8.3 + crc-32@1.2.2: {} create-ecdh@4.0.4: @@ -12101,7 +18105,7 @@ snapshots: cipher-base: 1.0.6 inherits: 2.0.4 ripemd160: 2.0.1 - sha.js: 2.4.11 + sha.js: 2.4.12 create-hash@1.2.0: dependencies: @@ -12109,7 +18113,7 @@ snapshots: inherits: 2.0.4 md5.js: 1.3.5 ripemd160: 2.0.2 - sha.js: 2.4.11 + sha.js: 2.4.12 create-hmac@1.1.7: dependencies: @@ -12118,10 +18122,14 @@ snapshots: inherits: 2.0.4 ripemd160: 2.0.2 safe-buffer: 5.2.1 - sha.js: 2.4.11 + sha.js: 2.4.12 create-require@1.1.1: {} + cross-env@7.0.3: + dependencies: + cross-spawn: 7.0.6 + cross-fetch@3.2.0: dependencies: node-fetch: 2.7.0 @@ -12178,7 +18186,7 @@ snapshots: postcss-value-parser: 4.2.0 semver: 7.7.2 optionalDependencies: - webpack: 5.99.9(@swc/core@1.12.1)(esbuild@0.25.5)(webpack-cli@4.10.0) + webpack: 5.99.9(@swc/core@1.12.11)(esbuild@0.25.6)(webpack-cli@4.10.0) css-loader@7.1.2(webpack@5.99.9): dependencies: @@ -12191,7 +18199,7 @@ snapshots: postcss-value-parser: 4.2.0 semver: 7.7.2 optionalDependencies: - webpack: 5.99.9(@swc/core@1.12.1)(esbuild@0.25.5)(webpack-cli@4.10.0) + webpack: 5.99.9(@swc/core@1.12.11)(esbuild@0.25.6)(webpack-cli@4.10.0) css-select-base-adapter@0.1.1: {} @@ -12205,7 +18213,7 @@ snapshots: css-select@4.3.0: dependencies: boolbase: 1.0.0 - css-what: 6.1.0 + css-what: 6.2.2 domhandler: 4.3.1 domutils: 2.8.0 nth-check: 2.1.1 @@ -12222,7 +18230,7 @@ snapshots: css-what@3.4.2: {} - css-what@6.1.0: {} + css-what@6.2.2: {} css.escape@1.5.1: {} @@ -12232,17 +18240,6 @@ snapshots: dependencies: css-tree: 1.1.3 - cssom@0.3.8: - optional: true - - cssom@0.4.4: - optional: true - - cssstyle@2.3.0: - dependencies: - cssom: 0.3.8 - optional: true - csstype@3.1.3: {} currently-unhandled@0.4.1: @@ -12287,12 +18284,7 @@ snapshots: d3-timer@3.0.1: {} - data-urls@2.0.0: - dependencies: - abab: 2.0.6 - whatwg-mimetype: 2.3.0 - whatwg-url: 8.7.0 - optional: true + dargs@8.1.0: {} data-view-buffer@1.0.2: dependencies: @@ -12333,9 +18325,6 @@ snapshots: decimal.js-light@2.5.1: {} - decimal.js@10.5.0: - optional: true - decode-uri-component@0.2.2: {} decompress-response@6.0.0: @@ -12374,9 +18363,6 @@ snapshots: defu@6.1.4: {} - delayed-stream@1.0.0: - optional: true - dependency-graph@1.0.0: {} dequal@2.0.3: {} @@ -12445,11 +18431,6 @@ snapshots: domelementtype@2.3.0: {} - domexception@2.0.1: - dependencies: - webidl-conversions: 5.0.0 - optional: true - domhandler@4.3.1: dependencies: domelementtype: 2.3.0 @@ -12474,16 +18455,20 @@ snapshots: dependencies: is-obj: 1.0.1 + dot-prop@5.3.0: + dependencies: + is-obj: 2.0.0 + dotenv-defaults@2.0.2: dependencies: dotenv: 8.6.0 - dotenv-webpack@8.1.0(webpack@5.99.9): + dotenv-webpack@8.1.1(webpack@5.99.9): dependencies: dotenv-defaults: 2.0.2 - webpack: 5.99.9(@swc/core@1.12.1)(esbuild@0.25.5)(webpack-cli@4.10.0) + webpack: 5.99.9(@swc/core@1.12.11)(esbuild@0.25.6)(webpack-cli@4.10.0) - dotenv@16.5.0: {} + dotenv@16.6.1: {} dotenv@8.6.0: {} @@ -12510,7 +18495,7 @@ snapshots: eastasianwidth@0.2.0: {} - electron-to-chromium@1.5.171: {} + electron-to-chromium@1.5.180: {} electron@23.3.13: dependencies: @@ -12550,7 +18535,7 @@ snapshots: fast-json-parse: 1.0.3 objectorarray: 1.0.5 - enhanced-resolve@5.18.1: + enhanced-resolve@5.18.2: dependencies: graceful-fs: 4.2.11 tapable: 2.2.2 @@ -12682,40 +18667,41 @@ snapshots: es6-error@4.1.1: optional: true - esbuild-register@3.6.0(esbuild@0.25.5): + esbuild-register@3.6.0(esbuild@0.25.6): dependencies: debug: 4.4.1 - esbuild: 0.25.5 + esbuild: 0.25.6 transitivePeerDependencies: - supports-color - esbuild@0.25.5: + esbuild@0.25.6: optionalDependencies: - '@esbuild/aix-ppc64': 0.25.5 - '@esbuild/android-arm': 0.25.5 - '@esbuild/android-arm64': 0.25.5 - '@esbuild/android-x64': 0.25.5 - '@esbuild/darwin-arm64': 0.25.5 - '@esbuild/darwin-x64': 0.25.5 - '@esbuild/freebsd-arm64': 0.25.5 - '@esbuild/freebsd-x64': 0.25.5 - '@esbuild/linux-arm': 0.25.5 - '@esbuild/linux-arm64': 0.25.5 - '@esbuild/linux-ia32': 0.25.5 - '@esbuild/linux-loong64': 0.25.5 - '@esbuild/linux-mips64el': 0.25.5 - '@esbuild/linux-ppc64': 0.25.5 - '@esbuild/linux-riscv64': 0.25.5 - '@esbuild/linux-s390x': 0.25.5 - '@esbuild/linux-x64': 0.25.5 - '@esbuild/netbsd-arm64': 0.25.5 - '@esbuild/netbsd-x64': 0.25.5 - '@esbuild/openbsd-arm64': 0.25.5 - '@esbuild/openbsd-x64': 0.25.5 - '@esbuild/sunos-x64': 0.25.5 - '@esbuild/win32-arm64': 0.25.5 - '@esbuild/win32-ia32': 0.25.5 - '@esbuild/win32-x64': 0.25.5 + '@esbuild/aix-ppc64': 0.25.6 + '@esbuild/android-arm': 0.25.6 + '@esbuild/android-arm64': 0.25.6 + '@esbuild/android-x64': 0.25.6 + '@esbuild/darwin-arm64': 0.25.6 + '@esbuild/darwin-x64': 0.25.6 + '@esbuild/freebsd-arm64': 0.25.6 + '@esbuild/freebsd-x64': 0.25.6 + '@esbuild/linux-arm': 0.25.6 + '@esbuild/linux-arm64': 0.25.6 + '@esbuild/linux-ia32': 0.25.6 + '@esbuild/linux-loong64': 0.25.6 + '@esbuild/linux-mips64el': 0.25.6 + '@esbuild/linux-ppc64': 0.25.6 + '@esbuild/linux-riscv64': 0.25.6 + '@esbuild/linux-s390x': 0.25.6 + '@esbuild/linux-x64': 0.25.6 + '@esbuild/netbsd-arm64': 0.25.6 + '@esbuild/netbsd-x64': 0.25.6 + '@esbuild/openbsd-arm64': 0.25.6 + '@esbuild/openbsd-x64': 0.25.6 + '@esbuild/openharmony-arm64': 0.25.6 + '@esbuild/sunos-x64': 0.25.6 + '@esbuild/win32-arm64': 0.25.6 + '@esbuild/win32-ia32': 0.25.6 + '@esbuild/win32-x64': 0.25.6 escalade@3.2.0: {} @@ -12723,14 +18709,13 @@ snapshots: escape-string-regexp@4.0.0: {} - escodegen@2.1.0: + eslint-config-prettier@9.1.0(eslint@9.30.1(jiti@2.4.2)): dependencies: - esprima: 4.0.1 - estraverse: 5.3.0 - esutils: 2.0.3 - optionalDependencies: - source-map: 0.6.1 - optional: true + eslint: 9.30.1(jiti@2.4.2) + + eslint-import-resolver-alias@1.1.2(eslint-plugin-import@2.32.0): + dependencies: + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.30.1(jiti@2.4.2)) eslint-import-resolver-node@0.3.9: dependencies: @@ -12740,33 +18725,33 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0)(eslint@9.29.0(jiti@2.4.2)): + eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0)(eslint@9.30.1(jiti@2.4.2)): dependencies: '@nolyfill/is-core-module': 1.0.39 debug: 4.4.1 - eslint: 9.29.0(jiti@2.4.2) + eslint: 9.30.1(jiti@2.4.2) get-tsconfig: 4.10.1 is-bun-module: 2.0.0 stable-hash: 0.0.5 tinyglobby: 0.2.14 - unrs-resolver: 1.9.1 + unrs-resolver: 1.11.0 optionalDependencies: - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.34.1(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.29.0(jiti@2.4.2)) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.30.1(jiti@2.4.2)) transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.1(@typescript-eslint/parser@8.34.1(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.29.0(jiti@2.4.2)): + eslint-module-utils@2.12.1(@typescript-eslint/parser@8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.30.1(jiti@2.4.2)): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 8.34.1(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3) - eslint: 9.29.0(jiti@2.4.2) + '@typescript-eslint/parser': 8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) + eslint: 9.30.1(jiti@2.4.2) eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.29.0(jiti@2.4.2)) + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.30.1(jiti@2.4.2)) transitivePeerDependencies: - supports-color - eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.34.1(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.29.0(jiti@2.4.2)): + eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.30.1(jiti@2.4.2)): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 @@ -12775,9 +18760,9 @@ snapshots: array.prototype.flatmap: 1.3.3 debug: 3.2.7 doctrine: 2.1.0 - eslint: 9.29.0(jiti@2.4.2) + eslint: 9.30.1(jiti@2.4.2) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.34.1(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.29.0(jiti@2.4.2)) + eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.30.1(jiti@2.4.2)) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -12789,17 +18774,27 @@ snapshots: string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.34.1(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/parser': 8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - eslint-plugin-react-hooks@5.2.0(eslint@9.29.0(jiti@2.4.2)): + eslint-plugin-prettier@5.5.1(@types/eslint@9.6.1)(eslint-config-prettier@9.1.0(eslint@9.30.1(jiti@2.4.2)))(eslint@9.30.1(jiti@2.4.2))(prettier@3.6.2): dependencies: - eslint: 9.29.0(jiti@2.4.2) + eslint: 9.30.1(jiti@2.4.2) + prettier: 3.6.2 + prettier-linter-helpers: 1.0.0 + synckit: 0.11.8 + optionalDependencies: + '@types/eslint': 9.6.1 + eslint-config-prettier: 9.1.0(eslint@9.30.1(jiti@2.4.2)) - eslint-plugin-react@7.37.5(eslint@9.29.0(jiti@2.4.2)): + eslint-plugin-react-hooks@5.2.0(eslint@9.30.1(jiti@2.4.2)): + dependencies: + eslint: 9.30.1(jiti@2.4.2) + + eslint-plugin-react@7.37.5(eslint@9.30.1(jiti@2.4.2)): dependencies: array-includes: 3.1.9 array.prototype.findlast: 1.2.5 @@ -12807,7 +18802,7 @@ snapshots: array.prototype.tosorted: 1.1.4 doctrine: 2.1.0 es-iterator-helpers: 1.2.1 - eslint: 9.29.0(jiti@2.4.2) + eslint: 9.30.1(jiti@2.4.2) estraverse: 5.3.0 hasown: 2.0.2 jsx-ast-utils: 3.3.5 @@ -12821,15 +18816,31 @@ snapshots: string.prototype.matchall: 4.0.12 string.prototype.repeat: 1.0.0 - eslint-plugin-storybook@9.0.12(eslint@9.29.0(jiti@2.4.2))(storybook@9.0.12(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10))(typescript@5.8.3): + eslint-plugin-storybook@0.11.6(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3): + dependencies: + '@storybook/csf': 0.1.13 + '@typescript-eslint/utils': 8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) + eslint: 9.30.1(jiti@2.4.2) + ts-dedent: 2.2.0 + transitivePeerDependencies: + - supports-color + - typescript + + eslint-plugin-storybook@9.0.16(eslint@9.30.1(jiti@2.4.2))(storybook@9.0.16(@testing-library/dom@10.4.0)(prettier@3.6.2))(typescript@5.8.3): dependencies: - '@typescript-eslint/utils': 8.34.1(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3) - eslint: 9.29.0(jiti@2.4.2) - storybook: 9.0.12(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10) + '@typescript-eslint/utils': 8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) + eslint: 9.30.1(jiti@2.4.2) + storybook: 9.0.16(@testing-library/dom@10.4.0)(prettier@3.6.2) transitivePeerDependencies: - supports-color - typescript + eslint-plugin-unused-imports@4.1.4(@typescript-eslint/eslint-plugin@8.36.0(@typescript-eslint/parser@8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3))(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3))(eslint@9.30.1(jiti@2.4.2)): + dependencies: + eslint: 9.30.1(jiti@2.4.2) + optionalDependencies: + '@typescript-eslint/eslint-plugin': 8.36.0(@typescript-eslint/parser@8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3))(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) + eslint-scope@5.1.1: dependencies: esrecurse: 4.3.0 @@ -12844,16 +18855,16 @@ snapshots: eslint-visitor-keys@4.2.1: {} - eslint@9.29.0(jiti@2.4.2): + eslint@9.30.1(jiti@2.4.2): dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.29.0(jiti@2.4.2)) + '@eslint-community/eslint-utils': 4.7.0(eslint@9.30.1(jiti@2.4.2)) '@eslint-community/regexpp': 4.12.1 - '@eslint/config-array': 0.20.1 - '@eslint/config-helpers': 0.2.3 + '@eslint/config-array': 0.21.0 + '@eslint/config-helpers': 0.3.0 '@eslint/core': 0.14.0 '@eslint/eslintrc': 3.3.1 - '@eslint/js': 9.29.0 - '@eslint/plugin-kit': 0.3.2 + '@eslint/js': 9.30.1 + '@eslint/plugin-kit': 0.3.3 '@humanfs/node': 0.16.6 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.4.3 @@ -13003,7 +19014,7 @@ snapshots: utf8: 3.0.0 uuid: 3.4.0 - ethers@6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10): + ethers@6.15.0: dependencies: '@adraffy/ens-normalize': 1.10.1 '@noble/curves': 1.2.0 @@ -13011,7 +19022,7 @@ snapshots: '@types/node': 22.7.5 aes-js: 4.0.0-beta.5 tslib: 2.7.0 - ws: 8.17.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) + ws: 8.17.1 transitivePeerDependencies: - bufferutil - utf-8-validate @@ -13068,7 +19079,7 @@ snapshots: signal-exit: 4.1.0 strip-final-newline: 3.0.0 - expect-type@1.2.1: {} + expect-type@1.2.2: {} extract-zip@2.0.1: dependencies: @@ -13082,6 +19093,8 @@ snapshots: fast-deep-equal@3.1.3: {} + fast-diff@1.3.0: {} + fast-equals@5.2.2: {} fast-glob@3.3.3: @@ -13130,7 +19143,7 @@ snapshots: dependencies: loader-utils: 2.0.4 schema-utils: 3.3.0 - webpack: 5.99.9(@swc/core@1.12.1)(esbuild@0.25.5)(webpack-cli@4.10.0) + webpack: 5.99.9(@swc/core@1.12.11)(esbuild@0.25.6)(webpack-cli@4.10.0) file-saver@2.0.5: {} @@ -13203,6 +19216,12 @@ snapshots: transitivePeerDependencies: - '@react-native-async-storage/async-storage' + fix-dts-default-cjs-exports@1.0.1: + dependencies: + magic-string: 0.30.17 + mlly: 1.7.4 + rollup: 4.44.2 + flat-cache@3.2.0: dependencies: flatted: 3.3.3 @@ -13242,15 +19261,7 @@ snapshots: semver: 7.7.2 tapable: 2.2.2 typescript: 5.8.3 - webpack: 5.99.9(@swc/core@1.12.1)(esbuild@0.25.5)(webpack-cli@4.10.0) - - form-data@3.0.3: - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - es-set-tostringtag: 2.1.0 - mime-types: 2.1.35 - optional: true + webpack: 5.99.9(@swc/core@1.12.11)(esbuild@0.25.6)(webpack-cli@4.10.0) fraction.js@4.3.7: {} @@ -13339,6 +19350,12 @@ snapshots: dependencies: resolve-pkg-maps: 1.0.0 + git-raw-commits@4.0.0: + dependencies: + dargs: 8.1.0 + meow: 12.1.1 + split2: 4.2.0 + glob-parent@5.1.2: dependencies: is-glob: 4.0.3 @@ -13358,6 +19375,15 @@ snapshots: package-json-from-dist: 1.0.1 path-scurry: 1.11.1 + glob@11.0.3: + dependencies: + foreground-child: 3.3.1 + jackspeak: 4.1.1 + minimatch: 10.0.3 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 2.0.0 + glob@7.2.3: dependencies: fs.realpath: 1.0.0 @@ -13377,12 +19403,14 @@ snapshots: serialize-error: 7.0.1 optional: true + global-directory@4.0.1: + dependencies: + ini: 4.1.1 + global-dirs@0.1.1: dependencies: ini: 1.3.8 - globals@11.12.0: {} - globals@14.0.0: {} globals@15.15.0: {} @@ -13446,7 +19474,7 @@ snapshots: defu: 6.1.4 destr: 2.0.5 iron-webcrypto: 1.2.1 - node-mock-http: 1.0.0 + node-mock-http: 1.0.1 radix3: 1.1.2 ufo: 1.6.1 uncrypto: 0.1.3 @@ -13522,11 +19550,6 @@ snapshots: hosted-git-info@2.8.9: {} - html-encoding-sniffer@2.0.1: - dependencies: - whatwg-encoding: 1.0.5 - optional: true - html-entities@2.6.0: {} html-escaper@2.0.2: {} @@ -13553,7 +19576,7 @@ snapshots: pretty-error: 4.0.0 tapable: 2.2.2 optionalDependencies: - webpack: 5.99.9(@swc/core@1.12.1)(esbuild@0.25.5)(webpack-cli@4.10.0) + webpack: 5.99.9(@swc/core@1.12.11)(esbuild@0.25.6)(webpack-cli@4.10.0) htmlparser2@6.1.0: dependencies: @@ -13566,28 +19589,11 @@ snapshots: http-parser-js@0.5.10: {} - http-proxy-agent@4.0.1: - dependencies: - '@tootallnate/once': 1.1.2 - agent-base: 6.0.2 - debug: 4.4.1 - transitivePeerDependencies: - - supports-color - optional: true - http2-wrapper@1.0.3: dependencies: quick-lru: 5.1.1 resolve-alpn: 1.2.1 - https-proxy-agent@5.0.1: - dependencies: - agent-base: 6.0.2 - debug: 4.4.1 - transitivePeerDependencies: - - supports-color - optional: true - human-signals@2.1.0: {} human-signals@5.0.0: {} @@ -13600,11 +19606,6 @@ snapshots: optionalDependencies: typescript: 5.8.3 - iconv-lite@0.4.24: - dependencies: - safer-buffer: 2.1.2 - optional: true - icss-utils@5.1.0(postcss@8.5.6): dependencies: postcss: 8.5.6 @@ -13633,6 +19634,8 @@ snapshots: pkg-dir: 4.2.0 resolve-cwd: 3.0.0 + import-meta-resolve@4.1.0: {} + imurmurhash@0.1.4: {} indent-string@3.2.0: {} @@ -13648,6 +19651,8 @@ snapshots: ini@1.3.8: {} + ini@4.1.1: {} + internal-ip@6.2.0: dependencies: default-gateway: 6.0.3 @@ -13794,6 +19799,8 @@ snapshots: is-obj@1.0.1: {} + is-obj@2.0.0: {} + is-path-inside@1.0.1: dependencies: path-is-inside: 1.0.2 @@ -13804,9 +19811,6 @@ snapshots: dependencies: isobject: 3.0.1 - is-potential-custom-element-name@1.0.1: - optional: true - is-redirect@1.0.0: {} is-regex@1.2.1: @@ -13841,6 +19845,10 @@ snapshots: has-symbols: 1.1.0 safe-regex-test: 1.1.0 + is-text-path@2.0.0: + dependencies: + text-extensions: 2.4.0 + is-typed-array@1.1.15: dependencies: which-typed-array: 1.1.19 @@ -13870,13 +19878,13 @@ snapshots: isobject@3.0.1: {} - isomorphic-ws@5.0.0(ws@8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)): + isomorphic-ws@5.0.0(ws@8.18.3): dependencies: - ws: 8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10) + ws: 8.18.3 - isows@1.0.7(ws@8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)): + isows@1.0.7(ws@8.18.2): dependencies: - ws: 8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10) + ws: 8.18.2 istanbul-lib-coverage@3.2.2: {} @@ -13888,7 +19896,7 @@ snapshots: istanbul-lib-source-maps@5.0.6: dependencies: - '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/trace-mapping': 0.3.29 debug: 4.4.1 istanbul-lib-coverage: 3.2.2 transitivePeerDependencies: @@ -13914,16 +19922,21 @@ snapshots: optionalDependencies: '@pkgjs/parseargs': 0.11.0 + jackspeak@4.1.1: + dependencies: + '@isaacs/cliui': 8.0.2 + jest-worker@27.5.1: dependencies: - '@types/node': 22.15.32 + '@types/node': 22.16.2 merge-stream: 2.0.0 supports-color: 8.1.1 jiti@1.21.7: {} - jiti@2.4.2: - optional: true + jiti@2.4.2: {} + + joycon@3.1.1: {} js-tokens@4.0.0: {} @@ -13938,41 +19951,6 @@ snapshots: dependencies: argparse: 2.0.1 - jsdom@16.7.0(bufferutil@4.0.9)(utf-8-validate@5.0.10): - dependencies: - abab: 2.0.6 - acorn: 8.15.0 - acorn-globals: 6.0.0 - cssom: 0.4.4 - cssstyle: 2.3.0 - data-urls: 2.0.0 - decimal.js: 10.5.0 - domexception: 2.0.1 - escodegen: 2.1.0 - form-data: 3.0.3 - html-encoding-sniffer: 2.0.1 - http-proxy-agent: 4.0.1 - https-proxy-agent: 5.0.1 - is-potential-custom-element-name: 1.0.1 - nwsapi: 2.2.20 - parse5: 6.0.1 - saxes: 5.0.1 - symbol-tree: 3.2.4 - tough-cookie: 4.1.4 - w3c-hr-time: 1.0.2 - w3c-xmlserializer: 2.0.0 - webidl-conversions: 6.1.0 - whatwg-encoding: 1.0.5 - whatwg-mimetype: 2.3.0 - whatwg-url: 8.7.0 - ws: 7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10) - xml-name-validator: 3.0.0 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - optional: true - jsesc@3.0.2: {} jsesc@3.1.0: {} @@ -14008,6 +19986,8 @@ snapshots: optionalDependencies: graceful-fs: 4.2.11 + jsonparse@1.3.1: {} + jsx-ast-utils@3.3.5: dependencies: array-includes: 3.1.9 @@ -14112,6 +20092,8 @@ snapshots: pify: 3.0.0 strip-bom: 3.0.0 + load-tsconfig@0.2.5: {} + loader-runner@4.3.0: {} loader-utils@2.0.4: @@ -14143,10 +20125,28 @@ snapshots: lodash.isequal@4.5.0: {} + lodash.isplainobject@4.0.6: {} + + lodash.kebabcase@4.1.1: {} + + lodash.memoize@4.1.2: {} + lodash.merge@4.6.2: {} + lodash.mergewith@4.6.2: {} + + lodash.snakecase@4.1.1: {} + + lodash.sortby@4.7.0: {} + + lodash.startcase@4.4.0: {} + lodash.truncate@4.4.2: {} + lodash.uniq@4.5.0: {} + + lodash.upperfirst@4.3.1: {} + lodash@4.17.21: {} log-update@6.1.0: @@ -14188,6 +20188,8 @@ snapshots: lru-cache@10.4.3: {} + lru-cache@11.1.0: {} + lru-cache@4.1.5: dependencies: pseudomap: 1.0.2 @@ -14197,20 +20199,16 @@ snapshots: dependencies: yallist: 3.1.1 - lru-cache@6.0.0: - dependencies: - yallist: 4.0.0 - lz-string@1.5.0: {} magic-string@0.30.17: dependencies: - '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/sourcemap-codec': 1.5.4 magicast@0.3.5: dependencies: - '@babel/parser': 7.27.5 - '@babel/types': 7.27.6 + '@babel/parser': 7.28.0 + '@babel/types': 7.28.0 source-map-js: 1.2.1 make-dir@1.3.0: @@ -14252,6 +20250,8 @@ snapshots: dependencies: fs-monkey: 1.0.6 + meow@12.1.1: {} + meow@5.0.0: dependencies: camelcase-keys: 4.2.0 @@ -14302,6 +20302,10 @@ snapshots: minimalistic-crypto-utils@1.0.1: {} + minimatch@10.0.3: + dependencies: + '@isaacs/brace-expansion': 5.0.0 + minimatch@3.1.2: dependencies: brace-expansion: 1.1.12 @@ -14323,6 +20327,13 @@ snapshots: dependencies: minimist: 1.2.8 + mlly@1.7.4: + dependencies: + acorn: 8.15.0 + pathe: 2.0.3 + pkg-types: 1.3.1 + ufo: 1.6.1 + motion@10.16.2: dependencies: '@motionone/animation': 10.18.0 @@ -14346,7 +20357,7 @@ snapshots: nanoid@3.3.11: {} - napi-postinstall@0.2.4: {} + napi-postinstall@0.3.0: {} natural-compare@1.4.0: {} @@ -14379,7 +20390,7 @@ snapshots: node-gyp-build@4.8.4: {} - node-mock-http@1.0.0: {} + node-mock-http@1.0.1: {} node-releases@2.0.19: {} @@ -14416,9 +20427,6 @@ snapshots: dependencies: boolbase: 1.0.0 - nwsapi@2.2.20: - optional: true - object-assign@4.1.1: {} object-hash@3.0.0: {} @@ -14527,7 +20535,7 @@ snapshots: object-keys: 1.1.1 safe-push-apply: 1.0.0 - ox@0.7.1(typescript@5.8.3)(zod@3.25.67): + ox@0.7.1(typescript@5.8.3)(zod@3.25.76): dependencies: '@adraffy/ens-normalize': 1.11.0 '@noble/ciphers': 1.3.0 @@ -14535,7 +20543,7 @@ snapshots: '@noble/hashes': 1.8.0 '@scure/bip32': 1.7.0 '@scure/bip39': 1.6.0 - abitype: 1.0.8(typescript@5.8.3)(zod@3.25.67) + abitype: 1.0.8(typescript@5.8.3)(zod@3.25.76) eventemitter3: 5.0.1 optionalDependencies: typescript: 5.8.3 @@ -14631,9 +20639,6 @@ snapshots: json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 - parse5@6.0.1: - optional: true - pascal-case@3.1.2: dependencies: no-case: 3.0.4 @@ -14664,6 +20669,11 @@ snapshots: lru-cache: 10.4.3 minipass: 7.1.2 + path-scurry@2.0.0: + dependencies: + lru-cache: 11.1.0 + minipass: 7.1.2 + path-to-regexp@1.9.0: dependencies: isarray: 0.0.1 @@ -14678,7 +20688,7 @@ snapshots: pathe@2.0.3: {} - pathval@2.0.0: {} + pathval@2.0.1: {} pbkdf2@3.1.3: dependencies: @@ -14686,7 +20696,7 @@ snapshots: create-hmac: 1.1.7 ripemd160: 2.0.1 safe-buffer: 5.2.1 - sha.js: 2.4.11 + sha.js: 2.4.12 to-buffer: 1.2.1 pend@1.2.0: {} @@ -14732,11 +20742,17 @@ snapshots: dependencies: find-up: 4.1.0 - playwright-core@1.53.1: {} + pkg-types@1.3.1: + dependencies: + confbox: 0.1.8 + mlly: 1.7.4 + pathe: 2.0.3 - playwright@1.53.1: + playwright-core@1.53.2: {} + + playwright@1.53.2: dependencies: - playwright-core: 1.53.1 + playwright-core: 1.53.2 optionalDependencies: fsevents: 2.3.2 @@ -14792,13 +20808,13 @@ snapshots: camelcase-css: 2.0.1 postcss: 8.5.6 - postcss-load-config@4.0.2(postcss@8.5.6)(ts-node@10.9.2(@swc/core@1.12.1)(@types/node@22.15.32)(typescript@5.8.3)): + postcss-load-config@4.0.2(postcss@8.5.6)(ts-node@10.9.2(@swc/core@1.12.11)(@types/node@22.16.2)(typescript@5.8.3)): dependencies: lilconfig: 3.1.3 yaml: 2.8.0 optionalDependencies: postcss: 8.5.6 - ts-node: 10.9.2(@swc/core@1.12.1)(@types/node@22.15.32)(typescript@5.8.3) + ts-node: 10.9.2(@swc/core@1.12.11)(@types/node@22.16.2)(typescript@5.8.3) postcss-load-config@5.1.0(jiti@2.4.2)(postcss@8.5.6)(tsx@4.20.3): dependencies: @@ -14809,13 +20825,22 @@ snapshots: postcss: 8.5.6 tsx: 4.20.3 + postcss-load-config@6.0.1(jiti@2.4.2)(postcss@8.5.6)(tsx@4.20.3)(yaml@2.8.0): + dependencies: + lilconfig: 3.1.3 + optionalDependencies: + jiti: 2.4.2 + postcss: 8.5.6 + tsx: 4.20.3 + yaml: 2.8.0 + postcss-loader@5.3.0(postcss@8.5.6)(webpack@5.99.9): dependencies: cosmiconfig: 7.1.0 klona: 2.0.6 postcss: 8.5.6 semver: 7.7.2 - webpack: 5.99.9(@swc/core@1.12.1)(esbuild@0.25.5)(webpack-cli@4.10.0) + webpack: 5.99.9(@swc/core@1.12.11)(esbuild@0.25.6)(webpack-cli@4.10.0) postcss-modules-extract-imports@3.1.0(postcss@8.5.6): dependencies: @@ -14878,7 +20903,11 @@ snapshots: prepend-http@1.0.4: {} - prettier@3.5.3: {} + prettier-linter-helpers@1.0.0: + dependencies: + fast-diff: 1.3.0 + + prettier@3.6.2: {} pretty-error@4.0.0: dependencies: @@ -14919,18 +20948,13 @@ snapshots: '@protobufjs/path': 1.1.2 '@protobufjs/pool': 1.1.0 '@protobufjs/utf8': 1.1.0 - '@types/node': 22.15.32 + '@types/node': 22.16.2 long: 5.3.2 proxy-compare@2.5.1: {} pseudomap@1.0.2: {} - psl@1.15.0: - dependencies: - punycode: 2.3.1 - optional: true - public-encrypt@4.0.3: dependencies: bn.js: 4.12.2 @@ -14951,13 +20975,13 @@ snapshots: qr-code-styling@1.9.2: dependencies: - qrcode-generator: 1.5.0 + qrcode-generator: 1.5.2 qr-scanner@1.4.2: dependencies: '@types/offscreencanvas': 2019.7.3 - qrcode-generator@1.5.0: {} + qrcode-generator@1.5.2: {} qrcode@1.5.3: dependencies: @@ -14973,9 +20997,6 @@ snapshots: split-on-first: 1.1.0 strict-uri-encode: 2.0.0 - querystringify@2.2.0: - optional: true - queue-microtask@1.2.3: {} quick-format-unescaped@4.0.4: {} @@ -15001,7 +21022,7 @@ snapshots: dependencies: loader-utils: 2.0.4 schema-utils: 3.3.0 - webpack: 5.99.9(@swc/core@1.12.1)(esbuild@0.25.5)(webpack-cli@4.10.0) + webpack: 5.99.9(@swc/core@1.12.11)(esbuild@0.25.6)(webpack-cli@4.10.0) rc@1.2.8: dependencies: @@ -15010,21 +21031,21 @@ snapshots: minimist: 1.2.8 strip-json-comments: 2.0.1 - react-devtools-core@6.1.2(bufferutil@4.0.9)(utf-8-validate@5.0.10): + react-devtools-core@6.1.5: dependencies: shell-quote: 1.8.3 - ws: 7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10) + ws: 7.5.10 transitivePeerDependencies: - bufferutil - utf-8-validate - react-devtools@6.1.2(bufferutil@4.0.9)(utf-8-validate@5.0.10): + react-devtools@6.1.5: dependencies: cross-spawn: 5.1.0 electron: 23.3.13 internal-ip: 6.2.0 minimist: 1.2.8 - react-devtools-core: 6.1.2(bufferutil@4.0.9)(utf-8-validate@5.0.10) + react-devtools-core: 6.1.5 update-notifier: 2.5.0 transitivePeerDependencies: - bufferutil @@ -15037,9 +21058,9 @@ snapshots: react-docgen@7.1.1: dependencies: - '@babel/core': 7.27.4 - '@babel/traverse': 7.27.4 - '@babel/types': 7.27.6 + '@babel/core': 7.28.0 + '@babel/traverse': 7.28.0 + '@babel/types': 7.28.0 '@types/babel__core': 7.20.5 '@types/babel__traverse': 7.20.7 '@types/doctrine': 0.0.9 @@ -15060,11 +21081,11 @@ snapshots: dependencies: highlight.js: 10.7.3 - react-hook-form@7.58.1(react@18.3.1): + react-hook-form@7.60.0(react@18.3.1): dependencies: react: 18.3.1 - react-i18next@15.5.3(i18next@24.2.3(typescript@5.8.3))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.3): + react-i18next@15.6.0(i18next@24.2.3(typescript@5.8.3))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.3): dependencies: '@babel/runtime': 7.27.6 html-parse-stringify: 3.0.1 @@ -15079,6 +21100,10 @@ snapshots: react: 18.3.1 throttle-debounce: 2.3.0 + react-inspector@6.0.2(react@18.3.1): + dependencies: + react: 18.3.1 + react-is@16.13.1: {} react-is@17.0.2: {} @@ -15090,33 +21115,17 @@ snapshots: react-qrcode-logo@3.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: lodash.isequal: 4.5.0 - qrcode-generator: 1.5.0 + qrcode-generator: 1.5.2 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - react-router-dom@5.3.4(react@18.3.1): + react-router@7.6.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - '@babel/runtime': 7.27.6 - history: 4.10.1 - loose-envify: 1.4.0 - prop-types: 15.8.1 + cookie: 1.0.2 react: 18.3.1 - react-router: 5.3.4(react@18.3.1) - tiny-invariant: 1.3.3 - tiny-warning: 1.0.3 - - react-router@5.3.4(react@18.3.1): - dependencies: - '@babel/runtime': 7.27.6 - history: 4.10.1 - hoist-non-react-statics: 3.3.2 - loose-envify: 1.4.0 - path-to-regexp: 1.9.0 - prop-types: 15.8.1 - react: 18.3.1 - react-is: 16.13.1 - tiny-invariant: 1.3.3 - tiny-warning: 1.0.3 + set-cookie-parser: 2.7.1 + optionalDependencies: + react-dom: 18.3.1(react@18.3.1) react-smooth@4.0.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: @@ -15240,9 +21249,6 @@ snapshots: regenerate@1.4.2: {} - regenerator-runtime@0.13.11: - optional: true - regexp.prototype.flags@1.5.4: dependencies: call-bind: 1.0.8 @@ -15292,9 +21298,6 @@ snapshots: require-main-filename@2.0.0: {} - requires-port@1.0.0: - optional: true - resolve-alpn@1.2.1: {} resolve-cwd@3.0.0: @@ -15338,6 +21341,11 @@ snapshots: dependencies: glob: 7.2.3 + rimraf@6.0.1: + dependencies: + glob: 11.0.3 + package-json-from-dist: 1.0.1 + ripemd160@2.0.1: dependencies: hash-base: 2.0.2 @@ -15364,30 +21372,30 @@ snapshots: sprintf-js: 1.1.3 optional: true - rollup@4.44.0: + rollup@4.44.2: dependencies: '@types/estree': 1.0.8 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.44.0 - '@rollup/rollup-android-arm64': 4.44.0 - '@rollup/rollup-darwin-arm64': 4.44.0 - '@rollup/rollup-darwin-x64': 4.44.0 - '@rollup/rollup-freebsd-arm64': 4.44.0 - '@rollup/rollup-freebsd-x64': 4.44.0 - '@rollup/rollup-linux-arm-gnueabihf': 4.44.0 - '@rollup/rollup-linux-arm-musleabihf': 4.44.0 - '@rollup/rollup-linux-arm64-gnu': 4.44.0 - '@rollup/rollup-linux-arm64-musl': 4.44.0 - '@rollup/rollup-linux-loongarch64-gnu': 4.44.0 - '@rollup/rollup-linux-powerpc64le-gnu': 4.44.0 - '@rollup/rollup-linux-riscv64-gnu': 4.44.0 - '@rollup/rollup-linux-riscv64-musl': 4.44.0 - '@rollup/rollup-linux-s390x-gnu': 4.44.0 - '@rollup/rollup-linux-x64-gnu': 4.44.0 - '@rollup/rollup-linux-x64-musl': 4.44.0 - '@rollup/rollup-win32-arm64-msvc': 4.44.0 - '@rollup/rollup-win32-ia32-msvc': 4.44.0 - '@rollup/rollup-win32-x64-msvc': 4.44.0 + '@rollup/rollup-android-arm-eabi': 4.44.2 + '@rollup/rollup-android-arm64': 4.44.2 + '@rollup/rollup-darwin-arm64': 4.44.2 + '@rollup/rollup-darwin-x64': 4.44.2 + '@rollup/rollup-freebsd-arm64': 4.44.2 + '@rollup/rollup-freebsd-x64': 4.44.2 + '@rollup/rollup-linux-arm-gnueabihf': 4.44.2 + '@rollup/rollup-linux-arm-musleabihf': 4.44.2 + '@rollup/rollup-linux-arm64-gnu': 4.44.2 + '@rollup/rollup-linux-arm64-musl': 4.44.2 + '@rollup/rollup-linux-loongarch64-gnu': 4.44.2 + '@rollup/rollup-linux-powerpc64le-gnu': 4.44.2 + '@rollup/rollup-linux-riscv64-gnu': 4.44.2 + '@rollup/rollup-linux-riscv64-musl': 4.44.2 + '@rollup/rollup-linux-s390x-gnu': 4.44.2 + '@rollup/rollup-linux-x64-gnu': 4.44.2 + '@rollup/rollup-linux-x64-musl': 4.44.2 + '@rollup/rollup-win32-arm64-msvc': 4.44.2 + '@rollup/rollup-win32-ia32-msvc': 4.44.2 + '@rollup/rollup-win32-x64-msvc': 4.44.2 fsevents: 2.3.3 run-parallel@1.2.0: @@ -15419,16 +21427,8 @@ snapshots: safe-stable-stringify@2.5.0: {} - safer-buffer@2.1.2: - optional: true - sax@1.2.4: {} - saxes@5.0.1: - dependencies: - xmlchars: 2.2.0 - optional: true - scheduler@0.23.2: dependencies: loose-envify: 1.4.0 @@ -15493,6 +21493,8 @@ snapshots: set-blocking@2.0.0: {} + set-cookie-parser@2.7.1: {} + set-function-length@1.2.2: dependencies: define-data-property: 1.1.4 @@ -15517,10 +21519,11 @@ snapshots: setimmediate@1.0.5: {} - sha.js@2.4.11: + sha.js@2.4.12: dependencies: inherits: 2.0.4 safe-buffer: 5.2.1 + to-buffer: 1.2.1 sha3@2.1.4: dependencies: @@ -15639,6 +21642,10 @@ snapshots: source-map@0.7.4: {} + source-map@0.8.0-beta.0: + dependencies: + whatwg-url: 7.1.0 + spdx-correct@3.2.0: dependencies: spdx-expression-parse: 3.0.1 @@ -15675,21 +21682,32 @@ snapshots: es-errors: 1.3.0 internal-slot: 1.1.0 - storybook@9.0.12(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10): + storybook-addon-remix-react-router@5.0.0(react-dom@18.3.1(react@18.3.1))(react-router@7.6.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(storybook@9.0.16(@testing-library/dom@10.4.0)(prettier@3.6.2)): + dependencies: + '@mjackson/form-data-parser': 0.4.0 + compare-versions: 6.1.1 + react-inspector: 6.0.2(react@18.3.1) + react-router: 7.6.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + storybook: 9.0.16(@testing-library/dom@10.4.0)(prettier@3.6.2) + optionalDependencies: + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + storybook@9.0.16(@testing-library/dom@10.4.0)(prettier@3.6.2): dependencies: '@storybook/global': 5.0.0 '@testing-library/jest-dom': 6.6.3 '@testing-library/user-event': 14.6.1(@testing-library/dom@10.4.0) - '@vitest/expect': 3.0.9 - '@vitest/spy': 3.0.9 + '@vitest/expect': 3.2.4 + '@vitest/spy': 3.2.4 better-opn: 3.0.2 - esbuild: 0.25.5 - esbuild-register: 3.6.0(esbuild@0.25.5) + esbuild: 0.25.6 + esbuild-register: 3.6.0(esbuild@0.25.6) recast: 0.23.11 semver: 7.7.2 - ws: 8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10) + ws: 8.18.3 optionalDependencies: - prettier: 3.5.3 + prettier: 3.6.2 transitivePeerDependencies: - '@testing-library/dom' - bufferutil @@ -15833,17 +21851,17 @@ snapshots: style-loader@3.3.4(webpack@5.99.9): dependencies: - webpack: 5.99.9(@swc/core@1.12.1)(esbuild@0.25.5)(webpack-cli@4.10.0) + webpack: 5.99.9(@swc/core@1.12.11)(esbuild@0.25.6)(webpack-cli@4.10.0) style-loader@4.0.0(webpack@5.99.9): dependencies: - webpack: 5.99.9(@swc/core@1.12.1)(esbuild@0.25.5)(webpack-cli@4.10.0) + webpack: 5.99.9(@swc/core@1.12.11)(esbuild@0.25.6)(webpack-cli@4.10.0) stylis@4.2.0: {} sucrase@3.35.0: dependencies: - '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/gen-mapping': 0.3.12 commander: 4.1.1 glob: 10.4.5 lines-and-columns: 1.2.4 @@ -15889,14 +21907,15 @@ snapshots: unquote: 1.1.1 util.promisify: 1.0.1 - swc-loader@0.2.6(@swc/core@1.12.1)(webpack@5.99.9): + swc-loader@0.2.6(@swc/core@1.12.11)(webpack@5.99.9): dependencies: - '@swc/core': 1.12.1 + '@swc/core': 1.12.11 '@swc/counter': 0.1.3 - webpack: 5.99.9(@swc/core@1.12.1)(esbuild@0.25.5)(webpack-cli@4.10.0) + webpack: 5.99.9(@swc/core@1.12.11)(esbuild@0.25.6)(webpack-cli@4.10.0) - symbol-tree@3.2.4: - optional: true + synckit@0.11.8: + dependencies: + '@pkgr/core': 0.2.7 table@4.0.3: dependencies: @@ -15915,7 +21934,7 @@ snapshots: string-width: 4.2.3 strip-ansi: 6.0.1 - tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.12.1)(@types/node@22.15.32)(typescript@5.8.3)): + tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.12.11)(@types/node@22.16.2)(typescript@5.8.3)): dependencies: '@alloc/quick-lru': 5.2.0 arg: 5.0.2 @@ -15934,7 +21953,7 @@ snapshots: postcss: 8.5.6 postcss-import: 15.1.0(postcss@8.5.6) postcss-js: 4.0.1(postcss@8.5.6) - postcss-load-config: 4.0.2(postcss@8.5.6)(ts-node@10.9.2(@swc/core@1.12.1)(@types/node@22.15.32)(typescript@5.8.3)) + postcss-load-config: 4.0.2(postcss@8.5.6)(ts-node@10.9.2(@swc/core@1.12.11)(@types/node@22.16.2)(typescript@5.8.3)) postcss-nested: 6.2.0(postcss@8.5.6) postcss-selector-parser: 6.1.2 resolve: 1.22.10 @@ -15948,21 +21967,21 @@ snapshots: dependencies: execa: 0.7.0 - terser-webpack-plugin@5.3.14(@swc/core@1.12.1)(esbuild@0.25.5)(webpack@5.99.9): + terser-webpack-plugin@5.3.14(@swc/core@1.12.11)(esbuild@0.25.6)(webpack@5.99.9): dependencies: - '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/trace-mapping': 0.3.29 jest-worker: 27.5.1 schema-utils: 4.3.2 serialize-javascript: 6.0.2 terser: 5.43.1 - webpack: 5.99.9(@swc/core@1.12.1)(esbuild@0.25.5)(webpack-cli@4.10.0) + webpack: 5.99.9(@swc/core@1.12.11)(esbuild@0.25.6)(webpack-cli@4.10.0) optionalDependencies: - '@swc/core': 1.12.1 - esbuild: 0.25.5 + '@swc/core': 1.12.11 + esbuild: 0.25.6 terser@5.43.1: dependencies: - '@jridgewell/source-map': 0.3.6 + '@jridgewell/source-map': 0.3.10 acorn: 8.15.0 commander: 2.20.3 source-map-support: 0.5.21 @@ -15973,6 +21992,8 @@ snapshots: glob: 10.4.5 minimatch: 9.0.5 + text-extensions@2.4.0: {} + thenby@1.3.4: {} thenify-all@1.6.0: @@ -15989,6 +22010,8 @@ snapshots: throttle-debounce@2.3.0: {} + through@2.3.8: {} + timed-out@4.0.1: {} tiny-invariant@1.3.3: {} @@ -15999,6 +22022,8 @@ snapshots: tinyexec@0.3.2: {} + tinyexec@1.0.1: {} + tinyglobby@0.2.14: dependencies: fdir: 6.4.6(picomatch@4.0.2) @@ -16008,8 +22033,6 @@ snapshots: tinyrainbow@2.0.0: {} - tinyspy@3.0.2: {} - tinyspy@4.0.3: {} to-buffer@1.2.1: @@ -16022,20 +22045,13 @@ snapshots: dependencies: is-number: 7.0.0 - tough-cookie@4.1.4: - dependencies: - psl: 1.15.0 - punycode: 2.3.1 - universalify: 0.2.0 - url-parse: 1.5.10 - optional: true - tr46@0.0.3: {} - tr46@2.1.0: + tr46@1.0.1: dependencies: punycode: 2.3.1 - optional: true + + tree-kill@1.2.2: {} trim-newlines@2.0.0: {} @@ -16050,21 +22066,21 @@ snapshots: ts-loader@9.5.2(typescript@5.8.3)(webpack@5.99.9): dependencies: chalk: 4.1.2 - enhanced-resolve: 5.18.1 + enhanced-resolve: 5.18.2 micromatch: 4.0.8 semver: 7.7.2 source-map: 0.7.4 typescript: 5.8.3 - webpack: 5.99.9(@swc/core@1.12.1)(esbuild@0.25.5)(webpack-cli@4.10.0) + webpack: 5.99.9(@swc/core@1.12.11)(esbuild@0.25.6)(webpack-cli@4.10.0) - ts-node@10.9.2(@swc/core@1.12.1)(@types/node@22.15.32)(typescript@5.8.3): + ts-node@10.9.2(@swc/core@1.12.11)(@types/node@22.16.2)(typescript@5.8.3): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 22.15.32 + '@types/node': 22.16.2 acorn: 8.15.0 acorn-walk: 8.3.4 arg: 4.1.3 @@ -16075,7 +22091,7 @@ snapshots: v8-compile-cache-lib: 3.0.1 yn: 3.1.1 optionalDependencies: - '@swc/core': 1.12.1 + '@swc/core': 1.12.11 ts-toolbelt@9.6.0: {} @@ -16114,9 +22130,38 @@ snapshots: '@tsparticles/updater-twinkle': 3.8.1 '@tsparticles/updater-wobble': 3.8.1 + tsup@8.5.0(@swc/core@1.12.11)(jiti@2.4.2)(postcss@8.5.6)(tsx@4.20.3)(typescript@5.8.3)(yaml@2.8.0): + dependencies: + bundle-require: 5.1.0(esbuild@0.25.6) + cac: 6.7.14 + chokidar: 4.0.3 + consola: 3.4.2 + debug: 4.4.1 + esbuild: 0.25.6 + fix-dts-default-cjs-exports: 1.0.1 + joycon: 3.1.1 + picocolors: 1.1.1 + postcss-load-config: 6.0.1(jiti@2.4.2)(postcss@8.5.6)(tsx@4.20.3)(yaml@2.8.0) + resolve-from: 5.0.0 + rollup: 4.44.2 + source-map: 0.8.0-beta.0 + sucrase: 3.35.0 + tinyexec: 0.3.2 + tinyglobby: 0.2.14 + tree-kill: 1.2.2 + optionalDependencies: + '@swc/core': 1.12.11 + postcss: 8.5.6 + typescript: 5.8.3 + transitivePeerDependencies: + - jiti + - supports-color + - tsx + - yaml + tsx@4.20.3: dependencies: - esbuild: 0.25.5 + esbuild: 0.25.6 get-tsconfig: 4.10.1 optionalDependencies: fsevents: 2.3.3 @@ -16132,6 +22177,8 @@ snapshots: type-fest@0.13.1: optional: true + type-fest@2.19.0: {} + typed-array-buffer@1.0.3: dependencies: call-bound: 1.0.4 @@ -16165,12 +22212,12 @@ snapshots: possible-typed-array-names: 1.1.0 reflect.getprototypeof: 1.0.10 - typescript-eslint@8.34.1(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3): + typescript-eslint@8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.34.1(@typescript-eslint/parser@8.34.1(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3) - '@typescript-eslint/parser': 8.34.1(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3) - '@typescript-eslint/utils': 8.34.1(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3) - eslint: 9.29.0(jiti@2.4.2) + '@typescript-eslint/eslint-plugin': 8.36.0(@typescript-eslint/parser@8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3))(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/parser': 8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/utils': 8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) + eslint: 9.30.1(jiti@2.4.2) typescript: 5.8.3 transitivePeerDependencies: - supports-color @@ -16201,6 +22248,8 @@ snapshots: undici-types@6.21.0: {} + undici-types@7.8.0: {} + undici@6.19.7: {} unicode-canonical-property-names-ecmascript@2.0.1: {} @@ -16224,9 +22273,6 @@ snapshots: universalify@0.1.2: {} - universalify@0.2.0: - optional: true - universalify@2.0.1: {} unplugin@1.16.1: @@ -16236,29 +22282,29 @@ snapshots: unquote@1.1.1: {} - unrs-resolver@1.9.1: + unrs-resolver@1.11.0: dependencies: - napi-postinstall: 0.2.4 + napi-postinstall: 0.3.0 optionalDependencies: - '@unrs/resolver-binding-android-arm-eabi': 1.9.1 - '@unrs/resolver-binding-android-arm64': 1.9.1 - '@unrs/resolver-binding-darwin-arm64': 1.9.1 - '@unrs/resolver-binding-darwin-x64': 1.9.1 - '@unrs/resolver-binding-freebsd-x64': 1.9.1 - '@unrs/resolver-binding-linux-arm-gnueabihf': 1.9.1 - '@unrs/resolver-binding-linux-arm-musleabihf': 1.9.1 - '@unrs/resolver-binding-linux-arm64-gnu': 1.9.1 - '@unrs/resolver-binding-linux-arm64-musl': 1.9.1 - '@unrs/resolver-binding-linux-ppc64-gnu': 1.9.1 - '@unrs/resolver-binding-linux-riscv64-gnu': 1.9.1 - '@unrs/resolver-binding-linux-riscv64-musl': 1.9.1 - '@unrs/resolver-binding-linux-s390x-gnu': 1.9.1 - '@unrs/resolver-binding-linux-x64-gnu': 1.9.1 - '@unrs/resolver-binding-linux-x64-musl': 1.9.1 - '@unrs/resolver-binding-wasm32-wasi': 1.9.1 - '@unrs/resolver-binding-win32-arm64-msvc': 1.9.1 - '@unrs/resolver-binding-win32-ia32-msvc': 1.9.1 - '@unrs/resolver-binding-win32-x64-msvc': 1.9.1 + '@unrs/resolver-binding-android-arm-eabi': 1.11.0 + '@unrs/resolver-binding-android-arm64': 1.11.0 + '@unrs/resolver-binding-darwin-arm64': 1.11.0 + '@unrs/resolver-binding-darwin-x64': 1.11.0 + '@unrs/resolver-binding-freebsd-x64': 1.11.0 + '@unrs/resolver-binding-linux-arm-gnueabihf': 1.11.0 + '@unrs/resolver-binding-linux-arm-musleabihf': 1.11.0 + '@unrs/resolver-binding-linux-arm64-gnu': 1.11.0 + '@unrs/resolver-binding-linux-arm64-musl': 1.11.0 + '@unrs/resolver-binding-linux-ppc64-gnu': 1.11.0 + '@unrs/resolver-binding-linux-riscv64-gnu': 1.11.0 + '@unrs/resolver-binding-linux-riscv64-musl': 1.11.0 + '@unrs/resolver-binding-linux-s390x-gnu': 1.11.0 + '@unrs/resolver-binding-linux-x64-gnu': 1.11.0 + '@unrs/resolver-binding-linux-x64-musl': 1.11.0 + '@unrs/resolver-binding-wasm32-wasi': 1.11.0 + '@unrs/resolver-binding-win32-arm64-msvc': 1.11.0 + '@unrs/resolver-binding-win32-ia32-msvc': 1.11.0 + '@unrs/resolver-binding-win32-x64-msvc': 1.11.0 unstorage@1.16.0(idb-keyval@6.2.2): dependencies: @@ -16275,9 +22321,9 @@ snapshots: unzip-response@2.0.1: {} - update-browserslist-db@1.1.3(browserslist@4.25.0): + update-browserslist-db@1.1.3(browserslist@4.25.1): dependencies: - browserslist: 4.25.0 + browserslist: 4.25.1 escalade: 3.2.0 picocolors: 1.1.1 @@ -16305,7 +22351,7 @@ snapshots: loader-utils: 2.0.4 mime-types: 2.1.35 schema-utils: 3.3.0 - webpack: 5.99.9(@swc/core@1.12.1)(esbuild@0.25.5)(webpack-cli@4.10.0) + webpack: 5.99.9(@swc/core@1.12.11)(esbuild@0.25.6)(webpack-cli@4.10.0) optionalDependencies: file-loader: 6.2.0(webpack@5.99.9) @@ -16313,12 +22359,6 @@ snapshots: dependencies: prepend-http: 1.0.4 - url-parse@1.5.10: - dependencies: - querystringify: 2.2.0 - requires-port: 1.0.0 - optional: true - use-debounce@10.0.5(react@18.3.1): dependencies: react: 18.3.1 @@ -16327,11 +22367,6 @@ snapshots: dependencies: react: 18.3.1 - utf-8-validate@5.0.10: - dependencies: - node-gyp-build: 4.8.4 - optional: true - utf8@3.0.0: {} util-deprecate@1.0.2: {} @@ -16393,16 +22428,16 @@ snapshots: d3-time: 3.1.0 d3-timer: 3.0.1 - viem@2.31.0(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67): + viem@2.31.0(typescript@5.8.3)(zod@3.25.76): dependencies: '@noble/curves': 1.9.1 '@noble/hashes': 1.8.0 '@scure/bip32': 1.7.0 '@scure/bip39': 1.6.0 - abitype: 1.0.8(typescript@5.8.3)(zod@3.25.67) - isows: 1.0.7(ws@8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)) - ox: 0.7.1(typescript@5.8.3)(zod@3.25.67) - ws: 8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10) + abitype: 1.0.8(typescript@5.8.3)(zod@3.25.76) + isows: 1.0.7(ws@8.18.2) + ox: 0.7.1(typescript@5.8.3)(zod@3.25.76) + ws: 8.18.2 optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: @@ -16410,13 +22445,13 @@ snapshots: - utf-8-validate - zod - vite-node@3.2.4(@types/node@22.15.32)(jiti@2.4.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0): + vite-node@3.2.4(@types/node@22.16.0)(jiti@2.4.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0): dependencies: cac: 6.7.14 debug: 4.4.1 es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 6.3.5(@types/node@22.15.32)(jiti@2.4.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0) + vite: 7.0.3(@types/node@22.16.0)(jiti@2.4.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0) transitivePeerDependencies: - '@types/node' - jiti @@ -16431,35 +22466,72 @@ snapshots: - tsx - yaml - vite@6.3.5(@types/node@22.15.32)(jiti@2.4.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0): + vite-node@3.2.4(@types/node@22.16.2)(jiti@2.4.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0): + dependencies: + cac: 6.7.14 + debug: 4.4.1 + es-module-lexer: 1.7.0 + pathe: 2.0.3 + vite: 7.0.3(@types/node@22.16.2)(jiti@2.4.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0) + transitivePeerDependencies: + - '@types/node' + - jiti + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml + + vite@7.0.3(@types/node@22.16.0)(jiti@2.4.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0): + dependencies: + esbuild: 0.25.6 + fdir: 6.4.6(picomatch@4.0.2) + picomatch: 4.0.2 + postcss: 8.5.6 + rollup: 4.44.2 + tinyglobby: 0.2.14 + optionalDependencies: + '@types/node': 22.16.0 + fsevents: 2.3.3 + jiti: 2.4.2 + terser: 5.43.1 + tsx: 4.20.3 + yaml: 2.8.0 + + vite@7.0.3(@types/node@22.16.2)(jiti@2.4.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0): dependencies: - esbuild: 0.25.5 + esbuild: 0.25.6 fdir: 6.4.6(picomatch@4.0.2) picomatch: 4.0.2 postcss: 8.5.6 - rollup: 4.44.0 + rollup: 4.44.2 tinyglobby: 0.2.14 optionalDependencies: - '@types/node': 22.15.32 + '@types/node': 22.16.2 fsevents: 2.3.3 jiti: 2.4.2 terser: 5.43.1 tsx: 4.20.3 yaml: 2.8.0 - vitest@3.2.4(@types/debug@4.1.12)(@types/node@22.15.32)(jiti@2.4.2)(jsdom@16.7.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0): + vitest@3.2.4(@types/debug@4.1.12)(@types/node@22.16.0)(jiti@2.4.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0): dependencies: '@types/chai': 5.2.2 '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(vite@6.3.5(@types/node@22.15.32)(jiti@2.4.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)) + '@vitest/mocker': 3.2.4(vite@7.0.3(@types/node@22.16.0)(jiti@2.4.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)) '@vitest/pretty-format': 3.2.4 '@vitest/runner': 3.2.4 '@vitest/snapshot': 3.2.4 '@vitest/spy': 3.2.4 '@vitest/utils': 3.2.4 - chai: 5.2.0 + chai: 5.2.1 debug: 4.4.1 - expect-type: 1.2.1 + expect-type: 1.2.2 magic-string: 0.30.17 pathe: 2.0.3 picomatch: 4.0.2 @@ -16469,13 +22541,54 @@ snapshots: tinyglobby: 0.2.14 tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 6.3.5(@types/node@22.15.32)(jiti@2.4.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0) - vite-node: 3.2.4(@types/node@22.15.32)(jiti@2.4.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0) + vite: 7.0.3(@types/node@22.16.0)(jiti@2.4.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0) + vite-node: 3.2.4(@types/node@22.16.0)(jiti@2.4.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0) why-is-node-running: 2.3.0 optionalDependencies: '@types/debug': 4.1.12 - '@types/node': 22.15.32 - jsdom: 16.7.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@types/node': 22.16.0 + transitivePeerDependencies: + - jiti + - less + - lightningcss + - msw + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml + + vitest@3.2.4(@types/debug@4.1.12)(@types/node@22.16.2)(jiti@2.4.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0): + dependencies: + '@types/chai': 5.2.2 + '@vitest/expect': 3.2.4 + '@vitest/mocker': 3.2.4(vite@7.0.3(@types/node@22.16.2)(jiti@2.4.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)) + '@vitest/pretty-format': 3.2.4 + '@vitest/runner': 3.2.4 + '@vitest/snapshot': 3.2.4 + '@vitest/spy': 3.2.4 + '@vitest/utils': 3.2.4 + chai: 5.2.1 + debug: 4.4.1 + expect-type: 1.2.2 + magic-string: 0.30.17 + pathe: 2.0.3 + picomatch: 4.0.2 + std-env: 3.9.0 + tinybench: 2.9.0 + tinyexec: 0.3.2 + tinyglobby: 0.2.14 + tinypool: 1.1.1 + tinyrainbow: 2.0.0 + vite: 7.0.3(@types/node@22.16.2)(jiti@2.4.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0) + vite-node: 3.2.4(@types/node@22.16.2)(jiti@2.4.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/debug': 4.1.12 + '@types/node': 22.16.2 transitivePeerDependencies: - jiti - less @@ -16494,28 +22607,18 @@ snapshots: void-elements@3.1.0: {} - w3c-hr-time@1.0.2: - dependencies: - browser-process-hrtime: 1.0.0 - optional: true - - w3c-xmlserializer@2.0.0: - dependencies: - xml-name-validator: 3.0.0 - optional: true - watchpack@2.4.4: dependencies: glob-to-regexp: 0.4.1 graceful-fs: 4.2.11 - web3-core@4.7.1(bufferutil@4.0.9)(utf-8-validate@5.0.10): + web3-core@4.7.1: dependencies: web3-errors: 1.3.1 web3-eth-accounts: 4.3.1 web3-eth-iban: 4.0.7 web3-providers-http: 4.2.0 - web3-providers-ws: 4.0.8(bufferutil@4.0.9)(utf-8-validate@5.0.10) + web3-providers-ws: 4.0.8 web3-types: 1.10.0 web3-utils: 4.3.3 web3-validator: 2.0.6 @@ -16530,9 +22633,9 @@ snapshots: dependencies: web3-types: 1.10.0 - web3-eth-abi@4.4.1(typescript@5.8.3)(zod@3.25.67): + web3-eth-abi@4.4.1(typescript@5.8.3)(zod@3.25.76): dependencies: - abitype: 0.7.1(typescript@5.8.3)(zod@3.25.67) + abitype: 0.7.1(typescript@5.8.3)(zod@3.25.76) web3-errors: 1.3.1 web3-types: 1.10.0 web3-utils: 4.3.3 @@ -16551,13 +22654,13 @@ snapshots: web3-utils: 4.3.3 web3-validator: 2.0.6 - web3-eth-contract@4.7.2(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67): + web3-eth-contract@4.7.2(typescript@5.8.3)(zod@3.25.76): dependencies: '@ethereumjs/rlp': 5.0.2 - web3-core: 4.7.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) + web3-core: 4.7.1 web3-errors: 1.3.1 - web3-eth: 4.11.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) - web3-eth-abi: 4.4.1(typescript@5.8.3)(zod@3.25.67) + web3-eth: 4.11.1(typescript@5.8.3)(zod@3.25.76) + web3-eth-abi: 4.4.1(typescript@5.8.3)(zod@3.25.76) web3-types: 1.10.0 web3-utils: 4.3.3 web3-validator: 2.0.6 @@ -16568,14 +22671,14 @@ snapshots: - utf-8-validate - zod - web3-eth-ens@4.4.0(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67): + web3-eth-ens@4.4.0(typescript@5.8.3)(zod@3.25.76): dependencies: '@adraffy/ens-normalize': 1.11.0 - web3-core: 4.7.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) + web3-core: 4.7.1 web3-errors: 1.3.1 - web3-eth: 4.11.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) - web3-eth-contract: 4.7.2(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) - web3-net: 4.1.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + web3-eth: 4.11.1(typescript@5.8.3)(zod@3.25.76) + web3-eth-contract: 4.7.2(typescript@5.8.3)(zod@3.25.76) + web3-net: 4.1.0 web3-types: 1.10.0 web3-utils: 4.3.3 web3-validator: 2.0.6 @@ -16593,11 +22696,11 @@ snapshots: web3-utils: 4.3.3 web3-validator: 2.0.6 - web3-eth-personal@4.1.0(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67): + web3-eth-personal@4.1.0(typescript@5.8.3)(zod@3.25.76): dependencies: - web3-core: 4.7.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) - web3-eth: 4.11.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) - web3-rpc-methods: 1.3.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + web3-core: 4.7.1 + web3-eth: 4.11.1(typescript@5.8.3)(zod@3.25.76) + web3-rpc-methods: 1.3.0 web3-types: 1.10.0 web3-utils: 4.3.3 web3-validator: 2.0.6 @@ -16608,16 +22711,16 @@ snapshots: - utf-8-validate - zod - web3-eth@4.11.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67): + web3-eth@4.11.1(typescript@5.8.3)(zod@3.25.76): dependencies: setimmediate: 1.0.5 - web3-core: 4.7.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) + web3-core: 4.7.1 web3-errors: 1.3.1 - web3-eth-abi: 4.4.1(typescript@5.8.3)(zod@3.25.67) + web3-eth-abi: 4.4.1(typescript@5.8.3)(zod@3.25.76) web3-eth-accounts: 4.3.1 - web3-net: 4.1.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - web3-providers-ws: 4.0.8(bufferutil@4.0.9)(utf-8-validate@5.0.10) - web3-rpc-methods: 1.3.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + web3-net: 4.1.0 + web3-providers-ws: 4.0.8 + web3-rpc-methods: 1.3.0 web3-types: 1.10.0 web3-utils: 4.3.3 web3-validator: 2.0.6 @@ -16628,10 +22731,10 @@ snapshots: - utf-8-validate - zod - web3-net@4.1.0(bufferutil@4.0.9)(utf-8-validate@5.0.10): + web3-net@4.1.0: dependencies: - web3-core: 4.7.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) - web3-rpc-methods: 1.3.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + web3-core: 4.7.1 + web3-rpc-methods: 1.3.0 web3-types: 1.10.0 web3-utils: 4.3.3 transitivePeerDependencies: @@ -16655,21 +22758,21 @@ snapshots: web3-utils: 4.3.3 optional: true - web3-providers-ws@4.0.8(bufferutil@4.0.9)(utf-8-validate@5.0.10): + web3-providers-ws@4.0.8: dependencies: '@types/ws': 8.5.3 - isomorphic-ws: 5.0.0(ws@8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + isomorphic-ws: 5.0.0(ws@8.18.3) web3-errors: 1.3.1 web3-types: 1.10.0 web3-utils: 4.3.3 - ws: 8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10) + ws: 8.18.3 transitivePeerDependencies: - bufferutil - utf-8-validate - web3-rpc-methods@1.3.0(bufferutil@4.0.9)(utf-8-validate@5.0.10): + web3-rpc-methods@1.3.0: dependencies: - web3-core: 4.7.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) + web3-core: 4.7.1 web3-types: 1.10.0 web3-validator: 2.0.6 transitivePeerDependencies: @@ -16677,11 +22780,11 @@ snapshots: - encoding - utf-8-validate - web3-rpc-providers@1.0.0-rc.4(bufferutil@4.0.9)(utf-8-validate@5.0.10): + web3-rpc-providers@1.0.0-rc.4: dependencies: web3-errors: 1.3.1 web3-providers-http: 4.2.0 - web3-providers-ws: 4.0.8(bufferutil@4.0.9)(utf-8-validate@5.0.10) + web3-providers-ws: 4.0.8 web3-types: 1.10.0 web3-utils: 4.3.3 web3-validator: 2.0.6 @@ -16706,24 +22809,24 @@ snapshots: util: 0.12.5 web3-errors: 1.3.1 web3-types: 1.10.0 - zod: 3.25.67 + zod: 3.25.76 - web3@4.16.0(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67): + web3@4.16.0(typescript@5.8.3)(zod@3.25.76): dependencies: - web3-core: 4.7.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) + web3-core: 4.7.1 web3-errors: 1.3.1 - web3-eth: 4.11.1(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) - web3-eth-abi: 4.4.1(typescript@5.8.3)(zod@3.25.67) + web3-eth: 4.11.1(typescript@5.8.3)(zod@3.25.76) + web3-eth-abi: 4.4.1(typescript@5.8.3)(zod@3.25.76) web3-eth-accounts: 4.3.1 - web3-eth-contract: 4.7.2(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) - web3-eth-ens: 4.4.0(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) + web3-eth-contract: 4.7.2(typescript@5.8.3)(zod@3.25.76) + web3-eth-ens: 4.4.0(typescript@5.8.3)(zod@3.25.76) web3-eth-iban: 4.0.7 - web3-eth-personal: 4.1.0(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67) - web3-net: 4.1.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + web3-eth-personal: 4.1.0(typescript@5.8.3)(zod@3.25.76) + web3-net: 4.1.0 web3-providers-http: 4.2.0 - web3-providers-ws: 4.0.8(bufferutil@4.0.9)(utf-8-validate@5.0.10) - web3-rpc-methods: 1.3.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - web3-rpc-providers: 1.0.0-rc.4(bufferutil@4.0.9)(utf-8-validate@5.0.10) + web3-providers-ws: 4.0.8 + web3-rpc-methods: 1.3.0 + web3-rpc-providers: 1.0.0-rc.4 web3-types: 1.10.0 web3-utils: 4.3.3 web3-validator: 2.0.6 @@ -16738,11 +22841,7 @@ snapshots: webidl-conversions@3.0.1: {} - webidl-conversions@5.0.0: - optional: true - - webidl-conversions@6.1.0: - optional: true + webidl-conversions@4.0.2: {} webpack-cli@4.10.0(webpack@5.99.9): dependencies: @@ -16757,7 +22856,7 @@ snapshots: import-local: 3.2.0 interpret: 2.2.0 rechoir: 0.7.1 - webpack: 5.99.9(@swc/core@1.12.1)(esbuild@0.25.5)(webpack-cli@4.10.0) + webpack: 5.99.9(@swc/core@1.12.11)(esbuild@0.25.6)(webpack-cli@4.10.0) webpack-merge: 5.10.0 webpack-dev-middleware@6.1.3(webpack@5.99.9): @@ -16768,7 +22867,7 @@ snapshots: range-parser: 1.2.1 schema-utils: 4.3.2 optionalDependencies: - webpack: 5.99.9(@swc/core@1.12.1)(esbuild@0.25.5)(webpack-cli@4.10.0) + webpack: 5.99.9(@swc/core@1.12.11)(esbuild@0.25.6)(webpack-cli@4.10.0) webpack-hot-middleware@2.26.1: dependencies: @@ -16786,7 +22885,7 @@ snapshots: webpack-virtual-modules@0.6.2: {} - webpack@5.99.9(@swc/core@1.12.1)(esbuild@0.25.5)(webpack-cli@4.10.0): + webpack@5.99.9(@swc/core@1.12.11)(esbuild@0.25.6)(webpack-cli@4.10.0): dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.8 @@ -16795,9 +22894,9 @@ snapshots: '@webassemblyjs/wasm-edit': 1.14.1 '@webassemblyjs/wasm-parser': 1.14.1 acorn: 8.15.0 - browserslist: 4.25.0 + browserslist: 4.25.1 chrome-trace-event: 1.0.4 - enhanced-resolve: 5.18.1 + enhanced-resolve: 5.18.2 es-module-lexer: 1.7.0 eslint-scope: 5.1.1 events: 3.3.0 @@ -16809,7 +22908,7 @@ snapshots: neo-async: 2.6.2 schema-utils: 4.3.2 tapable: 2.2.2 - terser-webpack-plugin: 5.3.14(@swc/core@1.12.1)(esbuild@0.25.5)(webpack@5.99.9) + terser-webpack-plugin: 5.3.14(@swc/core@1.12.11)(esbuild@0.25.6)(webpack@5.99.9) watchpack: 2.4.4 webpack-sources: 3.3.3 optionalDependencies: @@ -16827,25 +22926,16 @@ snapshots: websocket-extensions@0.1.4: {} - whatwg-encoding@1.0.5: - dependencies: - iconv-lite: 0.4.24 - optional: true - - whatwg-mimetype@2.3.0: - optional: true - whatwg-url@5.0.0: dependencies: tr46: 0.0.3 webidl-conversions: 3.0.1 - whatwg-url@8.7.0: + whatwg-url@7.1.0: dependencies: - lodash: 4.17.21 - tr46: 2.1.0 - webidl-conversions: 6.1.0 - optional: true + lodash.sortby: 4.7.0 + tr46: 1.0.1 + webidl-conversions: 4.0.2 which-boxed-primitive@1.1.1: dependencies: @@ -16943,28 +23033,15 @@ snapshots: imurmurhash: 0.1.4 signal-exit: 3.0.7 - ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10): - optionalDependencies: - bufferutil: 4.0.9 - utf-8-validate: 5.0.10 + ws@7.5.10: {} - ws@8.17.1(bufferutil@4.0.9)(utf-8-validate@5.0.10): - optionalDependencies: - bufferutil: 4.0.9 - utf-8-validate: 5.0.10 + ws@8.17.1: {} - ws@8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10): - optionalDependencies: - bufferutil: 4.0.9 - utf-8-validate: 5.0.10 + ws@8.18.2: {} - xdg-basedir@3.0.0: {} + ws@8.18.3: {} - xml-name-validator@3.0.0: - optional: true - - xmlchars@2.2.0: - optional: true + xdg-basedir@3.0.0: {} xtend@4.0.2: {} @@ -16976,8 +23053,6 @@ snapshots: yallist@3.1.1: {} - yallist@4.0.0: {} - yaml@1.10.2: {} yaml@2.8.0: {} @@ -17033,6 +23108,6 @@ snapshots: async: 3.2.6 jszip: 3.10.1 - zod@3.25.67: {} + zod@3.25.76: {} zxcvbn@4.4.2: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml new file mode 100644 index 000000000..7bdfdb2cb --- /dev/null +++ b/pnpm-workspace.yaml @@ -0,0 +1,16 @@ +packages: + - 'apps/*' + - 'packages/*' + +onlyBuiltDependencies: + - '@swc/core' + - '@tsparticles/engine' + - bufferutil + - electron + - esbuild + - keccak + - protobufjs + - secp256k1 + - storybook-addon-remix-react-router + - unrs-resolver + - utf-8-validate diff --git a/src/background/service/i18n.ts b/src/background/service/i18n.ts deleted file mode 100644 index a05b13547..000000000 --- a/src/background/service/i18n.ts +++ /dev/null @@ -1,39 +0,0 @@ -import i18n from 'i18next'; - -import messages from '../../messages.json'; - -export const fetchLocale = async (locale) => { - const res = messages; - const data = res; - return Object.keys(data).reduce((res, key) => { - return { - ...res, - [key.replace(/__/g, ' ')]: data[key].message, - }; - }, {}); -}; - -i18n.init({ - fallbackLng: 'en', - defaultNS: 'translations', - interpolation: { - escapeValue: false, // react already safes from xss - }, -}); - -export const I18N_NS = 'translations'; - -export const addResourceBundle = async (locale: string) => { - if (i18n.hasResourceBundle(locale, I18N_NS)) return; - const bundle = await fetchLocale(locale); - - i18n.addResourceBundle(locale, 'translations', bundle); -}; - -addResourceBundle('en'); - -i18n.on('languageChanged', function (lng) { - addResourceBundle(lng); -}); - -export default i18n; diff --git a/src/background/service/pageStateCache.ts b/src/background/service/pageStateCache.ts deleted file mode 100644 index c4b7d8222..000000000 --- a/src/background/service/pageStateCache.ts +++ /dev/null @@ -1,65 +0,0 @@ -import { createPersistStore } from 'background/utils'; - -export interface CacheState { - path: string; - params: Record; - states: Record; -} - -interface CacheStore { - cache: CacheState | null; - hasCache: boolean; -} - -class PageStateCacheService { - store: CacheStore | null = null; - - init = async () => { - this.store = await createPersistStore({ - name: 'pageStateCache', - template: { - cache: { - path: '', - params: {}, - states: {}, - }, - hasCache: false, - }, - }); - }; - - has = () => { - if (!this.store) return false; - - return this.store.hasCache; - }; - - get = (): CacheState | null => { - if (!this.store) return null; - - if (this.has()) { - return this.store.cache!; - } - - return null; - }; - - set = (cache: CacheState) => { - if (!this.store) return; - this.store.cache = cache; - this.store.hasCache = true; - }; - - clear = () => { - if (!this.store) return; - - this.store.cache = { - path: '', - params: {}, - states: {}, - }; - this.store.hasCache = false; - }; -} - -export default new PageStateCacheService(); diff --git a/src/background/service/permission.ts b/src/background/service/permission.ts deleted file mode 100644 index d97357385..000000000 --- a/src/background/service/permission.ts +++ /dev/null @@ -1,176 +0,0 @@ -import { max } from 'lodash'; -import LRU from 'lru-cache'; - -import { MAINNET_CHAIN_ID } from '@/shared/types/network-types'; -import { createPersistStore } from 'background/utils'; -import { INTERNAL_REQUEST_ORIGIN } from 'consts'; - -export interface ConnectedSite { - origin: string; - icon: string; - name: string; - chain?: number; - e?: number; - isSigned: boolean; - isTop: boolean; - isConnected?: boolean; - order?: number; -} - -export type PermissionStore = { - dumpCache: ReadonlyArray>; -}; - -class PermissionService { - store: PermissionStore = { - dumpCache: [], - }; - lruCache: LRU | undefined; - - init = async () => { - this.store = await createPersistStore({ - name: 'permission', - template: { - dumpCache: [], - }, - }); - - // @todo add a size limit to the LRU cache - // We're creating a new LRU cache here with no size limit. - // That's the whole point of the LRU cache. - - this.lruCache = new LRU(); - const cache: ReadonlyArray> = (this.store.dumpCache || []).map( - (item) => ({ - k: item.k, - v: item.v, - e: 0, - }) - ); - this.lruCache.load(cache); - }; - - sync = () => { - if (!this.lruCache) return; - this.store.dumpCache = this.lruCache.dump(); - }; - - getWithoutUpdate = (key: string) => { - if (!this.lruCache) return; - - return this.lruCache.peek(key); - }; - - addConnectedSite = ( - origin: string, - name: string, - icon: string, - defaultChain = MAINNET_CHAIN_ID, - isSigned = false - ) => { - if (!this.lruCache) return; - this.lruCache.set(origin, { - origin, - name, - icon, - chain: defaultChain, - isSigned, - isTop: false, - }); - this.sync(); - }; - - touchConnectedSite = (origin) => { - if (!this.lruCache) return; - if (origin === INTERNAL_REQUEST_ORIGIN) return; - this.lruCache.get(origin); - this.sync(); - }; - - updateConnectSite = (origin: string, value: Partial, partialUpdate?: boolean) => { - if (!this.lruCache || !this.lruCache.has(origin)) return; - if (origin === INTERNAL_REQUEST_ORIGIN) return; - - if (partialUpdate) { - const _value = this.lruCache.get(origin); - this.lruCache.set(origin, { ..._value, ...value } as ConnectedSite); - } else { - this.lruCache.set(origin, value as ConnectedSite); - } - - this.sync(); - }; - - hasPermission = (origin) => { - if (!this.lruCache) return; - if (origin === INTERNAL_REQUEST_ORIGIN) return true; - - return this.lruCache.has(origin); - }; - - setRecentConnectedSites = (sites: ConnectedSite[]) => { - this.lruCache?.load( - sites.map((item) => ({ - e: 0, - k: item.origin, - v: item, - })) - ); - this.sync(); - }; - - getRecentConnectedSites = () => { - const sites = this.lruCache?.values() || []; - const pinnedSites = sites - .filter((item) => item?.isTop) - .sort((a, b) => (a.order || 0) - (b.order || 0)); - const recentSites = sites.filter((item) => !item.isTop); - return [...pinnedSites, ...recentSites]; - }; - - getConnectedSites = () => { - return this.lruCache?.values() || []; - }; - - getConnectedSite = (key: string) => { - return this.lruCache?.get(key); - }; - - topConnectedSite = (origin: string, order?: number) => { - const site = this.getConnectedSite(origin); - if (!site || !this.lruCache) return; - order = order ?? (max(this.getRecentConnectedSites().map((item) => item.order)) || 0) + 1; - this.updateConnectSite(origin, { - ...site, - order, - isTop: true, - }); - }; - - unpinConnectedSite = (origin: string) => { - const site = this.getConnectedSite(origin); - if (!site || !this.lruCache) return; - this.updateConnectSite(origin, { - ...site, - isTop: false, - }); - }; - - removeConnectedSite = (origin: string) => { - if (!this.lruCache) return; - - this.lruCache.del(origin); - this.sync(); - }; - - // getSitesByDefaultChain = (chain: CHAINS_ENUM) => { - // if (!this.lruCache) return []; - // return this.lruCache.values().filter((item) => item.chain === chain); - // }; - - isInternalOrigin = (origin: string) => { - return origin === INTERNAL_REQUEST_ORIGIN; - }; -} - -export default new PermissionService(); diff --git a/src/background/webapi/index.ts b/src/background/webapi/index.ts deleted file mode 100644 index 065973b0f..000000000 --- a/src/background/webapi/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -export { default as storage } from '../../shared/utils/storage'; -export { default as tab } from './tab'; -export { default as winMgr } from './window'; -export { default as notification } from './notification'; diff --git a/src/constant/index.ts b/src/constant/index.ts deleted file mode 100644 index 4d8e49202..000000000 --- a/src/constant/index.ts +++ /dev/null @@ -1,172 +0,0 @@ -import { CHAINS, CHAINS_ENUM, Chain } from '@debank/common'; - -import IconEN from 'ui/assets/langs/en.svg'; - -export { CHAINS, CHAINS_ENUM }; - -export const KEYRING_TYPE = { - HdKeyring: 'HD Key Tree', - SimpleKeyring: 'Simple Key Pair', - HardwareKeyring: 'hardware', - WatchAddressKeyring: 'Watch Address', - WalletConnectKeyring: 'WalletConnect', - GnosisKeyring: 'Gnosis', -}; - -export const KEYRING_CLASS = { - PRIVATE_KEY: 'Simple Key Pair', - MNEMONIC: 'HD Key Tree', - HARDWARE: { - TREZOR: 'Trezor Hardware', - LEDGER: 'Ledger Hardware', - ONEKEY: 'Onekey Hardware', - GRIDPLUS: 'GridPlus Hardware', - }, - WATCH: 'Watch Address', - WALLETCONNECT: 'WalletConnect', - GNOSIS: 'Gnosis', -}; - -export const SAFE_RPC_METHODS = [ - 'eth_blockNumber', - 'eth_call', - 'eth_chainId', - 'eth_coinbase', - 'eth_decrypt', - 'eth_estimateGas', - 'eth_gasPrice', - 'eth_getBalance', - 'eth_getBlockByHash', - 'eth_getBlockByNumber', - 'eth_getBlockTransactionCountByHash', - 'eth_getBlockTransactionCountByNumber', - 'eth_getCode', - 'eth_getEncryptionPublicKey', - 'eth_getFilterChanges', - 'eth_getFilterLogs', - 'eth_getLogs', - 'eth_getProof', - 'eth_getStorageAt', - 'eth_getTransactionByBlockHashAndIndex', - 'eth_getTransactionByBlockNumberAndIndex', - 'eth_getTransactionByHash', - 'eth_getTransactionCount', - 'eth_getTransactionReceipt', - 'eth_getUncleByBlockHashAndIndex', - 'eth_getUncleByBlockNumberAndIndex', - 'eth_getUncleCountByBlockHash', - 'eth_getUncleCountByBlockNumber', - 'eth_getWork', - 'eth_hashrate', - 'eth_mining', - 'eth_newBlockFilter', - 'eth_newFilter', - 'eth_newPendingTransactionFilter', - 'eth_protocolVersion', - 'eth_sendRawTransaction', - 'eth_sendTransaction', - 'eth_submitHashrate', - 'eth_submitWork', - 'eth_syncing', - 'eth_uninstallFilter', - 'eth_signTypedData', - 'eth_signTypedData_v3', - 'eth_signTypedData_v4', - 'wallet_requestPermissions', - 'wallet_getPermissions', - 'wallet_revokePermissions', - 'wallet_switchEthereumChain', - 'wallet_watchAsset', - 'net_version', -]; - -export const IS_CHROME = /Chrome\//i.test(navigator.userAgent); - -export const IS_FIREFOX = /Firefox\//i.test(navigator.userAgent); - -export const IS_LINUX = /linux/i.test(navigator.userAgent); - -let chromeVersion: number | null = null; - -if (IS_CHROME) { - const matches = navigator.userAgent.match(/Chrome\/(\d+[^.\s])/); - if (matches && matches.length >= 2) { - chromeVersion = Number(matches[1]); - } -} - -export const IS_AFTER_CHROME94 = IS_CHROME ? chromeVersion && chromeVersion >= 94 : false; - -export const GAS_LEVEL_TEXT = { - slow: 'Standard', - normal: 'Fast', - fast: 'Instant', - custom: 'Custom', -}; - -export const IS_WINDOWS = /windows/i.test(navigator.userAgent); - -export const LANGS = [ - { - value: 'en', - label: 'English', - icon: IconEN, - }, -]; - -export const CHECK_METAMASK_INSTALLED_URL = { - Chrome: 'chrome-extension://nkbihfbeogaeaoehlefnkodbefgpgknn/phishing.html', - Firefox: '', - Brave: '', - Edge: '', -}; - -export const WALLETCONNECT_STATUS_MAP = { - PENDING: 1, - CONNECTED: 2, - WAITING: 3, - SIBMITTED: 4, - REJECTED: 5, - FAILD: 6, -}; - -export const INTERNAL_REQUEST_ORIGIN = 'https://core.flow.com'; - -export const INTERNAL_REQUEST_SESSION = { - name: 'Flow Wallet', - origin: INTERNAL_REQUEST_ORIGIN, - icon: './images/icon-128.png', -}; - -export const INITIAL_OPENAPI_URL = process.env.API_GO_SERVER_URL!; - -export const WEB_NEXT_URL = process.env.API_BASE_URL!; -// export const INITIAL_OPENAPI_URL = 'http://localhost:4747'; - -// export const INITIAL_OPENAPI_URL = process.env.INITIAL_OPENAPI_URL!; -// export const WEB_NEXT_URL = process.env.WEB_NEXT_URL!; - -export const EVENTS = { - walletIntialized: 'walletIntialized', - broadcastToUI: 'broadcastToUI', - broadcastToBackground: 'broadcastToBackground', - UIToBackground: 'UIToBackground', - SIGN_FINISHED: 'SIGN_FINISHED', - WALLETCONNECT: { - STATUS_CHANGED: 'WALLETCONNECT_STATUS_CHANGED', - INIT: 'WALLETCONNECT_INIT', - INITED: 'WALLETCONNECT_INITED', - }, - GNOSIS: { - TX_BUILT: 'TransactionBuilt', - TX_CONFIRMED: 'TransactionConfirmed', - }, -}; - -export const EVM_ENDPOINT = { - mainnet: 'https://mainnet.evm.nodes.onflow.org', - testnet: 'https://testnet.evm.nodes.onflow.org', -}; - -export const HTTP_STATUS_CONFLICT = 409; -export const HTTP_STATUS_TOO_MANY_REQUESTS = 429; diff --git a/src/constant/supportChains.json b/src/constant/supportChains.json deleted file mode 100644 index ccedf4277..000000000 --- a/src/constant/supportChains.json +++ /dev/null @@ -1,19 +0,0 @@ -[ - { - "id": "flow_evm_previewnet", - "community_id": 646, - "name": "Flow Previewnet", - "native_token": { - "id": "flow", - "symbol": "FLOW", - "logo": "https://raw.githubusercontent.com/Outblock/Assets/main/ft/flow/logo.png", - "decimals": 18 - }, - "logo_url": "https://raw.githubusercontent.com/Outblock/Assets/main/ft/flow/logo.png", - "white_logo_url": "https://raw.githubusercontent.com/Outblock/Assets/main/ft/flow/logo.png", - "eip_1559": true, - "is_disabled": false, - "explorer_host": "https://eth.flowscan.io", - "need_estimate_gas": false - } -] diff --git a/src/i18n.ts b/src/i18n.ts deleted file mode 100644 index 39ff7a265..000000000 --- a/src/i18n.ts +++ /dev/null @@ -1,43 +0,0 @@ -import i18n from 'i18next'; -import { initReactI18next } from 'react-i18next'; - -import messages from './messages.json'; - -export const fetchLocale = async (locale) => { - const res = messages; - const data = res; - - return Object.keys(data).reduce((res, key) => { - return { - ...res, - [key.replace(/__/g, ' ')]: data[key].message, - }; - }, {}); -}; - -i18n - .use(initReactI18next) // passes i18n down to react-i18next - .init({ - fallbackLng: 'en', - defaultNS: 'translations', - interpolation: { - escapeValue: false, // react already safes from xss - }, - }); - -export const I18N_NS = 'translations'; - -export const addResourceBundle = async (locale: string) => { - if (i18n.hasResourceBundle(locale, I18N_NS)) return; - const bundle = await fetchLocale(locale); - - i18n.addResourceBundle(locale, 'translations', bundle); -}; - -addResourceBundle('en'); - -i18n.on('languageChanged', function (lng) { - addResourceBundle(lng); -}); - -export default i18n; diff --git a/src/stories/react-router-dom.mock.ts b/src/stories/react-router-dom.mock.ts deleted file mode 100644 index aa795fc10..000000000 --- a/src/stories/react-router-dom.mock.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { fn } from 'storybook/test'; - -const Link = fn().mockName('Link'); -const useHistory = fn().mockName('useHistory'); - -export { Link, useHistory }; diff --git a/src/stories/ui-hooks.mock.ts b/src/stories/ui-hooks.mock.ts deleted file mode 100644 index d62b781d7..000000000 --- a/src/stories/ui-hooks.mock.ts +++ /dev/null @@ -1,27 +0,0 @@ -// Mock for the entire ui/hooks directory - -// Re-export everything from actual hooks that don't need mocking -export * from '../ui/hooks/use-data'; -export * from '../ui/hooks/preference-hooks'; -export * from '../ui/hooks/use-coin-hooks'; - -// Import and re-export mocked hooks -export { useProfiles } from './useProfileHook.mock'; -export { useNetwork } from './useNetworkHook.mock'; -export { useFeatureFlag, useFeatureFlags, useLatestVersion } from './use-feature-flags.mock'; - -// Export other hooks with basic mocks if needed -export const useInitHook = () => ({ - initializeStore: () => Promise.resolve(), -}); - -export const useCoins = () => ({ - handleStorageData: () => {}, - updateTokenFilter: () => {}, - coins: [], - tokenFilter: { hideDust: false, hideUnverified: false, filteredIds: [] }, - balance: '0', - totalFlow: '0', - availableFlow: '0', - coinsLoaded: true, -}); diff --git a/src/stories/ui-utils.mock.ts b/src/stories/ui-utils.mock.ts deleted file mode 100644 index 00237d867..000000000 --- a/src/stories/ui-utils.mock.ts +++ /dev/null @@ -1,30 +0,0 @@ -// Re-export everything from the original ui/utils except WalletContext -export * from '../ui/utils/WindowContext'; -export * from '../ui/utils/hooks'; -export * from '../ui/utils/webapi'; -export * from '../ui/utils/time'; -export * from '../shared/utils/number'; - -// Re-export other utils from the main index file -export { - noop, - getUiType, - hex2Text, - isEmoji, - hexToUint8Array, - getUITypeName, - getOriginName, - hashCode, - isMetaMaskActive, - ellipsisOverflowedText, - formatAddress, - HexToDecimalConverter, - returnFilteredCollections, - truncate, -} from '../ui/utils'; - -// Import and re-export the mocked WalletContext -export { useWallet, useWalletLoaded } from './wallet-context.mock'; - -// Import and re-export the mocked useProfiles hook -export { useProfiles } from './useProfileHook.mock'; diff --git a/src/stories/use-account-hooks.mock.ts b/src/stories/use-account-hooks.mock.ts deleted file mode 100644 index 89fcdcc2d..000000000 --- a/src/stories/use-account-hooks.mock.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { fn } from 'storybook/test'; - -// These are the mock function instances, exported with the names the component expects. -export const useChildAccounts = fn().mockName('useChildAccounts'); -export const useEvmAccount = fn().mockName('useEvmAccount'); -export const useAccountBalance = fn().mockName('useAccountBalance'); -export const usePendingAccountCreationTransactions = fn() - .mockName('usePendingAccountCreationTransactions') - .mockReturnValue([]); diff --git a/src/stories/use-feature-flags.mock.ts b/src/stories/use-feature-flags.mock.ts deleted file mode 100644 index f0acaf1c8..000000000 --- a/src/stories/use-feature-flags.mock.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { type FeatureFlagKey } from '@/shared/types/feature-types'; - -// Mock implementation that can be controlled via global variables -export const useFeatureFlag = (featureFlag: FeatureFlagKey) => { - // Check if we're in Storybook and have feature flag overrides - if (typeof window !== 'undefined' && (window as any).__STORYBOOK_FEATURE_FLAGS__) { - const featureFlags = (window as any).__STORYBOOK_FEATURE_FLAGS__; - const result = featureFlags[featureFlag] !== undefined ? featureFlags[featureFlag] : false; - return result; - } - - // Default to false if no override is set - return false; -}; - -export const useFeatureFlags = () => { - // Check if we're in Storybook and have feature flag overrides - if (typeof window !== 'undefined' && (window as any).__STORYBOOK_FEATURE_FLAGS__) { - return (window as any).__STORYBOOK_FEATURE_FLAGS__; - } - - // Default empty object - return {}; -}; - -export const useLatestVersion = () => null; diff --git a/src/stories/use-nft-hooks.mock.ts b/src/stories/use-nft-hooks.mock.ts deleted file mode 100644 index 429d6ff87..000000000 --- a/src/stories/use-nft-hooks.mock.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { fn } from 'storybook/test'; - -// These are the mock function instances, exported with the names the component expects. -export const useNftCatalogCollections = fn().mockName('useNftCatalogCollections'); diff --git a/src/stories/useNetworkHook.mock.ts b/src/stories/useNetworkHook.mock.ts deleted file mode 100644 index ff7b74cf4..000000000 --- a/src/stories/useNetworkHook.mock.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { fn } from 'storybook/test'; - -// Mock for useNetwork hook -export const useNetwork = fn() - .mockName('useNetwork') - .mockImplementation(() => ({ - network: 'mainnet', - developerMode: false, - emulatorModeOn: false, - })); diff --git a/src/stories/useProfileHook.mock.ts b/src/stories/useProfileHook.mock.ts deleted file mode 100644 index d38c0942d..000000000 --- a/src/stories/useProfileHook.mock.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { fn } from 'storybook/test'; - -// Mock for useProfiles hook that uses the global mock -export const useProfiles = fn() - .mockName('useProfiles') - .mockImplementation(() => ({ - currentWallet: { - address: '0x1234567890', - }, - activeAccountType: 'flow', - })); diff --git a/src/ui/components/LLHeader.tsx b/src/ui/components/LLHeader.tsx deleted file mode 100644 index 5a96fd108..000000000 --- a/src/ui/components/LLHeader.tsx +++ /dev/null @@ -1,53 +0,0 @@ -import ArrowBackIcon from '@mui/icons-material/ArrowBack'; -import HelpOutlineRoundedIcon from '@mui/icons-material/HelpOutlineRounded'; -import { IconButton, Typography, Tooltip } from '@mui/material'; -import Grid from '@mui/material/Grid'; -import React from 'react'; -import { useHistory } from 'react-router-dom'; - -interface LLHeaderProps { - title: string | JSX.Element; - help: boolean | JSX.Element; -} - -export const LLHeader = (props: LLHeaderProps) => { - // const { label, ...inherentProps } = props; - const history = useHistory(); - - return ( - - - - - - - - - {props.title} - - - {/* */} - {/* */} - {props.help && ( - -
- - - {/* */} - - {/* */} - - - - - )} - - ); -}; diff --git a/src/ui/components/LandingPages/LandingComponents.tsx b/src/ui/components/LandingPages/LandingComponents.tsx deleted file mode 100644 index 1d3d25549..000000000 --- a/src/ui/components/LandingPages/LandingComponents.tsx +++ /dev/null @@ -1,86 +0,0 @@ -import { Box, IconButton, Typography } from '@mui/material'; -import React from 'react'; - -import { LLPinAlert } from '@/ui/components'; -import Confetti from '@/ui/components/Confetti'; -import BackButtonIcon from '@/ui/components/iconfont/IconBackButton'; -import RegisterHeader from '@/ui/components/LandingPages/RegisterHeader'; -import SlideLeftRight from '@/ui/components/SlideLeftRight'; - -const LandingComponents = ({ - activeIndex, - direction, - showBackButton, - onBack, - children, - showConfetti, - showRegisterHeader, -}) => ( - - {showConfetti && } - {showRegisterHeader && } - - - - - {showBackButton && ( - - - - )} - -
- - - {chrome.i18n.getMessage('STEP')} {activeIndex + 1}/6 - -
- - - {children} - -
- - - -); - -export default LandingComponents; diff --git a/src/ui/components/LandingPages/PasswordComponents.tsx b/src/ui/components/LandingPages/PasswordComponents.tsx deleted file mode 100644 index 53f106aad..000000000 --- a/src/ui/components/LandingPages/PasswordComponents.tsx +++ /dev/null @@ -1,217 +0,0 @@ -import VisibilityIcon from '@mui/icons-material/Visibility'; -import VisibilityOffIcon from '@mui/icons-material/VisibilityOff'; -import { - Box, - LinearProgress, - Typography, - Input, - InputAdornment, - IconButton, - FormControlLabel, - Checkbox, - Link, - Button, - Snackbar, - Alert, -} from '@mui/material'; -import React from 'react'; -import zxcvbn from 'zxcvbn'; - -import { BpUncheked, BpCheckedIcon } from '@/ui/assets/icons/CustomCheckboxIcons'; -import { LLSpinner } from '@/ui/components'; - -// Password Indicator Component -interface PasswordIndicatorProps { - value: string; -} - -export const PasswordIndicator = ({ value }: PasswordIndicatorProps) => { - const score = zxcvbn(value).score; - const percentage = ((score + 1) / 5) * 100; - - const level = (score: number) => { - switch (score) { - case 0: - case 1: - return { text: chrome.i18n.getMessage('Weak'), color: 'error' }; - case 2: - return { text: chrome.i18n.getMessage('Good'), color: 'testnet' }; - case 3: - return { text: chrome.i18n.getMessage('Great'), color: 'success' }; - case 4: - return { text: chrome.i18n.getMessage('Strong'), color: 'success' }; - default: - return { text: chrome.i18n.getMessage('Unknown'), color: 'error' }; - } - }; - - return ( - - - - - - - {level(score).text} - - - - ); -}; - -// Password Input Component -interface PasswordInputProps { - value: string; - onChange: (value: string) => void; - isVisible: boolean; - setVisible: (visible: boolean) => void; - readOnly?: boolean; - placeholder?: string; - autoFocus?: boolean; - sx?: any; -} - -export const PasswordInput = ({ - value, - onChange, - isVisible, - setVisible, - readOnly = false, - placeholder = chrome.i18n.getMessage('Create__a__password'), - autoFocus = false, - sx, -}: PasswordInputProps) => { - return ( - onChange(e.target.value)} - endAdornment={ - - {value && } - setVisible(!isVisible)}> - {isVisible ? : } - - - } - /> - ); -}; - -// Terms Checkbox Component -interface TermsCheckboxProps { - onChange: (checked: boolean) => void; -} - -export const TermsCheckbox = ({ onChange }: TermsCheckboxProps) => ( - } - checkedIcon={} - onChange={(event) => onChange(event.target.checked)} - /> - } - label={ - - {chrome.i18n.getMessage('I__agree__to__Lilico') + ' '} - - {chrome.i18n.getMessage('Privacy__Policy')} - {' '} - {chrome.i18n.getMessage('and') + ' '} - - {chrome.i18n.getMessage('Terms__of__Service')} - {' '} - . - - } - /> -); - -// Error Snackbar Component -interface ErrorSnackbarProps { - open: boolean; - message: string; - onClose: () => void; -} - -export const ErrorSnackbar = ({ open, message, onClose }: ErrorSnackbarProps) => ( - - - {message} - - -); - -// Submit Button Component -interface SubmitButtonProps { - onClick: () => void; - isLoading: boolean; - disabled: boolean; - isLogin?: boolean; -} - -export const SubmitButton = ({ - onClick, - isLoading, - disabled, - isLogin = false, -}: SubmitButtonProps) => ( - -); diff --git a/src/ui/components/LandingPages/SetPassword.tsx b/src/ui/components/LandingPages/SetPassword.tsx deleted file mode 100644 index 15f7e4240..000000000 --- a/src/ui/components/LandingPages/SetPassword.tsx +++ /dev/null @@ -1,217 +0,0 @@ -import { Box, Typography, FormGroup } from '@mui/material'; -import React, { useCallback, useEffect, useState } from 'react'; - -import { DEFAULT_PASSWORD } from '@/shared/utils/default'; -import CheckCircleIcon from '@/ui/components/iconfont/IconCheckmark'; -import CancelIcon from '@/ui/components/iconfont/IconClose'; -import { - PasswordInput, - TermsCheckbox, - ErrorSnackbar, - SubmitButton, -} from '@/ui/components/LandingPages/PasswordComponents'; -import SlideRelative from '@/ui/components/SlideRelative'; - -interface SetPasswordProps { - handleSwitchTab: () => void; - onSubmit: (password: string) => Promise; - username?: string; - showTerms?: boolean; - title?: string | React.ReactNode; - subtitle?: string; - isLogin?: boolean; - autoFocus?: boolean; -} - -const SetPassword: React.FC = ({ - handleSwitchTab = () => {}, - onSubmit, - username = '', - showTerms = false, - title = '', - subtitle = '', - isLogin = false, - autoFocus = false, -}) => { - const [isPasswordVisible, setPasswordVisible] = useState(false); - const [isConfirmPasswordVisible, setConfirmPasswordVisible] = useState(false); - const [password, setPassword] = useState(DEFAULT_PASSWORD); - const [confirmPassword, setConfirmPassword] = useState(DEFAULT_PASSWORD); - const [isCharacters, setCharacters] = useState(false); - const [isMatch, setMatch] = useState(false); - const [isCheck, setCheck] = useState(!showTerms); - const [isLoading, setLoading] = useState(false); - const [errMessage, setErrorMessage] = useState('Something wrong, please try again'); - const [showError, setShowError] = useState(false); - const [helperText, setHelperText] = useState(
); - const [helperMatch, setHelperMatch] = useState(
); - - const successInfo = (message: string) => ( - - - - {message} - - - ); - - const errorInfo = (message: string) => ( - - - - {message} - - - ); - - const handleSubmit = async () => { - setLoading(true); - try { - await onSubmit(password); - setLoading(false); - } catch (error) { - setErrorMessage(error.message || errMessage); - setShowError(true); - setLoading(false); - } - }; - - useEffect(() => { - if (password.length > 7) { - setHelperText(successInfo(chrome.i18n.getMessage('At__least__8__characters'))); - setCharacters(true); - } else { - setHelperText(errorInfo(chrome.i18n.getMessage('At__least__8__characters'))); - setCharacters(false); - } - }, [password]); - - useEffect(() => { - if (confirmPassword === password) { - setHelperMatch(successInfo(chrome.i18n.getMessage('Passwords__match'))); - setMatch(true); - } else { - setMatch(false); - setHelperMatch(errorInfo(chrome.i18n.getMessage('Your__passwords__do__not__match'))); - } - }, [confirmPassword, password]); - - return ( - <> - - - {isLogin ? ( - chrome.i18n.getMessage('Confirm__Password') - ) : ( - <> - {chrome.i18n.getMessage('Create')} - - {chrome.i18n.getMessage('Password')} - - - )} - - - {subtitle || - chrome.i18n.getMessage( - 'Lilico__uses__this__password__to__protect__your__recovery__phrase' - )} - - - - - - - {helperText} - - - {!isLogin && ( - - - - {helperMatch} - - - )} - - - - {showTerms && } - - - - - setShowError(false)} /> - - ); -}; - -export default SetPassword; diff --git a/src/ui/components/PopupModal/remove-profile-modal.tsx b/src/ui/components/PopupModal/remove-profile-modal.tsx deleted file mode 100644 index 1cfc5f6c2..000000000 --- a/src/ui/components/PopupModal/remove-profile-modal.tsx +++ /dev/null @@ -1,192 +0,0 @@ -import CheckCircleOutlineIcon from '@mui/icons-material/CheckCircleOutline'; -import WarningAmberRoundedIcon from '@mui/icons-material/WarningAmberRounded'; -import { Button, Typography, TextField, DialogActions, CircularProgress, Box } from '@mui/material'; -import React, { useState, useEffect, useCallback } from 'react'; - -import { consoleError } from '@/shared/utils/console-log'; -import { useWallet } from '@/ui/utils'; - -import { CustomDialog } from '../custom-dialog'; // Reuse the styled dialog base - -interface RemoveProfileModalProps { - isOpen: boolean; - onClose: () => void; - onConfirm: (password: string) => void; // Callback with the entered password - isRemoving: boolean; - error: string; // Error specifically from the removal attempt - profileName?: string; // Optional profile name - profileUsername?: string; // Optional profile username -} - -const RemoveProfileModal: React.FC = ({ - isOpen, - onClose, - onConfirm, - isRemoving, - error: removalError, // Rename prop to avoid conflict - profileName, - profileUsername, -}) => { - const [password, setPassword] = useState(''); - const [isCheckingBackup, setIsCheckingBackup] = useState(true); // Added loading state - const [backupCheckError, setBackupCheckError] = useState(''); - const [hasBackup, setHasBackup] = useState(false); - const wallet = useWallet(); - - const checkBackup = useCallback(async () => { - setIsCheckingBackup(true); // Set loading true - setBackupCheckError(''); // Clear previous errors - try { - const backupResult = await wallet.hasCurrentUserBackup(); // Renamed variable for clarity - setHasBackup(backupResult); - } catch (err) { - consoleError('An error occurred while checking the backup:', err); - setBackupCheckError('Failed to check backup status.'); // Keep error state - setHasBackup(false); // Assume no backup on error - } finally { - setIsCheckingBackup(false); // Set loading false - } - }, [setHasBackup, wallet]); - - useEffect(() => { - if (isOpen) { - setPassword(''); // Clear password on open - setHasBackup(false); // Reset backup state on open - checkBackup(); - } - }, [isOpen, checkBackup]); - - const handleConfirmClick = () => { - if (password) { - onConfirm(password); - } - }; - - return ( - - - {chrome.i18n.getMessage('Remove__Profile')} - - - {profileName && profileUsername && ( - - {profileName} - @{profileUsername} - - )} - - {!isCheckingBackup && hasBackup && ( - - - - {chrome.i18n.getMessage('Backup__Found')} - - - )} - - {!isCheckingBackup && backupCheckError && ( - - - {backupCheckError} - - )} - - - {chrome.i18n.getMessage('Remove_profile_warning_simplified')} - - - setPassword(e.target.value)} - error={!!removalError} - helperText={removalError} - onKeyDown={(e) => { - if (e.key === 'Enter' && password && !isRemoving) { - handleConfirmClick(); - } - }} - sx={{ - mb: 3, - input: { color: '#FFFFFF' }, - '& .MuiOutlinedInput-root': { - '& fieldset': { borderColor: '#787878' }, - }, - '& .MuiFormLabel-root': { - color: '#BABABA', - }, - }} - /> - - - - - - - ); -}; - -export default RemoveProfileModal; diff --git a/src/ui/components/PrivateRoute.tsx b/src/ui/components/PrivateRoute.tsx deleted file mode 100644 index ed6df7b8e..000000000 --- a/src/ui/components/PrivateRoute.tsx +++ /dev/null @@ -1,61 +0,0 @@ -import React, { useEffect, useState } from 'react'; -import { Route, Redirect, useRouteMatch } from 'react-router-dom'; - -import { useWallet } from 'ui/utils'; - -const PrivateRoute = ({ children, path, ...rest }) => { - const wallet = useWallet(); - const match = useRouteMatch(path); - - const [booted, setBooted] = useState(false); - const [unlocked, setUnlocked] = useState(false); - const [loading, setLoading] = useState(true); - - // Everything through the wallet controller is async, so we need to check if the wallet is booted and unlocked in a useEffect - useEffect(() => { - let mounted = true; - - const fetchLockState = async () => { - const booted = await wallet.isBooted(); - - if (!booted) { - return { booted, unlocked: false }; - } else { - const unlocked = await wallet.isUnlocked(); - return { booted, unlocked }; - } - }; - - //const strippedPath = path.replace(/\/$/, ''); - - // Initial check - if (match?.isExact) { - fetchLockState().then(({ booted, unlocked }) => { - if (mounted) { - setBooted(booted); - setUnlocked(unlocked); - setLoading(false); - } - }); - } - return () => { - mounted = false; - }; - }, [wallet, match?.isExact]); - - return ( - { - if (loading) { - return null; - } - const to = !booted ? '/welcome' : !unlocked ? '/unlock' : null; - return !to ? children : ; - }} - /> - ); -}; - -export default PrivateRoute; diff --git a/src/ui/hooks/preference-hooks.ts b/src/ui/hooks/preference-hooks.ts deleted file mode 100644 index 980e8671f..000000000 --- a/src/ui/hooks/preference-hooks.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { - type SupportedCurrenciesStore, - supportedCurrenciesKey, -} from '@/shared/utils/cache-data-keys'; -import { preferencesKey, type PreferencesStore } from '@/shared/utils/user-data-keys'; - -import { useCachedData, useUserData } from './use-data'; - -export const useCurrency = () => { - const preferences = useUserData(preferencesKey); - return preferences?.displayCurrency; -}; - -export const useSupportedCurrencies = () => { - return useCachedData(supportedCurrenciesKey()); -}; diff --git a/src/ui/utils/WalletContext.tsx b/src/ui/utils/WalletContext.tsx deleted file mode 100644 index c9ec97ee3..000000000 --- a/src/ui/utils/WalletContext.tsx +++ /dev/null @@ -1,105 +0,0 @@ -import React, { type ReactNode, createContext, useContext, useEffect, useState } from 'react'; -import type { Object } from 'ts-toolbelt'; - -import type { WalletController as WalletControllerClass } from 'background/controller/wallet'; -import type { OpenApiService } from 'background/service/openapi'; - -import type { IExtractFromPromise } from '../../shared/utils/type'; - -export type WalletControllerType = { - [key in keyof WalletControllerClass]: WalletControllerClass[key] extends ( - ...args: infer ARGS - ) => infer RET - ? = IExtractFromPromise>( - ...args: ARGS - ) => Promise> - : WalletControllerClass[key]; -}; - -export type WalletController = Object.Merge< - WalletControllerClass, - { - openapi: { - [key in keyof OpenApiService]: OpenApiService[key] extends (...args: infer ARGS) => infer RET - ? = IExtractFromPromise>( - ...args: ARGS - ) => Promise> - : OpenApiService[key]; - }; - } ->; - -const WalletContext = createContext<{ - wallet: WalletController; - loaded: boolean; -} | null>(null); - -const WalletProvider = ({ - children, - wallet, -}: { - children?: ReactNode; - wallet: WalletController; -}) => { - const [walletInitialized, setWalletInitialized] = useState(false); - - useEffect(() => { - const checkWalletInitialized = async () => { - const walletInitialized = await wallet.isLoaded(); - if (walletInitialized) { - setWalletInitialized(true); - } - }; - checkWalletInitialized(); - }, [wallet]); - - const walletInitializedListener = ( - msg: { type: string }, - _sender: unknown, - _sendResponse: unknown - ) => { - if (msg.type === 'walletInitialized') { - setWalletInitialized(true); - } - }; - useEffect(() => { - let walletListener: typeof walletInitializedListener | null = null; - if (!walletInitialized) { - walletListener = walletInitializedListener; - chrome.runtime.onMessage.addListener(walletListener); - } else if (walletListener) { - chrome.runtime.onMessage.removeListener(walletListener); - walletListener = null; - } - return () => { - if (walletListener) { - chrome.runtime.onMessage.removeListener(walletListener); - walletListener = null; - } - }; - }, [walletInitialized]); - - return ( - - {children} - - ); -}; - -const useWallet = () => { - const { wallet } = useContext(WalletContext) as unknown as { - wallet: WalletControllerType; - }; - - return wallet; -}; - -const useWalletLoaded = () => { - const { loaded } = useContext(WalletContext) as unknown as { - loaded: boolean; - }; - - return loaded; -}; - -export { WalletProvider, useWallet, useWalletLoaded }; diff --git a/src/ui/utils/hooks.ts b/src/ui/utils/hooks.ts deleted file mode 100644 index 5de899270..000000000 --- a/src/ui/utils/hooks.ts +++ /dev/null @@ -1,231 +0,0 @@ -import { useCallback, useEffect, useRef, useMemo, useState } from 'react'; -import { useHistory } from 'react-router-dom'; - -import { useWallet } from './WalletContext'; - -export const useApproval = () => { - const usewallet = useWallet(); - const history = useHistory(); - - const getApproval = useCallback(() => usewallet.getApproval(), [usewallet]); - const stableUsewallet = useMemo(() => usewallet, [usewallet]); - const stableHistory = useMemo(() => history, [history]); - - const linkingConfirm = useCallback( - async (data?: any, stay = false, forceReject = false) => { - const approval = await getApproval(); - - if (approval) { - await stableUsewallet.resolveApproval(data, forceReject); - return; - } - if (stay) { - return; - } - // setTimeout(() => { - // stableHistory.replace('/'); - // }); - }, - [getApproval, stableUsewallet] - ); - - const resolveApproval = useCallback( - async (data?: any, stay = false, forceReject = false) => { - const approval = await getApproval(); - - if (approval) { - stableUsewallet.resolveApproval(data, forceReject); - } - if (stay) { - return; - } - setTimeout(() => { - stableHistory.replace('/'); - }); - }, - [getApproval, stableUsewallet, stableHistory] - ); - - const rejectApproval = useCallback( - async (err?) => { - const approval = await getApproval(); - if (approval) { - await stableUsewallet.rejectApproval(err); - } - stableHistory.push('/'); - }, - [getApproval, stableUsewallet, stableHistory] - ); - - return [getApproval, resolveApproval, rejectApproval, linkingConfirm] as const; -}; - -export const useSelectOption = ({ - options, - defaultValue = [], - onChange, - value, -}: { - options: T[]; - defaultValue?: T[]; - onChange?: (arg: T[]) => void; - value?: T[]; -}) => { - const isControlled = useRef(typeof value !== 'undefined').current; - const [chosenIndexes, setChosenIndexes] = useState( - (isControlled ? value! : defaultValue).map((x) => options.indexOf(x)) - ); - - useEffect(() => { - if (!isControlled) { - return; - } - - // shallow compare - if (value) { - setChosenIndexes(value.map((x) => options.indexOf(x))); - } - }, [value, options, isControlled]); - - const changeValue = useCallback( - (indexes: number[]) => { - setChosenIndexes([...indexes]); - if (onChange) { - onChange(indexes.map((o) => options[o])); - } - }, - [options, onChange] - ); - - const handleRemove = useCallback( - (i: number) => { - chosenIndexes.splice(i, 1); - changeValue(chosenIndexes); - }, - [chosenIndexes, changeValue] - ); - - const handleChoose = useCallback( - (i: number) => { - if (chosenIndexes.includes(i)) { - return; - } - - chosenIndexes.push(i); - changeValue(chosenIndexes); - }, - [chosenIndexes, changeValue] - ); - - const handleToggle = useCallback( - (i: number) => { - const inIdxs = chosenIndexes.indexOf(i); - if (inIdxs !== -1) { - handleRemove(inIdxs); - } else { - handleChoose(i); - } - }, - [chosenIndexes, handleRemove, handleChoose] - ); - - const handleClear = useCallback(() => { - changeValue([]); - }, [changeValue]); - - return [ - chosenIndexes.map((o) => options[o]), - handleRemove, - handleChoose, - handleToggle, - handleClear, - chosenIndexes, - ] as const; -}; - -export const useWalletRequest = ( - requestFn, - { - onSuccess, - onError, - }: { - onSuccess?(arg: any): void; - onError?(arg: any): void; - } -) => { - const mounted = useRef(false); - useEffect(() => { - mounted.current = true; - - return () => { - mounted.current = false; - }; - }, []); - const [loading, setLoading] = useState(false); - const [res, setRes] = useState(); - const [err, setErr] = useState(); - - const run = useCallback( - async (...args) => { - setLoading(true); - try { - const _res = await Promise.resolve(requestFn(...args)); - if (!mounted.current) { - return; - } - setRes(_res); - if (onSuccess) { - onSuccess(_res); - } - } catch (err) { - if (!mounted.current) { - return; - } - setErr(err); - if (onError) { - onError(err); - } - } finally { - if (mounted.current) { - setLoading(false); - } - } - }, - [requestFn, mounted, onSuccess, onError] - ); - - return [run, loading, res, err] as const; -}; -export interface UseHoverOptions { - mouseEnterDelayMS?: number; - mouseLeaveDelayMS?: number; -} - -export type HoverProps = Pick, 'onMouseEnter' | 'onMouseLeave'>; - -export const useHover = ({ mouseEnterDelayMS = 0, mouseLeaveDelayMS = 0 }: UseHoverOptions = {}): [ - boolean, - HoverProps, -] => { - const [isHovering, setIsHovering] = useState(false); - const mouseEnterTimer = useRef(); - const mouseOutTimer = useRef(); - - const onMouseEnter = useCallback(() => { - clearTimeout(mouseOutTimer.current); - mouseEnterTimer.current = window.setTimeout(() => setIsHovering(true), mouseEnterDelayMS); - }, [mouseEnterDelayMS, mouseOutTimer]); - - const onMouseLeave = useCallback(() => { - clearTimeout(mouseEnterTimer.current); - mouseOutTimer.current = window.setTimeout(() => setIsHovering(false), mouseLeaveDelayMS); - }, [mouseLeaveDelayMS, mouseEnterTimer]); - - return [ - isHovering, - { - onMouseEnter, - onMouseLeave, - }, - ]; -}; diff --git a/src/ui/utils/modules/constants.ts b/src/ui/utils/modules/constants.ts deleted file mode 100644 index 933bce002..000000000 --- a/src/ui/utils/modules/constants.ts +++ /dev/null @@ -1 +0,0 @@ -export * from '@/shared/utils/algo-constants'; diff --git a/src/ui/views/InnerRoute.tsx b/src/ui/views/InnerRoute.tsx deleted file mode 100644 index 4ab9e3030..000000000 --- a/src/ui/views/InnerRoute.tsx +++ /dev/null @@ -1,247 +0,0 @@ -import React, { useState, useEffect, useCallback, useRef } from 'react'; -import { Switch, withRouter, type RouteComponentProps } from 'react-router-dom'; - -import PrivateRoute from 'ui/components/PrivateRoute'; -import { useWallet, useWalletLoaded } from 'ui/utils'; - -import Deposit from '../views/Deposit'; -import Enable from '../views/Enable'; - -import Dashboard from './Dashboard'; -import Header from './Dashboard/Header'; -import ManageToken from './ManageToken'; -import CollectionDetail from './NFT/CollectionDetail'; -import Detail from './NFT/Detail'; -import AddList from './NFT/NFTList/AddList'; -import SendToAddress from './NFT/SendNFT/SendToAddress'; -import EvmCollectionDetail from './NftEvm/CollectionDetail'; -import NftEvmDetail from './NftEvm/Detail'; -import SendNftEvm from './NftEvm/SendNFT/SendToAddress'; -import SendAddress from './Send'; -import SendTo from './SendTo'; -import SettingTab from './Setting'; -import About from './Setting/About/About'; -import Account from './Setting/Account'; -import AddressBook from './Setting/AddressBook'; -import ManageBackups from './Setting/Backups'; -import BackupsPassword from './Setting/Backups/BackupsPassword'; -import ChangePassword from './Setting/change-password'; -import CurrencySettings from './Setting/Currency'; -import DeveloperMode from './Setting/DeveloperMode/DeveloperMode'; -import DeviceInfo from './Setting/Devices/DeviceInfo'; -import KeyList from './Setting/KeyList/KeyList'; -import Linked from './Setting/Linked'; -import LinkedCollection from './Setting/Linked/LinkedCollection'; -import LinkedDetail from './Setting/Linked/LinkedDetail'; -import LinkedNftDetail from './Setting/Linked/LinkedNftDetail'; -import Keydetail from './Setting/privatekey/Keydetail'; -import PrivateKeyPassword from './Setting/privatekey/Privatekeypassword'; -import RecoveryPhasesDetail from './Setting/recoveryphase/Recoveryphasedetail'; -import Recoveryphrasepassword from './Setting/recoveryphase/Recoveryphrasepassword'; -import Security from './Setting/Security'; -import Settingone from './Setting/Settingone'; -import Switchaccount from './Setting/Switchaccount'; -import './Landing.css'; -import WalletList from './Setting/Wallet'; -import RemoveWallet from './Setting/Wallet/RemoveWallet'; -import WalletDetail from './Setting/Wallet/WalletDetail'; -import TokenDetail from './TokenDetail'; -import TokenList from './TokenList'; -import AddCustomEvmToken from './Wallet/AddCustom/AddCustomEvmToken'; - -const InnerRoute = (props: RouteComponentProps) => { - const [value, setValue] = useState(0); - - const usewallet = useWallet(); - const walletLoaded = useWalletLoaded(); - - const initRef = useRef(false); - - const fetch = useCallback(async () => { - if (!walletLoaded || initRef.current) { - return; - } - - try { - initRef.current = true; - const dashIndex = await usewallet.getDashIndex(); - if (dashIndex) { - setValue(dashIndex); - } else { - setValue(0); - await usewallet.setDashIndex(0); - } - } finally { - initRef.current = false; - } - }, [usewallet, walletLoaded]); - - useEffect(() => { - if (walletLoaded) { - fetch(); - } - }, [walletLoaded, fetch]); - - useEffect(() => { - if (!walletLoaded) { - return; - } - usewallet.setDashIndex(value); - }, [value, usewallet, walletLoaded]); - - return ( - -
-
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
- ); -}; - -export default withRouter(InnerRoute); diff --git a/src/ui/views/Landing.css b/src/ui/views/Landing.css deleted file mode 100644 index 35c341892..000000000 --- a/src/ui/views/Landing.css +++ /dev/null @@ -1,71 +0,0 @@ -.switch-wrapper { - position: relative; - display: contents; - /* pointer-events: none; */ -} - -.switch-wrapper > div { - position: absolute; - display: contents; -} - -.route-wrapper { - position: relative; - height: 543px; - overflow-y: scroll; -} - -.route-wrapper > div { - position: absolute; - width: 100%; - height: 100%; -} - -/* Chrome, Safari, Edge, Opera */ -input::-webkit-outer-spin-button, -input::-webkit-inner-spin-button { - -webkit-appearance: none; - margin: 0; -} - -/* Firefox */ -input[type='number'] { - -moz-appearance: textfield; -} - -/* .pageSlider-exit > .page { - z-index: 1; -} - -.pageSlider-enter > .page { - z-index: 10; -} - -.pageSlider-enter.left > .page { - transform: translate3d(100%, 0, 0); -} - -.pageSlider-enter.right > .page { - transform: translate3d(-100%, 0, 0); -} - -.pageSlider-exit.left > .page { - transform: translate3d(-100%, 0, 0); -} - -.pageSlider-exit.right > .page { - transform: translate3d(100%, 0, 0); -} - -.pageSlider-enter.pageSlider-enter-active > .page { - transform: translate3d(0, 0, 0); - transition: all 400ms ease-in-out; -} -.right, .left{ - height: 100%; -} -*/ - -.page { - height: 100%; -} diff --git a/src/ui/views/Landing.tsx b/src/ui/views/Landing.tsx deleted file mode 100644 index 5ae5102ed..000000000 --- a/src/ui/views/Landing.tsx +++ /dev/null @@ -1,33 +0,0 @@ -import React from 'react'; -import { Switch, Route } from 'react-router-dom'; - -import Forgot from './Forgot'; -import Recover from './Forgot/Recover'; -import Reset from './Forgot/Reset'; -import Welcome from './Welcome'; -import AccountImport from './Welcome/AccountImport'; -import Register from './Welcome/Register'; -import Sync from './Welcome/Sync'; - -import './Landing.css'; - -const LogPageView = () => { - return null; -}; - -export const Landing: React.FC = () => { - return ( -
- - - - - - - - - - -
- ); -}; diff --git a/src/ui/views/Setting/Linked/LinkedDetail.tsx b/src/ui/views/Setting/Linked/LinkedDetail.tsx deleted file mode 100644 index 38db3a1ce..000000000 --- a/src/ui/views/Setting/Linked/LinkedDetail.tsx +++ /dev/null @@ -1,703 +0,0 @@ -import CircleOutlinedIcon from '@mui/icons-material/CircleOutlined'; -import EditRoundedIcon from '@mui/icons-material/EditRounded'; -import { - Typography, - IconButton, - Divider, - Button, - Stack, - Box, - Tabs, - Tab, - CardMedia, - Skeleton, - Card, - CardContent, - CardActionArea, - FormControlLabel, - Checkbox, -} from '@mui/material'; -import React, { useState, useMemo } from 'react'; -import { useHistory, useParams } from 'react-router-dom'; - -import { type NftCollection } from '@/shared/types/network-types'; -import { type ChildAccountNFTs, type ChildAccountNFTsStore } from '@/shared/utils/cache-data-keys'; -import IconNext from '@/ui/assets/svg/nextgray.svg'; -import { LLHeader, LLSecondaryButton } from '@/ui/components'; -import CheckCircleIcon from '@/ui/components/iconfont/IconCheckmark'; -import IconCopy from '@/ui/components/iconfont/IconCopy'; -import { useChildAccountAllowTypes, useCurrentId, useUserInfo } from '@/ui/hooks/use-account-hooks'; -import { useChildAccountFt } from '@/ui/hooks/use-coin-hooks'; -import { useChildAccountNfts, useNftCollectionList } from '@/ui/hooks/useNftHook'; -import { useProfiles } from '@/ui/hooks/useProfileHook'; - -import EditAccount from './EditAccount'; -import UnlinkAccount from './UnlinkAccount'; - -interface TicketToken { - id: string; - balance: string; -} -interface Collection { - id: string; - contractName: string; - logo?: string; - address: string; - name: string; - total: number; - nfts: string[]; -} - -const extractContractName = (collection: string) => { - return collection.split('.')[2]; -}; - -const findObjectByContractName = ( - contractName: string, - collections: NftCollection[] | undefined -): NftCollection | undefined => { - const extractedContract = extractContractName(contractName); - const foundObject = extractedContract - ? collections?.find( - (item) => - item.contract_name === extractedContract || item.contractName === extractedContract - ) - : undefined; - return foundObject; -}; - -const nftCollectionToCollection = ( - nftCollection: NftCollection, - childAccountNfts: ChildAccountNFTs -) => { - const nftCollectionContractName = nftCollection.contractName || nftCollection.contract_name; - const foundNftId = Object.keys(childAccountNfts).find((nftId) => { - const parts = nftId.split('.'); - const address = `0x${parts[1]}`; - const contractName = parts[2]; - return nftCollection.address === address && nftCollectionContractName === contractName; - }); - const nfts = foundNftId ? childAccountNfts[foundNftId] : []; - return { - ...nftCollection, - total: nfts.length, - nfts: nfts, - }; -}; - -const NftContent = ({ - availableNftCollection, - hideEmpty, - navigateWithState, -}: { - availableNftCollection: Collection[]; - hideEmpty: boolean; - navigateWithState: (data: Collection) => void; -}) => { - const filteredNftCollection = availableNftCollection.filter( - (item) => !hideEmpty || (hideEmpty && item.total && item.total > 0) - ); - - return ( - - {filteredNftCollection.length ? ( - filteredNftCollection.map((item, index) => { - const collectedText = chrome.i18n.getMessage('Collected'); - - return ( - navigateWithState(item)} - > - {item.name} - - {item.name} - - - - {item.total + ' '} - {collectedText} - - - - ); - }) - ) : ( - - - No accessible NFT - - - )} - - ); -}; - -const FtContent = ({ availableFt }: { availableFt: TicketToken[] | undefined }) => ( - - {availableFt?.map((token, index) => { - return ( - - - - {token.id.split('.')[2]} - - - - {parseFloat(token.balance).toFixed(3)} {token.id.split('.')[2]} - - - ); - })} - -); - -const LinkedDetail = () => { - const location = useParams(); - - const history = useHistory(); - const [unlinking, setUnlinking] = useState(false); - const [isEdit, setEdit] = useState(false); - const [hideEmpty, setHide] = useState(false); - const [value, setValue] = useState('one'); - - const { activeAccountType, childAccounts, mainAddress, network } = useProfiles(); - - const active = activeAccountType === 'main'; - // The child account address is the key in the url - const childAccountAddress: string | undefined = location['key']; - const childAccount = childAccounts?.find((account) => account.address === childAccountAddress); - const childAccountAllowTypes = useChildAccountAllowTypes( - network, - mainAddress, - childAccountAddress - ); - const nftCollectionList = useNftCollectionList(network); - const allChildAccountNfts: ChildAccountNFTsStore | undefined = useChildAccountNfts( - network, - mainAddress - ); - const childAccountNfts: ChildAccountNFTs | undefined = useMemo( - () => (childAccountAddress ? allChildAccountNfts?.[childAccountAddress] : {}), - [allChildAccountNfts, childAccountAddress] - ); - - const availableFt = useChildAccountFt(network, mainAddress, childAccountAddress); - - const availableNftCollection: Collection[] | undefined = useMemo( - () => - childAccountAllowTypes === undefined - ? undefined - : Object.values( - childAccountAllowTypes - .map((active) => { - const collection = findObjectByContractName(active, nftCollectionList); - if (collection) { - return nftCollectionToCollection(collection, childAccountNfts ?? {}); - } - }) - .filter((collection) => collection !== undefined) - .reduce( - (acc, collection) => { - const contractName = collection.contractName || collection.contract_name; - if (acc[contractName] !== undefined) { - acc[contractName].total += collection.total; - acc[contractName].nfts.push(...collection.nfts!); - } else { - acc[contractName] = { - ...collection, - contractName: contractName, - }; - } - return acc; - }, - {} as { [key: string]: Collection } - ) - ), - [childAccountAllowTypes, nftCollectionList, childAccountNfts] - ); - - const loading = availableNftCollection === undefined; - - const currentId = useCurrentId(); - const userInfo = useUserInfo(currentId); - - const handleChange = (_, newValue: string) => { - setValue(newValue); - }; - - const showUnlink = async (condition) => { - await setUnlinking(condition); - }; - - const toggleEdit = () => { - setEdit(!isEdit); - }; - - const toggleHide = (event) => { - event.stopPropagation(); - const prevEmpty = hideEmpty; - setHide(!prevEmpty); - }; - - const navigateWithState = (data) => { - const state = { nft: data }; - localStorage.setItem('nftLinkedState', JSON.stringify(state)); - const storagePath = data.path.storage_path.split('/')[2]; - if (data.total) { - history.push({ - pathname: `/dashboard/nested/linked/collectiondetail/${childAccountAddress + '.' + storagePath + '.' + data.total + '.linked'}`, - state: { - collection: data, - ownerAddress: childAccountAddress, - }, - }); - } - }; - - return ( -
- - - - { - toggleEdit(); - }} - > - - - - - - {/* logo */} - - - - - - - - {childAccount?.name ?? chrome.i18n.getMessage('Linked_Account')} - - - - - - - - - {chrome.i18n.getMessage('Address')} - - - {childAccountAddress} - - - - - - - - - {chrome.i18n.getMessage('Description')} - - {'No Description'} - - - - - - {chrome.i18n.getMessage('Accessible')} - - - - - {chrome.i18n.getMessage('Hide_Empty_collection')} - - } - control={ - } - sx={{ paddingLeft: '10px' }} - checkedIcon={} - value="mainnet" - checked={hideEmpty} - onClick={toggleHide} - /> - } - /> - - - - - - - {loading ? ( - - {[...Array(2).keys()].map((key) => ( - - - - - - - - - - - ))} - - ) : ( - - {value === 'one' ? ( - - ) : ( - - )} - - )} - - {active && ( - showUnlink(true)} /> - )} - - showUnlink(false)} - handleCancelBtnClicked={() => showUnlink(false)} - handleAddBtnClicked={() => { - showUnlink(false); - }} - childAccount={childAccount} - address={childAccountAddress} - userInfo={userInfo} - /> - {loading || !childAccount ? ( - // Show a loading indicator or other UI element while data is being fetched -
Loading...
- ) : ( - // Render the EditAccount component when the data is available - setEdit(false)} - handleCancelBtnClicked={() => setEdit(false)} - handleAddBtnClicked={() => { - setEdit(false); - }} - childAccount={childAccount} - address={childAccountAddress} - userInfo={userInfo} - /> - )} -
-
- ); -}; - -export default LinkedDetail; diff --git a/src/ui/views/Setting/Linked/index.tsx b/src/ui/views/Setting/Linked/index.tsx deleted file mode 100644 index c56f45360..000000000 --- a/src/ui/views/Setting/Linked/index.tsx +++ /dev/null @@ -1,125 +0,0 @@ -import { - Typography, - ListItemText, - ListItemIcon, - ListItem, - ListItemButton, - Box, -} from '@mui/material'; -import React from 'react'; -import { Link } from 'react-router-dom'; - -import { LLHeader } from '@/ui/components'; -import IconEnd from '@/ui/components/iconfont/IconAVector11Stroke'; -import { useProfiles } from '@/ui/hooks/useProfileHook'; -import EmptyStateImage from 'ui/assets/image/search_user.png'; - -const Linked = () => { - const { childAccounts } = useProfiles(); - - return ( -
- - {childAccounts && childAccounts.length > 0 && ( - - {chrome.i18n.getMessage('Linked_Account')} - - )} - {childAccounts && childAccounts.length > 0 ? ( - - {childAccounts.map((childAccount) => ( - - - - {childAccount?.name - - - {childAccount?.name ?? childAccount.address} - - } - secondary={ - - {childAccount.address} - - } - /> - - - - - - ))} - - ) : ( - - - - {chrome.i18n.getMessage('No_linked')} - - - )} -
- ); -}; - -export default Linked; diff --git a/src/ui/views/Setting/Settingone.tsx b/src/ui/views/Setting/Settingone.tsx deleted file mode 100644 index 481db3126..000000000 --- a/src/ui/views/Setting/Settingone.tsx +++ /dev/null @@ -1,151 +0,0 @@ -import SearchIcon from '@mui/icons-material/Search'; -import { List, ListItemText, ListItem, ListSubheader, ListItemAvatar, Input } from '@mui/material'; -import Avatar from '@mui/material/Avatar'; -import InputAdornment from '@mui/material/InputAdornment'; -import _ from 'lodash'; -import React, { useState } from 'react'; - -const CONTACTS = [ - { - name: 'Andy', - address: 'wjqhewqjifgiue', - avatar: 'https://lilico.app/api/avatar/beam/120/anna?colors=FFDD32,FC814A,7678ED,B3DEE2,BCF0DA', - }, - { - name: 'Bob', - address: 'wjqhewqjifgiue', - avatar: 'https://lilico.app/api/avatar/beam/120/anna?colors=FFDD32,FC814A,7678ED,B3DEE2,BCF0DA', - }, - { - name: 'Tom Hulk', - address: 'wjqhewqjifgiue', - avatar: 'https://lilico.app/api/avatar/beam/120/anna?colors=FFDD32,FC814A,7678ED,B3DEE2,BCF0DA', - }, - { - name: 'Tom Hank', - address: 'wjqhewqjifgiue', - avatar: 'https://lilico.app/api/avatar/beam/120/anna?colors=FFDD32,FC814A,7678ED,B3DEE2,BCF0DA', - }, - { - name: 'Audra', - address: 'wjqhewqjifgiue', - avatar: 'https://lilico.app/api/avatar/beam/120/anna?colors=FFDD32,FC814A,7678ED,B3DEE2,BCF0DA', - }, - { - name: 'Anna', - address: 'wjqhewqjifgiue', - avatar: 'https://lilico.app/api/avatar/beam/120/anna?colors=FFDD32,FC814A,7678ED,B3DEE2,BCF0DA', - }, - { - name: 'Tom', - address: 'wjqhewqjifgiue', - avatar: 'https://lilico.app/api/avatar/beam/120/anna?colors=FFDD32,FC814A,7678ED,B3DEE2,BCF0DA', - }, - { - name: 'Tom Riddle', - address: 'wjqhewqjifgiue', - avatar: 'https://lilico.app/api/avatar/beam/120/anna?colors=FFDD32,FC814A,7678ED,B3DEE2,BCF0DA', - }, - { - name: 'Bolo', - address: 'wjqhewqjifgiue', - avatar: 'https://lilico.app/api/avatar/beam/120/anna?colors=FFDD32,FC814A,7678ED,B3DEE2,BCF0DA', - }, -]; - -const Settingone = () => { - const group = CONTACTS.sort((a, b) => a.name.localeCompare(b.name)); - const grouped = _.groupBy(group, (contact) => contact.name[0]); - - const [name, setName] = useState(''); - const [foundContacts, setFoundContacts] = useState(group); - - const filter = (e1) => { - const keyword = e1.target.value; - - if (keyword !== '') { - const results = group.filter((contact) => { - return contact.name.toLowerCase().includes(keyword.toLowerCase()); - }); - setFoundContacts(results); - } else { - setFoundContacts(group); - } - - setName(keyword); - }; - const filterResult = _.groupBy(foundContacts, (contact) => contact.name[0]); - return ( -
- - - - } - /> - -
- {filterResult && filterResult.value !== null ? ( - Object.keys(filterResult).map((key) => ( - - - #{key} - -
- {filterResult[key].map((eachgroup, index) => ( - - - - - - - ))} - , -
-
- )) - ) : ( - - - - - - )} -
-
- ); -}; - -export default Settingone; diff --git a/src/ui/views/Setting/Wallet/WalletDetail.tsx b/src/ui/views/Setting/Wallet/WalletDetail.tsx deleted file mode 100644 index 2975972aa..000000000 --- a/src/ui/views/Setting/Wallet/WalletDetail.tsx +++ /dev/null @@ -1,475 +0,0 @@ -import { - Typography, - Box, - List, - ListItemText, - ListItemIcon, - ListItem, - ListItemButton, - Divider, - Alert, - Snackbar, - CardMedia, - Switch, -} from '@mui/material'; -import LinearProgress from '@mui/material/LinearProgress'; -import React, { useState, useEffect, useCallback } from 'react'; -import { Link, useLocation } from 'react-router-dom'; - -import { storage } from '@/background/webapi'; -import type { StorageInfo } from '@/shared/types/network-types'; -import { - type Emoji, - type MainAccountWithBalance, - type WalletAccountWithBalance, -} from '@/shared/types/wallet-types'; -import { isValidEthereumAddress } from '@/shared/utils/address'; -import { consoleError } from '@/shared/utils/console-log'; -import { LLHeader } from '@/ui/components'; -import IconEnd from '@/ui/components/iconfont/IconAVector11Stroke'; -import { useFeatureFlag } from '@/ui/hooks/use-feature-flags'; -import { useWallet } from 'ui/utils'; - -import editEmoji from '../../../assets/svg/editEmoji.svg'; - -import EditProfile from './EditProfile'; - -function formatBytes(bytes, decimals = 2) { - if (bytes === 0) return '0 Bytes'; - const k = 1000; - const dm = decimals < 0 ? 0 : decimals; - const sizes = ['', 'Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']; - const i = Math.floor(Math.log(bytes) / Math.log(k)); - return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i]; -} - -function formatStorageInfo(used: number | undefined, capacity: number | undefined) { - return `${formatBytes((used || 0) * 10)} / ${formatBytes((capacity || 0) * 10)}`; -} - -const WalletDetail = () => { - const wallet = useWallet(); - const location = useLocation(); - const address = new URLSearchParams(location.search).get('address') || ''; - const [userWallet, setWallet] = useState< - WalletAccountWithBalance | MainAccountWithBalance | null - >(null); - const [showProfile, setShowProfile] = useState(false); - const [gasKillSwitch, setGasKillSwitch] = useState(false); - const [modeGas, setGasMode] = useState(false); - const [showError, setShowError] = useState(false); - const [storageInfo, setStorageInfo] = useState(null); - const [isKeyphrase, setIsKeyphrase] = useState(false); - const [emoji, setEmoji] = useState(null); - const isFreeGasFeeEnabled = useFeatureFlag('free_gas'); - const handleErrorClose = (event?: React.SyntheticEvent | Event, reason?: string) => { - if (reason === 'clickaway') { - return; - } - setShowError(false); - }; - - const loadGasMode = useCallback(async () => { - const isFreeGasFeeEnabled = await storage.get('lilicoPayer'); - if (isFreeGasFeeEnabled) { - setGasMode(isFreeGasFeeEnabled); - } - }, []); - - const loadGasKillSwitch = useCallback(async () => { - await wallet.getPayerAddressAndKeyId(); - if (isFreeGasFeeEnabled) { - setGasKillSwitch(isFreeGasFeeEnabled); - } - }, [isFreeGasFeeEnabled, wallet]); - - const switchGasMode = async () => { - setGasMode(!modeGas); - storage.set('lilicoPayer', !modeGas); - setShowError(true); - }; - - const toggleEditProfile = async () => { - setShowProfile(!showProfile); - }; - - const updateProfileEmoji = (emoji) => { - setEmoji(emoji); - }; - - const setUserWallet = useCallback(async () => { - await wallet.setDashIndex(3); - const walletDetail: { - wallet: WalletAccountWithBalance; - selectedEmoji: Emoji; - } = JSON.parse(await storage.get('walletDetail')); - if (walletDetail) { - setWallet(walletDetail.wallet); - const selectingEmoji: Emoji = { - name: walletDetail.wallet.name, - emoji: walletDetail.wallet.icon, - bgcolor: walletDetail.wallet.color, - }; - setEmoji(selectingEmoji); - } - }, [wallet]); - - const loadStorageInfo = useCallback(async () => { - const info = await wallet.openapi.getStorageInfo(address!); - setStorageInfo(info); - }, [wallet, address]); - - function storageCapacity(storage): number { - const used = storage?.used ?? 1; - const capacity = storage?.capacity ?? 1; - return (used / capacity) * 100; - } - - const checkKeyphrase = useCallback(async () => { - const keyrings = await wallet.checkMnemonics(); - await setIsKeyphrase(keyrings); - }, [wallet]); - - useEffect(() => { - try { - setUserWallet(); - loadGasKillSwitch(); - loadGasMode(); - loadStorageInfo(); - checkKeyphrase(); - } catch (error) { - consoleError(error); - } - }, [checkKeyphrase, loadGasKillSwitch, loadGasMode, loadStorageInfo, setUserWallet]); - - return ( -
- - - - - - toggleEditProfile()} - > - - - - {emoji?.emoji} - - - - {emoji?.name} - - - - - - - - - {userWallet && !isValidEthereumAddress(userWallet.address) && ( - <> - - - - - - - - - - {isKeyphrase && } - - {isKeyphrase && ( - - - - - - - - - )} - - - - - - - - - - - - - - - - - - - {chrome.i18n.getMessage('Free__Gas__Fee')} - - - {gasKillSwitch - ? chrome.i18n.getMessage('Allow__lilico__to__pay__the__gas__fee') - : chrome.i18n.getMessage('This__feature__has__been__disabled__temporarily')} - - - { - switchGasMode(); - }} - /> - - {!!storageInfo /* TODO: remove this after the storage usage card is implemented */ && ( - - - - {chrome.i18n.getMessage('Storage')} - - - - {`${storageCapacity(storageInfo).toFixed(2)}%`} - - - {`${formatStorageInfo(storageInfo?.used, storageInfo?.capacity)}`} - - - - - - )} - - )} - - - - - - {chrome.i18n.getMessage('You__will__need__to__connect__to__your__wallet__again')} - - - {showProfile && ( - setShowProfile(false)} - handleCancelBtnClicked={() => setShowProfile(false)} - handleAddBtnClicked={() => { - setShowProfile(false); - }} - updateProfileEmoji={(emoji) => updateProfileEmoji(emoji)} - emoji={emoji} - userWallet={userWallet} - /> - )} -
- ); -}; - -export default WalletDetail; diff --git a/src/ui/views/Setting/Wallet/index.tsx b/src/ui/views/Setting/Wallet/index.tsx deleted file mode 100644 index f6177e0d1..000000000 --- a/src/ui/views/Setting/Wallet/index.tsx +++ /dev/null @@ -1,319 +0,0 @@ -import FiberManualRecordIcon from '@mui/icons-material/FiberManualRecord'; -import { - Typography, - List, - ListItemText, - ListItemIcon, - ListItem, - ListItemButton, - Divider, - CardMedia, - Box, -} from '@mui/material'; -import React, { useCallback, useEffect, useState } from 'react'; -import { Link, useRouteMatch } from 'react-router-dom'; - -import { - type MainAccountWithBalance, - type MainAccount, - type WalletAccount, - type WalletAccountWithBalance, - type Emoji, -} from '@/shared/types/wallet-types'; -import { isValidEthereumAddress } from '@/shared/utils/address'; -import { LLHeader } from '@/ui/components'; -import IconEnd from '@/ui/components/iconfont/IconAVector11Stroke'; -import { useProfiles } from '@/ui/hooks/useProfileHook'; -import { useWallet } from '@/ui/utils'; -import { storage } from 'background/webapi'; -import { formatAddress } from 'ui/utils'; - -const tempEmoji: Emoji[] = [ - { - emoji: '🥥', - name: 'Coconut', - bgcolor: '#FFE4C4', - }, - { - emoji: '🥑', - name: 'Avocado', - bgcolor: '#98FB98', - }, -]; - -const Wallet = () => { - const usewallet = useWallet(); - const { currentWallet } = useProfiles(); - const [userMainAccounts, setUserMainAccounts] = useState([]); - const [evmList, setEvmList] = useState([]); - const [currentAddress, setCurrentWallet] = useState(''); - const [emojis, setEmojis] = useState(tempEmoji); - - function handleWalletClick( - wallet: MainAccountWithBalance | WalletAccountWithBalance, - eindex: number - ) { - const selectedEmoji = emojis[eindex]; - const walletDetailInfo = { wallet, selectedEmoji }; - storage.set('walletDetail', JSON.stringify(walletDetailInfo)); - } - - const fetchFlowBalances = useCallback( - async (mainAccounts: MainAccount[]) => { - const updatedData = await Promise.all( - mainAccounts.map(async (account: MainAccount) => { - const mainAccountWithBalance: MainAccountWithBalance = { - ...account, - balance: await usewallet.getFlowBalance(account.address), - }; - return mainAccountWithBalance; - }) - ); - return updatedData; - }, - [usewallet] - ); - - const fetchEvmBalances = useCallback( - async (evmAccounts: WalletAccount[]): Promise => { - return Promise.all( - evmAccounts.map(async (item) => { - let balance = ''; - if (isValidEthereumAddress(item.address)) { - balance = await usewallet.getEvmBalance(item.address); - } - return { ...item, balance }; - }) - ); - }, - [usewallet] - ); - - const setUserWallet = useCallback(async () => { - await usewallet.setDashIndex(3); - const emojires = await usewallet.getEmoji(); - const mainAccounts: MainAccount[] | null = await usewallet.getMainAccounts(); - if (mainAccounts) { - const mainAccountsWithBalances: MainAccountWithBalance[] = - await fetchFlowBalances(mainAccounts); - setCurrentWallet(currentWallet?.address ?? ''); - const evmWallet: WalletAccount | null = await usewallet.getEvmWallet(); - if (evmWallet) { - const filteredEvm = [evmWallet].filter((evm) => evm?.address); - if (filteredEvm.length > 0) { - const fetchedEvm = await fetchEvmBalances(filteredEvm); - setEvmList(fetchedEvm); - } - } - setEmojis(emojires); - setUserMainAccounts(mainAccountsWithBalances); - } - }, [usewallet, currentWallet, fetchFlowBalances, fetchEvmBalances]); - - useEffect(() => { - setUserWallet(); - }, [setUserWallet]); - - return ( -
- - - - {chrome.i18n.getMessage('main_wallet')} - - - {userMainAccounts.map((item) => ( - handleWalletClick(item, 0)} - disablePadding - sx={{ - height: '72px', - width: '100%', - overflow: 'hidden', - }} - > - - - {item.icon} - - - - - {item.name} - - {`(${item.address})`} - {item.address === currentAddress && ( - - - - )} - - - {item.balance} Flow - - - - - - - ))} - - - {evmList.length > 0 && ( - - {chrome.i18n.getMessage('multi_vm')} - - )} - - - {evmList.map((item) => ( - handleWalletClick(item, 1)} - disablePadding - sx={{ - height: '72px', - width: '100%', - overflow: 'hidden', - }} - > - - - {item.icon} - - - - - {item.name} - - {`(${formatAddress(item.address)})`} - - EVM - - - - {item.balance} Flow - - - - - - - ))} - - -
- ); -}; - -export default Wallet; diff --git a/src/ui/views/Setting/change-password/index.tsx b/src/ui/views/Setting/change-password/index.tsx deleted file mode 100644 index 5bd1e3382..000000000 --- a/src/ui/views/Setting/change-password/index.tsx +++ /dev/null @@ -1,620 +0,0 @@ -import VisibilityIcon from '@mui/icons-material/Visibility'; -import VisibilityOffIcon from '@mui/icons-material/VisibilityOff'; -import { - Alert, - Button, - CircularProgress, - FormGroup, - IconButton, - Input, - InputAdornment, - LinearProgress, - Snackbar, - Typography, -} from '@mui/material'; -import Box from '@mui/material/Box'; -import React, { useCallback, useEffect, useState } from 'react'; -import { useHistory } from 'react-router-dom'; - -import { consoleError } from '@/shared/utils/console-log'; -import { DEFAULT_PASSWORD } from '@/shared/utils/default'; -import CheckCircleIcon from '@/ui/components/iconfont/IconCheckmark'; -import CancelIcon from '@/ui/components/iconfont/IconClose'; -import { LLHeader } from '@/ui/components/LLHeader'; -import SlideRelative from '@/ui/components/SlideRelative'; -import { useProfiles } from '@/ui/hooks/useProfileHook'; -import { useWallet } from '@/ui/utils'; - -import { GoogleWarningDialog } from './google-warning'; -import { PasswordIndicator } from './password-indicator'; -import { ProfileBackupSelectionDialog } from './profile-backup-selection'; - -const ChangePassword = () => { - const wallet = useWallet(); - const [isCurrentPasswordVisible, setCurrentPasswordVisible] = useState(false); - const [isPasswordVisible, setPasswordVisible] = useState(false); - const [isConfirmPasswordVisible, setConfirmPasswordVisible] = useState(false); - const [password, setPassword] = useState(DEFAULT_PASSWORD); - const [confirmPassword, setConfirmPassword] = useState(DEFAULT_PASSWORD); - const [isCharacters, setCharacters] = useState(false); - const [isMatch, setMatch] = useState(false); - const [confirmCurrentPassword, setConfirmCurrentPassword] = useState(DEFAULT_PASSWORD); - const [isSame, setSame] = useState(false); - const [isVerifying, setIsVerifying] = useState(false); - const [isResetting, setIsResetting] = useState(false); - const [error, setError] = useState(''); - const [statusMessage, setStatusMessage] = useState(''); - const [showGooglePermissionDialog, setShowGooglePermissionDialog] = useState(false); - const [showProfileBackupDialog, setShowProfileBackupDialog] = useState(false); - // No need to maintain selectedProfiles in state since we immediately use them - const history = useHistory(); - - const verify = useCallback(async () => { - try { - setIsVerifying(true); - // verifyPassword doesn't return a value, it throws an error if the password is incorrect - await wallet.verifyPassword(confirmCurrentPassword); - // If we reach here, the password is correct - setSame(true); - } catch (error) { - consoleError('Password verification failed:', error); - setSame(false); - } finally { - setIsVerifying(false); - } - }, [confirmCurrentPassword, wallet]); - - useEffect(() => { - verify(); - }, [confirmCurrentPassword, verify]); - - const successInfo = (message) => { - return ( - - - - {message} - - - ); - }; - - const errorInfo = (message) => { - return ( - - - - {message} - - - ); - }; - - const [helperText, setHelperText] = useState(
); - const [helperMatch, setHelperMatch] = useState(
); - - const changePassword = useCallback( - async (ignoreBackupsAtTheirOwnRisk = false) => { - try { - setIsResetting(true); - setError(''); - setStatusMessage(chrome.i18n.getMessage('Changing_password') || 'Changing password...'); - - const success = await wallet.changePassword( - confirmCurrentPassword, - confirmPassword, - [], - ignoreBackupsAtTheirOwnRisk - ); - - if (success) { - setStatusMessage( - chrome.i18n.getMessage('Password_changed_successfully_Locking_wallet') || - 'Password changed successfully! Locking wallet...' - ); - await wallet - .lockWallet() - .then(() => { - history.push('/unlock'); - }) - .catch((error) => { - consoleError('Error locking wallet:', error); - setError(chrome.i18n.getMessage('Oops__unexpected__error')); - }) - .finally(() => { - setIsResetting(false); - setStatusMessage(''); - }); - } else { - setError(chrome.i18n.getMessage('Oops__unexpected__error')); - } - } catch (error) { - consoleError('Error changing password:', error); - setError(error.message); - } finally { - setIsResetting(false); - if (!error) { - setStatusMessage(''); - } - } - }, - [confirmCurrentPassword, confirmPassword, wallet, history, error] - ); - - const changePasswordWithBackups = useCallback( - async (profileUsernames: string[]) => { - try { - setIsResetting(true); - setError(''); - setStatusMessage( - chrome.i18n.getMessage('Updating_backups_and_changing_password') || - 'Updating backups and changing password...' - ); - - const success = await wallet.changePassword( - confirmCurrentPassword, - confirmPassword, - profileUsernames, - false // not ignoring backups - ); - - if (success) { - setStatusMessage( - chrome.i18n.getMessage('Password_changed_successfully_Locking_wallet') || - 'Password changed successfully! Locking wallet...' - ); - - await wallet - .lockWallet() - .then(() => { - history.push('/unlock'); - }) - .catch((error) => { - consoleError('Error locking wallet:', error); - setError(chrome.i18n.getMessage('Oops__unexpected__error')); - }); - } else { - setError(chrome.i18n.getMessage('Oops__unexpected__error')); - } - } catch (error) { - consoleError('Error changing password:', error); - - // Provide more specific error messages based on the error - if (error.message.includes('backup')) { - setError( - `${chrome.i18n.getMessage('Failed_to_update_Google_Drive_backups') || 'Failed to update Google Drive backups'}: ${error.message}` - ); - } else if (error.message.includes('wallet password')) { - setError( - `${chrome.i18n.getMessage('Failed_to_change_wallet_password') || 'Failed to change wallet password'}: ${error.message}` - ); - } else { - setError(error.message); - } - } finally { - setIsResetting(false); - setStatusMessage(''); - } - }, - [confirmCurrentPassword, confirmPassword, wallet, history] - ); - - const handleChangePasswordClick = useCallback(async () => { - // Check if the user has google permission - // We need to access backups so we can re-encrypt them - const hasGooglePermission = await wallet.hasGooglePermission(); - if (hasGooglePermission) { - // Show the profile backup selection dialog - setShowProfileBackupDialog(true); - } else { - setShowGooglePermissionDialog(true); - } - }, [wallet]); - - // Handler for profile selection - const handleProfileSelection = useCallback( - (selectedUsernames: string[]) => { - setShowProfileBackupDialog(false); - - // Proceed with password change, including selected profiles - changePasswordWithBackups(selectedUsernames); - }, - [changePasswordWithBackups] - ); - - useEffect(() => { - if (password.length > 7) { - setHelperText(successInfo(chrome.i18n.getMessage('At__least__8__characters'))); - setCharacters(true); - } else { - setHelperText(errorInfo(chrome.i18n.getMessage('At__least__8__characters'))); - setCharacters(false); - } - }, [password]); - - useEffect(() => { - if (confirmPassword === password) { - setHelperMatch(successInfo(chrome.i18n.getMessage('Passwords__match'))); - setMatch(true); - } else { - setMatch(false); - setHelperMatch(errorInfo(chrome.i18n.getMessage('Your__passwords__do__not__match'))); - } - }, [confirmPassword, password]); - - return ( -
- - - - - - - {chrome.i18n.getMessage('Current__Password')} - - { - setConfirmCurrentPassword(event.target.value); - }} - endAdornment={ - - {isVerifying ? ( - - - - ) : isSame ? ( - - ) : ( - - )} - setCurrentPasswordVisible(!isCurrentPasswordVisible)}> - {isCurrentPasswordVisible ? ( - - ) : ( - - )} - - - } - /> - - - {chrome.i18n.getMessage('New__Password')} - - { - setPassword(event.target.value); - }} - endAdornment={ - - {password && } - setPasswordVisible(!isPasswordVisible)}> - {isPasswordVisible ? ( - - ) : ( - - )} - - - } - /> - - {helperText} - - - - {chrome.i18n.getMessage('Confirm__Password')} - - { - setConfirmPassword(event.target.value); - }} - endAdornment={ - - setConfirmPasswordVisible(!isConfirmPasswordVisible)}> - {isConfirmPasswordVisible ? ( - - ) : ( - - )} - - - } - /> - - {helperMatch} - - - - - - - - setError('')} - anchorOrigin={{ vertical: 'bottom', horizontal: 'center' }} - > - setError('')} severity="error" sx={{ width: '100%' }}> - {error} - - - - {/* Simple success message with better visibility */} - {isResetting && !error && ( - - - - {chrome.i18n.getMessage('Password__Change__Success')} - - - )} - - changePassword(true)} - onError={setError} - /> - - setShowProfileBackupDialog(false)} - onConfirm={handleProfileSelection} - currentPassword={confirmCurrentPassword} - /> - - {statusMessage && ( - - - - {statusMessage} - - - )} - -
- ); -}; - -export default ChangePassword; diff --git a/src/ui/views/Setting/change-password/password-indicator.tsx b/src/ui/views/Setting/change-password/password-indicator.tsx deleted file mode 100644 index b64f5b2fc..000000000 --- a/src/ui/views/Setting/change-password/password-indicator.tsx +++ /dev/null @@ -1,43 +0,0 @@ -import { Box, Typography, LinearProgress } from '@mui/material'; -import React from 'react'; -import zxcvbn from 'zxcvbn'; - -export const PasswordIndicator = (props) => { - const score = zxcvbn(props.value).score; - const precentage = ((score + 1) / 5) * 100; - - const level = (score) => { - switch (score) { - case 0: - case 1: - return { text: 'Weak', color: 'primary' }; - case 2: - return { text: 'Good', color: 'testnet' }; - case 3: - return { text: 'Great', color: 'success' }; - case 4: - return { text: 'Strong', color: 'success' }; - default: - return { text: 'Unknow', color: 'error' }; - } - }; - - return ( - - - - - - - {level(score).text} - - - - ); -}; diff --git a/src/ui/views/Setting/index.tsx b/src/ui/views/Setting/index.tsx deleted file mode 100644 index c54f293aa..000000000 --- a/src/ui/views/Setting/index.tsx +++ /dev/null @@ -1,633 +0,0 @@ -import AndroidIcon from '@mui/icons-material/Android'; -import AppleIcon from '@mui/icons-material/Apple'; -import CurrencyExchangeIcon from '@mui/icons-material/CurrencyExchange'; -import PhoneIphoneIcon from '@mui/icons-material/PhoneIphone'; -import { - List, - ListItemText, - ListItemIcon, - ListItem, - ListItemButton, - Divider, - CardMedia, - IconButton, - Box, -} from '@mui/material'; -import React, { useState, useEffect, useCallback } from 'react'; -import { Link } from 'react-router-dom'; - -import { LLHeader } from '@/ui/components'; -import CoinsIcon from '@/ui/components/CoinsIcon'; -import IconAbout from '@/ui/components/iconfont/IconAbout'; -import IconAccount from '@/ui/components/iconfont/IconAccount'; -import IconAddressbook from '@/ui/components/iconfont/IconAddressbook'; -import IconEnd from '@/ui/components/iconfont/IconAVector11Stroke'; -import IconBackup from '@/ui/components/iconfont/IconBackup'; -import IconDeveloper from '@/ui/components/iconfont/IconDeveloper'; -import IconLock from '@/ui/components/iconfont/IconLock'; -import { useWallet } from '@/ui/utils'; -import { ReactComponent as Device } from 'ui/assets/svg/device.svg'; -import { ReactComponent as IconLink } from 'ui/assets/svg/Iconlink.svg'; -// Feature flags -const SHOW_DEVICES = false; - -const SettingTab = () => { - const usewallet = useWallet(); - const [isActive, setIsActive] = useState(false); - const [isKeyphrase, setIsKeyphrase] = useState(false); - - const checkIsActive = useCallback(async () => { - // setSending(true); - const activeAccountType = await usewallet.getActiveAccountType(); - if (activeAccountType === 'child') { - setIsActive(true); - } - const keyrings = await usewallet.checkMnemonics(); - await setIsKeyphrase(keyrings); - }, [usewallet]); - - useEffect(() => { - checkIsActive(); - }, [checkIsActive]); - - return ( -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {!isActive && ( - - - - - - - - - - - - - - )} - - - - - - - - - - - - - - - - - - {!isActive && } - {isKeyphrase && ( - - - - - - - - - - - - - - )} - - - - window.open('https://core.flow.com')} - sx={{ - height: '66px', - width: '100%', - overflow: 'hidden', - '&:hover': { - backgroundColor: '#282828', - }, - }} - > - - - - - - - - - {/* */} - - window.open( - 'https://apps.apple.com/ca/app/flow-wallet-nfts-and-crypto/id6478996750' - ) - } - > - - - - window.open( - 'https://play.google.com/store/apps/details?id=com.flowfoundation.wallet' - ) - } - > - - - - - - - - - - - - - - - - - - - - - - - - - {SHOW_DEVICES && ( - <> - - - - - - - - - - - - - - - - - )} - - - - - - - - - - - - - - - - -
- ); -}; - -export default SettingTab; diff --git a/src/ui/views/Setting/recoveryphase/Recoveryphrasepassword.tsx b/src/ui/views/Setting/recoveryphase/Recoveryphrasepassword.tsx deleted file mode 100644 index 72c05650a..000000000 --- a/src/ui/views/Setting/recoveryphase/Recoveryphrasepassword.tsx +++ /dev/null @@ -1,251 +0,0 @@ -import { Input, FormControl, Typography, Button, Fade } from '@mui/material'; -import Box from '@mui/material/Box'; -import React, { useCallback, useEffect, useState } from 'react'; -import { Link, useHistory } from 'react-router-dom'; - -import { DEFAULT_PASSWORD } from '@/shared/utils/default'; -import { LLHeader } from '@/ui/components'; -import CancelIcon from '@/ui/components/iconfont/IconClose'; -import SlideRelative from '@/ui/components/SlideRelative'; -import { useWallet } from 'ui/utils'; - -const Recoveryphrasepassword = () => { - const history = useHistory(); - const wallet = useWallet(); - const [confirmPassword, setConfirmPassword] = useState(DEFAULT_PASSWORD); - const [isMatch, setMatch] = useState(false); - - const handleKeyDown = (event) => { - if (event.key === ' ' || event.keyCode === 32) { - event.preventDefault(); - } - }; - - const verify = useCallback(() => { - setMatch(false); - - if (confirmPassword.length > 7) { - wallet - .verifyPassword(confirmPassword) - .then(() => { - setMatch(true); - }) - .catch(() => { - setMatch(false); - }); - } - }, [confirmPassword, wallet]); - - const setTab = useCallback(async () => { - await wallet.setDashIndex(3); - }, [wallet]); - - const navigate = useCallback(async () => { - history.push({ - pathname: '/dashboard/nested/recoveryphrasedetail', - state: { - password: confirmPassword, - }, - }); - }, [confirmPassword, history]); - - useEffect(() => { - setTab(); - }, [setTab]); - - useEffect(() => { - verify(); - }, [confirmPassword, verify]); - - const passwordError = () => ( - - - - {chrome.i18n.getMessage('Incorrect__Password')} - - - ); - - return ( -
- - - - - { - setConfirmPassword(event.target.value); - }} - onKeyDown={handleKeyDown} - /> - - - <> - - {passwordError()} - - - - - {/* */} - - - - - {chrome.i18n.getMessage('Do__not__share__your__secret__phrase')} - - - {chrome.i18n.getMessage('If__someone__has__your__secret__phrase')} - - - - - - - - - - - - - -
- ); -}; - -export default Recoveryphrasepassword; diff --git a/src/ui/views/Welcome/AccountImport/Google/DecryptWallet.tsx b/src/ui/views/Welcome/AccountImport/Google/DecryptWallet.tsx deleted file mode 100644 index 9e05e78c4..000000000 --- a/src/ui/views/Welcome/AccountImport/Google/DecryptWallet.tsx +++ /dev/null @@ -1,159 +0,0 @@ -import VisibilityIcon from '@mui/icons-material/Visibility'; -import VisibilityOffIcon from '@mui/icons-material/VisibilityOff'; -import { Button, Typography, IconButton, Input, InputAdornment, FormGroup } from '@mui/material'; -import { Box } from '@mui/system'; -import React, { useEffect, useState } from 'react'; - -import { DEFAULT_PASSWORD } from '@/shared/utils/default'; -import CancelIcon from '@/ui/components/iconfont/IconClose'; -import SlideRelative from '@/ui/components/SlideRelative'; -import { useWallet } from 'ui/utils'; - -const DecryptWallet = ({ handleSwitchTab, setMnemonic, username }) => { - const usewallet = useWallet(); - - const [isPasswordVisible, setPasswordVisible] = useState(false); - const [password, setPassword] = useState(DEFAULT_PASSWORD); - const [isCharacters, setCharacters] = useState(false); - // const [isCheck, setCheck] = useState(false); - const [isLoading, setLoading] = useState(false); - - const errorInfo = (message) => { - return ( - - - - {message} - - - ); - }; - - const [helperText, setHelperText] = useState(
); - - const decryptWallet = async () => { - setLoading(true); - - try { - const mnemonic = await usewallet.restoreAccount(username, password); - setLoading(false); - setMnemonic(mnemonic); - handleSwitchTab(); - } catch (e) { - setLoading(false); - setHelperText( - errorInfo(chrome.i18n.getMessage('Incorrect__decrypt__password__please__try__again')) - ); - } - }; - - useEffect(() => { - if (password.length < 8) { - setHelperText( - errorInfo(chrome.i18n.getMessage('The__decrypt__password__should__be__8__characters__long')) - ); - setCharacters(false); - } else { - setHelperText(
); - setCharacters(true); - } - }, [password]); - - return ( - <> - - - {chrome.i18n.getMessage('Welcome__Back')} - - {username} - {' '} - - - {chrome.i18n.getMessage('Please__enter__your__password__to__decrypt')} - - - - - { - setPassword(event.target.value); - }} - endAdornment={ - - setPasswordVisible(!isPasswordVisible)}> - {isPasswordVisible ? : } - - - } - /> - - {helperText} - - - - - - - - - ); -}; - -export default DecryptWallet; diff --git a/src/ui/views/Welcome/index.tsx b/src/ui/views/Welcome/index.tsx deleted file mode 100644 index 89b7b1a49..000000000 --- a/src/ui/views/Welcome/index.tsx +++ /dev/null @@ -1,239 +0,0 @@ -import { Typography, Button, CardMedia } from '@mui/material'; -import { Box } from '@mui/system'; -import React from 'react'; -import { Link, useLocation } from 'react-router-dom'; - -import appicon from '@/ui/assets/image/appicon.png'; -import create from '@/ui/assets/svg/create.svg'; -import importPng from '@/ui/assets/svg/import.svg'; -import qr from '@/ui/assets/svg/scanIcon.svg'; -import RegisterHeader from '@/ui/components/LandingPages/RegisterHeader'; - -const Welcome = () => { - return ( - - - - - - - - - - - - {chrome.i18n.getMessage('Welcome_to_lilico')} - - - - {chrome.i18n.getMessage('A_crypto_wallet_on_Flow')}{' '} - - {chrome.i18n.getMessage('Explorers_Collectors_and_Gamers')} - - - - - - - - - - - - - - - ); -}; - -export default Welcome; diff --git a/src/ui/views/index.tsx b/src/ui/views/index.tsx deleted file mode 100644 index 4fe3cb781..000000000 --- a/src/ui/views/index.tsx +++ /dev/null @@ -1,70 +0,0 @@ -import { CssBaseline } from '@mui/material'; -import { createTheme, ThemeProvider } from '@mui/material/styles'; -import React from 'react'; -import { HashRouter as Router, Route, useLocation } from 'react-router-dom'; - -import themeOptions from '@/ui/style/LLTheme'; -import PrivateRoute from 'ui/components/PrivateRoute'; -import { WalletProvider, useWallet } from 'ui/utils'; - -// Uncomment this when we need to test api-test -import ApiTestPage from './api-test/api-test-page'; -import Approval from './Approval'; -import InnerRoute from './InnerRoute'; -import { Landing } from './Landing'; -import SortHat from './SortHat'; -import Unlock from './Unlock'; - -const theme = createTheme(themeOptions); - -const Routes = () => { - const location = useLocation(); - const wallet = useWallet(); - - React.useEffect(() => { - wallet.trackPageView(location.pathname); - }, [location, wallet]); - - return ( - <> - - - - - - - - - - - - {/* uncomment this when we need to test api-test */} - {process.env.NODE_ENV === 'development' && ( - - - - )} - - ); -}; - -function Main() { - return ( - - - - ); -} - -const App = ({ wallet }: { wallet: any }) => { - return ( - - - -
- - - ); -}; - -export default App; diff --git a/tsconfig.json b/tsconfig.json index a3184be8c..b36f755eb 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,44 +1,22 @@ { "compilerOptions": { "baseUrl": "./", - "experimentalDecorators": true, - "emitDecoratorMetadata": true, "module": "ESNext", "target": "ESNext", "moduleResolution": "bundler", - "noImplicitAny": false, - "checkJs": true, - "strict": true, "esModuleInterop": true, - "useUnknownInCatchVariables": false, + "strict": true, "resolveJsonModule": true, - "paths": { - "@/*": ["./src/*"], - "ui/*": ["./src/ui/*"], - "background/*": ["./src/background/*"], - "consts": ["./src/constant/index"] - }, - "lib": ["ES2021.String", "DOM", "DOM.Iterable"], - "types": ["chrome", "node", "react", "react-dom"], "jsx": "react", "allowSyntheticDefaultImports": true, - "allowJs": true, - "plugins": [ - { - "transform": "typescript-transform-paths", - "afterDeclarations": true - } - ], - "outDir": "./dist" + "allowJs": true }, - "exclude": ["./node_modules"], - "include": [ - "src", - "__tests__", - "build", - "webpack.config.ts", - "postcss.config.mjs", - "svgTransform.js", - ".storybook/**/*" - ] + "references": [ + { "path": "./apps/extension" }, + { "path": "./packages/shared" }, + { "path": "./packages/reducers" } + ], + "files": [], + "include": [], + "exclude": ["node_modules"] }