diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..da329de --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,27 @@ +name: CI + +on: + push: + branches: [main] + pull_request: + branches: [main] + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: '20' + cache: 'npm' + + - name: Install dependencies + run: npm ci + + - name: TypeScript check & build + run: npm run build diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..1166381 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,64 @@ +name: Release +run-name: Release v${{ inputs.version }} + +on: + workflow_dispatch: + inputs: + version: + description: 'Version (e.g., 0.2.0, 0.2.1-beta.1)' + required: true + type: string + release_notes: + description: 'Release notes / changelog (leave empty for auto-generated)' + required: false + type: string + +jobs: + build-and-release: + runs-on: ubuntu-latest + permissions: + contents: write + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: '20' + cache: 'npm' + + - name: Validate version format + run: | + if ! echo "${{ inputs.version }}" | grep -qE '^[0-9]+\.[0-9]+\.[0-9]+(-[a-zA-Z0-9.]+)?$'; then + echo "Error: Invalid version format. Use semver (e.g., 0.2.0, 0.2.1-beta.1)" + exit 1 + fi + + - name: Update package version + run: npm version ${{ inputs.version }} --no-git-tag-version + + - name: Install dependencies + run: npm ci + + - name: Build & package + run: npm run package + + - name: Commit version bump and push tag + run: | + git config user.name "github-actions[bot]" + git config user.email "github-actions[bot]@users.noreply.github.com" + git add package.json package-lock.json + git commit -m "chore: release v${{ inputs.version }}" + git tag "v${{ inputs.version }}" + git push origin HEAD --tags + + - name: Create GitHub Release + uses: softprops/action-gh-release@v2 + with: + name: Sphere Wallet v${{ inputs.version }} + tag_name: v${{ inputs.version }} + files: sphere-wallet-v${{ inputs.version }}.zip + body: ${{ inputs.release_notes }} + generate_release_notes: ${{ inputs.release_notes == '' }} diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..7dce97e --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,196 @@ +# CLAUDE.md — Sphere Extension + +Chrome extension wallet for Unicity Protocol. Branch: `rn-wallet`. Version: 0.2.0. + +## Dev Commands + +```bash +npm run dev # Build + Vite watch (for development) +npm run build # tsc --noEmit + full build +npm run build:fast # Skip type check, just build +npm run lint # tsc --noEmit only +npm run package # Build + create .zip for distribution +``` + +After build: load `dist/` folder in Chrome → chrome://extensions → Developer mode → Load unpacked. + +## Architecture + +``` +src/ + components/ # React UI components + ui/ # Button, BaseModal, AlertMessage, EmptyState, MenuButton, ModalHeader + wallet/ + modals/ # SendModal, PaymentRequestsModal, TransactionHistoryModal, + # SettingsModal, BackupWalletModal, LogoutConfirmModal, + # TopUpModal, SwapModal, SeedPhraseModal, LookupModal, SaveWalletModal + onboarding/ # CreateWalletFlow + 7 screens + shared/ # AddressSelector, AssetRow, TokenRow, RegisterNametagModal, etc. + platform/extension/ + background/ # Service worker (wallet-manager.ts — ALL SDK calls here) + content/ # Content script (bridges web page ↔ background) + inject/ # window.sphere API exposed to web pages + popup/ # PopupApp.tsx — main entry + sdk/ # React adapter (context.ts, queryKeys.ts, hooks/) + shared/ # types.ts, constants.ts, messages.ts +``` + +## Critical Architecture Rules + +### SDK calls ONLY in background/wallet-manager.ts +The popup UI never calls SDK directly. All SDK operations go through: +``` +Popup component → chrome.runtime.sendMessage({ type: 'POPUP_*' }) → wallet-manager.ts → SDK +``` + +### Message Types +- `POPUP_*` — Popup UI → Background service worker (30+ types) +- `SPHERE_*` — Web page → Extension (via inject → content → background) + +### Chrome Storage +All wallet data in `chrome.storage.local`: +- `encryptedMnemonic` — AES-GCM encrypted (PBKDF2, 100k iterations) +- `aggregatorConfig`, `nametag`, `pendingTransactions`, `preferences` + +### NO direct IndexedDB access in popup +SDK's IndexedDB (sphere-storage, sphere-token-storage-*) is managed by background service worker via wallet-manager.ts + +## SDK Usage (background/wallet-manager.ts) +```typescript +import { Sphere } from '@unicitylabs/sphere-sdk' +import { createBrowserProviders } from '@unicitylabs/sphere-sdk/impl/browser' + +const providers = await createBrowserProviders({ network: 'testnet' }) +const { sphere } = await Sphere.init({ ...providers, l1: {} }) + +// Key calls: +sphere.identity // WalletIdentity +sphere.payments.getTokens() // Token[] +sphere.payments.getAssets() // Asset[] +sphere.payments.send({ recipient, amount, coinId, memo }) +sphere.payments.l1.getBalance() // L1Balance +sphere.payments.l1.send({ to, amount }) +sphere.communications.sendDM(to, content) +sphere.registerNametag(name) +sphere.resolve(identifier) // @nametag, DIRECT://, alpha1... +sphere.destroy() +``` + +## Key Types (src/shared/types.ts) +```typescript +interface WalletState { hasWallet: boolean; isUnlocked: boolean; activeIdentityId: string | null } +interface TokenBalance { coinId, symbol, amount, pendingAmount? } +interface PendingTransaction { requestId, type: 'send'|'sign_message'|'sign_nostr', origin, tabId, data } +interface SendTransactionData { recipient, coinId, amount, message? } +``` + +## Supported Tokens (src/shared/constants.ts) +UCT (18), USDU (6), EURU (6), SOL (9), BTC (8), ETH (18), ALPHT (8), USDT (6), USDC (6) + +Gateway URL: `https://goggregator-test.unicity.network` (testnet) + +## Path Aliases (vite.config.ts) +``` +@/shared → src/shared +@/sdk → src/sdk +@/components → src/components +@/platform → src/platform +``` + +## Build Output +- `dist/popup.html` + assets — popup UI +- `dist/background.js` — service worker +- `dist/content.js` — content script +- `dist/inject.js` — injected script (window.sphere) + +## Connect Protocol (Sphere Connect — dApp integration) + +The extension implements the Sphere Connect protocol on top of the SDK's `ConnectHost`. See [`CONNECT.md`](./CONNECT.md) for the full integration guide. + +### Key Files + +| File | Role | +|------|------| +| `src/platform/extension/background/connect-host.ts` | ConnectHost lifecycle, approved origins, approval/intent queues | +| `src/platform/extension/background/message-handler.ts` | Routes POPUP_* messages from popup to connect-host | +| `src/platform/extension/background/wallet-manager.ts` | Calls `initConnectHost()` after unlock, `destroyConnectHost()` on lock | +| `src/platform/extension/content/index.ts` | Relays `sphere-connect-ext` messages between page ↔ background | +| `src/components/wallet/modals/ConnectApprovalModal.tsx` | UI for first-time dApp connection approval | +| `src/components/wallet/modals/ConnectIntentModal.tsx` | UI for generic intent approval | +| `src/components/wallet/modals/ConnectedSitesModal.tsx` | Settings → Connected Sites (list + revoke) | + +### Approved Origins Storage + +```typescript +interface ApprovedOriginEntry { + permissions: PermissionScope[]; + connectedAt: number; // first approval timestamp + lastSeenAt: number; // last successful silent-connect timestamp + dapp: DAppMetadata; // name, description, url, iconUrl? +} +// chrome.storage.local key: 'sphere_approved_origins' +``` + +### POPUP_* Messages for Connect Protocol + +```typescript +// Poll for pending connection approval +{ type: 'POPUP_GET_CONNECT_APPROVAL' } +// → null | { id, dapp, requestedPermissions } + +// Resolve approval (user clicked Connect or Reject) +{ type: 'POPUP_RESOLVE_CONNECT_APPROVAL', id, approved: true, grantedPermissions } + +// Poll for pending intent +{ type: 'POPUP_GET_CONNECT_INTENT' } +// → null | { id, action, params, session } + +// Resolve intent +{ type: 'POPUP_RESOLVE_CONNECT_INTENT', id, result: { result: {...} } | { error: {...} } } + +// Get connected sites (for ConnectedSitesModal) +{ type: 'POPUP_GET_CONNECTED_SITES' } +// → { success: true, sites: Record } + +// Revoke a site +{ type: 'POPUP_REVOKE_CONNECTED_SITE', origin: 'https://...' } +// → { success: true } +``` + +### Silent Mode (auto-connect) + +When `silent=true` arrives in handshake: +- Origin in approved storage → approve immediately (update `lastSeenAt`) +- Origin NOT in storage → reject immediately (no popup, no window) + +### onDisconnect + +When dApp calls `client.disconnect()` → SDK fires `onDisconnect(session)` → extension calls `revokeConnectedSite(origin)` → origin removed from storage → next silent-check fails → Connect button shown. + +### Content Script Relay + +``` +Page: window.postMessage({ type: 'sphere-connect-ext:tohost', ... }) + → content script: chrome.runtime.sendMessage(envelope) + → background: ConnectHost handles it + +Background: chrome.tabs.sendMessage(tabId, { type: 'sphere-connect-ext:toclient', ... }) + → content script: window.postMessage(message, '*') + → page: ExtensionTransport.forClient() receives it +``` + +--- + +## window.sphere API (exposed to web pages via inject/index.ts) +```typescript +window.sphere.isInstalled(): boolean +window.sphere.connect(): Promise +window.sphere.getBalances(): Promise +window.sphere.sendTokens({ recipient, coinId, amount, message? }): Promise<{ transactionId }> +window.sphere.signMessage(message): Promise +window.sphere.getNostrPublicKey(): Promise<{ hex, npub }> +window.sphere.nip44.encrypt(recipientPubkey, plaintext): Promise +window.sphere.nip44.decrypt(senderPubkey, ciphertext): Promise +window.sphere.getMyNametag(): Promise<{ name, proxyAddress } | null> +window.sphere.resolveNametag(nametag): Promise +``` diff --git a/CONNECT.md b/CONNECT.md new file mode 100644 index 0000000..5fa4347 --- /dev/null +++ b/CONNECT.md @@ -0,0 +1,200 @@ +# Sphere Extension — Connect Protocol Integration Guide + +This document explains how the Sphere browser extension implements the Sphere Connect protocol, allowing web dApps to interact with the wallet via `ExtensionTransport`. + +## Overview + +``` +dApp page (any website) + │ window.postMessage (sphere-connect-ext:tohost) + ↓ +Content Script (injected on every page) + │ chrome.runtime.sendMessage + ↓ +Background Service Worker + │ ExtensionTransport.forHost + ↓ +ConnectHost → Sphere SDK instance +``` + +## Key Files + +| File | Role | +|------|------| +| `src/platform/extension/background/connect-host.ts` | ConnectHost lifecycle, approved origins, approval/intent queues | +| `src/platform/extension/background/message-handler.ts` | Routes POPUP_* messages from extension popup to connect-host | +| `src/platform/extension/background/wallet-manager.ts` | Holds the Sphere SDK instance; calls `initConnectHost()` after unlock | +| `src/platform/extension/content/index.ts` | Relays sphere-connect-ext messages between page and background | +| `src/components/wallet/modals/ConnectApprovalModal.tsx` | UI shown to user for first-time dApp connection | +| `src/components/wallet/modals/ConnectedSitesModal.tsx` | Settings → Connected Sites — lists approved origins, allows revoke | +| `src/components/wallet/modals/SettingsModal.tsx` | Settings entry point (includes Connected Sites menu item) | + +--- + +## Approved Origins (Persistent Permissions) + +Approved origins are stored in `chrome.storage.local` under key `sphere_approved_origins`: + +```typescript +interface ApprovedOriginEntry { + permissions: PermissionScope[]; + connectedAt: number; // timestamp of first approval + lastSeenAt: number; // timestamp of last successful connect + dapp: DAppMetadata; +} + +// Storage shape: +{ + "sphere_approved_origins": { + "https://app.example.com": { permissions: [...], connectedAt: 1234, lastSeenAt: 1234, dapp: {...} }, + "http://localhost:5174": { permissions: [...], connectedAt: 1234, lastSeenAt: 1234, dapp: {...} } + } +} +``` + +### Flow on connection request + +``` +dApp calls client.connect() + │ + ↓ handshake arrives at ConnectHost + │ + ├─ silent=true (auto-connect check)? + │ ├─ origin in storage? → approve silently (update lastSeenAt) + │ └─ origin NOT in storage? → reject immediately (no popup) + │ + └─ silent=false (user clicked "Connect")? + ├─ origin in storage? → approve silently + └─ origin NOT in storage? → open extension popup → show ConnectApprovalModal + │ + ├─ User approves → save origin to storage → return approved + └─ User rejects (or 2-min timeout) → return rejected +``` + +### Managing approved origins + +```typescript +import { + getConnectedSites, + revokeConnectedSite, +} from '@/platform/extension/background/connect-host'; + +// Get all approved origins (used by Connected Sites UI) +const sites = await getConnectedSites(); +// { "https://example.com": { permissions, connectedAt, lastSeenAt, dapp } } + +// Revoke an origin (used by Connected Sites UI revoke button) +await revokeConnectedSite('https://example.com'); +``` + +When `revokeConnectedSite` is called, the origin is removed from `chrome.storage.local`. The next time the dApp loads and does a silent-check, it will fail and show the Connect button instead of auto-connecting. + +--- + +## onDisconnect — dApp-initiated disconnect + +When a dApp calls `client.disconnect()`, the SDK sends `sphere_disconnect` RPC. `ConnectHost` handles it by: +1. Revoking the in-memory session +2. Calling `onDisconnect(session)` — the extension uses this to `revokeConnectedSite(origin)` + +This means: **disconnect from the dApp side = revoke approval from the wallet**. The dApp must re-request approval on next connect. + +--- + +## ConnectHost Lifecycle + +`ConnectHost` is created after wallet unlock and destroyed on lock: + +```typescript +// In wallet-manager.ts after unlock: +initConnectHost(); + +// In wallet-manager.ts on lock: +destroyConnectHost(); +``` + +`destroyConnectHost()` also rejects any pending approval or intent with a user-rejected error. + +--- + +## Pending Approvals & Intents + +The background keeps at most **one** pending approval and **one** pending intent at a time. + +The extension popup polls via `chrome.runtime.sendMessage`: + +```typescript +// Poll for pending approval +chrome.runtime.sendMessage({ type: 'POPUP_GET_CONNECT_APPROVAL' }) +// → null (no pending) or { id, dapp, requestedPermissions } + +// Resolve approval (user clicked Connect or Reject) +chrome.runtime.sendMessage({ + type: 'POPUP_RESOLVE_CONNECT_APPROVAL', + id, + approved: true, + grantedPermissions: [...], +}) + +// Poll for pending intent +chrome.runtime.sendMessage({ type: 'POPUP_GET_CONNECT_INTENT' }) +// → null (no pending) or { id, action, params, session } + +// Resolve intent +chrome.runtime.sendMessage({ + type: 'POPUP_RESOLVE_CONNECT_INTENT', + id, + result: { result: { ... } }, // success + // or: + result: { error: { code: 4001, message: 'User rejected' } }, +}) + +// Get all connected sites +chrome.runtime.sendMessage({ type: 'POPUP_GET_CONNECTED_SITES' }) +// → { success: true, sites: Record } + +// Revoke a site from settings +chrome.runtime.sendMessage({ type: 'POPUP_REVOKE_CONNECTED_SITE', origin: 'https://...' }) +// → { success: true } +``` + +Timeouts: +- Approval: **2 minutes** (auto-rejected if user doesn't respond) +- Intent: **5 minutes** (auto-rejected) + +--- + +## Intent Routing + +When a dApp sends an intent, `onIntent` in `connect-host.ts` opens the popup and stores `pendingIntent`. The popup's `WalletPanel.tsx` polls for it and routes to the correct UI: + +| Intent action | UI component | +|--------------|--------------| +| `send` | `SendModal` (pre-filled with recipient/amount/coinId) | +| other | `ConnectIntentModal` (generic approval) | + +--- + +## Content Script Relay + +The content script (`content/index.ts`) bridges the page and the background for the Connect protocol: + +``` +Page: window.postMessage({ type: 'sphere-connect-ext:tohost', ... }) + → content script: chrome.runtime.sendMessage(envelope) + → background: ConnectHost handles it + +Background: chrome.tabs.sendMessage(tabId, { type: 'sphere-connect-ext:toclient', ... }) + → content script: window.postMessage(message, '*') + → page: ExtensionTransport.forClient() receives it +``` + +--- + +## Adding a New Intent UI + +1. Add the intent action to `INTENT_ACTIONS` in `sphere-sdk/connect/protocol.ts` +2. Add the intent permission to `permissions.ts` +3. In `WalletPanel.tsx`, add a case in the intent routing switch +4. Create (or reuse) a modal component for the UI +5. Resolve via `chrome.runtime.sendMessage({ type: 'POPUP_RESOLVE_CONNECT_INTENT', id, result })` diff --git a/README.md b/README.md index aa491c3..4e79c70 100644 --- a/README.md +++ b/README.md @@ -37,6 +37,47 @@ npm run package Load the `dist/` folder as an unpacked extension in `chrome://extensions` for development. +## Features + +- **Wallet management** — create, import, backup via seed phrase +- **L3 payments** — send/receive UCT and other tokens +- **L1 payments** — ALPHA blockchain transactions +- **Nametags** — register @username for human-readable addresses +- **Connect Protocol** — dApps can connect to the wallet via `ExtensionTransport` and request queries/intents +- **Connected Sites** — manage approved dApp origins (Settings → Connected Sites) +- **window.sphere API** — legacy web page integration via injected script + +## Connect Protocol (for dApp developers) + +Web dApps can integrate with Sphere Extension using the Sphere Connect protocol: + +```typescript +import { ConnectClient } from '@unicitylabs/sphere-sdk/connect'; +import { ExtensionTransport } from '@unicitylabs/sphere-sdk/connect/browser'; + +// Silent auto-connect on page load +const client = new ConnectClient({ + transport: ExtensionTransport.forClient(), + dapp: { name: 'My dApp', description: '...', url: location.origin }, + silent: true, // fast-fail if not approved — no popup +}); +try { + const { identity } = await client.connect(); // instant if already approved +} catch { + // Not approved — show Connect button +} + +// User-triggered connect (shows approval popup in extension) +const client2 = new ConnectClient({ transport: ExtensionTransport.forClient(), dapp }); +const { identity, permissions } = await client2.connect(); + +// Queries and intents +const balance = await client2.query('sphere_getBalance'); +await client2.intent('send', { recipient: '@alice', amount: 100, coinId: 'USDC' }); +``` + +See [CONNECT.md](./CONNECT.md) for the full integration guide. + ## Supported Tokens (Testnet) | Symbol | Decimals | diff --git a/eslint.config.js b/eslint.config.js new file mode 100644 index 0000000..eeeb0a3 --- /dev/null +++ b/eslint.config.js @@ -0,0 +1,32 @@ +import js from '@eslint/js' +import globals from 'globals' +import reactHooks from 'eslint-plugin-react-hooks' +import reactRefresh from 'eslint-plugin-react-refresh' +import tseslint from 'typescript-eslint' +import { defineConfig, globalIgnores } from 'eslint/config' + +export default defineConfig([ + globalIgnores(['dist', 'scripts']), + { + files: ['**/*.{ts,tsx}'], + extends: [ + js.configs.recommended, + tseslint.configs.recommended, + reactHooks.configs['recommended-latest'], + reactRefresh.configs.vite, + ], + languageOptions: { + ecmaVersion: 2022, + globals: { + ...globals.browser, + ...globals.webextensions, + }, + }, + rules: { + // Allow unused vars with underscore prefix + '@typescript-eslint/no-unused-vars': ['error', { argsIgnorePattern: '^_', varsIgnorePattern: '^_' }], + // Not relevant for extension (no HMR) + 'react-refresh/only-export-components': 'warn', + }, + }, +]) diff --git a/package-lock.json b/package-lock.json index 1350f05..610bfbf 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,96 +1,49 @@ { - "name": "sphere-extension", - "version": "0.1.5", + "name": "sphere-wallet", + "version": "0.2.0", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "sphere-extension", - "version": "0.1.5", + "name": "sphere-wallet", + "version": "0.2.0", "dependencies": { - "@noble/curves": "^1.4.0", - "@noble/hashes": "^1.4.0", - "@scure/base": "^1.1.0", - "@tailwindcss/postcss": "^4.1.18", + "@noble/curves": "^1.8.2", + "@noble/hashes": "^1.7.2", + "@scure/base": "^1.2.4", + "@tanstack/react-query": "^5.90.0", "@unicitylabs/nostr-js-sdk": "^0.3.2", - "@unicitylabs/sphere-sdk": "^0.4.7", - "@unicitylabs/state-transition-sdk": "^1.6.1-rc.f37cb85", + "@unicitylabs/sphere-sdk": "^0.5.4", + "@unicitylabs/state-transition-sdk": "^1.6.1-rc", + "lucide-react": "^0.552.0", "react": "^18.3.1", - "react-dom": "^18.3.1", - "zustand": "^5.0.0" + "react-dom": "^18.3.1" }, "devDependencies": { - "@types/chrome": "^0.0.268", - "@types/react": "^18.3.0", - "@types/react-dom": "^18.3.0", - "@vitejs/plugin-react": "^4.3.0", + "@eslint/js": "^9.39.3", + "@tailwindcss/vite": "^4.1.0", + "@types/chrome": "^0.0.287", + "@types/node": "^25.3.2", + "@types/react": "^18.3.23", + "@types/react-dom": "^18.3.7", + "@vitejs/plugin-react": "^4.5.2", "archiver": "^7.0.1", - "autoprefixer": "^10.4.18", - "postcss": "^8.4.35", - "tailwindcss": "^4.0.0", - "typescript": "^5.5.0", - "vite": "^5.4.0", + "eslint": "^9.39.3", + "eslint-plugin-react-hooks": "^5.2.0", + "eslint-plugin-react-refresh": "^0.4.26", + "globals": "^16.5.0", + "tailwindcss": "^4.1.0", + "typescript": "^5.7.3", + "typescript-eslint": "^8.56.1", + "vite": "^6.3.5", "vite-plugin-node-polyfills": "^0.25.0" } }, - "node_modules/@achingbrain/http-parser-js": { - "version": "0.5.9", - "resolved": "https://registry.npmjs.org/@achingbrain/http-parser-js/-/http-parser-js-0.5.9.tgz", - "integrity": "sha512-nPuMf2zVzBAGRigH/1jFpb/6HmJsps+15f4BPlGDp3vsjYB2ZgruAErUpKpcFiVRz3DHLXcGNmuwmqZx/sVI7A==", - "license": "MIT", - "optional": true, - "dependencies": { - "uint8arrays": "^5.1.0" - } - }, - "node_modules/@achingbrain/nat-port-mapper": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@achingbrain/nat-port-mapper/-/nat-port-mapper-4.0.5.tgz", - "integrity": "sha512-YAA4MW6jO6W7pmJaFzQ0AOLpu8iQClUkdT2HbfKLmtFjrpoZugnFj9wH8EONV9LxnIW+0W1J98ri+oApKyAKLQ==", - "license": "Apache-2.0 OR MIT", - "optional": true, - "dependencies": { - "@achingbrain/ssdp": "^4.1.0", - "@chainsafe/is-ip": "^2.0.2", - "@libp2p/logger": "^6.0.5", - "abort-error": "^1.0.0", - "err-code": "^3.0.1", - "netmask": "^2.0.2", - "p-defer": "^4.0.0", - "race-signal": "^2.0.0", - "xml2js": "^0.6.0" - } - }, - "node_modules/@achingbrain/ssdp": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/@achingbrain/ssdp/-/ssdp-4.2.4.tgz", - "integrity": "sha512-1dZIV7dwYJRS1sTA0qIDzsMdwZAnPa7DGb2YuPqMq4PjEjvzBBuz2WIsXnrkRFCNY00JuqLiMby9GecnGsOgaQ==", - "license": "Apache-2.0 OR MIT", - "optional": true, - "dependencies": { - "abort-error": "^1.0.0", - "freeport-promise": "^2.0.0", - "merge-options": "^3.0.4", - "xml2js": "^0.6.2" - } - }, - "node_modules/@alloc/quick-lru": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", - "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/@babel/code-frame": { "version": "7.29.0", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", - "devOptional": true, + "dev": true, "license": "MIT", "dependencies": { "@babel/helper-validator-identifier": "^7.28.5", @@ -105,7 +58,7 @@ "version": "7.29.0", "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.0.tgz", "integrity": "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==", - "devOptional": true, + "dev": true, "license": "MIT", "engines": { "node": ">=6.9.0" @@ -115,9 +68,8 @@ "version": "7.29.0", "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz", "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", - "devOptional": true, + "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "^7.29.0", "@babel/generator": "^7.29.0", @@ -147,7 +99,7 @@ "version": "7.29.1", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", - "devOptional": true, + "dev": true, "license": "MIT", "dependencies": { "@babel/parser": "^7.29.0", @@ -164,7 +116,7 @@ "version": "7.28.6", "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", - "devOptional": true, + "dev": true, "license": "MIT", "dependencies": { "@babel/compat-data": "^7.28.6", @@ -181,7 +133,7 @@ "version": "7.28.0", "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", - "devOptional": true, + "dev": true, "license": "MIT", "engines": { "node": ">=6.9.0" @@ -191,7 +143,7 @@ "version": "7.28.6", "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", - "devOptional": true, + "dev": true, "license": "MIT", "dependencies": { "@babel/traverse": "^7.28.6", @@ -205,7 +157,7 @@ "version": "7.28.6", "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", - "devOptional": true, + "dev": true, "license": "MIT", "dependencies": { "@babel/helper-module-imports": "^7.28.6", @@ -223,7 +175,7 @@ "version": "7.28.6", "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==", - "devOptional": true, + "dev": true, "license": "MIT", "engines": { "node": ">=6.9.0" @@ -233,7 +185,7 @@ "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", - "devOptional": true, + "dev": true, "license": "MIT", "engines": { "node": ">=6.9.0" @@ -243,7 +195,7 @@ "version": "7.28.5", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", - "devOptional": true, + "dev": true, "license": "MIT", "engines": { "node": ">=6.9.0" @@ -253,7 +205,7 @@ "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", - "devOptional": true, + "dev": true, "license": "MIT", "engines": { "node": ">=6.9.0" @@ -263,7 +215,7 @@ "version": "7.28.6", "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.6.tgz", "integrity": "sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==", - "devOptional": true, + "dev": true, "license": "MIT", "dependencies": { "@babel/template": "^7.28.6", @@ -277,7 +229,7 @@ "version": "7.29.0", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.0.tgz", "integrity": "sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==", - "devOptional": true, + "dev": true, "license": "MIT", "dependencies": { "@babel/types": "^7.29.0" @@ -289,213 +241,6 @@ "node": ">=6.0.0" } }, - "node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "license": "MIT", - "optional": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-bigint": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", - "license": "MIT", - "optional": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "license": "MIT", - "optional": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", - "license": "MIT", - "optional": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.28.6.tgz", - "integrity": "sha512-jiLC0ma9XkQT3TKJ9uYvlakm66Pamywo+qwL+oL8HJOvc6TWdZXVfhqJr8CCzbSGUAbDOzlGHJC1U+vRfLQDvw==", - "license": "MIT", - "optional": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "license": "MIT", - "optional": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "license": "MIT", - "optional": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "license": "MIT", - "optional": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "license": "MIT", - "optional": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "license": "MIT", - "optional": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "license": "MIT", - "optional": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "license": "MIT", - "optional": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "license": "MIT", - "optional": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", - "license": "MIT", - "optional": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "license": "MIT", - "optional": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-transform-react-jsx-self": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz", @@ -528,21 +273,11 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/runtime": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.6.tgz", - "integrity": "sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/template": { "version": "7.28.6", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", - "devOptional": true, + "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.28.6", @@ -557,28 +292,8 @@ "version": "7.29.0", "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.29.0", - "@babel/generator": "^7.29.0", - "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.29.0", - "@babel/template": "^7.28.6", - "@babel/types": "^7.29.0", - "debug": "^4.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse--for-generate-function-map": { - "name": "@babel/traverse", - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", - "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", + "dev": true, "license": "MIT", - "optional": true, "dependencies": { "@babel/code-frame": "^7.29.0", "@babel/generator": "^7.29.0", @@ -596,7 +311,7 @@ "version": "7.29.0", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", - "devOptional": true, + "dev": true, "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.27.1", @@ -606,20 +321,6 @@ "node": ">=6.9.0" } }, - "node_modules/@chainsafe/as-chacha20poly1305": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@chainsafe/as-chacha20poly1305/-/as-chacha20poly1305-0.1.0.tgz", - "integrity": "sha512-BpNcL8/lji/GM3+vZ/bgRWqJ1q5kwvTFmGPk7pxm/QQZDbaMI98waOHjEymTjq2JmdD/INdNBFOVSyJofXg7ew==", - "license": "Apache-2.0", - "optional": true - }, - "node_modules/@chainsafe/as-sha256": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@chainsafe/as-sha256/-/as-sha256-1.2.0.tgz", - "integrity": "sha512-H2BNHQ5C3RS+H0ZvOdovK6GjFAyq5T6LClad8ivwj9Oaiy28uvdsGVS7gNJKuZmg0FGHAI+n7F0Qju6U0QkKDA==", - "license": "Apache-2.0", - "optional": true - }, "node_modules/@chainsafe/is-ip": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/@chainsafe/is-ip/-/is-ip-2.1.0.tgz", @@ -627,145 +328,58 @@ "license": "MIT", "optional": true }, - "node_modules/@chainsafe/libp2p-noise": { - "version": "17.0.0", - "resolved": "https://registry.npmjs.org/@chainsafe/libp2p-noise/-/libp2p-noise-17.0.0.tgz", - "integrity": "sha512-vwrmY2Y+L1xYhIDiEpl61KHxwrLCZoXzTpwhyk34u+3+6zCAZPL3GxH3i2cs+u5IYNoyLptORdH17RKFXy7upA==", - "license": "Apache-2.0 OR MIT", + "node_modules/@dnsquery/dns-packet": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/@dnsquery/dns-packet/-/dns-packet-6.1.1.tgz", + "integrity": "sha512-WXTuFvL3G+74SchFAtz3FgIYVOe196ycvGsMgvSH/8Goptb1qpIQtIuM4SOK9G9lhMWYpHxnXyy544ZhluFOew==", + "license": "MIT", "optional": true, "dependencies": { - "@chainsafe/as-chacha20poly1305": "^0.1.0", - "@chainsafe/as-sha256": "^1.2.0", - "@libp2p/crypto": "^5.1.9", - "@libp2p/interface": "^3.0.0", - "@libp2p/peer-id": "^6.0.0", - "@libp2p/utils": "^7.0.0", - "@noble/ciphers": "^2.0.1", - "@noble/curves": "^2.0.1", - "@noble/hashes": "^2.0.1", - "protons-runtime": "^5.6.0", - "uint8arraylist": "^2.4.8", - "uint8arrays": "^5.1.0", - "wherearewe": "^2.0.1" + "@leichtgewicht/ip-codec": "^2.0.4", + "utf8-codec": "^1.0.0" + }, + "engines": { + "node": ">=6" } }, - "node_modules/@chainsafe/libp2p-noise/node_modules/@noble/ciphers": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-2.1.1.tgz", - "integrity": "sha512-bysYuiVfhxNJuldNXlFEitTVdNnYUc+XNJZd7Qm2a5j1vZHgY+fazadNFWFaMK/2vye0JVlxV3gHmC0WDfAOQw==", + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", + "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", + "cpu": [ + "ppc64" + ], + "dev": true, "license": "MIT", "optional": true, + "os": [ + "aix" + ], "engines": { - "node": ">= 20.19.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" + "node": ">=18" } }, - "node_modules/@chainsafe/libp2p-noise/node_modules/@noble/curves": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-2.0.1.tgz", - "integrity": "sha512-vs1Az2OOTBiP4q0pwjW5aF0xp9n4MxVrmkFBxc6EKZc6ddYx5gaZiAsZoq0uRRXWbi3AT/sBqn05eRPtn1JCPw==", + "node_modules/@esbuild/android-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", + "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", + "cpu": [ + "arm" + ], + "dev": true, "license": "MIT", "optional": true, - "dependencies": { - "@noble/hashes": "2.0.1" - }, + "os": [ + "android" + ], "engines": { - "node": ">= 20.19.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@chainsafe/libp2p-noise/node_modules/@noble/hashes": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-2.0.1.tgz", - "integrity": "sha512-XlOlEbQcE9fmuXxrVTXCTlG2nlRXa9Rj3rr5Ue/+tX+nmkgbX720YHh0VR3hBF9xDvwnb8D2shVGOwNx+ulArw==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">= 20.19.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@chainsafe/libp2p-yamux": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/@chainsafe/libp2p-yamux/-/libp2p-yamux-8.0.1.tgz", - "integrity": "sha512-pJsqmUg1cZRJZn/luAtQaq0uLcVfExo51Rg7iRtAEceNYtsKUi/exfegnvTBzTnF1CGmTzVEV3MCLsRhqiNyoA==", - "license": "Apache-2.0 OR MIT", - "optional": true, - "dependencies": { - "@libp2p/interface": "^3.0.0", - "@libp2p/utils": "^7.0.0", - "race-signal": "^2.0.0", - "uint8arraylist": "^2.4.8" - } - }, - "node_modules/@chainsafe/netmask": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@chainsafe/netmask/-/netmask-2.0.0.tgz", - "integrity": "sha512-I3Z+6SWUoaljh3TBzCnCxjlUyN8tA+NAk5L6m9IxvCf1BENQTePzPMis97CoN/iMW1St3WN+AWCCRp+TTBRiDg==", - "license": "MIT", - "optional": true, - "dependencies": { - "@chainsafe/is-ip": "^2.0.1" - } - }, - "node_modules/@dnsquery/dns-packet": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/@dnsquery/dns-packet/-/dns-packet-6.1.1.tgz", - "integrity": "sha512-WXTuFvL3G+74SchFAtz3FgIYVOe196ycvGsMgvSH/8Goptb1qpIQtIuM4SOK9G9lhMWYpHxnXyy544ZhluFOew==", - "license": "MIT", - "optional": true, - "dependencies": { - "@leichtgewicht/ip-codec": "^2.0.4", - "utf8-codec": "^1.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", - "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", - "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/android-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", - "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", + "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", "cpu": [ "arm64" ], @@ -776,13 +390,13 @@ "android" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/android-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", - "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", + "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", "cpu": [ "x64" ], @@ -793,13 +407,13 @@ "android" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", - "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", + "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", "cpu": [ "arm64" ], @@ -810,13 +424,13 @@ "darwin" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", - "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", + "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", "cpu": [ "x64" ], @@ -827,13 +441,13 @@ "darwin" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", - "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", + "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", "cpu": [ "arm64" ], @@ -844,13 +458,13 @@ "freebsd" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", - "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", + "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", "cpu": [ "x64" ], @@ -861,13 +475,13 @@ "freebsd" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", - "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", + "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", "cpu": [ "arm" ], @@ -878,13 +492,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", - "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", + "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", "cpu": [ "arm64" ], @@ -895,13 +509,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", - "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", + "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", "cpu": [ "ia32" ], @@ -912,13 +526,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", - "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", + "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", "cpu": [ "loong64" ], @@ -929,13 +543,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", - "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", + "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", "cpu": [ "mips64el" ], @@ -946,13 +560,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", - "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", + "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", "cpu": [ "ppc64" ], @@ -963,13 +577,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", - "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", + "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", "cpu": [ "riscv64" ], @@ -980,13 +594,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", - "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", + "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", "cpu": [ "s390x" ], @@ -997,13 +611,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", - "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", + "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", "cpu": [ "x64" ], @@ -1014,13 +628,30 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", + "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", - "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", + "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", "cpu": [ "x64" ], @@ -1031,13 +662,30 @@ "netbsd" ], "engines": { - "node": ">=12" + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", + "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", - "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", + "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", "cpu": [ "x64" ], @@ -1048,13 +696,30 @@ "openbsd" ], "engines": { - "node": ">=12" + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", + "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", - "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", + "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", "cpu": [ "x64" ], @@ -1065,13 +730,13 @@ "sunos" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", - "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", + "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", "cpu": [ "arm64" ], @@ -1082,13 +747,13 @@ "win32" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", - "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", + "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", "cpu": [ "ia32" ], @@ -1099,13 +764,13 @@ "win32" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/win32-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", - "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", + "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", "cpu": [ "x64" ], @@ -1116,498 +781,289 @@ "win32" ], "engines": { - "node": ">=12" + "node": ">=18" } }, - "node_modules/@helia/bitswap": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@helia/bitswap/-/bitswap-3.1.2.tgz", - "integrity": "sha512-MHkZFSnamHhoeY4BR4DhYmDWUQzURuYp75dEEI5bg7Lv0tlT0fAyowIAXqzBNBdGBBctokHrCMCAu34W41D7Cg==", - "license": "Apache-2.0 OR MIT", - "optional": true, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", + "dev": true, + "license": "MIT", "dependencies": { - "@helia/interface": "^6.1.1", - "@helia/utils": "^2.4.2", - "@libp2p/interface": "^3.1.0", - "@libp2p/logger": "^6.0.5", - "@libp2p/peer-collections": "^7.0.5", - "@libp2p/utils": "^7.0.5", - "@multiformats/multiaddr": "^13.0.1", - "any-signal": "^4.1.1", - "interface-blockstore": "^6.0.1", - "interface-store": "^7.0.0", - "it-drain": "^3.0.10", - "it-length-prefixed": "^10.0.1", - "it-map": "^3.1.4", - "it-pushable": "^3.2.3", - "it-take": "^3.0.9", - "it-to-buffer": "^4.0.10", - "multiformats": "^13.4.1", - "p-defer": "^4.0.1", - "progress-events": "^1.0.1", - "protons-runtime": "^5.6.0", - "race-event": "^1.6.1", - "uint8-varint": "^2.0.4", - "uint8arraylist": "^2.4.8", - "uint8arrays": "^5.1.0" + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, - "node_modules/@helia/block-brokers": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@helia/block-brokers/-/block-brokers-5.1.2.tgz", - "integrity": "sha512-Ols4+kpPHyrjWlMaBAqF+75zCfHwaCGRGQPxS8A+5To213bO7Dmfexat6eK+/Sl2lqNmlQQlgn5o0WuXQoyBLg==", - "license": "Apache-2.0 OR MIT", - "optional": true, - "dependencies": { - "@helia/bitswap": "^3.1.2", - "@helia/interface": "^6.1.1", - "@helia/utils": "^2.4.2", - "@libp2p/interface": "^3.1.0", - "@libp2p/utils": "^7.0.5", - "@multiformats/multiaddr": "^13.0.1", - "@multiformats/multiaddr-matcher": "^3.0.1", - "@multiformats/multiaddr-to-uri": "^12.0.0", - "interface-blockstore": "^6.0.1", - "interface-store": "^7.0.0", - "multiformats": "^13.4.1", - "progress-events": "^1.0.1", - "uint8arraylist": "^2.4.8" + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/@helia/delegated-routing-v1-http-api-client": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@helia/delegated-routing-v1-http-api-client/-/delegated-routing-v1-http-api-client-6.0.1.tgz", - "integrity": "sha512-Y1nGpUQrdN80XSDDAfe7azJFKKD0MxM0mQqfbefNEcrYMM344rHNQJ7xgiSqsH20vMIaKv+NnQqT/MEg2aWv6g==", - "license": "Apache-2.0 OR MIT", - "optional": true, - "dependencies": { - "@libp2p/interface": "^3.0.2", - "@libp2p/peer-id": "^6.0.3", - "@multiformats/multiaddr": "^13.0.1", - "any-signal": "^4.1.1", - "browser-readablestream-to-it": "^2.0.9", - "ipns": "^10.0.2", - "it-first": "^3.0.8", - "it-map": "^3.1.3", - "it-ndjson": "^1.1.3", - "multiformats": "^13.3.6", - "p-defer": "^4.0.1", - "p-queue": "^9.0.0", - "uint8arrays": "^5.1.0" + "node_modules/@eslint-community/regexpp": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, - "node_modules/@helia/interface": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/@helia/interface/-/interface-6.1.1.tgz", - "integrity": "sha512-vcLr6lMB2sE3iweBMr2ZXmugOPw1U2kLppwit7raQ84L1wM/q4ERBQfouaeAA0dntliopXk1luPU8I9glE6PIA==", - "license": "Apache-2.0 OR MIT", - "optional": true, + "node_modules/@eslint/config-array": { + "version": "0.21.1", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz", + "integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==", + "dev": true, + "license": "Apache-2.0", "dependencies": { - "@libp2p/interface": "^3.1.0", - "@multiformats/dns": "^1.0.9", - "@multiformats/multiaddr": "^13.0.1", - "interface-blockstore": "^6.0.1", - "interface-datastore": "^9.0.2", - "interface-store": "^7.0.0", - "multiformats": "^13.4.1", - "progress-events": "^1.0.1" + "@eslint/object-schema": "^2.1.7", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@helia/ipns": { - "version": "9.1.9", - "resolved": "https://registry.npmjs.org/@helia/ipns/-/ipns-9.1.9.tgz", - "integrity": "sha512-SbCyTsdkvxkY2NBV6Lg4Xg8XRaAPSfVuYMIHlcctEu9+tEFllAP9cyC3TzDTHBQOj2+qlxTXR2n4ayIGLSZwyg==", - "license": "Apache-2.0 OR MIT", - "optional": true, + "node_modules/@eslint/config-array/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", "dependencies": { - "@helia/interface": "^6.1.1", - "@libp2p/crypto": "^5.1.7", - "@libp2p/interface": "^3.1.0", - "@libp2p/kad-dht": "^16.1.0", - "@libp2p/keychain": "^6.0.5", - "@libp2p/logger": "^6.0.5", - "@libp2p/utils": "^7.0.5", - "interface-datastore": "^9.0.2", - "ipns": "^10.1.2", - "multiformats": "^13.4.1", - "progress-events": "^1.0.1", - "protons-runtime": "^5.5.0", - "uint8arraylist": "^2.4.8", - "uint8arrays": "^5.1.0" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/@helia/json": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/@helia/json/-/json-5.0.7.tgz", - "integrity": "sha512-MayipDUTsEZA0a7g8Za9jljk1CO7QVHG0cbtg55D+j0+0opMghQq6O03wNjrCxBhF06QRm4awDECIRjr2K/DdA==", - "license": "Apache-2.0 OR MIT", - "optional": true, + "node_modules/@eslint/config-array/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", "dependencies": { - "@helia/interface": "^6.1.1", - "@libp2p/interface": "^3.1.0", - "interface-blockstore": "^6.0.1", - "it-to-buffer": "^4.0.10", - "multiformats": "^13.4.1", - "progress-events": "^1.0.1" + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" } }, - "node_modules/@helia/routers": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/@helia/routers/-/routers-5.0.3.tgz", - "integrity": "sha512-6yiaN8amvHrC1yynWV+HRjk0zPOL2QwB2QzilaF2R0XozqqoCyOOX0NE0Z5rkVA6IyUBSH2J+t+TpgnE5pTaHA==", - "license": "Apache-2.0 OR MIT", - "optional": true, + "node_modules/@eslint/config-helpers": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", + "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", + "dev": true, + "license": "Apache-2.0", "dependencies": { - "@helia/delegated-routing-v1-http-api-client": "^6.0.0", - "@helia/interface": "^6.1.1", - "@libp2p/interface": "^3.1.0", - "@libp2p/peer-id": "^6.0.3", - "@multiformats/uri-to-multiaddr": "^10.0.0", - "ipns": "^10.1.2", - "it-first": "^3.0.9", - "it-map": "^3.1.4", - "multiformats": "^13.4.1", - "uint8arrays": "^5.1.0" + "@eslint/core": "^0.17.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@helia/utils": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/@helia/utils/-/utils-2.4.2.tgz", - "integrity": "sha512-a+5uTq5+O3aRmbdYW4a2Tm+eRqS6XMy26N+D2i++efubxt2loB195hAIb6Gue9BbzRt/IRKfndfSLVrcav2hZw==", - "license": "Apache-2.0 OR MIT", - "optional": true, + "node_modules/@eslint/core": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", + "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", + "dev": true, + "license": "Apache-2.0", "dependencies": { - "@helia/interface": "^6.1.1", - "@ipld/dag-cbor": "^9.2.5", - "@ipld/dag-json": "^10.2.5", - "@ipld/dag-pb": "^4.1.5", - "@libp2p/interface": "^3.1.0", - "@libp2p/keychain": "^6.0.5", - "@libp2p/utils": "^7.0.5", - "@multiformats/dns": "^1.0.9", - "@multiformats/multiaddr": "^13.0.1", - "any-signal": "^4.1.1", - "blockstore-core": "^6.1.1", - "cborg": "^4.2.15", - "interface-blockstore": "^6.0.1", - "interface-datastore": "^9.0.2", - "interface-store": "^7.0.0", - "it-drain": "^3.0.10", - "it-filter": "^3.1.4", - "it-foreach": "^2.1.5", - "it-merge": "^3.0.12", - "it-to-buffer": "^4.0.10", - "libp2p": "^3.0.6", - "mortice": "^3.3.1", - "multiformats": "^13.4.1", - "p-defer": "^4.0.1", - "progress-events": "^1.0.1", - "race-signal": "^2.0.0", - "uint8arrays": "^5.1.0" + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@ipld/dag-cbor": { - "version": "9.2.5", - "resolved": "https://registry.npmjs.org/@ipld/dag-cbor/-/dag-cbor-9.2.5.tgz", - "integrity": "sha512-84wSr4jv30biui7endhobYhXBQzQE4c/wdoWlFrKcfiwH+ofaPg8fwsM8okX9cOzkkrsAsNdDyH3ou+kiLquwQ==", - "license": "Apache-2.0 OR MIT", - "optional": true, + "node_modules/@eslint/eslintrc": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.4.tgz", + "integrity": "sha512-4h4MVF8pmBsncB60r0wSJiIeUKTSD4m7FmTFThG8RHlsg9ajqckLm9OraguFGZE4vVdpiI1Q4+hFnisopmG6gQ==", + "dev": true, + "license": "MIT", "dependencies": { - "cborg": "^4.0.0", - "multiformats": "^13.1.0" + "ajv": "^6.14.0", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.1", + "minimatch": "^3.1.3", + "strip-json-comments": "^3.1.1" }, "engines": { - "node": ">=16.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/@ipld/dag-json": { - "version": "10.2.6", - "resolved": "https://registry.npmjs.org/@ipld/dag-json/-/dag-json-10.2.6.tgz", - "integrity": "sha512-51yc5azhmkvc9mp2HV/vtJ8SlgFXADp55wAPuuAjQZ+yPurAYuTVddS3ke5vT4sjcd4DbE+DWjsMZGXjFB2cuA==", - "license": "Apache-2.0 OR MIT", - "optional": true, - "dependencies": { - "cborg": "^4.4.0", - "multiformats": "^13.1.0" - }, - "engines": { - "node": ">=16.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/@ipld/dag-pb": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@ipld/dag-pb/-/dag-pb-4.1.5.tgz", - "integrity": "sha512-w4PZ2yPqvNmlAir7/2hsCRMqny1EY5jj26iZcSgxREJexmbAc2FI21jp26MqiNdfgAxvkCnf2N/TJI18GaDNwA==", - "license": "Apache-2.0 OR MIT", - "optional": true, - "dependencies": { - "multiformats": "^13.1.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, - "engines": { - "node": ">=16.0.0", - "npm": ">=7.0.0" + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/@ipshipyard/libp2p-auto-tls": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@ipshipyard/libp2p-auto-tls/-/libp2p-auto-tls-2.0.1.tgz", - "integrity": "sha512-zpDXVMY1ZgB6o30zFocXUzrD9+tz1bbEdgewFoBf4olDh5/CwjDi/k9v2RrJqujWKYWyRuHRg6Q+VRpvtGrpuw==", - "license": "Apache-2.0 OR MIT", - "optional": true, + "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", "dependencies": { - "@chainsafe/is-ip": "^2.0.2", - "@libp2p/crypto": "^5.0.9", - "@libp2p/http": "^2.0.0", - "@libp2p/interface": "^3.0.2", - "@libp2p/interface-internal": "^3.0.4", - "@libp2p/keychain": "^6.0.4", - "@libp2p/utils": "^7.0.4", - "@multiformats/multiaddr": "^13.0.1", - "@multiformats/multiaddr-matcher": "^3.0.1", - "@peculiar/x509": "^1.12.3", - "acme-client": "^5.4.0", - "any-signal": "^4.1.1", - "delay": "^6.0.0", - "interface-datastore": "^9.0.2", - "multiformats": "^13.3.1", - "uint8arrays": "^5.1.0" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/@ipshipyard/libp2p-auto-tls/node_modules/delay": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/delay/-/delay-6.0.0.tgz", - "integrity": "sha512-2NJozoOHQ4NuZuVIr5CWd0iiLVIRSDepakaovIN+9eIDHEhdCAEvSy2cuf1DCrPPQLvHmbqTHODlhHg8UCy4zw==", + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, "license": "MIT", - "optional": true, "engines": { - "node": ">=16" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, "license": "ISC", "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@isaacs/ttlcache": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@isaacs/ttlcache/-/ttlcache-1.4.1.tgz", - "integrity": "sha512-RQgQ4uQ+pLbqXfOmieB91ejmLwvSgv9nLx6sT6sD83s7umBypgg+OIBOBbEUiJXrfpnp9j0mRhYYdzp9uqq3lA==", - "license": "ISC", - "optional": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "license": "ISC", - "optional": true, - "dependencies": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=8" + "node": "*" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "node_modules/@eslint/js": { + "version": "9.39.3", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.3.tgz", + "integrity": "sha512-1B1VkCq6FuUNlQvlBYb+1jDu/gV297TIs/OeiaSR9l1H27SVW55ONE1e1Vp16NqP683+xEGzxYtv4XCiDPaQiw==", + "dev": true, "license": "MIT", - "optional": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "license": "MIT", - "optional": true, - "dependencies": { - "p-locate": "^4.1.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, - "engines": { - "node": ">=8" + "funding": { + "url": "https://eslint.org/donate" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "license": "MIT", - "optional": true, - "dependencies": { - "p-try": "^2.0.0" - }, + "node_modules/@eslint/object-schema": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", + "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", + "dev": true, + "license": "Apache-2.0", "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "license": "MIT", - "optional": true, + "node_modules/@eslint/plugin-kit": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", + "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", + "dev": true, + "license": "Apache-2.0", "dependencies": { - "p-limit": "^2.2.0" + "@eslint/core": "^0.17.0", + "levn": "^0.4.1" }, "engines": { - "node": ">=8" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "license": "MIT", - "optional": true, + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "dev": true, + "license": "Apache-2.0", "engines": { - "node": ">=8" + "node": ">=18.18.0" } }, - "node_modules/@jest/create-cache-key-function": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/create-cache-key-function/-/create-cache-key-function-29.7.0.tgz", - "integrity": "sha512-4QqS3LY5PBmTRHj9sAg1HLoPzqAI0uOX6wI/TRqHIcOxlFidy6YEmCQJk6FSZjNLGCeubDMfmkWL+qaLKhSGQA==", - "license": "MIT", - "optional": true, + "node_modules/@humanfs/node": { + "version": "0.16.7", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", + "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", + "dev": true, + "license": "Apache-2.0", "dependencies": { - "@jest/types": "^29.6.3" + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.4.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=18.18.0" } }, - "node_modules/@jest/environment": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", - "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", - "license": "MIT", - "optional": true, - "dependencies": { - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0" - }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/fake-timers": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", - "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", - "license": "MIT", - "optional": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@sinonjs/fake-timers": "^10.0.2", - "@types/node": "*", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" + "node": ">=12.22" }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/@jest/schemas": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", - "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", - "license": "MIT", - "optional": true, - "dependencies": { - "@sinclair/typebox": "^0.27.8" - }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "dev": true, + "license": "Apache-2.0", "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/transform": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", - "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", - "license": "MIT", - "optional": true, - "dependencies": { - "@babel/core": "^7.11.6", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^2.0.0", - "fast-json-stable-stringify": "^2.1.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "write-file-atomic": "^4.0.2" + "node": ">=18.18" }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", - "license": "MIT", - "optional": true, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "license": "ISC", "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=12" } }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.13", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, "license": "MIT", "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", @@ -1618,6 +1074,7 @@ "version": "2.3.5", "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, "license": "MIT", "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", @@ -1628,32 +1085,24 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, "license": "MIT", "engines": { "node": ">=6.0.0" } }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.11", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", - "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", - "license": "MIT", - "optional": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25" - } - }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.5.5", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.31", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", @@ -1667,82 +1116,6 @@ "license": "MIT", "optional": true }, - "node_modules/@libp2p/autonat": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/@libp2p/autonat/-/autonat-3.0.10.tgz", - "integrity": "sha512-JGU2+sKU/6J4lxjNePjfcpus7fw1zf9STFr1MFHp0K8suyb3y3wvMPULNOPEVL4HlQqTkEH7J0PD3LWRnedtOQ==", - "license": "Apache-2.0 OR MIT", - "optional": true, - "dependencies": { - "@libp2p/interface": "^3.1.0", - "@libp2p/interface-internal": "^3.0.10", - "@libp2p/peer-collections": "^7.0.10", - "@libp2p/peer-id": "^6.0.4", - "@libp2p/utils": "^7.0.10", - "@multiformats/multiaddr": "^13.0.1", - "any-signal": "^4.1.1", - "main-event": "^1.0.1", - "multiformats": "^13.4.0", - "protons-runtime": "^5.6.0", - "uint8arraylist": "^2.4.8" - } - }, - "node_modules/@libp2p/bootstrap": { - "version": "12.0.11", - "resolved": "https://registry.npmjs.org/@libp2p/bootstrap/-/bootstrap-12.0.11.tgz", - "integrity": "sha512-ZIG8QKS+4w7ugK7a1ftdopjIA+NvOPKUq7JY1OsRxaiLdCdxgghPTiNIbinYsVv5iHULBnFZe4o5l+5L7+Hssw==", - "license": "Apache-2.0 OR MIT", - "optional": true, - "dependencies": { - "@libp2p/interface": "^3.1.0", - "@libp2p/interface-internal": "^3.0.10", - "@libp2p/peer-id": "^6.0.4", - "@multiformats/multiaddr": "^13.0.1", - "@multiformats/multiaddr-matcher": "^3.0.1", - "main-event": "^1.0.1" - } - }, - "node_modules/@libp2p/circuit-relay-v2": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/@libp2p/circuit-relay-v2/-/circuit-relay-v2-4.1.3.tgz", - "integrity": "sha512-XDgzXu/zMjwHyRSh8xiWlsQk3vGDVSdlukFxb0Eg1VXB2c0ytWgIF5JoynyrNpwXa6Pe0SgGEcUMt9wMaF6/HQ==", - "license": "Apache-2.0 OR MIT", - "optional": true, - "dependencies": { - "@libp2p/crypto": "^5.1.13", - "@libp2p/interface": "^3.1.0", - "@libp2p/interface-internal": "^3.0.10", - "@libp2p/peer-collections": "^7.0.10", - "@libp2p/peer-id": "^6.0.4", - "@libp2p/peer-record": "^9.0.5", - "@libp2p/utils": "^7.0.10", - "@multiformats/multiaddr": "^13.0.1", - "@multiformats/multiaddr-matcher": "^3.0.1", - "any-signal": "^4.1.1", - "main-event": "^1.0.1", - "multiformats": "^13.4.0", - "nanoid": "^5.1.5", - "progress-events": "^1.0.1", - "protons-runtime": "^5.6.0", - "retimeable-signal": "^1.0.1", - "uint8arraylist": "^2.4.8", - "uint8arrays": "^5.1.0" - } - }, - "node_modules/@libp2p/config": { - "version": "1.1.25", - "resolved": "https://registry.npmjs.org/@libp2p/config/-/config-1.1.25.tgz", - "integrity": "sha512-kscWoyxM0bR/eFxxLTDoryYe5jy2W6YgbgAADpUPfPwZlR4XsVGjI78zMx+si/LDLTyNmb74lW/g8zv8RN7Bww==", - "license": "Apache-2.0 OR MIT", - "optional": true, - "dependencies": { - "@libp2p/crypto": "^5.1.13", - "@libp2p/interface": "^3.1.0", - "@libp2p/keychain": "^6.0.10", - "@libp2p/logger": "^6.2.2", - "interface-datastore": "^9.0.1" - } - }, "node_modules/@libp2p/crypto": { "version": "5.1.13", "resolved": "https://registry.npmjs.org/@libp2p/crypto/-/crypto-5.1.13.tgz", @@ -1788,4400 +1161,2564 @@ "url": "https://paulmillr.com/funding/" } }, - "node_modules/@libp2p/dcutr": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/@libp2p/dcutr/-/dcutr-3.0.10.tgz", - "integrity": "sha512-rMBstMznxLgIGNvHFlEHo9Lvx0/+wD2RXB+H7VU58ov1CRQNwlSix38BaQ6PI94LOmVzDPHKl8x3mG6YKp5GEw==", + "node_modules/@libp2p/interface": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@libp2p/interface/-/interface-3.1.0.tgz", + "integrity": "sha512-RE7/XyvC47fQBe1cHxhMvepYKa5bFCUyFrrpj8PuM0E7JtzxU7F+Du5j4VXbg2yLDcToe0+j8mB7jvwE2AThYw==", "license": "Apache-2.0 OR MIT", "optional": true, "dependencies": { - "@libp2p/interface": "^3.1.0", - "@libp2p/interface-internal": "^3.0.10", - "@libp2p/utils": "^7.0.10", + "@multiformats/dns": "^1.0.6", "@multiformats/multiaddr": "^13.0.1", - "@multiformats/multiaddr-matcher": "^3.0.1", - "delay": "^7.0.0", - "protons-runtime": "^5.6.0", + "main-event": "^1.0.1", + "multiformats": "^13.4.0", + "progress-events": "^1.0.1", "uint8arraylist": "^2.4.8" } }, - "node_modules/@libp2p/http": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@libp2p/http/-/http-2.0.1.tgz", - "integrity": "sha512-NjTvXdpwlGNvPsjiumRWJ3jm+9euQkKLXzdHnE+cPCEjPWo6cyGGB541161Jgi8CZ5tNTudddlriwkZRb8Z6KQ==", + "node_modules/@libp2p/logger": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/@libp2p/logger/-/logger-6.2.2.tgz", + "integrity": "sha512-XtanXDT+TuMuZoCK760HGV1AmJsZbwAw5AiRUxWDbsZPwAroYq64nb41AHRu9Gyc0TK9YD+p72+5+FIxbw0hzw==", "license": "Apache-2.0 OR MIT", "optional": true, "dependencies": { - "@libp2p/http-fetch": "^4.0.0", - "@libp2p/http-peer-id-auth": "^2.0.0", - "@libp2p/http-utils": "^2.0.0", - "@libp2p/http-websocket": "^2.0.0", - "@libp2p/interface": "^3.0.2", - "@libp2p/interface-internal": "^3.0.4", + "@libp2p/interface": "^3.1.0", "@multiformats/multiaddr": "^13.0.1", - "cookie": "^1.0.2", - "undici": "^7.16.0" + "interface-datastore": "^9.0.1", + "multiformats": "^13.4.0", + "weald": "^1.1.0" } }, - "node_modules/@libp2p/http-fetch": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@libp2p/http-fetch/-/http-fetch-4.0.1.tgz", - "integrity": "sha512-7vtJVOfyGol6CWrNm9HhjlYOmCsJVLKWYdhpmjdpS6pGWtpkTMrHJLznSJ7PYkMq7OnhzhXNFq0FhWygP6mmPQ==", + "node_modules/@libp2p/peer-id": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/@libp2p/peer-id/-/peer-id-6.0.4.tgz", + "integrity": "sha512-Z3xK0lwwKn4bPg3ozEpPr1HxsRi2CxZdghOL+MXoFah/8uhJJHxHFA8A/jxtKn4BB8xkk6F8R5vKNIS05yaCYw==", "license": "Apache-2.0 OR MIT", "optional": true, "dependencies": { - "@achingbrain/http-parser-js": "^0.5.9", - "@libp2p/http-utils": "^2.0.0", - "@libp2p/interface": "^3.0.2", + "@libp2p/crypto": "^5.1.13", + "@libp2p/interface": "^3.1.0", + "multiformats": "^13.4.0", "uint8arrays": "^5.1.0" } }, - "node_modules/@libp2p/http-peer-id-auth": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@libp2p/http-peer-id-auth/-/http-peer-id-auth-2.0.0.tgz", - "integrity": "sha512-GKs0DXK/JVKKH57IGQDiWsC6hYsLY+cwKNRMuX1FY6FZo09zc1QPwvgr0FNtIB2c5WJFf/vja4M4QekLsWU+xw==", + "node_modules/@multiformats/dns": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/@multiformats/dns/-/dns-1.0.13.tgz", + "integrity": "sha512-yr4bxtA3MbvJ+2461kYIYMsiiZj/FIqKI64hE4SdvWJUdWF9EtZLar38juf20Sf5tguXKFUruluswAO6JsjS2w==", "license": "Apache-2.0 OR MIT", "optional": true, "dependencies": { - "@libp2p/crypto": "^5.1.12", - "@libp2p/interface": "^3.0.2", - "@libp2p/peer-id": "^6.0.3", - "uint8-varint": "^2.0.4", - "uint8arrays": "^5.1.0" + "@dnsquery/dns-packet": "^6.1.1", + "@libp2p/interface": "^3.1.0", + "hashlru": "^2.3.0", + "p-queue": "^9.0.0", + "progress-events": "^1.0.0", + "uint8arrays": "^5.0.2" } }, - "node_modules/@libp2p/http-utils": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@libp2p/http-utils/-/http-utils-2.0.1.tgz", - "integrity": "sha512-dJFRV2gAzPkF5NOnGMdWXXO3PFK0cMSn5uDbW55n5Usnrx6hHQmDCRfKh3ClQUzjG66pFjXM3zFXLKORyasl3A==", + "node_modules/@multiformats/multiaddr": { + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-13.0.1.tgz", + "integrity": "sha512-XToN915cnfr6Lr9EdGWakGJbPT0ghpg/850HvdC+zFX8XvpLZElwa8synCiwa8TuvKNnny6m8j8NVBNCxhIO3g==", "license": "Apache-2.0 OR MIT", "optional": true, "dependencies": { - "@achingbrain/http-parser-js": "^0.5.9", - "@libp2p/interface": "^3.0.2", - "@libp2p/peer-id": "^6.0.3", - "@libp2p/utils": "^7.0.4", - "@multiformats/multiaddr": "^13.0.1", - "@multiformats/multiaddr-to-uri": "^12.0.0", - "@multiformats/uri-to-multiaddr": "^10.0.0", - "it-to-browser-readablestream": "^2.0.12", - "multiformats": "^13.4.1", - "race-event": "^1.6.1", - "readable-stream": "^4.7.0", - "uint8arraylist": "^2.4.8", - "uint8arrays": "^5.1.0" - } - }, - "node_modules/@libp2p/http-websocket": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@libp2p/http-websocket/-/http-websocket-2.0.1.tgz", - "integrity": "sha512-hMMWVKAK3P3oAmatUB8SQ4mUMhkkLdERAjgZUoKdohIPumPGQ6ADFSJMYsSWv9ZwyBiXMHBbwluYEBZUw85GCw==", - "license": "Apache-2.0 OR MIT", - "optional": true, - "dependencies": { - "@achingbrain/http-parser-js": "^0.5.9", - "@libp2p/http-utils": "^2.0.0", - "@libp2p/interface": "^3.0.2", - "@libp2p/interface-internal": "^3.0.4", - "@libp2p/utils": "^7.0.4", - "@multiformats/multiaddr": "^13.0.1", - "multiformats": "^13.4.1", - "race-event": "^1.6.1", - "uint8arraylist": "^2.4.8", - "uint8arrays": "^5.1.0" - } - }, - "node_modules/@libp2p/identify": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/@libp2p/identify/-/identify-4.0.10.tgz", - "integrity": "sha512-DROyV+bZIlz9czCCHJdeVtm1+hEOKUigJHyTzzA/cuwwyvtm8Dco8F+VRYcrwpafuVtjv7yN7CskN4oIys56jw==", - "license": "Apache-2.0 OR MIT", - "optional": true, - "dependencies": { - "@libp2p/crypto": "^5.1.13", - "@libp2p/interface": "^3.1.0", - "@libp2p/interface-internal": "^3.0.10", - "@libp2p/peer-id": "^6.0.4", - "@libp2p/peer-record": "^9.0.5", - "@libp2p/utils": "^7.0.10", - "@multiformats/multiaddr": "^13.0.1", - "@multiformats/multiaddr-matcher": "^3.0.1", - "it-drain": "^3.0.10", - "it-parallel": "^3.0.13", - "main-event": "^1.0.1", - "protons-runtime": "^5.6.0", - "uint8arraylist": "^2.4.8", - "uint8arrays": "^5.1.0" - } - }, - "node_modules/@libp2p/interface": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@libp2p/interface/-/interface-3.1.0.tgz", - "integrity": "sha512-RE7/XyvC47fQBe1cHxhMvepYKa5bFCUyFrrpj8PuM0E7JtzxU7F+Du5j4VXbg2yLDcToe0+j8mB7jvwE2AThYw==", - "license": "Apache-2.0 OR MIT", - "optional": true, - "dependencies": { - "@multiformats/dns": "^1.0.6", - "@multiformats/multiaddr": "^13.0.1", - "main-event": "^1.0.1", - "multiformats": "^13.4.0", - "progress-events": "^1.0.1", - "uint8arraylist": "^2.4.8" - } - }, - "node_modules/@libp2p/interface-internal": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/@libp2p/interface-internal/-/interface-internal-3.0.10.tgz", - "integrity": "sha512-Gd/eQAoAlXqeCRJ6wOwcnTQ/SDe95bQow8osY8zq0nbfFBu26aChQHjAd+CjcCADJRh+Sd+7+dYG7BrhpxGt1A==", - "license": "Apache-2.0 OR MIT", - "optional": true, - "dependencies": { - "@libp2p/interface": "^3.1.0", - "@libp2p/peer-collections": "^7.0.10", - "@multiformats/multiaddr": "^13.0.1", - "progress-events": "^1.0.1" + "@chainsafe/is-ip": "^2.0.1", + "multiformats": "^13.0.0", + "uint8-varint": "^2.0.1", + "uint8arrays": "^5.0.0" } }, - "node_modules/@libp2p/kad-dht": { - "version": "16.1.3", - "resolved": "https://registry.npmjs.org/@libp2p/kad-dht/-/kad-dht-16.1.3.tgz", - "integrity": "sha512-yM9UumHkN8Dd+nFUllOio3/0uuzzpPgc/+PouDAABWs2ut36VfizhWVWAiqlLpzkpCquIzPUd0doRu0GKztdXA==", - "license": "Apache-2.0 OR MIT", - "optional": true, - "dependencies": { - "@libp2p/crypto": "^5.1.13", - "@libp2p/interface": "^3.1.0", - "@libp2p/interface-internal": "^3.0.10", - "@libp2p/peer-collections": "^7.0.10", - "@libp2p/peer-id": "^6.0.4", - "@libp2p/ping": "^3.0.10", - "@libp2p/record": "^4.0.9", - "@libp2p/utils": "^7.0.10", - "@multiformats/multiaddr": "^13.0.1", - "@multiformats/multiaddr-matcher": "^3.0.1", - "any-signal": "^4.1.1", - "interface-datastore": "^9.0.1", - "it-all": "^3.0.9", - "it-drain": "^3.0.10", - "it-length": "^3.0.9", - "it-map": "^3.1.4", - "it-merge": "^3.0.12", - "it-parallel": "^3.0.13", - "it-pipe": "^3.0.1", - "it-pushable": "^3.2.3", - "it-take": "^3.0.9", - "main-event": "^1.0.1", - "multiformats": "^13.4.0", - "p-defer": "^4.0.1", - "p-event": "^7.0.0", - "progress-events": "^1.0.1", - "protons-runtime": "^5.6.0", - "race-signal": "^2.0.0", - "uint8-varint": "^2.0.4", - "uint8arraylist": "^2.4.8", - "uint8arrays": "^5.1.0" + "node_modules/@noble/ciphers": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-1.3.0.tgz", + "integrity": "sha512-2I0gnIVPtfnMw9ee9h1dJG7tp81+8Ob3OJb3Mv37rx5L40/b0i7djjCVvGOVqc9AEIQyvyu1i6ypKdFw8R8gQw==", + "license": "MIT", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" } }, - "node_modules/@libp2p/keychain": { - "version": "6.0.10", - "resolved": "https://registry.npmjs.org/@libp2p/keychain/-/keychain-6.0.10.tgz", - "integrity": "sha512-f80yJSzKb3Vh8KtdNCxiPUu8qjyT6b+nQlS+jSmSDnMGXI8z49wdtfKuigQsKft64qt2mKMNq/9OBWyhUMYPFQ==", - "license": "Apache-2.0 OR MIT", - "optional": true, + "node_modules/@noble/curves": { + "version": "1.9.7", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.7.tgz", + "integrity": "sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw==", + "license": "MIT", "dependencies": { - "@libp2p/crypto": "^5.1.13", - "@libp2p/interface": "^3.1.0", - "@noble/hashes": "^2.0.1", - "asn1js": "^3.0.6", - "interface-datastore": "^9.0.1", - "multiformats": "^13.4.0", - "sanitize-filename": "^1.6.3", - "uint8arrays": "^5.1.0" + "@noble/hashes": "1.8.0" + }, + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" } }, - "node_modules/@libp2p/keychain/node_modules/@noble/hashes": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-2.0.1.tgz", - "integrity": "sha512-XlOlEbQcE9fmuXxrVTXCTlG2nlRXa9Rj3rr5Ue/+tX+nmkgbX720YHh0VR3hBF9xDvwnb8D2shVGOwNx+ulArw==", + "node_modules/@noble/hashes": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", + "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", "license": "MIT", - "optional": true, "engines": { - "node": ">= 20.19.0" + "node": "^14.21.3 || >=16" }, "funding": { "url": "https://paulmillr.com/funding/" } }, - "node_modules/@libp2p/logger": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/@libp2p/logger/-/logger-6.2.2.tgz", - "integrity": "sha512-XtanXDT+TuMuZoCK760HGV1AmJsZbwAw5AiRUxWDbsZPwAroYq64nb41AHRu9Gyc0TK9YD+p72+5+FIxbw0hzw==", - "license": "Apache-2.0 OR MIT", + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "license": "MIT", "optional": true, - "dependencies": { - "@libp2p/interface": "^3.1.0", - "@multiformats/multiaddr": "^13.0.1", - "interface-datastore": "^9.0.1", - "multiformats": "^13.4.0", - "weald": "^1.1.0" + "engines": { + "node": ">=14" } }, - "node_modules/@libp2p/mdns": { - "version": "12.0.11", - "resolved": "https://registry.npmjs.org/@libp2p/mdns/-/mdns-12.0.11.tgz", - "integrity": "sha512-OB6am5A21Yc5c7KBZONQhTao4BHRDc3MurZ1qHzqU4FQidi719cNRw4ac6TVk4dcdtOYx+1ef8pvvLX+57hXAQ==", - "license": "Apache-2.0 OR MIT", - "optional": true, - "dependencies": { - "@libp2p/interface": "^3.1.0", - "@libp2p/interface-internal": "^3.0.10", - "@libp2p/peer-id": "^6.0.4", - "@libp2p/utils": "^7.0.10", - "@multiformats/multiaddr": "^13.0.1", - "@types/multicast-dns": "^7.2.4", - "dns-packet": "^5.6.1", - "main-event": "^1.0.1", - "multicast-dns": "^7.2.5" - } + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-beta.27", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz", + "integrity": "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==", + "dev": true, + "license": "MIT" }, - "node_modules/@libp2p/mplex": { - "version": "12.0.11", - "resolved": "https://registry.npmjs.org/@libp2p/mplex/-/mplex-12.0.11.tgz", - "integrity": "sha512-jD77lX3FkgHM4FdznF5G2aN8G6BoQrPZPTdox56KvFOUjUKs04KoiC58kuSHVuEo/25gBTpjTLnYJN07ixC3vg==", - "license": "Apache-2.0 OR MIT", - "optional": true, + "node_modules/@rollup/plugin-inject": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/@rollup/plugin-inject/-/plugin-inject-5.0.5.tgz", + "integrity": "sha512-2+DEJbNBoPROPkgTDNe8/1YXWcqxbN5DTjASVIOx8HS+pITXushyNiBV56RB08zuptzz8gT3YfkqriTBVycepg==", + "dev": true, + "license": "MIT", "dependencies": { - "@libp2p/interface": "^3.1.0", - "@libp2p/utils": "^7.0.10", - "it-pushable": "^3.2.3", - "uint8-varint": "^2.0.4", - "uint8arraylist": "^2.4.8", - "uint8arrays": "^5.1.0" + "@rollup/pluginutils": "^5.0.1", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.3" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } } }, - "node_modules/@libp2p/multistream-select": { - "version": "7.0.10", - "resolved": "https://registry.npmjs.org/@libp2p/multistream-select/-/multistream-select-7.0.10.tgz", - "integrity": "sha512-6RAFctqWzwQ/qPaN3CxoueSs1b7pBVMZ+0n6G0kcsqVBj0wc4eB+dcJyUNrTV1NGgMCAl6tVAGztZaE8XZc9lw==", - "license": "Apache-2.0 OR MIT", - "optional": true, + "node_modules/@rollup/pluginutils": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.3.0.tgz", + "integrity": "sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==", + "dev": true, + "license": "MIT", "dependencies": { - "@libp2p/interface": "^3.1.0", - "@libp2p/utils": "^7.0.10", - "it-length-prefixed": "^10.0.1", - "uint8arraylist": "^2.4.8", - "uint8arrays": "^5.1.0" + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } } }, - "node_modules/@libp2p/peer-collections": { - "version": "7.0.10", - "resolved": "https://registry.npmjs.org/@libp2p/peer-collections/-/peer-collections-7.0.10.tgz", - "integrity": "sha512-OvlSY5N3J6q8U+EbTrQGbW8zdyOa3y7nz9Y3IbuE55tIiMd7pwm1U3Lknfb6IPkOWkHNfQDfCGGfGVQcMRodvQ==", - "license": "Apache-2.0 OR MIT", + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.57.1.tgz", + "integrity": "sha512-A6ehUVSiSaaliTxai040ZpZ2zTevHYbvu/lDoeAteHI8QnaosIzm4qwtezfRg1jOYaUmnzLX1AOD6Z+UJjtifg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", "optional": true, - "dependencies": { - "@libp2p/interface": "^3.1.0", - "@libp2p/peer-id": "^6.0.4", - "@libp2p/utils": "^7.0.10", - "multiformats": "^13.4.0" - } + "os": [ + "android" + ] }, - "node_modules/@libp2p/peer-id": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/@libp2p/peer-id/-/peer-id-6.0.4.tgz", - "integrity": "sha512-Z3xK0lwwKn4bPg3ozEpPr1HxsRi2CxZdghOL+MXoFah/8uhJJHxHFA8A/jxtKn4BB8xkk6F8R5vKNIS05yaCYw==", - "license": "Apache-2.0 OR MIT", + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.57.1.tgz", + "integrity": "sha512-dQaAddCY9YgkFHZcFNS/606Exo8vcLHwArFZ7vxXq4rigo2bb494/xKMMwRRQW6ug7Js6yXmBZhSBRuBvCCQ3w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", "optional": true, - "dependencies": { - "@libp2p/crypto": "^5.1.13", - "@libp2p/interface": "^3.1.0", - "multiformats": "^13.4.0", - "uint8arrays": "^5.1.0" - } + "os": [ + "android" + ] }, - "node_modules/@libp2p/peer-record": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/@libp2p/peer-record/-/peer-record-9.0.5.tgz", - "integrity": "sha512-disk23OO00yD52O4VmItbDkjJZ/YZJsKbMsqNgVhr+D3PcM+KRpu9VVbiCnN5Tzn9XvFEHhrMJY7BPE+rvT5MQ==", - "license": "Apache-2.0 OR MIT", + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.57.1.tgz", + "integrity": "sha512-crNPrwJOrRxagUYeMn/DZwqN88SDmwaJ8Cvi/TN1HnWBU7GwknckyosC2gd0IqYRsHDEnXf328o9/HC6OkPgOg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", "optional": true, - "dependencies": { - "@libp2p/crypto": "^5.1.13", - "@libp2p/interface": "^3.1.0", - "@libp2p/peer-id": "^6.0.4", - "@multiformats/multiaddr": "^13.0.1", - "multiformats": "^13.4.0", - "protons-runtime": "^5.6.0", - "uint8-varint": "^2.0.4", - "uint8arraylist": "^2.4.8", - "uint8arrays": "^5.1.0" - } + "os": [ + "darwin" + ] }, - "node_modules/@libp2p/peer-store": { - "version": "12.0.10", - "resolved": "https://registry.npmjs.org/@libp2p/peer-store/-/peer-store-12.0.10.tgz", - "integrity": "sha512-fe/6m0vXny9pvCyaSjg2GisdSVgxtHYZtp6op1WNm8dBvYqRXLuqSYi0QGEbLtSDSL4SeE8BKZyadyk/tYAqfg==", - "license": "Apache-2.0 OR MIT", - "optional": true, - "dependencies": { - "@libp2p/crypto": "^5.1.13", - "@libp2p/interface": "^3.1.0", - "@libp2p/peer-collections": "^7.0.10", - "@libp2p/peer-id": "^6.0.4", - "@libp2p/peer-record": "^9.0.5", - "@multiformats/multiaddr": "^13.0.1", - "interface-datastore": "^9.0.1", - "it-all": "^3.0.9", - "main-event": "^1.0.1", - "mortice": "^3.3.1", - "multiformats": "^13.4.0", - "protons-runtime": "^5.6.0", - "uint8arraylist": "^2.4.8", - "uint8arrays": "^5.1.0" - } - }, - "node_modules/@libp2p/ping": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/@libp2p/ping/-/ping-3.0.10.tgz", - "integrity": "sha512-XkwQOOrmIa1/9t2xq0+Zm3rWkyO+Q0SavlM3t6WkDjxC4F3h0MaYep2CX5BBWD2mZWyy8YdeQTF3N9YhRr4irg==", - "license": "Apache-2.0 OR MIT", - "optional": true, - "dependencies": { - "@libp2p/crypto": "^5.1.13", - "@libp2p/interface": "^3.1.0", - "@libp2p/interface-internal": "^3.0.10", - "@multiformats/multiaddr": "^13.0.1", - "p-event": "^7.0.0", - "race-signal": "^2.0.0", - "uint8arraylist": "^2.4.8", - "uint8arrays": "^5.1.0" - } - }, - "node_modules/@libp2p/record": { - "version": "4.0.9", - "resolved": "https://registry.npmjs.org/@libp2p/record/-/record-4.0.9.tgz", - "integrity": "sha512-ITxntqQ2GDK/yA1NhzEQc2dXpxgox96xZ1cqO507choY5z5Czhz2BxfyElVO/XYjOXvylu1XN66uh3VuGHrfkQ==", - "license": "Apache-2.0 OR MIT", + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.57.1.tgz", + "integrity": "sha512-Ji8g8ChVbKrhFtig5QBV7iMaJrGtpHelkB3lsaKzadFBe58gmjfGXAOfI5FV0lYMH8wiqsxKQ1C9B0YTRXVy4w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", "optional": true, - "dependencies": { - "protons-runtime": "^5.6.0", - "uint8arraylist": "^2.4.8", - "uint8arrays": "^5.1.0" - } + "os": [ + "darwin" + ] }, - "node_modules/@libp2p/tcp": { - "version": "11.0.10", - "resolved": "https://registry.npmjs.org/@libp2p/tcp/-/tcp-11.0.10.tgz", - "integrity": "sha512-vp1XvbRUU6JyVZMDfrr8UX+xs1sybT2r3PFoN5m07r3GSrMMPOKpWN2HkhT2pCBZWJG6ADQOy5+K0tBRE782oA==", - "license": "Apache-2.0 OR MIT", + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.57.1.tgz", + "integrity": "sha512-R+/WwhsjmwodAcz65guCGFRkMb4gKWTcIeLy60JJQbXrJ97BOXHxnkPFrP+YwFlaS0m+uWJTstrUA9o+UchFug==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", "optional": true, - "dependencies": { - "@libp2p/interface": "^3.1.0", - "@libp2p/utils": "^7.0.10", - "@multiformats/multiaddr": "^13.0.1", - "@multiformats/multiaddr-matcher": "^3.0.1", - "@types/sinon": "^20.0.0", - "main-event": "^1.0.1", - "p-event": "^7.0.0", - "progress-events": "^1.0.1", - "uint8arraylist": "^2.4.8" - } + "os": [ + "freebsd" + ] }, - "node_modules/@libp2p/tls": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/@libp2p/tls/-/tls-3.0.10.tgz", - "integrity": "sha512-O/e/kEzXZPgHb1asyN1P4hCcECQnFEiGAQCgjkKU/nTjHYCvWG0CAU5uJuJkj9RXLpDFPVZ38FMN3dSzx0Ny7Q==", - "license": "Apache-2.0 OR MIT", + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.57.1.tgz", + "integrity": "sha512-IEQTCHeiTOnAUC3IDQdzRAGj3jOAYNr9kBguI7MQAAZK3caezRrg0GxAb6Hchg4lxdZEI5Oq3iov/w/hnFWY9Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", "optional": true, - "dependencies": { - "@libp2p/crypto": "^5.1.13", - "@libp2p/interface": "^3.1.0", - "@libp2p/peer-id": "^6.0.4", - "@libp2p/utils": "^7.0.10", - "@peculiar/asn1-schema": "^2.4.0", - "@peculiar/asn1-x509": "^2.4.0", - "@peculiar/webcrypto": "^1.5.0", - "@peculiar/x509": "^1.13.0", - "asn1js": "^3.0.6", - "p-event": "^7.0.0", - "protons-runtime": "^5.6.0", - "uint8arraylist": "^2.4.8", - "uint8arrays": "^5.1.0" - } + "os": [ + "freebsd" + ] }, - "node_modules/@libp2p/upnp-nat": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/@libp2p/upnp-nat/-/upnp-nat-4.0.10.tgz", - "integrity": "sha512-pEVLzDI7hY37vxjQyPvY6naWavUB5icTTLUtu/mHLvlb79jYX/NspIhUlbPcYFGH5dTD4NBaqHn6k3otOHssiw==", - "license": "Apache-2.0 OR MIT", + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.57.1.tgz", + "integrity": "sha512-F8sWbhZ7tyuEfsmOxwc2giKDQzN3+kuBLPwwZGyVkLlKGdV1nvnNwYD0fKQ8+XS6hp9nY7B+ZeK01EBUE7aHaw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", "optional": true, - "dependencies": { - "@achingbrain/nat-port-mapper": "^4.0.4", - "@chainsafe/is-ip": "^2.1.0", - "@libp2p/interface": "^3.1.0", - "@libp2p/interface-internal": "^3.0.10", - "@libp2p/utils": "^7.0.10", - "@multiformats/multiaddr": "^13.0.1", - "@multiformats/multiaddr-matcher": "^3.0.1", - "main-event": "^1.0.1", - "p-defer": "^4.0.1", - "race-signal": "^2.0.0" - } + "os": [ + "linux" + ] }, - "node_modules/@libp2p/utils": { - "version": "7.0.10", - "resolved": "https://registry.npmjs.org/@libp2p/utils/-/utils-7.0.10.tgz", - "integrity": "sha512-+mzD+7yLMoZ8+34y/iS9d1CnwHjJJ/qEsao9FckHf9T9tnVXEyLLu9TpzBCcGRm4fUK/QCSHK2AcZH50kkAFkw==", - "license": "Apache-2.0 OR MIT", + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.57.1.tgz", + "integrity": "sha512-rGfNUfn0GIeXtBP1wL5MnzSj98+PZe/AXaGBCRmT0ts80lU5CATYGxXukeTX39XBKsxzFpEeK+Mrp9faXOlmrw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", "optional": true, - "dependencies": { - "@chainsafe/is-ip": "^2.1.0", - "@chainsafe/netmask": "^2.0.0", - "@libp2p/crypto": "^5.1.13", - "@libp2p/interface": "^3.1.0", - "@libp2p/logger": "^6.2.2", - "@multiformats/multiaddr": "^13.0.1", - "@sindresorhus/fnv1a": "^3.1.0", - "any-signal": "^4.1.1", - "cborg": "^4.2.14", - "delay": "^7.0.0", - "is-loopback-addr": "^2.0.2", - "it-length-prefixed": "^10.0.1", - "it-pipe": "^3.0.1", - "it-pushable": "^3.2.3", - "it-stream-types": "^2.0.2", - "main-event": "^1.0.1", - "netmask": "^2.0.2", - "p-defer": "^4.0.1", - "p-event": "^7.0.0", - "race-signal": "^2.0.0", - "uint8-varint": "^2.0.4", - "uint8arraylist": "^2.4.8", - "uint8arrays": "^5.1.0" - } + "os": [ + "linux" + ] }, - "node_modules/@libp2p/webrtc": { - "version": "6.0.11", - "resolved": "https://registry.npmjs.org/@libp2p/webrtc/-/webrtc-6.0.11.tgz", - "integrity": "sha512-7Y1w3zA5625N/myagH/bWFq6PzFxadhYGvQMPOjO7mLcRgq/mmeBuP6ZrHWGIMJT5FsftrlJDI0S8//pieA9Xg==", - "license": "Apache-2.0 OR MIT", + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.57.1.tgz", + "integrity": "sha512-MMtej3YHWeg/0klK2Qodf3yrNzz6CGjo2UntLvk2RSPlhzgLvYEB3frRvbEF2wRKh1Z2fDIg9KRPe1fawv7C+g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", "optional": true, - "dependencies": { - "@chainsafe/is-ip": "^2.1.0", - "@chainsafe/libp2p-noise": "^17.0.0", - "@libp2p/crypto": "^5.1.13", - "@libp2p/interface": "^3.1.0", - "@libp2p/interface-internal": "^3.0.10", - "@libp2p/keychain": "^6.0.10", - "@libp2p/peer-id": "^6.0.4", - "@libp2p/utils": "^7.0.10", - "@multiformats/multiaddr": "^13.0.1", - "@multiformats/multiaddr-matcher": "^3.0.1", - "@peculiar/webcrypto": "^1.5.0", - "@peculiar/x509": "^1.13.0", - "detect-browser": "^5.3.0", - "get-port": "^7.1.0", - "interface-datastore": "^9.0.1", - "it-length-prefixed": "^10.0.1", - "it-protobuf-stream": "^2.0.3", - "it-pushable": "^3.2.3", - "it-stream-types": "^2.0.2", - "main-event": "^1.0.1", - "multiformats": "^13.4.0", - "node-datachannel": "^0.29.0", - "p-defer": "^4.0.1", - "p-event": "^7.0.0", - "p-timeout": "^7.0.0", - "p-wait-for": "^6.0.0", - "progress-events": "^1.0.1", - "protons-runtime": "^5.6.0", - "race-signal": "^2.0.0", - "react-native-webrtc": "^124.0.6", - "uint8-varint": "^2.0.4", - "uint8arraylist": "^2.4.8", - "uint8arrays": "^5.1.0" - } + "os": [ + "linux" + ] }, - "node_modules/@libp2p/webrtc/node_modules/@react-native/virtualized-lists": { - "version": "0.84.0", - "resolved": "https://registry.npmjs.org/@react-native/virtualized-lists/-/virtualized-lists-0.84.0.tgz", - "integrity": "sha512-ugwSj0Gb4MYrcm8uQrQw8qHPx5RKGDLuZRAP/AuwneFizHx8YCLBEFbOYRGWgxHBRtkJ70D1o+jpIx3CK3p5lw==", + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.57.1.tgz", + "integrity": "sha512-1a/qhaaOXhqXGpMFMET9VqwZakkljWHLmZOX48R0I/YLbhdxr1m4gtG1Hq7++VhVUmf+L3sTAf9op4JlhQ5u1Q==", + "cpu": [ + "arm64" + ], + "dev": true, "license": "MIT", "optional": true, - "dependencies": { - "invariant": "^2.2.4", - "nullthrows": "^1.1.1" - }, - "engines": { - "node": ">= 20.19.4" - }, - "peerDependencies": { - "@types/react": "^19.2.0", - "react": "*", - "react-native": "*" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } + "os": [ + "linux" + ] }, - "node_modules/@libp2p/webrtc/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.57.1.tgz", + "integrity": "sha512-QWO6RQTZ/cqYtJMtxhkRkidoNGXc7ERPbZN7dVW5SdURuLeVU7lwKMpo18XdcmpWYd0qsP1bwKPf7DNSUinhvA==", + "cpu": [ + "loong64" + ], + "dev": true, "license": "MIT", "optional": true, - "engines": { - "node": ">=8" - } + "os": [ + "linux" + ] }, - "node_modules/@libp2p/webrtc/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.57.1.tgz", + "integrity": "sha512-xpObYIf+8gprgWaPP32xiN5RVTi/s5FCR+XMXSKmhfoJjrpRAjCuuqQXyxUa/eJTdAE6eJ+KDKaoEqjZQxh3Gw==", + "cpu": [ + "loong64" + ], + "dev": true, "license": "MIT", "optional": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } + "os": [ + "linux" + ] }, - "node_modules/@libp2p/webrtc/node_modules/event-target-shim": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-6.0.2.tgz", - "integrity": "sha512-8q3LsZjRezbFZ2PN+uP+Q7pnHUMmAOziU2vA2OwoFaKIXxlxl38IylhSSgUorWu/rf4er67w0ikBqjBFk/pomA==", + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.57.1.tgz", + "integrity": "sha512-4BrCgrpZo4hvzMDKRqEaW1zeecScDCR+2nZ86ATLhAoJ5FQ+lbHVD3ttKe74/c7tNT9c6F2viwB3ufwp01Oh2w==", + "cpu": [ + "ppc64" + ], + "dev": true, "license": "MIT", "optional": true, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } + "os": [ + "linux" + ] }, - "node_modules/@libp2p/webrtc/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.57.1.tgz", + "integrity": "sha512-NOlUuzesGauESAyEYFSe3QTUguL+lvrN1HtwEEsU2rOwdUDeTMJdO5dUYl/2hKf9jWydJrO9OL/XSSf65R5+Xw==", + "cpu": [ + "ppc64" + ], + "dev": true, "license": "MIT", - "optional": true + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@libp2p/webrtc/node_modules/react-native-webrtc": { - "version": "124.0.7", - "resolved": "https://registry.npmjs.org/react-native-webrtc/-/react-native-webrtc-124.0.7.tgz", - "integrity": "sha512-gnXPdbUS8IkKHq9WNaWptW/yy5s6nMyI6cNn90LXdobPVCgYSk6NA2uUGdT4c4J14BRgaFA95F+cR28tUPkMVA==", + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.57.1.tgz", + "integrity": "sha512-ptA88htVp0AwUUqhVghwDIKlvJMD/fmL/wrQj99PRHFRAG6Z5nbWoWG4o81Nt9FT+IuqUQi+L31ZKAFeJ5Is+A==", + "cpu": [ + "riscv64" + ], + "dev": true, "license": "MIT", "optional": true, - "dependencies": { - "base64-js": "1.5.1", - "debug": "4.3.4", - "event-target-shim": "6.0.2" - }, - "peerDependencies": { - "react-native": ">=0.60.0" - } + "os": [ + "linux" + ] }, - "node_modules/@libp2p/webrtc/node_modules/react-refresh": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz", - "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==", + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.57.1.tgz", + "integrity": "sha512-S51t7aMMTNdmAMPpBg7OOsTdn4tySRQvklmL3RpDRyknk87+Sp3xaumlatU+ppQ+5raY7sSTcC2beGgvhENfuw==", + "cpu": [ + "riscv64" + ], + "dev": true, "license": "MIT", "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@libp2p/webrtc/node_modules/scheduler": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", - "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", - "license": "MIT", - "optional": true - }, - "node_modules/@libp2p/webrtc/node_modules/semver": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", - "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", - "license": "ISC", - "optional": true, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@libp2p/webrtc/node_modules/ws": { - "version": "7.5.10", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", - "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/@libp2p/websockets": { - "version": "10.1.3", - "resolved": "https://registry.npmjs.org/@libp2p/websockets/-/websockets-10.1.3.tgz", - "integrity": "sha512-TzH7ja1Ay7zIXif5eYSRUAupqtRotUyNegumRPFV+DjiqOYK2DiZd8Z6QTG1iVUsUXMXrWihbFkR96zyQ9eajw==", - "license": "Apache-2.0 OR MIT", - "optional": true, - "dependencies": { - "@libp2p/interface": "^3.1.0", - "@libp2p/utils": "^7.0.10", - "@multiformats/multiaddr": "^13.0.1", - "@multiformats/multiaddr-matcher": "^3.0.1", - "@multiformats/multiaddr-to-uri": "^12.0.0", - "main-event": "^1.0.1", - "p-event": "^7.0.0", - "progress-events": "^1.0.1", - "uint8arraylist": "^2.4.8", - "uint8arrays": "^5.1.0", - "ws": "^8.18.3" - } - }, - "node_modules/@multiformats/dns": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/@multiformats/dns/-/dns-1.0.13.tgz", - "integrity": "sha512-yr4bxtA3MbvJ+2461kYIYMsiiZj/FIqKI64hE4SdvWJUdWF9EtZLar38juf20Sf5tguXKFUruluswAO6JsjS2w==", - "license": "Apache-2.0 OR MIT", - "optional": true, - "dependencies": { - "@dnsquery/dns-packet": "^6.1.1", - "@libp2p/interface": "^3.1.0", - "hashlru": "^2.3.0", - "p-queue": "^9.0.0", - "progress-events": "^1.0.0", - "uint8arrays": "^5.0.2" - } - }, - "node_modules/@multiformats/multiaddr": { - "version": "13.0.1", - "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-13.0.1.tgz", - "integrity": "sha512-XToN915cnfr6Lr9EdGWakGJbPT0ghpg/850HvdC+zFX8XvpLZElwa8synCiwa8TuvKNnny6m8j8NVBNCxhIO3g==", - "license": "Apache-2.0 OR MIT", - "optional": true, - "dependencies": { - "@chainsafe/is-ip": "^2.0.1", - "multiformats": "^13.0.0", - "uint8-varint": "^2.0.1", - "uint8arrays": "^5.0.0" - } - }, - "node_modules/@multiformats/multiaddr-matcher": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@multiformats/multiaddr-matcher/-/multiaddr-matcher-3.0.1.tgz", - "integrity": "sha512-jvjwzCPysVTQ53F4KqwmcqZw73BqHMk0UUZrMP9P4OtJ/YHrfs122ikTqhVA2upe0P/Qz9l8HVlhEifVYB2q9A==", - "license": "Apache-2.0 OR MIT", - "optional": true, - "dependencies": { - "@multiformats/multiaddr": "^13.0.0" - } - }, - "node_modules/@multiformats/multiaddr-to-uri": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/@multiformats/multiaddr-to-uri/-/multiaddr-to-uri-12.0.0.tgz", - "integrity": "sha512-3uIEBCiy8tfzxYYBl81x1tISiNBQ7mHU4pGjippbJRoQYHzy/ZdZM/7JvTldr8pc/dzpkaNJxnsuxxlhsPOJsA==", - "license": "Apache-2.0 OR MIT", - "optional": true, - "dependencies": { - "@multiformats/multiaddr": "^13.0.0" - } - }, - "node_modules/@multiformats/uri-to-multiaddr": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/@multiformats/uri-to-multiaddr/-/uri-to-multiaddr-10.0.0.tgz", - "integrity": "sha512-QsmwLmY6iB1wDU1e1wyctqF0eP/2KD1QPLQ+APISuqETbCTSpaq159S/K/ssmWlBpSEkhH0SUfBUgGi014Ttfw==", - "license": "Apache-2.0 OR MIT", - "optional": true, - "dependencies": { - "@multiformats/multiaddr": "^13.0.0", - "is-ip": "^5.0.0" - } - }, - "node_modules/@noble/ciphers": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-1.3.0.tgz", - "integrity": "sha512-2I0gnIVPtfnMw9ee9h1dJG7tp81+8Ob3OJb3Mv37rx5L40/b0i7djjCVvGOVqc9AEIQyvyu1i6ypKdFw8R8gQw==", - "license": "MIT", - "engines": { - "node": "^14.21.3 || >=16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@noble/curves": { - "version": "1.9.7", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.7.tgz", - "integrity": "sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw==", - "license": "MIT", - "dependencies": { - "@noble/hashes": "1.8.0" - }, - "engines": { - "node": "^14.21.3 || >=16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@noble/hashes": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", - "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", - "license": "MIT", - "engines": { - "node": "^14.21.3 || >=16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@peculiar/asn1-cms": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-cms/-/asn1-cms-2.6.0.tgz", - "integrity": "sha512-2uZqP+ggSncESeUF/9Su8rWqGclEfEiz1SyU02WX5fUONFfkjzS2Z/F1Li0ofSmf4JqYXIOdCAZqIXAIBAT1OA==", - "license": "MIT", - "optional": true, - "dependencies": { - "@peculiar/asn1-schema": "^2.6.0", - "@peculiar/asn1-x509": "^2.6.0", - "@peculiar/asn1-x509-attr": "^2.6.0", - "asn1js": "^3.0.6", - "tslib": "^2.8.1" - } - }, - "node_modules/@peculiar/asn1-csr": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-csr/-/asn1-csr-2.6.0.tgz", - "integrity": "sha512-BeWIu5VpTIhfRysfEp73SGbwjjoLL/JWXhJ/9mo4vXnz3tRGm+NGm3KNcRzQ9VMVqwYS2RHlolz21svzRXIHPQ==", - "license": "MIT", - "optional": true, - "dependencies": { - "@peculiar/asn1-schema": "^2.6.0", - "@peculiar/asn1-x509": "^2.6.0", - "asn1js": "^3.0.6", - "tslib": "^2.8.1" - } - }, - "node_modules/@peculiar/asn1-ecc": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-ecc/-/asn1-ecc-2.6.0.tgz", - "integrity": "sha512-FF3LMGq6SfAOwUG2sKpPXblibn6XnEIKa+SryvUl5Pik+WR9rmRA3OCiwz8R3lVXnYnyRkSZsSLdml8H3UiOcw==", - "license": "MIT", - "optional": true, - "dependencies": { - "@peculiar/asn1-schema": "^2.6.0", - "@peculiar/asn1-x509": "^2.6.0", - "asn1js": "^3.0.6", - "tslib": "^2.8.1" - } - }, - "node_modules/@peculiar/asn1-pfx": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-pfx/-/asn1-pfx-2.6.0.tgz", - "integrity": "sha512-rtUvtf+tyKGgokHHmZzeUojRZJYPxoD/jaN1+VAB4kKR7tXrnDCA/RAWXAIhMJJC+7W27IIRGe9djvxKgsldCQ==", - "license": "MIT", - "optional": true, - "dependencies": { - "@peculiar/asn1-cms": "^2.6.0", - "@peculiar/asn1-pkcs8": "^2.6.0", - "@peculiar/asn1-rsa": "^2.6.0", - "@peculiar/asn1-schema": "^2.6.0", - "asn1js": "^3.0.6", - "tslib": "^2.8.1" - } - }, - "node_modules/@peculiar/asn1-pkcs8": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-pkcs8/-/asn1-pkcs8-2.6.0.tgz", - "integrity": "sha512-KyQ4D8G/NrS7Fw3XCJrngxmjwO/3htnA0lL9gDICvEQ+GJ+EPFqldcJQTwPIdvx98Tua+WjkdKHSC0/Km7T+lA==", - "license": "MIT", - "optional": true, - "dependencies": { - "@peculiar/asn1-schema": "^2.6.0", - "@peculiar/asn1-x509": "^2.6.0", - "asn1js": "^3.0.6", - "tslib": "^2.8.1" - } - }, - "node_modules/@peculiar/asn1-pkcs9": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-pkcs9/-/asn1-pkcs9-2.6.0.tgz", - "integrity": "sha512-b78OQ6OciW0aqZxdzliXGYHASeCvvw5caqidbpQRYW2mBtXIX2WhofNXTEe7NyxTb0P6J62kAAWLwn0HuMF1Fw==", - "license": "MIT", - "optional": true, - "dependencies": { - "@peculiar/asn1-cms": "^2.6.0", - "@peculiar/asn1-pfx": "^2.6.0", - "@peculiar/asn1-pkcs8": "^2.6.0", - "@peculiar/asn1-schema": "^2.6.0", - "@peculiar/asn1-x509": "^2.6.0", - "@peculiar/asn1-x509-attr": "^2.6.0", - "asn1js": "^3.0.6", - "tslib": "^2.8.1" - } - }, - "node_modules/@peculiar/asn1-rsa": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-rsa/-/asn1-rsa-2.6.0.tgz", - "integrity": "sha512-Nu4C19tsrTsCp9fDrH+sdcOKoVfdfoQQ7S3VqjJU6vedR7tY3RLkQ5oguOIB3zFW33USDUuYZnPEQYySlgha4w==", - "license": "MIT", - "optional": true, - "dependencies": { - "@peculiar/asn1-schema": "^2.6.0", - "@peculiar/asn1-x509": "^2.6.0", - "asn1js": "^3.0.6", - "tslib": "^2.8.1" - } - }, - "node_modules/@peculiar/asn1-schema": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-schema/-/asn1-schema-2.6.0.tgz", - "integrity": "sha512-xNLYLBFTBKkCzEZIw842BxytQQATQv+lDTCEMZ8C196iJcJJMBUZxrhSTxLaohMyKK8QlzRNTRkUmanucnDSqg==", - "license": "MIT", - "optional": true, - "dependencies": { - "asn1js": "^3.0.6", - "pvtsutils": "^1.3.6", - "tslib": "^2.8.1" - } - }, - "node_modules/@peculiar/asn1-x509": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-x509/-/asn1-x509-2.6.0.tgz", - "integrity": "sha512-uzYbPEpoQiBoTq0/+jZtpM6Gq6zADBx+JNFP3yqRgziWBxQ/Dt/HcuvRfm9zJTPdRcBqPNdaRHTVwpyiq6iNMA==", - "license": "MIT", - "optional": true, - "dependencies": { - "@peculiar/asn1-schema": "^2.6.0", - "asn1js": "^3.0.6", - "pvtsutils": "^1.3.6", - "tslib": "^2.8.1" - } - }, - "node_modules/@peculiar/asn1-x509-attr": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-x509-attr/-/asn1-x509-attr-2.6.0.tgz", - "integrity": "sha512-MuIAXFX3/dc8gmoZBkwJWxUWOSvG4MMDntXhrOZpJVMkYX+MYc/rUAU2uJOved9iJEoiUx7//3D8oG83a78UJA==", - "license": "MIT", - "optional": true, - "dependencies": { - "@peculiar/asn1-schema": "^2.6.0", - "@peculiar/asn1-x509": "^2.6.0", - "asn1js": "^3.0.6", - "tslib": "^2.8.1" - } - }, - "node_modules/@peculiar/json-schema": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/@peculiar/json-schema/-/json-schema-1.1.12.tgz", - "integrity": "sha512-coUfuoMeIB7B8/NMekxaDzLhaYmp0HZNPEjYRm9goRou8UZIC3z21s0sL9AWoCw4EG876QyO3kYrc61WNF9B/w==", - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@peculiar/webcrypto": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@peculiar/webcrypto/-/webcrypto-1.5.0.tgz", - "integrity": "sha512-BRs5XUAwiyCDQMsVA9IDvDa7UBR9gAvPHgugOeGng3YN6vJ9JYonyDc0lNczErgtCWtucjR5N7VtaonboD/ezg==", - "license": "MIT", - "optional": true, - "dependencies": { - "@peculiar/asn1-schema": "^2.3.8", - "@peculiar/json-schema": "^1.1.12", - "pvtsutils": "^1.3.5", - "tslib": "^2.6.2", - "webcrypto-core": "^1.8.0" - }, - "engines": { - "node": ">=10.12.0" - } - }, - "node_modules/@peculiar/x509": { - "version": "1.14.3", - "resolved": "https://registry.npmjs.org/@peculiar/x509/-/x509-1.14.3.tgz", - "integrity": "sha512-C2Xj8FZ0uHWeCXXqX5B4/gVFQmtSkiuOolzAgutjTfseNOHT3pUjljDZsTSxXFGgio54bCzVFqmEOUrIVk8RDA==", - "license": "MIT", - "optional": true, - "dependencies": { - "@peculiar/asn1-cms": "^2.6.0", - "@peculiar/asn1-csr": "^2.6.0", - "@peculiar/asn1-ecc": "^2.6.0", - "@peculiar/asn1-pkcs9": "^2.6.0", - "@peculiar/asn1-rsa": "^2.6.0", - "@peculiar/asn1-schema": "^2.6.0", - "@peculiar/asn1-x509": "^2.6.0", - "pvtsutils": "^1.3.6", - "reflect-metadata": "^0.2.2", - "tslib": "^2.8.1", - "tsyringe": "^4.10.0" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@react-native/assets-registry": { - "version": "0.84.0", - "resolved": "https://registry.npmjs.org/@react-native/assets-registry/-/assets-registry-0.84.0.tgz", - "integrity": "sha512-YiU9h1IN0pvvZsHbd03MaD7mE2q+ySaKMlE9tWK+3iiwtbEaMQOsMUuSJ1er2LU6ERMWfhfvCYgWpKRGOMeN8A==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">= 20.19.4" - } - }, - "node_modules/@react-native/codegen": { - "version": "0.84.0", - "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.84.0.tgz", - "integrity": "sha512-TcTAO58JigCw9onYTrbE2yK2js5YNgqbmnpYyq9oXz2mofbX7JcK53kIi7fhqyJhie8RkY+X85zSOTWNs6S3CA==", - "license": "MIT", - "optional": true, - "dependencies": { - "@babel/core": "^7.25.2", - "@babel/parser": "^7.25.3", - "hermes-parser": "0.32.0", - "invariant": "^2.2.4", - "nullthrows": "^1.1.1", - "tinyglobby": "^0.2.15", - "yargs": "^17.6.2" - }, - "engines": { - "node": ">= 20.19.4" - }, - "peerDependencies": { - "@babel/core": "*" - } - }, - "node_modules/@react-native/community-cli-plugin": { - "version": "0.84.0", - "resolved": "https://registry.npmjs.org/@react-native/community-cli-plugin/-/community-cli-plugin-0.84.0.tgz", - "integrity": "sha512-uYoLBHnAzod4E5dA5rPPQeny2A5RD0PiIJQ4r+2F7cvA+5bZ8+znxw4TdaSiEk8uhN+clffI4d2bl9V4+xEK+Q==", - "license": "MIT", - "optional": true, - "dependencies": { - "@react-native/dev-middleware": "0.84.0", - "debug": "^4.4.0", - "invariant": "^2.2.4", - "metro": "^0.83.3", - "metro-config": "^0.83.3", - "metro-core": "^0.83.3", - "semver": "^7.1.3" - }, - "engines": { - "node": ">= 20.19.4" - }, - "peerDependencies": { - "@react-native-community/cli": "*", - "@react-native/metro-config": "*" - }, - "peerDependenciesMeta": { - "@react-native-community/cli": { - "optional": true - }, - "@react-native/metro-config": { - "optional": true - } - } - }, - "node_modules/@react-native/community-cli-plugin/node_modules/semver": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", - "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", - "license": "ISC", - "optional": true, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@react-native/debugger-frontend": { - "version": "0.84.0", - "resolved": "https://registry.npmjs.org/@react-native/debugger-frontend/-/debugger-frontend-0.84.0.tgz", - "integrity": "sha512-n7JKYVDCbA2aj8/5/OD1IK7nuiAYj5l/Z6yhGf7GG4EGaeQdthqdb0LZbseaRPyZK/7tLfdnLdqlqdTQC6/UTQ==", - "license": "BSD-3-Clause", - "optional": true, - "engines": { - "node": ">= 20.19.4" - } - }, - "node_modules/@react-native/debugger-shell": { - "version": "0.84.0", - "resolved": "https://registry.npmjs.org/@react-native/debugger-shell/-/debugger-shell-0.84.0.tgz", - "integrity": "sha512-5t/NvQLYk/d0kWlGOMNobkjfimqBc+/LYRmSOkgKm+pyOhxjygCLSnRjAUkeRALSZ8h6MKGTz1Wc4pbmJr7T0Q==", - "license": "MIT", - "optional": true, - "dependencies": { - "cross-spawn": "^7.0.6", - "debug": "^4.4.0", - "fb-dotslash": "0.5.8" - }, - "engines": { - "node": ">= 20.19.4" - } - }, - "node_modules/@react-native/dev-middleware": { - "version": "0.84.0", - "resolved": "https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.84.0.tgz", - "integrity": "sha512-c0o7YW39AUI1FSLV/TFSszr87kQGmaePAQK0ygIRnwZ2fAGDnQ5Iu/tk3u9O5lVH6nTjfAwTKJ3El9YeEWDeEQ==", - "license": "MIT", - "optional": true, - "dependencies": { - "@isaacs/ttlcache": "^1.4.1", - "@react-native/debugger-frontend": "0.84.0", - "@react-native/debugger-shell": "0.84.0", - "chrome-launcher": "^0.15.2", - "chromium-edge-launcher": "^0.2.0", - "connect": "^3.6.5", - "debug": "^4.4.0", - "invariant": "^2.2.4", - "nullthrows": "^1.1.1", - "open": "^7.0.3", - "serve-static": "^1.16.2", - "ws": "^7.5.10" - }, - "engines": { - "node": ">= 20.19.4" - } - }, - "node_modules/@react-native/dev-middleware/node_modules/ws": { - "version": "7.5.10", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", - "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/@react-native/gradle-plugin": { - "version": "0.84.0", - "resolved": "https://registry.npmjs.org/@react-native/gradle-plugin/-/gradle-plugin-0.84.0.tgz", - "integrity": "sha512-j8g/I4Z+SAdh2NXOVng4rmfYgPoeJBZwAKoGPpSe/wB/9XDLh9IRGUTg8dGS5BWUy2471xBUoGZPwHb6QMJmVw==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">= 20.19.4" - } - }, - "node_modules/@react-native/js-polyfills": { - "version": "0.84.0", - "resolved": "https://registry.npmjs.org/@react-native/js-polyfills/-/js-polyfills-0.84.0.tgz", - "integrity": "sha512-xaxmzYWLgHH+2uAZQ0owEkDE58hOTWmuBKD/Gl+cDFD3mFfSK4lZpin/3hiXtE5LB4BwgqICsPN07zCAqx6Fpg==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">= 20.19.4" - } - }, - "node_modules/@react-native/normalize-colors": { - "version": "0.84.0", - "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.84.0.tgz", - "integrity": "sha512-7JgZyWtQ9Sz4qZvCTsURUtuv8/niEZ/iCorp7eExc3GgpBWNazPumieiUoWPdgRKofU0Bqpr2/dJevEn2hrlwA==", - "license": "MIT", - "optional": true - }, - "node_modules/@rolldown/pluginutils": { - "version": "1.0.0-beta.27", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz", - "integrity": "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@rollup/plugin-inject": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@rollup/plugin-inject/-/plugin-inject-5.0.5.tgz", - "integrity": "sha512-2+DEJbNBoPROPkgTDNe8/1YXWcqxbN5DTjASVIOx8HS+pITXushyNiBV56RB08zuptzz8gT3YfkqriTBVycepg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@rollup/pluginutils": "^5.0.1", - "estree-walker": "^2.0.2", - "magic-string": "^0.30.3" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, - "node_modules/@rollup/pluginutils": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.3.0.tgz", - "integrity": "sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0", - "estree-walker": "^2.0.2", - "picomatch": "^4.0.2" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.57.1.tgz", - "integrity": "sha512-A6ehUVSiSaaliTxai040ZpZ2zTevHYbvu/lDoeAteHI8QnaosIzm4qwtezfRg1jOYaUmnzLX1AOD6Z+UJjtifg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.57.1.tgz", - "integrity": "sha512-dQaAddCY9YgkFHZcFNS/606Exo8vcLHwArFZ7vxXq4rigo2bb494/xKMMwRRQW6ug7Js6yXmBZhSBRuBvCCQ3w==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.57.1.tgz", - "integrity": "sha512-crNPrwJOrRxagUYeMn/DZwqN88SDmwaJ8Cvi/TN1HnWBU7GwknckyosC2gd0IqYRsHDEnXf328o9/HC6OkPgOg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.57.1.tgz", - "integrity": "sha512-Ji8g8ChVbKrhFtig5QBV7iMaJrGtpHelkB3lsaKzadFBe58gmjfGXAOfI5FV0lYMH8wiqsxKQ1C9B0YTRXVy4w==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.57.1.tgz", - "integrity": "sha512-R+/WwhsjmwodAcz65guCGFRkMb4gKWTcIeLy60JJQbXrJ97BOXHxnkPFrP+YwFlaS0m+uWJTstrUA9o+UchFug==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.57.1.tgz", - "integrity": "sha512-IEQTCHeiTOnAUC3IDQdzRAGj3jOAYNr9kBguI7MQAAZK3caezRrg0GxAb6Hchg4lxdZEI5Oq3iov/w/hnFWY9Q==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.57.1.tgz", - "integrity": "sha512-F8sWbhZ7tyuEfsmOxwc2giKDQzN3+kuBLPwwZGyVkLlKGdV1nvnNwYD0fKQ8+XS6hp9nY7B+ZeK01EBUE7aHaw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.57.1.tgz", - "integrity": "sha512-rGfNUfn0GIeXtBP1wL5MnzSj98+PZe/AXaGBCRmT0ts80lU5CATYGxXukeTX39XBKsxzFpEeK+Mrp9faXOlmrw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.57.1.tgz", - "integrity": "sha512-MMtej3YHWeg/0klK2Qodf3yrNzz6CGjo2UntLvk2RSPlhzgLvYEB3frRvbEF2wRKh1Z2fDIg9KRPe1fawv7C+g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.57.1.tgz", - "integrity": "sha512-1a/qhaaOXhqXGpMFMET9VqwZakkljWHLmZOX48R0I/YLbhdxr1m4gtG1Hq7++VhVUmf+L3sTAf9op4JlhQ5u1Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loong64-gnu": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.57.1.tgz", - "integrity": "sha512-QWO6RQTZ/cqYtJMtxhkRkidoNGXc7ERPbZN7dVW5SdURuLeVU7lwKMpo18XdcmpWYd0qsP1bwKPf7DNSUinhvA==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loong64-musl": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.57.1.tgz", - "integrity": "sha512-xpObYIf+8gprgWaPP32xiN5RVTi/s5FCR+XMXSKmhfoJjrpRAjCuuqQXyxUa/eJTdAE6eJ+KDKaoEqjZQxh3Gw==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.57.1.tgz", - "integrity": "sha512-4BrCgrpZo4hvzMDKRqEaW1zeecScDCR+2nZ86ATLhAoJ5FQ+lbHVD3ttKe74/c7tNT9c6F2viwB3ufwp01Oh2w==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-ppc64-musl": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.57.1.tgz", - "integrity": "sha512-NOlUuzesGauESAyEYFSe3QTUguL+lvrN1HtwEEsU2rOwdUDeTMJdO5dUYl/2hKf9jWydJrO9OL/XSSf65R5+Xw==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.57.1.tgz", - "integrity": "sha512-ptA88htVp0AwUUqhVghwDIKlvJMD/fmL/wrQj99PRHFRAG6Z5nbWoWG4o81Nt9FT+IuqUQi+L31ZKAFeJ5Is+A==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.57.1.tgz", - "integrity": "sha512-S51t7aMMTNdmAMPpBg7OOsTdn4tySRQvklmL3RpDRyknk87+Sp3xaumlatU+ppQ+5raY7sSTcC2beGgvhENfuw==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.57.1.tgz", - "integrity": "sha512-Bl00OFnVFkL82FHbEqy3k5CUCKH6OEJL54KCyx2oqsmZnFTR8IoNqBF+mjQVcRCT5sB6yOvK8A37LNm/kPJiZg==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.57.1.tgz", - "integrity": "sha512-ABca4ceT4N+Tv/GtotnWAeXZUZuM/9AQyCyKYyKnpk4yoA7QIAuBt6Hkgpw8kActYlew2mvckXkvx0FfoInnLg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.57.1.tgz", - "integrity": "sha512-HFps0JeGtuOR2convgRRkHCekD7j+gdAuXM+/i6kGzQtFhlCtQkpwtNzkNj6QhCDp7DRJ7+qC/1Vg2jt5iSOFw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-openbsd-x64": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.57.1.tgz", - "integrity": "sha512-H+hXEv9gdVQuDTgnqD+SQffoWoc0Of59AStSzTEj/feWTBAnSfSD3+Dql1ZruJQxmykT/JVY0dE8Ka7z0DH1hw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ] - }, - "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.57.1.tgz", - "integrity": "sha512-4wYoDpNg6o/oPximyc/NG+mYUejZrCU2q+2w6YZqrAs2UcNUChIZXjtafAiiZSUc7On8v5NyNj34Kzj/Ltk6dQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ] - }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.57.1.tgz", - "integrity": "sha512-O54mtsV/6LW3P8qdTcamQmuC990HDfR71lo44oZMZlXU4tzLrbvTii87Ni9opq60ds0YzuAlEr/GNwuNluZyMQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.57.1.tgz", - "integrity": "sha512-P3dLS+IerxCT/7D2q2FYcRdWRl22dNbrbBEtxdWhXrfIMPP9lQhb5h4Du04mdl5Woq05jVCDPCMF7Ub0NAjIew==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-gnu": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.57.1.tgz", - "integrity": "sha512-VMBH2eOOaKGtIJYleXsi2B8CPVADrh+TyNxJ4mWPnKfLB/DBUmzW+5m1xUrcwWoMfSLagIRpjUFeW5CO5hyciQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.57.1.tgz", - "integrity": "sha512-mxRFDdHIWRxg3UfIIAwCm6NzvxG0jDX/wBN6KsQFTvKFqqg9vTrWUE68qEjHt19A5wwx5X5aUi2zuZT7YR0jrA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@scure/base": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.2.6.tgz", - "integrity": "sha512-g/nm5FgUa//MCj1gV09zTJTaM6KBAHqLN907YVQqf7zC49+DcO4B1so4ZX07Ef10Twr6nuqYEH9GEggFXA4Fmg==", - "license": "MIT", - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@sinclair/typebox": { - "version": "0.27.10", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.10.tgz", - "integrity": "sha512-MTBk/3jGLNB2tVxv6uLlFh1iu64iYOQ2PbdOSK3NW8JZsmlaOh2q6sdtKowBhfw8QFLmYNzTW4/oK4uATIi6ZA==", - "license": "MIT", - "optional": true - }, - "node_modules/@sindresorhus/fnv1a": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/fnv1a/-/fnv1a-3.1.0.tgz", - "integrity": "sha512-KV321z5m/0nuAg83W1dPLy85HpHDk7Sdi4fJbwvacWsEhAh+rZUW4ZfGcXmUIvjZg4ss2bcwNlRhJ7GBEUG08w==", - "license": "MIT", - "optional": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@sinonjs/commons": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", - "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", - "license": "BSD-3-Clause", - "optional": true, - "dependencies": { - "type-detect": "4.0.8" - } - }, - "node_modules/@sinonjs/fake-timers": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", - "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", - "license": "BSD-3-Clause", - "optional": true, - "dependencies": { - "@sinonjs/commons": "^3.0.0" - } - }, - "node_modules/@tailwindcss/node": { - "version": "4.1.18", - "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.18.tgz", - "integrity": "sha512-DoR7U1P7iYhw16qJ49fgXUlry1t4CpXeErJHnQ44JgTSKMaZUdf17cfn5mHchfJ4KRBZRFA/Coo+MUF5+gOaCQ==", - "license": "MIT", - "dependencies": { - "@jridgewell/remapping": "^2.3.4", - "enhanced-resolve": "^5.18.3", - "jiti": "^2.6.1", - "lightningcss": "1.30.2", - "magic-string": "^0.30.21", - "source-map-js": "^1.2.1", - "tailwindcss": "4.1.18" - } - }, - "node_modules/@tailwindcss/oxide": { - "version": "4.1.18", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.18.tgz", - "integrity": "sha512-EgCR5tTS5bUSKQgzeMClT6iCY3ToqE1y+ZB0AKldj809QXk1Y+3jB0upOYZrn9aGIzPtUsP7sX4QQ4XtjBB95A==", - "license": "MIT", - "engines": { - "node": ">= 10" - }, - "optionalDependencies": { - "@tailwindcss/oxide-android-arm64": "4.1.18", - "@tailwindcss/oxide-darwin-arm64": "4.1.18", - "@tailwindcss/oxide-darwin-x64": "4.1.18", - "@tailwindcss/oxide-freebsd-x64": "4.1.18", - "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.18", - "@tailwindcss/oxide-linux-arm64-gnu": "4.1.18", - "@tailwindcss/oxide-linux-arm64-musl": "4.1.18", - "@tailwindcss/oxide-linux-x64-gnu": "4.1.18", - "@tailwindcss/oxide-linux-x64-musl": "4.1.18", - "@tailwindcss/oxide-wasm32-wasi": "4.1.18", - "@tailwindcss/oxide-win32-arm64-msvc": "4.1.18", - "@tailwindcss/oxide-win32-x64-msvc": "4.1.18" - } - }, - "node_modules/@tailwindcss/oxide-android-arm64": { - "version": "4.1.18", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.18.tgz", - "integrity": "sha512-dJHz7+Ugr9U/diKJA0W6N/6/cjI+ZTAoxPf9Iz9BFRF2GzEX8IvXxFIi/dZBloVJX/MZGvRuFA9rqwdiIEZQ0Q==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-darwin-arm64": { - "version": "4.1.18", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.18.tgz", - "integrity": "sha512-Gc2q4Qhs660bhjyBSKgq6BYvwDz4G+BuyJ5H1xfhmDR3D8HnHCmT/BSkvSL0vQLy/nkMLY20PQ2OoYMO15Jd0A==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-darwin-x64": { - "version": "4.1.18", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.18.tgz", - "integrity": "sha512-FL5oxr2xQsFrc3X9o1fjHKBYBMD1QZNyc1Xzw/h5Qu4XnEBi3dZn96HcHm41c/euGV+GRiXFfh2hUCyKi/e+yw==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-freebsd-x64": { - "version": "4.1.18", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.18.tgz", - "integrity": "sha512-Fj+RHgu5bDodmV1dM9yAxlfJwkkWvLiRjbhuO2LEtwtlYlBgiAT4x/j5wQr1tC3SANAgD+0YcmWVrj8R9trVMA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { - "version": "4.1.18", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.18.tgz", - "integrity": "sha512-Fp+Wzk/Ws4dZn+LV2Nqx3IilnhH51YZoRaYHQsVq3RQvEl+71VGKFpkfHrLM/Li+kt5c0DJe/bHXK1eHgDmdiA==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { - "version": "4.1.18", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.18.tgz", - "integrity": "sha512-S0n3jboLysNbh55Vrt7pk9wgpyTTPD0fdQeh7wQfMqLPM/Hrxi+dVsLsPrycQjGKEQk85Kgbx+6+QnYNiHalnw==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-linux-arm64-musl": { - "version": "4.1.18", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.18.tgz", - "integrity": "sha512-1px92582HkPQlaaCkdRcio71p8bc8i/ap5807tPRDK/uw953cauQBT8c5tVGkOwrHMfc2Yh6UuxaH4vtTjGvHg==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-linux-x64-gnu": { - "version": "4.1.18", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.18.tgz", - "integrity": "sha512-v3gyT0ivkfBLoZGF9LyHmts0Isc8jHZyVcbzio6Wpzifg/+5ZJpDiRiUhDLkcr7f/r38SWNe7ucxmGW3j3Kb/g==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-linux-x64-musl": { - "version": "4.1.18", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.18.tgz", - "integrity": "sha512-bhJ2y2OQNlcRwwgOAGMY0xTFStt4/wyU6pvI6LSuZpRgKQwxTec0/3Scu91O8ir7qCR3AuepQKLU/kX99FouqQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-wasm32-wasi": { - "version": "4.1.18", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.18.tgz", - "integrity": "sha512-LffYTvPjODiP6PT16oNeUQJzNVyJl1cjIebq/rWWBF+3eDst5JGEFSc5cWxyRCJ0Mxl+KyIkqRxk1XPEs9x8TA==", - "bundleDependencies": [ - "@napi-rs/wasm-runtime", - "@emnapi/core", - "@emnapi/runtime", - "@tybys/wasm-util", - "@emnapi/wasi-threads", - "tslib" - ], - "cpu": [ - "wasm32" - ], - "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/core": "^1.7.1", - "@emnapi/runtime": "^1.7.1", - "@emnapi/wasi-threads": "^1.1.0", - "@napi-rs/wasm-runtime": "^1.1.0", - "@tybys/wasm-util": "^0.10.1", - "tslib": "^2.4.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { - "version": "4.1.18", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.18.tgz", - "integrity": "sha512-HjSA7mr9HmC8fu6bdsZvZ+dhjyGCLdotjVOgLA2vEqxEBZaQo9YTX4kwgEvPCpRh8o4uWc4J/wEoFzhEmjvPbA==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-win32-x64-msvc": { - "version": "4.1.18", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.18.tgz", - "integrity": "sha512-bJWbyYpUlqamC8dpR7pfjA0I7vdF6t5VpUGMWRkXVE3AXgIZjYUYAK7II1GNaxR8J1SSrSrppRar8G++JekE3Q==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/postcss": { - "version": "4.1.18", - "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.1.18.tgz", - "integrity": "sha512-Ce0GFnzAOuPyfV5SxjXGn0CubwGcuDB0zcdaPuCSzAa/2vII24JTkH+I6jcbXLb1ctjZMZZI6OjDaLPJQL1S0g==", - "license": "MIT", - "dependencies": { - "@alloc/quick-lru": "^5.2.0", - "@tailwindcss/node": "4.1.18", - "@tailwindcss/oxide": "4.1.18", - "postcss": "^8.4.41", - "tailwindcss": "4.1.18" - } - }, - "node_modules/@types/babel__core": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", - "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "node_modules/@types/babel__generator": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", - "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", - "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__traverse": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", - "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.28.2" - } - }, - "node_modules/@types/chrome": { - "version": "0.0.268", - "resolved": "https://registry.npmjs.org/@types/chrome/-/chrome-0.0.268.tgz", - "integrity": "sha512-7N1QH9buudSJ7sI8Pe4mBHJr5oZ48s0hcanI9w3wgijAlv1OZNUZve9JR4x42dn5lJ5Sm87V1JNfnoh10EnQlA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/filesystem": "*", - "@types/har-format": "*" - } - }, - "node_modules/@types/dns-packet": { - "version": "5.6.5", - "resolved": "https://registry.npmjs.org/@types/dns-packet/-/dns-packet-5.6.5.tgz", - "integrity": "sha512-qXOC7XLOEe43ehtWJCMnQXvgcIpv6rPmQ1jXT98Ad8A3TB1Ue50jsCbSSSyuazScEuZ/Q026vHbrOTVkmwA+7Q==", - "license": "MIT", - "optional": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/estree": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/filesystem": { - "version": "0.0.36", - "resolved": "https://registry.npmjs.org/@types/filesystem/-/filesystem-0.0.36.tgz", - "integrity": "sha512-vPDXOZuannb9FZdxgHnqSwAG/jvdGM8Wq+6N4D/d80z+D4HWH+bItqsZaVRQykAn6WEVeEkLm2oQigyHtgb0RA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/filewriter": "*" - } - }, - "node_modules/@types/filewriter": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/@types/filewriter/-/filewriter-0.0.33.tgz", - "integrity": "sha512-xFU8ZXTw4gd358lb2jw25nxY9QAgqn2+bKKjKOYfNCzN4DKCFetK7sPtrlpg66Ywe3vWY9FNxprZawAh9wfJ3g==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/graceful-fs": { - "version": "4.1.9", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", - "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", - "license": "MIT", - "optional": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/har-format": { - "version": "1.2.16", - "resolved": "https://registry.npmjs.org/@types/har-format/-/har-format-1.2.16.tgz", - "integrity": "sha512-fluxdy7ryD3MV6h8pTfTYpy/xQzCFC7m89nOH9y94cNqJ1mDIDPut7MnRHI3F6qRmh/cT2fUjG1MLdCNb4hE9A==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", - "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", - "license": "MIT", - "optional": true - }, - "node_modules/@types/istanbul-lib-report": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", - "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", - "license": "MIT", - "optional": true, - "dependencies": { - "@types/istanbul-lib-coverage": "*" - } - }, - "node_modules/@types/istanbul-reports": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", - "license": "MIT", - "optional": true, - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/@types/multicast-dns": { - "version": "7.2.4", - "resolved": "https://registry.npmjs.org/@types/multicast-dns/-/multicast-dns-7.2.4.tgz", - "integrity": "sha512-ib5K4cIDR4Ro5SR3Sx/LROkMDa0BHz0OPaCBL/OSPDsAXEGZ3/KQeS6poBKYVN7BfjXDL9lWNwzyHVgt/wkyCw==", - "license": "MIT", - "optional": true, - "dependencies": { - "@types/dns-packet": "*", - "@types/node": "*" - } - }, - "node_modules/@types/node": { - "version": "25.2.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-25.2.3.tgz", - "integrity": "sha512-m0jEgYlYz+mDJZ2+F4v8D1AyQb+QzsNqRuI7xg1VQX/KlKS0qT9r1Mo16yo5F/MtifXFgaofIFsdFMox2SxIbQ==", - "license": "MIT", - "optional": true, - "dependencies": { - "undici-types": "~7.16.0" - } - }, - "node_modules/@types/prop-types": { - "version": "15.7.15", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz", - "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==", - "devOptional": true, - "license": "MIT" - }, - "node_modules/@types/react": { - "version": "18.3.28", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.28.tgz", - "integrity": "sha512-z9VXpC7MWrhfWipitjNdgCauoMLRdIILQsAEV+ZesIzBq/oUlxk0m3ApZuMFCXdnS4U7KrI+l3WRUEGQ8K1QKw==", - "devOptional": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@types/prop-types": "*", - "csstype": "^3.2.2" - } + "os": [ + "linux" + ] }, - "node_modules/@types/react-dom": { - "version": "18.3.7", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.7.tgz", - "integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==", + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.57.1.tgz", + "integrity": "sha512-Bl00OFnVFkL82FHbEqy3k5CUCKH6OEJL54KCyx2oqsmZnFTR8IoNqBF+mjQVcRCT5sB6yOvK8A37LNm/kPJiZg==", + "cpu": [ + "s390x" + ], "dev": true, "license": "MIT", - "peerDependencies": { - "@types/react": "^18.0.0" - } - }, - "node_modules/@types/sinon": { - "version": "20.0.0", - "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-20.0.0.tgz", - "integrity": "sha512-etYGUC6IEevDGSWvR9WrECRA01ucR2/Oi9XMBUAdV0g4bLkNf4HlZWGiGlDOq5lgwXRwcV+PSeKgFcW4QzzYOg==", - "license": "MIT", - "optional": true, - "dependencies": { - "@types/sinonjs__fake-timers": "*" - } - }, - "node_modules/@types/sinonjs__fake-timers": { - "version": "15.0.1", - "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-15.0.1.tgz", - "integrity": "sha512-Ko2tjWJq8oozHzHV+reuvS5KYIRAokHnGbDwGh/J64LntgpbuylF74ipEL24HCyRjf9FOlBiBHWBR1RlVKsI1w==", - "license": "MIT", - "optional": true - }, - "node_modules/@types/stack-utils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", - "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", - "license": "MIT", - "optional": true - }, - "node_modules/@types/yargs": { - "version": "17.0.35", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.35.tgz", - "integrity": "sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==", - "license": "MIT", "optional": true, - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@types/yargs-parser": { - "version": "21.0.3", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", - "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", - "license": "MIT", - "optional": true - }, - "node_modules/@unicitylabs/nostr-js-sdk": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@unicitylabs/nostr-js-sdk/-/nostr-js-sdk-0.3.3.tgz", - "integrity": "sha512-1COxkSZI5ENSAO1LZaDZPmplmLjIZXPiyDhkGU2rM7GV9FAP1Qk+xsZNmW7vxgaUB7sftBWMXc2uhHn6LDTOWA==", - "license": "MIT", - "dependencies": { - "@noble/ciphers": "^1.0.0", - "@noble/curves": "^1.6.0", - "@noble/hashes": "^1.5.0", - "@scure/base": "^1.1.9", - "libphonenumber-js": "^1.11.14" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@unicitylabs/sphere-sdk": { - "version": "0.4.7", - "resolved": "https://registry.npmjs.org/@unicitylabs/sphere-sdk/-/sphere-sdk-0.4.7.tgz", - "integrity": "sha512-JIRR8nAuPY5HYiqtrgN9xkNcqddSCHK9Kyq4rtJnoFWwIZhFdAi2lAWEQ4bBLtO+MWhOoTux2PTsL2oZuIPASA==", - "license": "MIT", - "dependencies": { - "@noble/curves": "^2.0.1", - "@noble/hashes": "^2.0.1", - "@unicitylabs/nostr-js-sdk": "^0.3.3", - "@unicitylabs/state-transition-sdk": "1.6.1-rc.f37cb85", - "bip39": "^3.1.0", - "buffer": "^6.0.3", - "crypto-js": "^4.2.0", - "elliptic": "^6.6.1" - }, - "engines": { - "node": ">=18.0.0" - }, - "optionalDependencies": { - "@helia/ipns": "^9.1.3", - "@helia/json": "^5.0.3", - "@libp2p/crypto": "^5.1.13", - "@libp2p/peer-id": "^6.0.4", - "helia": "^6.0.11", - "ipns": "^10.0.0", - "multiformats": "^13.4.2" - }, - "peerDependencies": { - "@helia/ipns": ">=9.0.0", - "@helia/json": ">=5.0.0", - "@libp2p/crypto": ">=5.0.0", - "@libp2p/peer-id": ">=6.0.0", - "helia": ">=6.0.0", - "ipns": ">=10.0.0", - "multiformats": ">=13.0.0", - "ws": ">=8.0.0" - }, - "peerDependenciesMeta": { - "@helia/ipns": { - "optional": true - }, - "@helia/json": { - "optional": true - }, - "@libp2p/crypto": { - "optional": true - }, - "@libp2p/peer-id": { - "optional": true - }, - "helia": { - "optional": true - }, - "ipns": { - "optional": true - }, - "multiformats": { - "optional": true - }, - "ws": { - "optional": true - } - } - }, - "node_modules/@unicitylabs/sphere-sdk/node_modules/@noble/curves": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-2.0.1.tgz", - "integrity": "sha512-vs1Az2OOTBiP4q0pwjW5aF0xp9n4MxVrmkFBxc6EKZc6ddYx5gaZiAsZoq0uRRXWbi3AT/sBqn05eRPtn1JCPw==", - "license": "MIT", - "dependencies": { - "@noble/hashes": "2.0.1" - }, - "engines": { - "node": ">= 20.19.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@unicitylabs/sphere-sdk/node_modules/@noble/hashes": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-2.0.1.tgz", - "integrity": "sha512-XlOlEbQcE9fmuXxrVTXCTlG2nlRXa9Rj3rr5Ue/+tX+nmkgbX720YHh0VR3hBF9xDvwnb8D2shVGOwNx+ulArw==", - "license": "MIT", - "engines": { - "node": ">= 20.19.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@unicitylabs/state-transition-sdk": { - "version": "1.6.1-rc.f37cb85", - "resolved": "https://registry.npmjs.org/@unicitylabs/state-transition-sdk/-/state-transition-sdk-1.6.1-rc.f37cb85.tgz", - "integrity": "sha512-6chybquV+sZPdaqluJhAeceCWyO5SO2K2j8QI/RhN6cbX4wHILumfG3GKm20ubQZTL80yTfj85kMxsbKeUIGUQ==", - "license": "ISC", - "dependencies": { - "@noble/curves": "2.0.1", - "@noble/hashes": "2.0.1", - "uuid": "13.0.0" - } - }, - "node_modules/@unicitylabs/state-transition-sdk/node_modules/@noble/curves": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-2.0.1.tgz", - "integrity": "sha512-vs1Az2OOTBiP4q0pwjW5aF0xp9n4MxVrmkFBxc6EKZc6ddYx5gaZiAsZoq0uRRXWbi3AT/sBqn05eRPtn1JCPw==", - "license": "MIT", - "dependencies": { - "@noble/hashes": "2.0.1" - }, - "engines": { - "node": ">= 20.19.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@unicitylabs/state-transition-sdk/node_modules/@noble/hashes": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-2.0.1.tgz", - "integrity": "sha512-XlOlEbQcE9fmuXxrVTXCTlG2nlRXa9Rj3rr5Ue/+tX+nmkgbX720YHh0VR3hBF9xDvwnb8D2shVGOwNx+ulArw==", - "license": "MIT", - "engines": { - "node": ">= 20.19.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } + "os": [ + "linux" + ] }, - "node_modules/@vitejs/plugin-react": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz", - "integrity": "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==", + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.57.1.tgz", + "integrity": "sha512-ABca4ceT4N+Tv/GtotnWAeXZUZuM/9AQyCyKYyKnpk4yoA7QIAuBt6Hkgpw8kActYlew2mvckXkvx0FfoInnLg==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@babel/core": "^7.28.0", - "@babel/plugin-transform-react-jsx-self": "^7.27.1", - "@babel/plugin-transform-react-jsx-source": "^7.27.1", - "@rolldown/pluginutils": "1.0.0-beta.27", - "@types/babel__core": "^7.20.5", - "react-refresh": "^0.17.0" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "peerDependencies": { - "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" - } - }, - "node_modules/abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "event-target-shim": "^5.0.0" - }, - "engines": { - "node": ">=6.5" - } - }, - "node_modules/abort-error": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/abort-error/-/abort-error-1.0.1.tgz", - "integrity": "sha512-fxqCblJiIPdSXIUrxI0PL+eJG49QdP9SQ70qtB65MVAoMr2rASlOyAbJFOylfB467F/f+5BCLJJq58RYi7mGfg==", - "license": "Apache-2.0 OR MIT", - "optional": true - }, - "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "license": "MIT", "optional": true, - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } + "os": [ + "linux" + ] }, - "node_modules/acme-client": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/acme-client/-/acme-client-5.4.0.tgz", - "integrity": "sha512-mORqg60S8iML6XSmVjqjGHJkINrCGLMj2QvDmFzI9vIlv1RGlyjmw3nrzaINJjkNsYXC41XhhD5pfy7CtuGcbA==", + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.57.1.tgz", + "integrity": "sha512-HFps0JeGtuOR2convgRRkHCekD7j+gdAuXM+/i6kGzQtFhlCtQkpwtNzkNj6QhCDp7DRJ7+qC/1Vg2jt5iSOFw==", + "cpu": [ + "x64" + ], + "dev": true, "license": "MIT", "optional": true, - "dependencies": { - "@peculiar/x509": "^1.11.0", - "asn1js": "^3.0.5", - "axios": "^1.7.2", - "debug": "^4.3.5", - "node-forge": "^1.3.1" - }, - "engines": { - "node": ">= 16" - } + "os": [ + "linux" + ] }, - "node_modules/acorn": { - "version": "8.15.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", - "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.57.1.tgz", + "integrity": "sha512-H+hXEv9gdVQuDTgnqD+SQffoWoc0Of59AStSzTEj/feWTBAnSfSD3+Dql1ZruJQxmykT/JVY0dE8Ka7z0DH1hw==", + "cpu": [ + "x64" + ], + "dev": true, "license": "MIT", "optional": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } + "os": [ + "openbsd" + ] }, - "node_modules/agent-base": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", - "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.57.1.tgz", + "integrity": "sha512-4wYoDpNg6o/oPximyc/NG+mYUejZrCU2q+2w6YZqrAs2UcNUChIZXjtafAiiZSUc7On8v5NyNj34Kzj/Ltk6dQ==", + "cpu": [ + "arm64" + ], + "dev": true, "license": "MIT", "optional": true, - "engines": { - "node": ">= 14" - } + "os": [ + "openharmony" + ] }, - "node_modules/anser": { - "version": "1.4.10", - "resolved": "https://registry.npmjs.org/anser/-/anser-1.4.10.tgz", - "integrity": "sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww==", + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.57.1.tgz", + "integrity": "sha512-O54mtsV/6LW3P8qdTcamQmuC990HDfR71lo44oZMZlXU4tzLrbvTii87Ni9opq60ds0YzuAlEr/GNwuNluZyMQ==", + "cpu": [ + "arm64" + ], + "dev": true, "license": "MIT", - "optional": true + "optional": true, + "os": [ + "win32" + ] }, - "node_modules/ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.57.1.tgz", + "integrity": "sha512-P3dLS+IerxCT/7D2q2FYcRdWRl22dNbrbBEtxdWhXrfIMPP9lQhb5h4Du04mdl5Woq05jVCDPCMF7Ub0NAjIew==", + "cpu": [ + "ia32" + ], "dev": true, "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } + "optional": true, + "os": [ + "win32" + ] }, - "node_modules/ansi-styles": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", - "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.57.1.tgz", + "integrity": "sha512-VMBH2eOOaKGtIJYleXsi2B8CPVADrh+TyNxJ4mWPnKfLB/DBUmzW+5m1xUrcwWoMfSLagIRpjUFeW5CO5hyciQ==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/any-signal": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/any-signal/-/any-signal-4.2.0.tgz", - "integrity": "sha512-LndMvYuAPf4rC195lk7oSFuHOYFpOszIYrNYv0gHAvz+aEhE9qPZLhmrIz5pXP2BSsPOXvsuHDXEGaiQhIh9wA==", - "license": "Apache-2.0 OR MIT", "optional": true, - "engines": { - "node": ">=16.0.0", - "npm": ">=7.0.0" - } + "os": [ + "win32" + ] }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "license": "ISC", + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.57.1.tgz", + "integrity": "sha512-mxRFDdHIWRxg3UfIIAwCm6NzvxG0jDX/wBN6KsQFTvKFqqg9vTrWUE68qEjHt19A5wwx5X5aUi2zuZT7YR0jrA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", "optional": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } + "os": [ + "win32" + ] }, - "node_modules/anymatch/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "node_modules/@scure/base": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.2.6.tgz", + "integrity": "sha512-g/nm5FgUa//MCj1gV09zTJTaM6KBAHqLN907YVQqf7zC49+DcO4B1so4ZX07Ef10Twr6nuqYEH9GEggFXA4Fmg==", "license": "MIT", - "optional": true, - "engines": { - "node": ">=8.6" - }, "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "url": "https://paulmillr.com/funding/" } }, - "node_modules/archiver": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/archiver/-/archiver-7.0.1.tgz", - "integrity": "sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ==", + "node_modules/@tailwindcss/vite": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.2.1.tgz", + "integrity": "sha512-TBf2sJjYeb28jD2U/OhwdW0bbOsxkWPwQ7SrqGf9sVcoYwZj7rkXljroBO9wKBut9XnmQLXanuDUeqQK0lGg/w==", "dev": true, "license": "MIT", "dependencies": { - "archiver-utils": "^5.0.2", - "async": "^3.2.4", - "buffer-crc32": "^1.0.0", - "readable-stream": "^4.0.0", - "readdir-glob": "^1.1.2", - "tar-stream": "^3.0.0", - "zip-stream": "^6.0.1" + "@tailwindcss/node": "4.2.1", + "@tailwindcss/oxide": "4.2.1", + "tailwindcss": "4.2.1" }, - "engines": { - "node": ">= 14" + "peerDependencies": { + "vite": "^5.2.0 || ^6 || ^7" } }, - "node_modules/archiver-utils": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-5.0.2.tgz", - "integrity": "sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA==", + "node_modules/@tailwindcss/vite/node_modules/@tailwindcss/node": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.2.1.tgz", + "integrity": "sha512-jlx6sLk4EOwO6hHe1oCGm1Q4AN/s0rSrTTPBGPM0/RQ6Uylwq17FuU8IeJJKEjtc6K6O07zsvP+gDO6MMWo7pg==", "dev": true, "license": "MIT", "dependencies": { - "glob": "^10.0.0", - "graceful-fs": "^4.2.0", - "is-stream": "^2.0.1", - "lazystream": "^1.0.0", - "lodash": "^4.17.15", - "normalize-path": "^3.0.0", - "readable-stream": "^4.0.0" - }, - "engines": { - "node": ">= 14" + "@jridgewell/remapping": "^2.3.5", + "enhanced-resolve": "^5.19.0", + "jiti": "^2.6.1", + "lightningcss": "1.31.1", + "magic-string": "^0.30.21", + "source-map-js": "^1.2.1", + "tailwindcss": "4.2.1" } }, - "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "node_modules/@tailwindcss/vite/node_modules/@tailwindcss/oxide": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.2.1.tgz", + "integrity": "sha512-yv9jeEFWnjKCI6/T3Oq50yQEOqmpmpfzG1hcZsAOaXFQPfzWprWrlHSdGPEF3WQTi8zu8ohC9Mh9J470nT5pUw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 20" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.2.1", + "@tailwindcss/oxide-darwin-arm64": "4.2.1", + "@tailwindcss/oxide-darwin-x64": "4.2.1", + "@tailwindcss/oxide-freebsd-x64": "4.2.1", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.2.1", + "@tailwindcss/oxide-linux-arm64-gnu": "4.2.1", + "@tailwindcss/oxide-linux-arm64-musl": "4.2.1", + "@tailwindcss/oxide-linux-x64-gnu": "4.2.1", + "@tailwindcss/oxide-linux-x64-musl": "4.2.1", + "@tailwindcss/oxide-wasm32-wasi": "4.2.1", + "@tailwindcss/oxide-win32-arm64-msvc": "4.2.1", + "@tailwindcss/oxide-win32-x64-msvc": "4.2.1" + } + }, + "node_modules/@tailwindcss/vite/node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.2.1.tgz", + "integrity": "sha512-eZ7G1Zm5EC8OOKaesIKuw77jw++QJ2lL9N+dDpdQiAB/c/B2wDh0QPFHbkBVrXnwNugvrbJFk1gK2SsVjwWReg==", + "cpu": [ + "arm64" + ], + "dev": true, "license": "MIT", "optional": true, - "dependencies": { - "sprintf-js": "~1.0.2" + "os": [ + "android" + ], + "engines": { + "node": ">= 20" } }, - "node_modules/asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", - "license": "MIT", - "optional": true - }, - "node_modules/asn1.js": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", - "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", + "node_modules/@tailwindcss/vite/node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.2.1.tgz", + "integrity": "sha512-q/LHkOstoJ7pI1J0q6djesLzRvQSIfEto148ppAd+BVQK0JYjQIFSK3JgYZJa+Yzi0DDa52ZsQx2rqytBnf8Hw==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", - "dependencies": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "node_modules/asn1js": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/asn1js/-/asn1js-3.0.7.tgz", - "integrity": "sha512-uLvq6KJu04qoQM6gvBfKFjlh6Gl0vOKQuR5cJMDHQkmwfMOQeN3F3SHCv9SNYSL+CRoHvOGFfllDlVz03GQjvQ==", - "license": "BSD-3-Clause", "optional": true, - "dependencies": { - "pvtsutils": "^1.3.6", - "pvutils": "^1.1.3", - "tslib": "^2.8.1" - }, + "os": [ + "darwin" + ], "engines": { - "node": ">=12.0.0" + "node": ">= 20" } }, - "node_modules/assert": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/assert/-/assert-2.1.0.tgz", - "integrity": "sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==", + "node_modules/@tailwindcss/vite/node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.2.1.tgz", + "integrity": "sha512-/f/ozlaXGY6QLbpvd/kFTro2l18f7dHKpB+ieXz+Cijl4Mt9AI2rTrpq7V+t04nK+j9XBQHnSMdeQRhbGyt6fw==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "is-nan": "^1.3.2", - "object-is": "^1.1.5", - "object.assign": "^4.1.4", - "util": "^0.12.5" + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" } }, - "node_modules/async": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", - "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", + "node_modules/@tailwindcss/vite/node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.2.1.tgz", + "integrity": "sha512-5e/AkgYJT/cpbkys/OU2Ei2jdETCLlifwm7ogMC7/hksI2fC3iiq6OcXwjibcIjPung0kRtR3TxEITkqgn0TcA==", + "cpu": [ + "x64" + ], "dev": true, - "license": "MIT" - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", "license": "MIT", - "optional": true + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 20" + } }, - "node_modules/autoprefixer": { - "version": "10.4.24", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.24.tgz", - "integrity": "sha512-uHZg7N9ULTVbutaIsDRoUkoS8/h3bdsmVJYZ5l3wv8Cp/6UIIoRDm90hZ+BwxUj/hGBEzLxdHNSKuFpn8WOyZw==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/autoprefixer" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } + "node_modules/@tailwindcss/vite/node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.2.1.tgz", + "integrity": "sha512-Uny1EcVTTmerCKt/1ZuKTkb0x8ZaiuYucg2/kImO5A5Y/kBz41/+j0gxUZl+hTF3xkWpDmHX+TaWhOtba2Fyuw==", + "cpu": [ + "arm" ], + "dev": true, "license": "MIT", - "dependencies": { - "browserslist": "^4.28.1", - "caniuse-lite": "^1.0.30001766", - "fraction.js": "^5.3.4", - "picocolors": "^1.1.1", - "postcss-value-parser": "^4.2.0" - }, - "bin": { - "autoprefixer": "bin/autoprefixer" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^10 || ^12 || >=14" - }, - "peerDependencies": { - "postcss": "^8.1.0" + "node": ">= 20" } }, - "node_modules/available-typed-arrays": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", - "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "node_modules/@tailwindcss/vite/node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.2.1.tgz", + "integrity": "sha512-CTrwomI+c7n6aSSQlsPL0roRiNMDQ/YzMD9EjcR+H4f0I1SQ8QqIuPnsVp7QgMkC1Qi8rtkekLkOFjo7OlEFRQ==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", - "dependencies": { - "possible-typed-array-names": "^1.0.0" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 20" } }, - "node_modules/axios": { - "version": "1.13.5", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.5.tgz", - "integrity": "sha512-cz4ur7Vb0xS4/KUN0tPWe44eqxrIu31me+fbang3ijiNscE129POzipJJA6zniq2C/Z6sJCjMimjS8Lc/GAs8Q==", + "node_modules/@tailwindcss/vite/node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.2.1.tgz", + "integrity": "sha512-WZA0CHRL/SP1TRbA5mp9htsppSEkWuQ4KsSUumYQnyl8ZdT39ntwqmz4IUHGN6p4XdSlYfJwM4rRzZLShHsGAQ==", + "cpu": [ + "arm64" + ], + "dev": true, "license": "MIT", "optional": true, - "dependencies": { - "follow-redirects": "^1.15.11", - "form-data": "^4.0.5", - "proxy-from-env": "^1.1.0" + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" } }, - "node_modules/babel-jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", - "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", + "node_modules/@tailwindcss/vite/node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.2.1.tgz", + "integrity": "sha512-qMFzxI2YlBOLW5PhblzuSWlWfwLHaneBE0xHzLrBgNtqN6mWfs+qYbhryGSXQjFYB1Dzf5w+LN5qbUTPhW7Y5g==", + "cpu": [ + "x64" + ], + "dev": true, "license": "MIT", "optional": true, - "dependencies": { - "@jest/transform": "^29.7.0", - "@types/babel__core": "^7.1.14", - "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^29.6.3", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "slash": "^3.0.0" - }, + "os": [ + "linux" + ], "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.8.0" + "node": ">= 20" } }, - "node_modules/babel-plugin-istanbul": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", - "license": "BSD-3-Clause", + "node_modules/@tailwindcss/vite/node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.2.1.tgz", + "integrity": "sha512-5r1X2FKnCMUPlXTWRYpHdPYUY6a1Ar/t7P24OuiEdEOmms5lyqjDRvVY1yy9Rmioh+AunQ0rWiOTPE8F9A3v5g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", "optional": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^5.0.4", - "test-exclude": "^6.0.0" - }, + "os": [ + "linux" + ], "engines": { - "node": ">=8" + "node": ">= 20" } }, - "node_modules/babel-plugin-jest-hoist": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", - "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", + "node_modules/@tailwindcss/vite/node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.2.1.tgz", + "integrity": "sha512-MGFB5cVPvshR85MTJkEvqDUnuNoysrsRxd6vnk1Lf2tbiqNlXpHYZqkqOQalydienEWOHHFyyuTSYRsLfxFJ2Q==", + "bundleDependencies": [ + "@napi-rs/wasm-runtime", + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util", + "@emnapi/wasi-threads", + "tslib" + ], + "cpu": [ + "wasm32" + ], + "dev": true, "license": "MIT", "optional": true, "dependencies": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.1.14", - "@types/babel__traverse": "^7.0.6" + "@emnapi/core": "^1.8.1", + "@emnapi/runtime": "^1.8.1", + "@emnapi/wasi-threads": "^1.1.0", + "@napi-rs/wasm-runtime": "^1.1.1", + "@tybys/wasm-util": "^0.10.1", + "tslib": "^2.8.1" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=14.0.0" } }, - "node_modules/babel-plugin-syntax-hermes-parser": { - "version": "0.32.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-hermes-parser/-/babel-plugin-syntax-hermes-parser-0.32.0.tgz", - "integrity": "sha512-m5HthL++AbyeEA2FcdwOLfVFvWYECOBObLHNqdR8ceY4TsEdn4LdX2oTvbB2QJSSElE2AWA/b2MXZ/PF/CqLZg==", + "node_modules/@tailwindcss/vite/node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.2.1.tgz", + "integrity": "sha512-YlUEHRHBGnCMh4Nj4GnqQyBtsshUPdiNroZj8VPkvTZSoHsilRCwXcVKnG9kyi0ZFAS/3u+qKHBdDc81SADTRA==", + "cpu": [ + "arm64" + ], + "dev": true, "license": "MIT", "optional": true, - "dependencies": { - "hermes-parser": "0.32.0" + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" } }, - "node_modules/babel-preset-current-node-syntax": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.2.0.tgz", - "integrity": "sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==", + "node_modules/@tailwindcss/vite/node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.2.1.tgz", + "integrity": "sha512-rbO34G5sMWWyrN/idLeVxAZgAKWrn5LiR3/I90Q9MkA67s6T1oB0xtTe+0heoBvHSpbU9Mk7i6uwJnpo4u21XQ==", + "cpu": [ + "x64" + ], + "dev": true, "license": "MIT", "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/vite/node_modules/lightningcss": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.31.1.tgz", + "integrity": "sha512-l51N2r93WmGUye3WuFoN5k10zyvrVs0qfKBhyC5ogUQ6Ew6JUSswh78mbSO+IU3nTWsyOArqPCcShdQSadghBQ==", + "dev": true, + "license": "MPL-2.0", "dependencies": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-import-attributes": "^7.24.7", - "@babel/plugin-syntax-import-meta": "^7.10.4", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5" + "detect-libc": "^2.0.3" }, - "peerDependencies": { - "@babel/core": "^7.0.0 || ^8.0.0-0" + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.31.1", + "lightningcss-darwin-arm64": "1.31.1", + "lightningcss-darwin-x64": "1.31.1", + "lightningcss-freebsd-x64": "1.31.1", + "lightningcss-linux-arm-gnueabihf": "1.31.1", + "lightningcss-linux-arm64-gnu": "1.31.1", + "lightningcss-linux-arm64-musl": "1.31.1", + "lightningcss-linux-x64-gnu": "1.31.1", + "lightningcss-linux-x64-musl": "1.31.1", + "lightningcss-win32-arm64-msvc": "1.31.1", + "lightningcss-win32-x64-msvc": "1.31.1" + } + }, + "node_modules/@tailwindcss/vite/node_modules/lightningcss-android-arm64": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.31.1.tgz", + "integrity": "sha512-HXJF3x8w9nQ4jbXRiNppBCqeZPIAfUo8zE/kOEGbW5NZvGc/K7nMxbhIr+YlFlHW5mpbg/YFPdbnCh1wAXCKFg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/babel-preset-jest": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", - "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", - "license": "MIT", + "node_modules/@tailwindcss/vite/node_modules/lightningcss-darwin-arm64": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.31.1.tgz", + "integrity": "sha512-02uTEqf3vIfNMq3h/z2cJfcOXnQ0GRwQrkmPafhueLb2h7mqEidiCzkE4gBMEH65abHRiQvhdcQ+aP0D0g67sg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", "optional": true, - "dependencies": { - "babel-plugin-jest-hoist": "^29.6.3", - "babel-preset-current-node-syntax": "^1.0.0" - }, + "os": [ + "darwin" + ], "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">= 12.0.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "devOptional": true, - "license": "MIT" + "node_modules/@tailwindcss/vite/node_modules/lightningcss-darwin-x64": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.31.1.tgz", + "integrity": "sha512-1ObhyoCY+tGxtsz1lSx5NXCj3nirk0Y0kB/g8B8DT+sSx4G9djitg9ejFnjb3gJNWo7qXH4DIy2SUHvpoFwfTA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } }, - "node_modules/bare-events": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.8.2.tgz", - "integrity": "sha512-riJjyv1/mHLIPX4RwiK+oW9/4c3TEUeORHKefKAKnZ5kyslbN+HXowtbaVEqt4IMUB7OXlfixcs6gsFeo/jhiQ==", + "node_modules/@tailwindcss/vite/node_modules/lightningcss-freebsd-x64": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.31.1.tgz", + "integrity": "sha512-1RINmQKAItO6ISxYgPwszQE1BrsVU5aB45ho6O42mu96UiZBxEXsuQ7cJW4zs4CEodPUioj/QrXW1r9pLUM74A==", + "cpu": [ + "x64" + ], "dev": true, - "license": "Apache-2.0", - "peerDependencies": { - "bare-abort-controller": "*" + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" }, - "peerDependenciesMeta": { - "bare-abort-controller": { - "optional": true - } + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } + "node_modules/@tailwindcss/vite/node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.31.1.tgz", + "integrity": "sha512-OOCm2//MZJ87CdDK62rZIu+aw9gBv4azMJuA8/KB74wmfS3lnC4yoPHm0uXZ/dvNNHmnZnB8XLAZzObeG0nS1g==", + "cpu": [ + "arm" ], - "license": "MIT" + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } }, - "node_modules/baseline-browser-mapping": { - "version": "2.9.19", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.19.tgz", - "integrity": "sha512-ipDqC8FrAl/76p2SSWKSI+H9tFwm7vYqXQrItCuiVPt26Km0jS+NzSsBWAaBusvSbQcfJG+JitdMm+wZAgTYqg==", - "devOptional": true, - "license": "Apache-2.0", - "bin": { - "baseline-browser-mapping": "dist/cli.js" + "node_modules/@tailwindcss/vite/node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.31.1.tgz", + "integrity": "sha512-WKyLWztD71rTnou4xAD5kQT+982wvca7E6QoLpoawZ1gP9JM0GJj4Tp5jMUh9B3AitHbRZ2/H3W5xQmdEOUlLg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/bip39": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bip39/-/bip39-3.1.0.tgz", - "integrity": "sha512-c9kiwdk45Do5GL0vJMe7tS95VjCii65mYAH7DfWl3uW8AVzXKQVUm64i3hzVybBDMp9r7j9iNxR85+ul8MdN/A==", - "license": "ISC", - "dependencies": { - "@noble/hashes": "^1.2.0" + "node_modules/@tailwindcss/vite/node_modules/lightningcss-linux-arm64-musl": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.31.1.tgz", + "integrity": "sha512-mVZ7Pg2zIbe3XlNbZJdjs86YViQFoJSpc41CbVmKBPiGmC4YrfeOyz65ms2qpAobVd7WQsbW4PdsSJEMymyIMg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "license": "MIT", + "node_modules/@tailwindcss/vite/node_modules/lightningcss-linux-x64-gnu": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.31.1.tgz", + "integrity": "sha512-xGlFWRMl+0KvUhgySdIaReQdB4FNudfUTARn7q0hh/V67PVGCs3ADFjw+6++kG1RNd0zdGRlEKa+T13/tQjPMA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", "optional": true, - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/bl/node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } + "node_modules/@tailwindcss/vite/node_modules/lightningcss-linux-x64-musl": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.31.1.tgz", + "integrity": "sha512-eowF8PrKHw9LpoZii5tdZwnBcYDxRw2rRCyvAXLi34iyeYfqCQNA9rmUM0ce62NlPhCvof1+9ivRaTY6pSKDaA==", + "cpu": [ + "x64" ], - "license": "MIT", + "dev": true, + "license": "MPL-2.0", "optional": true, - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/bl/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "license": "MIT", + "node_modules/@tailwindcss/vite/node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.31.1.tgz", + "integrity": "sha512-aJReEbSEQzx1uBlQizAOBSjcmr9dCdL3XuC/6HLXAxmtErsj2ICo5yYggg1qOODQMtnjNQv2UHb9NpOuFtYe4w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", "optional": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, + "os": [ + "win32" + ], "engines": { - "node": ">= 6" + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/blockstore-core": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/blockstore-core/-/blockstore-core-6.1.2.tgz", - "integrity": "sha512-yWU38RM8DJ6C7Y2shIeTNVgGiJX/ko2RXqDyNlxMakOc+aVS7k1SCiakMlh6ix0juRNPtj0ySMTXU8UBDXXRCQ==", - "license": "Apache-2.0 OR MIT", + "node_modules/@tailwindcss/vite/node_modules/lightningcss-win32-x64-msvc": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.31.1.tgz", + "integrity": "sha512-I9aiFrbd7oYHwlnQDqr1Roz+fTz61oDDJX7n9tYF9FJymH1cIN1DtKw3iYt6b8WZgEjoNwVSncwF4wx/ZedMhw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", "optional": true, - "dependencies": { - "@libp2p/logger": "^6.0.0", - "interface-blockstore": "^6.0.0", - "interface-store": "^7.0.0", - "it-all": "^3.0.9", - "it-filter": "^3.1.3", - "it-merge": "^3.0.11", - "multiformats": "^13.3.6" + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/bn.js": { - "version": "4.12.2", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.2.tgz", - "integrity": "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==", + "node_modules/@tailwindcss/vite/node_modules/tailwindcss": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.2.1.tgz", + "integrity": "sha512-/tBrSQ36vCleJkAOsy9kbNTgaxvGbyOamC30PRePTQe/o1MFwEKHQk4Cn7BNGaPtjp+PuUrByJehM1hgxfq4sw==", + "dev": true, "license": "MIT" }, - "node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", - "dev": true, + "node_modules/@tanstack/query-core": { + "version": "5.90.20", + "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.90.20.tgz", + "integrity": "sha512-OMD2HLpNouXEfZJWcKeVKUgQ5n+n3A2JFmBaScpNDUqSrQSjiveC7dKMe53uJUg1nDG16ttFPz2xfilz6i2uVg==", "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" } }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "node_modules/@tanstack/react-query": { + "version": "5.90.21", + "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.90.21.tgz", + "integrity": "sha512-0Lu6y5t+tvlTJMTO7oh5NSpJfpg/5D41LlThfepTixPYkJ0sE2Jj0m0f6yYqujBwIXlId87e234+MxG3D3g7kg==", "license": "MIT", - "optional": true, "dependencies": { - "fill-range": "^7.1.1" + "@tanstack/query-core": "5.90.20" }, - "engines": { - "node": ">=8" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "react": "^18 || ^19" } }, - "node_modules/brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==", - "license": "MIT" - }, - "node_modules/browser-readablestream-to-it": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/browser-readablestream-to-it/-/browser-readablestream-to-it-2.0.10.tgz", - "integrity": "sha512-I/9hEcRtjct8CzD9sVo9Mm4ntn0D+7tOVrjbPl69XAoOfgJ8NBdOQU+WX+5SHhcELJDb14mWt7zuvyqha+MEAQ==", - "license": "Apache-2.0 OR MIT", - "optional": true - }, - "node_modules/browser-resolve": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-2.0.0.tgz", - "integrity": "sha512-7sWsQlYL2rGLy2IWm8WL8DCTJvYLc/qlOnsakDac87SOoCd16WLsaAMdCiAqsTNHIe+SXfaqyxyo6THoWqs8WQ==", + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", "dev": true, "license": "MIT", "dependencies": { - "resolve": "^1.17.0" + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" } }, - "node_modules/browserify-aes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "node_modules/@types/babel__generator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", "dev": true, "license": "MIT", "dependencies": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" + "@babel/types": "^7.0.0" } }, - "node_modules/browserify-cipher": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", - "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", "dev": true, "license": "MIT", "dependencies": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" } }, - "node_modules/browserify-des": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", - "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "node_modules/@types/babel__traverse": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", "dev": true, "license": "MIT", "dependencies": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" + "@babel/types": "^7.28.2" } }, - "node_modules/browserify-rsa": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.1.tgz", - "integrity": "sha512-YBjSAiTqM04ZVei6sXighu679a3SqWORA3qZTEqZImnlkDIFtKc6pNutpjyZ8RJTjQtuYfeetkxM11GwoYXMIQ==", + "node_modules/@types/chrome": { + "version": "0.0.287", + "resolved": "https://registry.npmjs.org/@types/chrome/-/chrome-0.0.287.tgz", + "integrity": "sha512-wWhBNPNXZHwycHKNYnexUcpSbrihVZu++0rdp6GEk5ZgAglenLx+RwdEouh6FrHS0XQiOxSd62yaujM1OoQlZQ==", "dev": true, "license": "MIT", "dependencies": { - "bn.js": "^5.2.1", - "randombytes": "^2.1.0", - "safe-buffer": "^5.2.1" - }, - "engines": { - "node": ">= 0.10" + "@types/filesystem": "*", + "@types/har-format": "*" } }, - "node_modules/browserify-rsa/node_modules/bn.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.2.tgz", - "integrity": "sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==", + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", "dev": true, "license": "MIT" }, - "node_modules/browserify-sign": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.5.tgz", - "integrity": "sha512-C2AUdAJg6rlM2W5QMp2Q4KGQMVBwR1lIimTsUnutJ8bMpW5B52pGpR2gEnNBNwijumDo5FojQ0L9JrXA8m4YEw==", + "node_modules/@types/filesystem": { + "version": "0.0.36", + "resolved": "https://registry.npmjs.org/@types/filesystem/-/filesystem-0.0.36.tgz", + "integrity": "sha512-vPDXOZuannb9FZdxgHnqSwAG/jvdGM8Wq+6N4D/d80z+D4HWH+bItqsZaVRQykAn6WEVeEkLm2oQigyHtgb0RA==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "bn.js": "^5.2.2", - "browserify-rsa": "^4.1.1", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "elliptic": "^6.6.1", - "inherits": "^2.0.4", - "parse-asn1": "^5.1.9", - "readable-stream": "^2.3.8", - "safe-buffer": "^5.2.1" - }, - "engines": { - "node": ">= 0.10" + "@types/filewriter": "*" } }, - "node_modules/browserify-sign/node_modules/bn.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.2.tgz", - "integrity": "sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==", - "dev": true, - "license": "MIT" - }, - "node_modules/browserify-sign/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "node_modules/@types/filewriter": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/@types/filewriter/-/filewriter-0.0.33.tgz", + "integrity": "sha512-xFU8ZXTw4gd358lb2jw25nxY9QAgqn2+bKKjKOYfNCzN4DKCFetK7sPtrlpg66Ywe3vWY9FNxprZawAh9wfJ3g==", "dev": true, "license": "MIT" }, - "node_modules/browserify-sign/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } + "node_modules/@types/har-format": { + "version": "1.2.16", + "resolved": "https://registry.npmjs.org/@types/har-format/-/har-format-1.2.16.tgz", + "integrity": "sha512-fluxdy7ryD3MV6h8pTfTYpy/xQzCFC7m89nOH9y94cNqJ1mDIDPut7MnRHI3F6qRmh/cT2fUjG1MLdCNb4hE9A==", + "dev": true, + "license": "MIT" }, - "node_modules/browserify-sign/node_modules/readable-stream/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "dev": true, "license": "MIT" }, - "node_modules/browserify-sign/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "node_modules/@types/node": { + "version": "25.3.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.3.2.tgz", + "integrity": "sha512-RpV6r/ij22zRRdyBPcxDeKAzH43phWVKEjL2iksqo1Vz3CuBUrgmPpPhALKiRfU7OMCmeeO9vECBMsV0hMTG8Q==", "dev": true, "license": "MIT", "dependencies": { - "safe-buffer": "~5.1.0" + "undici-types": "~7.18.0" } }, - "node_modules/browserify-sign/node_modules/string_decoder/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "node_modules/@types/prop-types": { + "version": "15.7.15", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz", + "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==", "dev": true, "license": "MIT" }, - "node_modules/browserify-zlib": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", - "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "node_modules/@types/react": { + "version": "18.3.28", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.28.tgz", + "integrity": "sha512-z9VXpC7MWrhfWipitjNdgCauoMLRdIILQsAEV+ZesIzBq/oUlxk0m3ApZuMFCXdnS4U7KrI+l3WRUEGQ8K1QKw==", "dev": true, "license": "MIT", "dependencies": { - "pako": "~1.0.5" + "@types/prop-types": "*", + "csstype": "^3.2.2" } }, - "node_modules/browserslist": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", - "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", - "devOptional": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], + "node_modules/@types/react-dom": { + "version": "18.3.7", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.7.tgz", + "integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==", + "dev": true, "license": "MIT", - "peer": true, - "dependencies": { - "baseline-browser-mapping": "^2.9.0", - "caniuse-lite": "^1.0.30001759", - "electron-to-chromium": "^1.5.263", - "node-releases": "^2.0.27", - "update-browserslist-db": "^1.2.0" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "node-int64": "^0.4.0" + "peerDependencies": { + "@types/react": "^18.0.0" } }, - "node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.56.1.tgz", + "integrity": "sha512-Jz9ZztpB37dNC+HU2HI28Bs9QXpzCz+y/twHOwhyrIRdbuVDxSytJNDl6z/aAKlaRIwC7y8wJdkBv7FxYGgi0A==", + "dev": true, "license": "MIT", "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.56.1", + "@typescript-eslint/type-utils": "8.56.1", + "@typescript-eslint/utils": "8.56.1", + "@typescript-eslint/visitor-keys": "8.56.1", + "ignore": "^7.0.5", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.56.1", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" } }, - "node_modules/buffer-crc32": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-1.0.0.tgz", - "integrity": "sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==", + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", "dev": true, "license": "MIT", "engines": { - "node": ">=8.0.0" + "node": ">= 4" } }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "license": "MIT", - "optional": true - }, - "node_modules/buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/builtin-status-codes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/call-bind": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", - "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "node_modules/@typescript-eslint/parser": { + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.56.1.tgz", + "integrity": "sha512-klQbnPAAiGYFyI02+znpBRLyjL4/BrBd0nyWkdC0s/6xFLkXYQ8OoRrSkqacS1ddVxf/LDyODIKbQ5TgKAf/Fg==", "dev": true, "license": "MIT", "dependencies": { - "call-bind-apply-helpers": "^1.0.0", - "es-define-property": "^1.0.0", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.2" + "@typescript-eslint/scope-manager": "8.56.1", + "@typescript-eslint/types": "8.56.1", + "@typescript-eslint/typescript-estree": "8.56.1", + "@typescript-eslint/visitor-keys": "8.56.1", + "debug": "^4.4.3" }, "engines": { - "node": ">= 0.4" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" } }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "devOptional": true, + "node_modules/@typescript-eslint/project-service": { + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.56.1.tgz", + "integrity": "sha512-TAdqQTzHNNvlVFfR+hu2PDJrURiwKsUvxFn1M0h95BB8ah5jejas08jUWG4dBA68jDMI988IvtfdAI53JzEHOQ==", + "dev": true, "license": "MIT", "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" + "@typescript-eslint/tsconfig-utils": "^8.56.1", + "@typescript-eslint/types": "^8.56.1", + "debug": "^4.4.3" }, "engines": { - "node": ">= 0.4" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" } }, - "node_modules/call-bound": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", - "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.56.1.tgz", + "integrity": "sha512-YAi4VDKcIZp0O4tz/haYKhmIDZFEUPOreKbfdAN3SzUDMcPhJ8QI99xQXqX+HoUVq8cs85eRKnD+rne2UAnj2w==", "dev": true, "license": "MIT", "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "get-intrinsic": "^1.3.0" + "@typescript-eslint/types": "8.56.1", + "@typescript-eslint/visitor-keys": "8.56.1" }, "engines": { - "node": ">= 0.4" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.56.1.tgz", + "integrity": "sha512-qOtCYzKEeyr3aR9f28mPJqBty7+DBqsdd63eO0yyDwc6vgThj2UjWfJIcsFeSucYydqcuudMOprZ+x1SpF3ZuQ==", + "dev": true, "license": "MIT", - "optional": true, "engines": { - "node": ">=6" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001769", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001769.tgz", - "integrity": "sha512-BCfFL1sHijQlBGWBMuJyhZUhzo7wer5sVj9hqekB/7xn0Ypy+pER/edCYQm4exbXj4WiySGp40P8UuTh6w1srg==", - "devOptional": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "CC-BY-4.0" - }, - "node_modules/cborg": { - "version": "4.5.8", - "resolved": "https://registry.npmjs.org/cborg/-/cborg-4.5.8.tgz", - "integrity": "sha512-6/viltD51JklRhq4L7jC3zgy6gryuG5xfZ3kzpE+PravtyeQLeQmCYLREhQH7pWENg5pY4Yu/XCd6a7dKScVlw==", - "license": "Apache-2.0", - "optional": true, - "bin": { - "cborg": "lib/bin.js" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" } }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/@typescript-eslint/type-utils": { + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.56.1.tgz", + "integrity": "sha512-yB/7dxi7MgTtGhZdaHCemf7PuwrHMenHjmzgUW1aJpO+bBU43OycnM3Wn+DdvDO/8zzA9HlhaJ0AUGuvri4oGg==", + "dev": true, "license": "MIT", - "optional": true, "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "@typescript-eslint/types": "8.56.1", + "@typescript-eslint/typescript-estree": "8.56.1", + "@typescript-eslint/utils": "8.56.1", + "debug": "^4.4.3", + "ts-api-utils": "^2.4.0" }, "engines": { - "node": ">=10" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" } }, - "node_modules/chalk/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/@typescript-eslint/types": { + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.56.1.tgz", + "integrity": "sha512-dbMkdIUkIkchgGDIv7KLUpa0Mda4IYjo4IAMJUZ+3xNoUXxMsk9YtKpTHSChRS85o+H9ftm51gsK1dZReY9CVw==", + "dev": true, "license": "MIT", - "optional": true, - "dependencies": { - "color-convert": "^2.0.1" - }, "engines": { - "node": ">=8" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/chalk/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.56.1.tgz", + "integrity": "sha512-qzUL1qgalIvKWAf9C1HpvBjif+Vm6rcT5wZd4VoMb9+Km3iS3Cv9DY6dMRMDtPnwRAFyAi7YXJpTIEXLvdfPxg==", + "dev": true, "license": "MIT", - "optional": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "license": "ISC", - "optional": true - }, - "node_modules/chrome-launcher": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/chrome-launcher/-/chrome-launcher-0.15.2.tgz", - "integrity": "sha512-zdLEwNo3aUVzIhKhTtXfxhdvZhUghrnmkvcAq2NoDd+LeOHKf03H5jwZ8T/STsAlzyALkBVK552iaG1fGf1xVQ==", - "license": "Apache-2.0", - "optional": true, "dependencies": { - "@types/node": "*", - "escape-string-regexp": "^4.0.0", - "is-wsl": "^2.2.0", - "lighthouse-logger": "^1.0.0" - }, - "bin": { - "print-chrome-path": "bin/print-chrome-path.js" + "@typescript-eslint/project-service": "8.56.1", + "@typescript-eslint/tsconfig-utils": "8.56.1", + "@typescript-eslint/types": "8.56.1", + "@typescript-eslint/visitor-keys": "8.56.1", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.4.0" }, "engines": { - "node": ">=12.13.0" - } - }, - "node_modules/chromium-edge-launcher": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/chromium-edge-launcher/-/chromium-edge-launcher-0.2.0.tgz", - "integrity": "sha512-JfJjUnq25y9yg4FABRRVPmBGWPZZi+AQXT4mxupb67766/0UlhG8PAZCz6xzEMXTbW3CsSoE8PcCWA49n35mKg==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@types/node": "*", - "escape-string-regexp": "^4.0.0", - "is-wsl": "^2.2.0", - "lighthouse-logger": "^1.0.0", - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" } }, - "node_modules/ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], + "node_modules/@typescript-eslint/typescript-estree/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, "license": "MIT", - "optional": true, "engines": { - "node": ">=8" + "node": "18 || 20 || >=22" } }, - "node_modules/cipher-base": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.7.tgz", - "integrity": "sha512-Mz9QMT5fJe7bKI7MH31UilT5cEK5EHHRCccw/YRFsRY47AuNgaV6HY3rscp0/I4Q+tTW/5zoqpSeRRI54TkDWA==", + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.4.tgz", + "integrity": "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==", "dev": true, "license": "MIT", "dependencies": { - "inherits": "^2.0.4", - "safe-buffer": "^5.2.1", - "to-buffer": "^1.2.2" + "balanced-match": "^4.0.2" }, "engines": { - "node": ">= 0.10" + "node": "18 || 20 || >=22" } }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "license": "ISC", - "optional": true, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "10.2.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz", + "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==", + "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" + "brace-expansion": "^5.0.2" }, "engines": { - "node": ">=12" + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/cliui/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", - "optional": true, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, "engines": { - "node": ">=8" + "node": ">=10" } }, - "node_modules/cliui/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/@typescript-eslint/utils": { + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.56.1.tgz", + "integrity": "sha512-HPAVNIME3tABJ61siYlHzSWCGtOoeP2RTIaHXFMPqjrQKCGB9OgUVdiNgH7TJS2JNIQ5qQ4RsAUDuGaGme/KOA==", + "dev": true, "license": "MIT", - "optional": true, "dependencies": { - "color-convert": "^2.0.1" + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.56.1", + "@typescript-eslint/types": "8.56.1", + "@typescript-eslint/typescript-estree": "8.56.1" }, "engines": { - "node": ">=8" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" } }, - "node_modules/cliui/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT", - "optional": true - }, - "node_modules/cliui/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.56.1.tgz", + "integrity": "sha512-KiROIzYdEV85YygXw6BI/Dx4fnBlFQu6Mq4QE4MOH9fFnhohw6wX/OAvDY2/C+ut0I3RSPKenvZJIVYqJNkhEw==", + "dev": true, "license": "MIT", - "optional": true, "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "@typescript-eslint/types": "8.56.1", + "eslint-visitor-keys": "^5.0.0" }, "engines": { - "node": ">=8" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/cliui/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@unicitylabs/nostr-js-sdk": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@unicitylabs/nostr-js-sdk/-/nostr-js-sdk-0.3.3.tgz", + "integrity": "sha512-1COxkSZI5ENSAO1LZaDZPmplmLjIZXPiyDhkGU2rM7GV9FAP1Qk+xsZNmW7vxgaUB7sftBWMXc2uhHn6LDTOWA==", "license": "MIT", - "optional": true, "dependencies": { - "ansi-regex": "^5.0.1" + "@noble/ciphers": "^1.0.0", + "@noble/curves": "^1.6.0", + "@noble/hashes": "^1.5.0", + "@scure/base": "^1.1.9", + "libphonenumber-js": "^1.11.14" }, "engines": { - "node": ">=8" + "node": ">=18.0.0" } }, - "node_modules/cliui/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "node_modules/@unicitylabs/sphere-sdk": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/@unicitylabs/sphere-sdk/-/sphere-sdk-0.5.4.tgz", + "integrity": "sha512-MdkVAEdU9lWD8WGLerwaMxZZJBv1/BQpwd8cnhowRUY4IRCC6EZVIYJP8soshyWPLUQ1f0E0KFfez9arQc88Sg==", "license": "MIT", - "optional": true, "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "@noble/curves": "^2.0.1", + "@noble/hashes": "^2.0.1", + "@unicitylabs/nostr-js-sdk": "^0.3.3", + "@unicitylabs/state-transition-sdk": "1.6.1-rc.f37cb85", + "bip39": "^3.1.0", + "buffer": "^6.0.3", + "crypto-js": "^4.2.0", + "elliptic": "^6.6.1" }, "engines": { - "node": ">=10" + "node": ">=18.0.0" }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "optionalDependencies": { + "@libp2p/crypto": "^5.1.13", + "@libp2p/peer-id": "^6.0.4", + "ipns": "^10.0.0", + "multiformats": "^13.4.2" + }, + "peerDependencies": { + "@libp2p/crypto": ">=5.0.0", + "@libp2p/peer-id": ">=6.0.0", + "ipns": ">=10.0.0", + "multiformats": ">=13.0.0", + "ws": ">=8.0.0" + }, + "peerDependenciesMeta": { + "@libp2p/crypto": { + "optional": true + }, + "@libp2p/peer-id": { + "optional": true + }, + "ipns": { + "optional": true + }, + "multiformats": { + "optional": true + }, + "ws": { + "optional": true + } } }, - "node_modules/clone-regexp": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/clone-regexp/-/clone-regexp-3.0.0.tgz", - "integrity": "sha512-ujdnoq2Kxb8s3ItNBtnYeXdm07FcU0u8ARAT1lQ2YdMwQC+cdiXX8KoqMVuglztILivceTtp4ivqGSmEmhBUJw==", + "node_modules/@unicitylabs/sphere-sdk/node_modules/@noble/curves": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-2.0.1.tgz", + "integrity": "sha512-vs1Az2OOTBiP4q0pwjW5aF0xp9n4MxVrmkFBxc6EKZc6ddYx5gaZiAsZoq0uRRXWbi3AT/sBqn05eRPtn1JCPw==", "license": "MIT", - "optional": true, "dependencies": { - "is-regexp": "^3.0.0" + "@noble/hashes": "2.0.1" }, "engines": { - "node": ">=12" + "node": ">= 20.19.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://paulmillr.com/funding/" } }, - "node_modules/color-convert": { + "node_modules/@unicitylabs/sphere-sdk/node_modules/@noble/hashes": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "devOptional": true, + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-2.0.1.tgz", + "integrity": "sha512-XlOlEbQcE9fmuXxrVTXCTlG2nlRXa9Rj3rr5Ue/+tX+nmkgbX720YHh0VR3hBF9xDvwnb8D2shVGOwNx+ulArw==", "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, "engines": { - "node": ">=7.0.0" + "node": ">= 20.19.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" } }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "devOptional": true, - "license": "MIT" + "node_modules/@unicitylabs/state-transition-sdk": { + "version": "1.6.1-rc.f37cb85", + "resolved": "https://registry.npmjs.org/@unicitylabs/state-transition-sdk/-/state-transition-sdk-1.6.1-rc.f37cb85.tgz", + "integrity": "sha512-6chybquV+sZPdaqluJhAeceCWyO5SO2K2j8QI/RhN6cbX4wHILumfG3GKm20ubQZTL80yTfj85kMxsbKeUIGUQ==", + "license": "ISC", + "dependencies": { + "@noble/curves": "2.0.1", + "@noble/hashes": "2.0.1", + "uuid": "13.0.0" + } }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "node_modules/@unicitylabs/state-transition-sdk/node_modules/@noble/curves": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-2.0.1.tgz", + "integrity": "sha512-vs1Az2OOTBiP4q0pwjW5aF0xp9n4MxVrmkFBxc6EKZc6ddYx5gaZiAsZoq0uRRXWbi3AT/sBqn05eRPtn1JCPw==", "license": "MIT", - "optional": true, "dependencies": { - "delayed-stream": "~1.0.0" + "@noble/hashes": "2.0.1" }, "engines": { - "node": ">= 0.8" + "node": ">= 20.19.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" } }, - "node_modules/commander": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", - "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", + "node_modules/@unicitylabs/state-transition-sdk/node_modules/@noble/hashes": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-2.0.1.tgz", + "integrity": "sha512-XlOlEbQcE9fmuXxrVTXCTlG2nlRXa9Rj3rr5Ue/+tX+nmkgbX720YHh0VR3hBF9xDvwnb8D2shVGOwNx+ulArw==", "license": "MIT", - "optional": true, "engines": { - "node": ">=18" + "node": ">= 20.19.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" } }, - "node_modules/compress-commons": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-6.0.2.tgz", - "integrity": "sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg==", + "node_modules/@vitejs/plugin-react": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz", + "integrity": "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==", "dev": true, "license": "MIT", "dependencies": { - "crc-32": "^1.2.0", - "crc32-stream": "^6.0.0", - "is-stream": "^2.0.1", - "normalize-path": "^3.0.0", - "readable-stream": "^4.0.0" + "@babel/core": "^7.28.0", + "@babel/plugin-transform-react-jsx-self": "^7.27.1", + "@babel/plugin-transform-react-jsx-source": "^7.27.1", + "@rolldown/pluginutils": "1.0.0-beta.27", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.17.0" }, "engines": { - "node": ">= 14" + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" } }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "dev": true, "license": "MIT", - "optional": true + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } }, - "node_modules/connect": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", - "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", + "node_modules/acorn": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", + "dev": true, "license": "MIT", - "optional": true, - "dependencies": { - "debug": "2.6.9", - "finalhandler": "1.1.2", - "parseurl": "~1.3.3", - "utils-merge": "1.0.1" + "bin": { + "acorn": "bin/acorn" }, "engines": { - "node": ">= 0.10.0" + "node": ">=0.4.0" } }, - "node_modules/connect/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, "license": "MIT", - "optional": true, - "dependencies": { - "ms": "2.0.0" + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/connect/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "node_modules/ajv": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", + "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", + "dev": true, "license": "MIT", - "optional": true - }, - "node_modules/console-browserify": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", - "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", - "dev": true + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } }, - "node_modules/constants-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==", + "node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "dev": true, - "license": "MIT" - }, - "node_modules/convert-hrtime": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/convert-hrtime/-/convert-hrtime-5.0.0.tgz", - "integrity": "sha512-lOETlkIeYSJWcbbcvjRKGxVMXJR+8+OQb/mTPbA4ObPMytYIsUbuOE0Jzy60hjARYszq1id0j8KgVhC+WGZVTg==", "license": "MIT", - "optional": true, "engines": { "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "devOptional": true, - "license": "MIT" - }, - "node_modules/cookie": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz", - "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==", + "node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, "license": "MIT", - "optional": true, "engines": { - "node": ">=18" + "node": ">=12" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/crc-32": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", - "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", + "node_modules/archiver": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-7.0.1.tgz", + "integrity": "sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ==", "dev": true, - "license": "Apache-2.0", - "bin": { - "crc32": "bin/crc32.njs" + "license": "MIT", + "dependencies": { + "archiver-utils": "^5.0.2", + "async": "^3.2.4", + "buffer-crc32": "^1.0.0", + "readable-stream": "^4.0.0", + "readdir-glob": "^1.1.2", + "tar-stream": "^3.0.0", + "zip-stream": "^6.0.1" }, "engines": { - "node": ">=0.8" + "node": ">= 14" } }, - "node_modules/crc32-stream": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-6.0.0.tgz", - "integrity": "sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g==", + "node_modules/archiver-utils": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-5.0.2.tgz", + "integrity": "sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA==", "dev": true, "license": "MIT", "dependencies": { - "crc-32": "^1.2.0", + "glob": "^10.0.0", + "graceful-fs": "^4.2.0", + "is-stream": "^2.0.1", + "lazystream": "^1.0.0", + "lodash": "^4.17.15", + "normalize-path": "^3.0.0", "readable-stream": "^4.0.0" }, "engines": { "node": ">= 14" } }, - "node_modules/create-ecdh": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", - "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true, - "license": "MIT", - "dependencies": { - "bn.js": "^4.1.0", - "elliptic": "^6.5.3" - } + "license": "Python-2.0" }, - "node_modules/create-hash": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "node_modules/asn1.js": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", + "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", "dev": true, "license": "MIT", "dependencies": { - "cipher-base": "^1.0.1", + "bn.js": "^4.0.0", "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" + "minimalistic-assert": "^1.0.0" } }, - "node_modules/create-hmac": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "node_modules/assert": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-2.1.0.tgz", + "integrity": "sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==", "dev": true, "license": "MIT", "dependencies": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" + "call-bind": "^1.0.2", + "is-nan": "^1.3.2", + "object-is": "^1.1.5", + "object.assign": "^4.1.4", + "util": "^0.12.5" } }, - "node_modules/create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "node_modules/async": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", "dev": true, "license": "MIT" }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/crypto-browserify": { - "version": "3.12.1", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.1.tgz", - "integrity": "sha512-r4ESw/IlusD17lgQi1O20Fa3qNnsckR126TdUuBgAu7GBYSIPvdNyONd3Zrxh0xCwA4+6w/TDArBPsMvhur+KQ==", + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", "dev": true, "license": "MIT", "dependencies": { - "browserify-cipher": "^1.0.1", - "browserify-sign": "^4.2.3", - "create-ecdh": "^4.0.4", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "diffie-hellman": "^5.0.3", - "hash-base": "~3.0.4", - "inherits": "^2.0.4", - "pbkdf2": "^3.1.2", - "public-encrypt": "^4.0.3", - "randombytes": "^2.1.0", - "randomfill": "^1.0.4" + "possible-typed-array-names": "^1.0.0" }, "engines": { - "node": ">= 0.10" + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/crypto-js": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.2.0.tgz", - "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==", - "license": "MIT" - }, - "node_modules/csstype": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", - "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", - "devOptional": true, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, "license": "MIT" }, - "node_modules/datastore-core": { - "version": "11.0.2", - "resolved": "https://registry.npmjs.org/datastore-core/-/datastore-core-11.0.2.tgz", - "integrity": "sha512-0pN4hMcaCWcnUBo5OL/8j14Lt1l/p1v2VvzryRYeJAKRLqnFrzy2FhAQ7y0yTA63ki760ImQHfm2XlZrfIdFpQ==", - "license": "Apache-2.0 OR MIT", - "optional": true, - "dependencies": { - "@libp2p/logger": "^6.0.0", - "interface-datastore": "^9.0.0", - "interface-store": "^7.0.0", - "it-drain": "^3.0.9", - "it-filter": "^3.1.3", - "it-map": "^3.1.3", - "it-merge": "^3.0.11", - "it-pipe": "^3.0.1", - "it-sort": "^3.0.8", - "it-take": "^3.0.8" - } - }, - "node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" + "node_modules/bare-events": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.8.2.tgz", + "integrity": "sha512-riJjyv1/mHLIPX4RwiK+oW9/4c3TEUeORHKefKAKnZ5kyslbN+HXowtbaVEqt4IMUB7OXlfixcs6gsFeo/jhiQ==", + "dev": true, + "license": "Apache-2.0", + "peerDependencies": { + "bare-abort-controller": "*" }, "peerDependenciesMeta": { - "supports-color": { + "bare-abort-controller": { "optional": true } } }, - "node_modules/decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "license": "MIT", - "optional": true, - "dependencies": { - "mimic-response": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=4.0.0" - } + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" }, - "node_modules/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "node_modules/baseline-browser-mapping": { + "version": "2.9.19", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.19.tgz", + "integrity": "sha512-ipDqC8FrAl/76p2SSWKSI+H9tFwm7vYqXQrItCuiVPt26Km0jS+NzSsBWAaBusvSbQcfJG+JitdMm+wZAgTYqg==", "dev": true, - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.js" } }, - "node_modules/define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", - "dev": true, - "license": "MIT", + "node_modules/bip39": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bip39/-/bip39-3.1.0.tgz", + "integrity": "sha512-c9kiwdk45Do5GL0vJMe7tS95VjCii65mYAH7DfWl3uW8AVzXKQVUm64i3hzVybBDMp9r7j9iNxR85+ul8MdN/A==", + "license": "ISC", "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "@noble/hashes": "^1.2.0" } }, - "node_modules/delay": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/delay/-/delay-7.0.0.tgz", - "integrity": "sha512-C3vaGs818qzZjCvVJ98GQUMVyWeg7dr5w2Nwwb2t5K8G98jOyyVO2ti2bKYk5yoYElqH3F2yA53ykuEnwD6MCg==", + "node_modules/bn.js": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.2.tgz", + "integrity": "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==", + "license": "MIT" + }, + "node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, "license": "MIT", - "optional": true, "dependencies": { - "random-int": "^3.1.0", - "unlimited-timeout": "^0.1.0" - }, - "engines": { - "node": ">=20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "balanced-match": "^1.0.0" } }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.4.0" - } + "node_modules/brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==", + "license": "MIT" }, - "node_modules/depd": { + "node_modules/browser-resolve": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/des.js": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.1.0.tgz", - "integrity": "sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==", + "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-2.0.0.tgz", + "integrity": "sha512-7sWsQlYL2rGLy2IWm8WL8DCTJvYLc/qlOnsakDac87SOoCd16WLsaAMdCiAqsTNHIe+SXfaqyxyo6THoWqs8WQ==", "dev": true, "license": "MIT", "dependencies": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" + "resolve": "^1.17.0" } }, - "node_modules/destroy": { + "node_modules/browserify-aes": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dev": true, "license": "MIT", - "optional": true, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" + "dependencies": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" } }, - "node_modules/detect-browser": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/detect-browser/-/detect-browser-5.3.0.tgz", - "integrity": "sha512-53rsFbGdwMwlF7qvCt0ypLM5V5/Mbl0szB7GPN8y9NCcbknYOeVVXdrXEq+90IwAfrrzt6Hd+u2E2ntakICU8w==", + "node_modules/browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "dev": true, "license": "MIT", - "optional": true - }, - "node_modules/detect-libc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", - "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", - "license": "Apache-2.0", - "engines": { - "node": ">=8" + "dependencies": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" } }, - "node_modules/diffie-hellman": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", - "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "node_modules/browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", "dev": true, "license": "MIT", "dependencies": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" } }, - "node_modules/dns-packet": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", - "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", + "node_modules/browserify-rsa": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.1.tgz", + "integrity": "sha512-YBjSAiTqM04ZVei6sXighu679a3SqWORA3qZTEqZImnlkDIFtKc6pNutpjyZ8RJTjQtuYfeetkxM11GwoYXMIQ==", + "dev": true, "license": "MIT", - "optional": true, "dependencies": { - "@leichtgewicht/ip-codec": "^2.0.1" + "bn.js": "^5.2.1", + "randombytes": "^2.1.0", + "safe-buffer": "^5.2.1" }, "engines": { - "node": ">=6" + "node": ">= 0.10" } }, - "node_modules/domain-browser": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-4.22.0.tgz", - "integrity": "sha512-IGBwjF7tNk3cwypFNH/7bfzBcgSCbaMOD3GsaY1AU/JRrnHnYgEM0+9kQt52iZxjNsjBtJYtao146V+f8jFZNw==", + "node_modules/browserify-rsa/node_modules/bn.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.2.tgz", + "integrity": "sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://bevry.me/fund" - } + "license": "MIT" }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "devOptional": true, - "license": "MIT", + "node_modules/browserify-sign": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.5.tgz", + "integrity": "sha512-C2AUdAJg6rlM2W5QMp2Q4KGQMVBwR1lIimTsUnutJ8bMpW5B52pGpR2gEnNBNwijumDo5FojQ0L9JrXA8m4YEw==", + "dev": true, + "license": "ISC", "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" + "bn.js": "^5.2.2", + "browserify-rsa": "^4.1.1", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.6.1", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.9", + "readable-stream": "^2.3.8", + "safe-buffer": "^5.2.1" }, "engines": { - "node": ">= 0.4" + "node": ">= 0.10" } }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "node_modules/browserify-sign/node_modules/bn.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.2.tgz", + "integrity": "sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==", "dev": true, "license": "MIT" }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "node_modules/browserify-sign/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/browserify-sign/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, "license": "MIT", - "optional": true + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } }, - "node_modules/electron-to-chromium": { - "version": "1.5.286", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.286.tgz", - "integrity": "sha512-9tfDXhJ4RKFNerfjdCcZfufu49vg620741MNs26a9+bhLThdB+plgMeou98CAaHu/WATj2iHOOHTp1hWtABj2A==", - "devOptional": true, - "license": "ISC" + "node_modules/browserify-sign/node_modules/readable-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "license": "MIT" }, - "node_modules/elliptic": { - "version": "6.6.1", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.6.1.tgz", - "integrity": "sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==", + "node_modules/browserify-sign/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, "license": "MIT", "dependencies": { - "bn.js": "^4.11.9", - "brorand": "^1.1.0", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" + "safe-buffer": "~5.1.0" } }, - "node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "node_modules/browserify-sign/node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "dev": true, "license": "MIT" }, - "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/end-of-stream": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", - "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", + "node_modules/browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dev": true, "license": "MIT", - "optional": true, "dependencies": { - "once": "^1.4.0" + "pako": "~1.0.5" } }, - "node_modules/enhanced-resolve": { - "version": "5.19.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.19.0.tgz", - "integrity": "sha512-phv3E1Xl4tQOShqSte26C7Fl84EwUdZsyOuSSk9qtAGyyQs2s3jJzComh+Abf4g187lUUAvH+H26omrqia2aGg==", + "node_modules/browserslist": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", + "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "license": "MIT", "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.3.0" + "baseline-browser-mapping": "^2.9.0", + "caniuse-lite": "^1.0.30001759", + "electron-to-chromium": "^1.5.263", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.2.0" + }, + "bin": { + "browserslist": "cli.js" }, "engines": { - "node": ">=10.13.0" + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, - "node_modules/err-code": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/err-code/-/err-code-3.0.1.tgz", - "integrity": "sha512-GiaH0KJUewYok+eeY05IIgjtAe4Yltygk9Wqp1V5yVWLdhf0hYZchRjNIT9bb0mSwRcIusT3cx7PJUf3zEIfUA==", - "license": "MIT", - "optional": true - }, - "node_modules/error-stack-parser": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz", - "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==", + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], "license": "MIT", - "optional": true, "dependencies": { - "stackframe": "^1.3.4" + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" } }, - "node_modules/es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "devOptional": true, + "node_modules/buffer-crc32": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-1.0.0.tgz", + "integrity": "sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==", + "dev": true, "license": "MIT", "engines": { - "node": ">= 0.4" + "node": ">=8.0.0" } }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "devOptional": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } + "node_modules/buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==", + "dev": true, + "license": "MIT" }, - "node_modules/es-object-atoms": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", - "devOptional": true, + "node_modules/builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "dev": true, "license": "MIT", "dependencies": { - "es-errors": "^1.3.0" + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/es-set-tostringtag": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", - "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dev": true, "license": "MIT", - "optional": true, "dependencies": { "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" + "function-bind": "^1.1.2" }, "engines": { "node": ">= 0.4" } }, - "node_modules/esbuild": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", - "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", "dev": true, - "hasInstallScript": true, "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" }, "engines": { - "node": ">=12" + "node": ">= 0.4" }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.21.5", - "@esbuild/android-arm": "0.21.5", - "@esbuild/android-arm64": "0.21.5", - "@esbuild/android-x64": "0.21.5", - "@esbuild/darwin-arm64": "0.21.5", - "@esbuild/darwin-x64": "0.21.5", - "@esbuild/freebsd-arm64": "0.21.5", - "@esbuild/freebsd-x64": "0.21.5", - "@esbuild/linux-arm": "0.21.5", - "@esbuild/linux-arm64": "0.21.5", - "@esbuild/linux-ia32": "0.21.5", - "@esbuild/linux-loong64": "0.21.5", - "@esbuild/linux-mips64el": "0.21.5", - "@esbuild/linux-ppc64": "0.21.5", - "@esbuild/linux-riscv64": "0.21.5", - "@esbuild/linux-s390x": "0.21.5", - "@esbuild/linux-x64": "0.21.5", - "@esbuild/netbsd-x64": "0.21.5", - "@esbuild/openbsd-x64": "0.21.5", - "@esbuild/sunos-x64": "0.21.5", - "@esbuild/win32-arm64": "0.21.5", - "@esbuild/win32-ia32": "0.21.5", - "@esbuild/win32-x64": "0.21.5" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "devOptional": true, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, "license": "MIT", "engines": { "node": ">=6" } }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "license": "MIT", - "optional": true - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "node_modules/caniuse-lite": { + "version": "1.0.30001769", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001769.tgz", + "integrity": "sha512-BCfFL1sHijQlBGWBMuJyhZUhzo7wer5sVj9hqekB/7xn0Ypy+pER/edCYQm4exbXj4WiySGp40P8UuTh6w1srg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "license": "BSD-2-Clause", + "node_modules/cborg": { + "version": "4.5.8", + "resolved": "https://registry.npmjs.org/cborg/-/cborg-4.5.8.tgz", + "integrity": "sha512-6/viltD51JklRhq4L7jC3zgy6gryuG5xfZ3kzpE+PravtyeQLeQmCYLREhQH7pWENg5pY4Yu/XCd6a7dKScVlw==", + "license": "Apache-2.0", "optional": true, "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" + "cborg": "lib/bin.js" } }, - "node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "license": "MIT" - }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", "license": "MIT", - "optional": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, "engines": { - "node": ">= 0.6" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/event-target-shim": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", - "devOptional": true, + "node_modules/chalk/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, "engines": { - "node": ">=6" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/eventemitter3": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz", - "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==", - "license": "MIT", - "optional": true - }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "devOptional": true, + "node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, "engines": { - "node": ">=0.8.x" + "node": ">=8" } }, - "node_modules/events-universal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/events-universal/-/events-universal-1.0.1.tgz", - "integrity": "sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==", + "node_modules/cipher-base": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.7.tgz", + "integrity": "sha512-Mz9QMT5fJe7bKI7MH31UilT5cEK5EHHRCccw/YRFsRY47AuNgaV6HY3rscp0/I4Q+tTW/5zoqpSeRRI54TkDWA==", "dev": true, - "license": "Apache-2.0", + "license": "MIT", "dependencies": { - "bare-events": "^2.7.0" + "inherits": "^2.0.4", + "safe-buffer": "^5.2.1", + "to-buffer": "^1.2.2" + }, + "engines": { + "node": ">= 0.10" } }, - "node_modules/evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "license": "MIT", "dependencies": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, - "node_modules/expand-template": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", - "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", - "license": "(MIT OR WTFPL)", - "optional": true, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/compress-commons": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-6.0.2.tgz", + "integrity": "sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "crc-32": "^1.2.0", + "crc32-stream": "^6.0.0", + "is-stream": "^2.0.1", + "normalize-path": "^3.0.0", + "readable-stream": "^4.0.0" + }, "engines": { - "node": ">=6" + "node": ">= 14" } }, - "node_modules/exponential-backoff": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.3.tgz", - "integrity": "sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==", - "license": "Apache-2.0", - "optional": true + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" }, - "node_modules/fast-fifo": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", - "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", + "node_modules/console-browserify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", + "dev": true + }, + "node_modules/constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==", "dev": true, "license": "MIT" }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "license": "MIT", - "optional": true + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" }, - "node_modules/fb-dotslash": { - "version": "0.5.8", - "resolved": "https://registry.npmjs.org/fb-dotslash/-/fb-dotslash-0.5.8.tgz", - "integrity": "sha512-XHYLKk9J4BupDxi9bSEhkfss0m+Vr9ChTrjhf9l2iw3jB5C7BnY4GVPoMcqbrTutsKJso6yj2nAB6BI/F2oZaA==", - "license": "(MIT OR Apache-2.0)", - "optional": true, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/crc-32": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", + "dev": true, + "license": "Apache-2.0", "bin": { - "dotslash": "bin/dotslash" + "crc32": "bin/crc32.njs" }, "engines": { - "node": ">=20" - } - }, - "node_modules/fb-watchman": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", - "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "bser": "2.1.1" + "node": ">=0.8" } }, - "node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "node_modules/crc32-stream": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-6.0.0.tgz", + "integrity": "sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g==", + "dev": true, "license": "MIT", - "optional": true, - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" + "dependencies": { + "crc-32": "^1.2.0", + "readable-stream": "^4.0.0" }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } + "engines": { + "node": ">= 14" } }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "node_modules/create-ecdh": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", + "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", + "dev": true, "license": "MIT", - "optional": true, "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" + "bn.js": "^4.1.0", + "elliptic": "^6.5.3" } }, - "node_modules/finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "node_modules/create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dev": true, "license": "MIT", - "optional": true, "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "statuses": "~1.5.0", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" } }, - "node_modules/finalhandler/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "node_modules/create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dev": true, "license": "MIT", - "optional": true, "dependencies": { - "ms": "2.0.0" + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" } }, - "node_modules/finalhandler/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, "license": "MIT", - "optional": true + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "node_modules/crypto-browserify": { + "version": "3.12.1", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.1.tgz", + "integrity": "sha512-r4ESw/IlusD17lgQi1O20Fa3qNnsckR126TdUuBgAu7GBYSIPvdNyONd3Zrxh0xCwA4+6w/TDArBPsMvhur+KQ==", "dev": true, "license": "MIT", "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" + "browserify-cipher": "^1.0.1", + "browserify-sign": "^4.2.3", + "create-ecdh": "^4.0.4", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "diffie-hellman": "^5.0.3", + "hash-base": "~3.0.4", + "inherits": "^2.0.4", + "pbkdf2": "^3.1.2", + "public-encrypt": "^4.0.3", + "randombytes": "^2.1.0", + "randomfill": "^1.0.4" }, "engines": { - "node": ">=10" + "node": ">= 0.10" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/flow-enums-runtime": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/flow-enums-runtime/-/flow-enums-runtime-0.0.6.tgz", - "integrity": "sha512-3PYnM29RFXwvAN6Pc/scUfkI7RwhQ/xqyLUyPNlXUp9S40zI8nup9tUSrTLSVnWGBN38FNiGWbwZOB6uR4OGdw==", - "license": "MIT", - "optional": true + "node_modules/crypto-js": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.2.0.tgz", + "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==", + "license": "MIT" }, - "node_modules/follow-redirects": { - "version": "1.15.11", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", - "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, "license": "MIT", - "optional": true, + "dependencies": { + "ms": "^2.1.3" + }, "engines": { - "node": ">=4.0" + "node": ">=6.0" }, "peerDependenciesMeta": { - "debug": { + "supports-color": { "optional": true } } }, - "node_modules/for-each": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", - "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", "dev": true, "license": "MIT", "dependencies": { - "is-callable": "^1.2.7" + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" }, "engines": { "node": ">= 0.4" @@ -6190,663 +3727,595 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/foreground-child": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", - "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "cross-spawn": "^7.0.6", - "signal-exit": "^4.0.1" + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" }, "engines": { - "node": ">=14" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/form-data": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", - "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "node_modules/des.js": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.1.0.tgz", + "integrity": "sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==", + "dev": true, "license": "MIT", - "optional": true, "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "es-set-tostringtag": "^2.1.0", - "hasown": "^2.0.2", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" } }, - "node_modules/fraction.js": { - "version": "5.3.4", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-5.3.4.tgz", - "integrity": "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==", + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", "dev": true, - "license": "MIT", - "engines": { - "node": "*" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/rawify" - } - }, - "node_modules/freeport-promise": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/freeport-promise/-/freeport-promise-2.0.0.tgz", - "integrity": "sha512-dwWpT1DdQcwrhmRwnDnPM/ZFny+FtzU+k50qF2eid3KxaQDsMiBrwo1i0G3qSugkN5db6Cb0zgfc68QeTOpEFg==", - "license": "Apache-2.0 OR MIT", - "optional": true, - "engines": { - "node": ">=16.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "license": "MIT", - "optional": true - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "license": "ISC", - "optional": true - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], + "license": "Apache-2.0", "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + "node": ">=8" } }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "devOptional": true, + "node_modules/diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "dev": true, "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" + "dependencies": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" } }, - "node_modules/function-timeout": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/function-timeout/-/function-timeout-0.1.1.tgz", - "integrity": "sha512-0NVVC0TaP7dSTvn1yMiy6d6Q8gifzbvQafO46RtLG/kHJUBNd+pVRGOBoK44wNBvtSPUJRfdVvkFdD3p0xvyZg==", + "node_modules/domain-browser": { + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-4.22.0.tgz", + "integrity": "sha512-IGBwjF7tNk3cwypFNH/7bfzBcgSCbaMOD3GsaY1AU/JRrnHnYgEM0+9kQt52iZxjNsjBtJYtao146V+f8jFZNw==", + "dev": true, "license": "MIT", - "optional": true, "engines": { - "node": ">=14.16" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://bevry.me/fund" } }, - "node_modules/generator-function": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", - "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", "dev": true, "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, "engines": { "node": ">= 0.4" } }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "devOptional": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true, + "license": "MIT" }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "license": "ISC", - "optional": true, - "engines": { - "node": "6.* || 8.* || >= 10.*" - } + "node_modules/electron-to-chromium": { + "version": "1.5.286", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.286.tgz", + "integrity": "sha512-9tfDXhJ4RKFNerfjdCcZfufu49vg620741MNs26a9+bhLThdB+plgMeou98CAaHu/WATj2iHOOHTp1hWtABj2A==", + "dev": true, + "license": "ISC" }, - "node_modules/get-intrinsic": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "devOptional": true, + "node_modules/elliptic": { + "version": "6.6.1", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.6.1.tgz", + "integrity": "sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==", "license": "MIT", "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" } }, - "node_modules/get-iterator": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/get-iterator/-/get-iterator-2.0.1.tgz", - "integrity": "sha512-7HuY/hebu4gryTDT7O/XY/fvY9wRByEGdK6QOa4of8npTcv0+NS6frFKABcf6S9EBAsveTuKTsZQQBFMMNILIg==", - "license": "MIT", - "optional": true + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT" }, - "node_modules/get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "node_modules/enhanced-resolve": { + "version": "5.19.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.19.0.tgz", + "integrity": "sha512-phv3E1Xl4tQOShqSte26C7Fl84EwUdZsyOuSSk9qtAGyyQs2s3jJzComh+Abf4g187lUUAvH+H26omrqia2aGg==", + "dev": true, "license": "MIT", - "optional": true, + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.3.0" + }, "engines": { - "node": ">=8.0.0" + "node": ">=10.13.0" } }, - "node_modules/get-port": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/get-port/-/get-port-7.1.0.tgz", - "integrity": "sha512-QB9NKEeDg3xxVwCCwJQ9+xycaz6pBB6iQ76wiWMl1927n0Kir6alPiP+yuiICLLU4jpMe08dXfpebuQppFA2zw==", + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, "license": "MIT", - "optional": true, "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 0.4" } }, - "node_modules/get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "devOptional": true, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - }, "engines": { "node": ">= 0.4" } }, - "node_modules/github-from-package": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", - "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", - "license": "MIT", - "optional": true - }, - "node_modules/glob": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", - "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", - "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", - "dev": true, - "license": "ISC", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "engines": { + "node": ">= 0.4" } }, - "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "devOptional": true, + "node_modules/esbuild": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", + "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", + "dev": true, + "hasInstallScript": true, "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, "engines": { - "node": ">= 0.4" + "node": ">=18" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.12", + "@esbuild/android-arm": "0.25.12", + "@esbuild/android-arm64": "0.25.12", + "@esbuild/android-x64": "0.25.12", + "@esbuild/darwin-arm64": "0.25.12", + "@esbuild/darwin-x64": "0.25.12", + "@esbuild/freebsd-arm64": "0.25.12", + "@esbuild/freebsd-x64": "0.25.12", + "@esbuild/linux-arm": "0.25.12", + "@esbuild/linux-arm64": "0.25.12", + "@esbuild/linux-ia32": "0.25.12", + "@esbuild/linux-loong64": "0.25.12", + "@esbuild/linux-mips64el": "0.25.12", + "@esbuild/linux-ppc64": "0.25.12", + "@esbuild/linux-riscv64": "0.25.12", + "@esbuild/linux-s390x": "0.25.12", + "@esbuild/linux-x64": "0.25.12", + "@esbuild/netbsd-arm64": "0.25.12", + "@esbuild/netbsd-x64": "0.25.12", + "@esbuild/openbsd-arm64": "0.25.12", + "@esbuild/openbsd-x64": "0.25.12", + "@esbuild/openharmony-arm64": "0.25.12", + "@esbuild/sunos-x64": "0.25.12", + "@esbuild/win32-arm64": "0.25.12", + "@esbuild/win32-ia32": "0.25.12", + "@esbuild/win32-x64": "0.25.12" } }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "license": "ISC" + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } }, - "node_modules/has-flag": { + "node_modules/escape-string-regexp": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, "license": "MIT", - "optional": true, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "node_modules/eslint": { + "version": "9.39.3", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.3.tgz", + "integrity": "sha512-VmQ+sifHUbI/IcSopBCF/HO3YiHQx/AVd3UVyYL6weuwW+HvON9VYn5l6Zl1WZzPWXPNZrSQpxwkkZ/VuvJZzg==", "dev": true, "license": "MIT", "dependencies": { - "es-define-property": "^1.0.0" + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.21.1", + "@eslint/config-helpers": "^0.4.2", + "@eslint/core": "^0.17.0", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "9.39.3", + "@eslint/plugin-kit": "^0.4.1", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } } }, - "node_modules/has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "devOptional": true, + "node_modules/eslint-plugin-react-hooks": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.2.0.tgz", + "integrity": "sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==", + "dev": true, "license": "MIT", "engines": { - "node": ">= 0.4" + "node": ">=10" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" } }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "devOptional": true, + "node_modules/eslint-plugin-react-refresh": { + "version": "0.4.26", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.26.tgz", + "integrity": "sha512-1RETEylht2O6FM/MvgnyvT+8K21wLqDNg4qD51Zj3guhjt433XbnnkVttHMyaVyAFD03QSV4LPS5iE3VQmO7XQ==", + "dev": true, "license": "MIT", + "peerDependencies": { + "eslint": ">=8.40" + } + }, + "node_modules/eslint-scope": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", + "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "has-symbols": "^1.0.3" + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" }, "engines": { - "node": ">= 0.4" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://opencollective.com/eslint" } }, - "node_modules/hash-base": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.5.tgz", - "integrity": "sha512-vXm0l45VbcHEVlTCzs8M+s0VeYsB2lnlAaThoLKGXr3bE/VWDOelNUnycUPEhKEaXARL2TEFjBOyUiM6+55KBg==", + "node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.4", - "safe-buffer": "^5.2.1" - }, + "license": "Apache-2.0", "engines": { - "node": ">= 0.10" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "node_modules/eslint/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, "license": "MIT", "dependencies": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/hashlru": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/hashlru/-/hashlru-2.3.0.tgz", - "integrity": "sha512-0cMsjjIC8I+D3M44pOQdsy0OHXGLVz6Z0beRuufhKa0KfaD2wGwAev6jILzXsd3/vpnNQJmWyZtIILqM1N+n5A==", - "license": "MIT", - "optional": true - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "devOptional": true, - "license": "MIT", + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", "dependencies": { - "function-bind": "^1.1.2" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">= 0.4" - } - }, - "node_modules/helia": { - "version": "6.0.20", - "resolved": "https://registry.npmjs.org/helia/-/helia-6.0.20.tgz", - "integrity": "sha512-9UTrDT71tKYTdf/4P6DhsxL1mwCPEq+Zmqp5b2582YzUvdpIydItORuXaP+yqOk3N6EP6vgcQOnHUo31drFWVQ==", - "license": "Apache-2.0 OR MIT", - "optional": true, - "dependencies": { - "@chainsafe/libp2p-noise": "^17.0.0", - "@chainsafe/libp2p-yamux": "^8.0.0", - "@helia/block-brokers": "^5.1.2", - "@helia/delegated-routing-v1-http-api-client": "^6.0.0", - "@helia/interface": "^6.1.1", - "@helia/routers": "^5.0.3", - "@helia/utils": "^2.4.2", - "@ipshipyard/libp2p-auto-tls": "^2.0.1", - "@libp2p/autonat": "^3.0.5", - "@libp2p/bootstrap": "^12.0.6", - "@libp2p/circuit-relay-v2": "^4.0.5", - "@libp2p/config": "^1.1.20", - "@libp2p/dcutr": "^3.0.5", - "@libp2p/http": "^2.0.0", - "@libp2p/identify": "^4.0.5", - "@libp2p/interface": "^3.1.0", - "@libp2p/kad-dht": "^16.1.0", - "@libp2p/keychain": "^6.0.5", - "@libp2p/mdns": "^12.0.6", - "@libp2p/mplex": "^12.0.6", - "@libp2p/ping": "^3.0.5", - "@libp2p/tcp": "^11.0.5", - "@libp2p/tls": "^3.0.5", - "@libp2p/upnp-nat": "^4.0.5", - "@libp2p/webrtc": "^6.0.6", - "@libp2p/websockets": "^10.0.6", - "@multiformats/dns": "^1.0.9", - "blockstore-core": "^6.1.1", - "datastore-core": "^11.0.2", - "interface-datastore": "^9.0.2", - "ipns": "^10.1.2", - "libp2p": "^3.0.6", - "multiformats": "^13.4.1" + "node": "*" } }, - "node_modules/hermes-compiler": { - "version": "250829098.0.7", - "resolved": "https://registry.npmjs.org/hermes-compiler/-/hermes-compiler-250829098.0.7.tgz", - "integrity": "sha512-8QOmg1VjAWv8poFVslJDY8qkvjTy/UiO3R/hyGoC0IAchLzBdS9/TmAvI9cN1F3yLTEjimAIQQtUslpBMPXVVg==", - "license": "MIT", - "optional": true - }, - "node_modules/hermes-estree": { - "version": "0.32.0", - "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.32.0.tgz", - "integrity": "sha512-KWn3BqnlDOl97Xe1Yviur6NbgIZ+IP+UVSpshlZWkq+EtoHg6/cwiDj/osP9PCEgFE15KBm1O55JRwbMEm5ejQ==", - "license": "MIT", - "optional": true - }, - "node_modules/hermes-parser": { - "version": "0.32.0", - "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.32.0.tgz", - "integrity": "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==", - "license": "MIT", - "optional": true, + "node_modules/espree": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "hermes-estree": "0.32.0" + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", - "license": "MIT", + "node_modules/esquery": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", + "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" } }, - "node_modules/http-errors": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", - "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", - "license": "MIT", - "optional": true, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "depd": "~2.0.0", - "inherits": "~2.0.4", - "setprototypeof": "~1.2.0", - "statuses": "~2.0.2", - "toidentifier": "~1.0.1" + "estraverse": "^5.2.0" }, "engines": { - "node": ">= 0.8" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" + "node": ">=4.0" } }, - "node_modules/http-errors/node_modules/statuses": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", - "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", - "license": "MIT", - "optional": true, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", "engines": { - "node": ">= 0.8" + "node": ">=4.0" } }, - "node_modules/https-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", - "integrity": "sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==", + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", "dev": true, "license": "MIT" }, - "node_modules/https-proxy-agent": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", - "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", - "license": "MIT", - "optional": true, - "dependencies": { - "agent-base": "^7.1.2", - "debug": "4" - }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", "engines": { - "node": ">= 14" + "node": ">=0.10.0" } }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "BSD-3-Clause" + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } }, - "node_modules/image-size": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.2.1.tgz", - "integrity": "sha512-rH+46sQJ2dlwfjfhCyNx5thzrv+dtmBIhPHk0zgRUukHzZ/kRueTJXoYYsclBaKcSMBWuGbOFXtioLpzTb5euw==", + "node_modules/eventemitter3": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz", + "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==", + "license": "MIT", + "optional": true + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, "license": "MIT", - "optional": true, - "dependencies": { - "queue": "6.0.2" - }, - "bin": { - "image-size": "bin/image-size.js" - }, "engines": { - "node": ">=16.x" + "node": ">=0.8.x" } }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.8.19" + "node_modules/events-universal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/events-universal/-/events-universal-1.0.1.tgz", + "integrity": "sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "bare-events": "^2.7.0" } }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "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.", - "license": "ISC", - "optional": true, + "node_modules/evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dev": true, + "license": "MIT", "dependencies": { - "once": "^1.3.0", - "wrappy": "1" + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" } }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "license": "ISC" + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" }, - "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "license": "ISC", - "optional": true + "node_modules/fast-fifo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", + "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", + "dev": true, + "license": "MIT" }, - "node_modules/interface-blockstore": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/interface-blockstore/-/interface-blockstore-6.0.1.tgz", - "integrity": "sha512-AVcUbMwrhiO4RqDljUitUt3aoon6MD2fblsN7vEVBDsmHFQT0LIOODVK5Qxe28h1uUvVykyZqmo09f6w55KiJg==", - "license": "Apache-2.0 OR MIT", - "optional": true, - "dependencies": { - "interface-store": "^7.0.0", - "multiformats": "^13.3.6" - } + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" }, - "node_modules/interface-datastore": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/interface-datastore/-/interface-datastore-9.0.2.tgz", - "integrity": "sha512-jebn+GV/5LTDDoyicNIB4D9O0QszpPqT09Z/MpEWvf3RekjVKpXJCDguM5Au2fwIFxFDAQMZe5bSla0jMamCNg==", - "license": "Apache-2.0 OR MIT", - "optional": true, - "dependencies": { - "interface-store": "^7.0.0", - "uint8arrays": "^5.1.0" - } + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" }, - "node_modules/interface-store": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/interface-store/-/interface-store-7.0.1.tgz", - "integrity": "sha512-OPRRUO3Cs6Jr/t98BrJLQp1jUTPgrRH0PqFfuNoPAqd+J7ABN1tjFVjQdaOBiybYJTS/AyBSZnZVWLPvp3dW3w==", - "license": "Apache-2.0 OR MIT", - "optional": true + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } }, - "node_modules/invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, "license": "MIT", - "optional": true, "dependencies": { - "loose-envify": "^1.0.0" + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" } }, - "node_modules/ip-regex": { + "node_modules/find-up": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-5.0.0.tgz", - "integrity": "sha512-fOCG6lhoKKakwv+C6KdsOnGvgXnmgfmp0myi3bcNwj3qfwPAxRKWEuFhvEFF7ceYIz6+1jRZ+yguLFAmUNPEfw==", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, "license": "MIT", - "optional": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ipns": { - "version": "10.1.3", - "resolved": "https://registry.npmjs.org/ipns/-/ipns-10.1.3.tgz", - "integrity": "sha512-b2Zeh8+7qOV11NjnTsYLpG8K6T13uBMndpzk9N9E2Qjz/u80qsxvKpspSP32sErOLr/GWjdFVVc02E9PMojQNA==", - "license": "Apache-2.0 OR MIT", - "optional": true, - "dependencies": { - "@libp2p/crypto": "^5.0.0", - "@libp2p/interface": "^3.0.2", - "@libp2p/logger": "^6.0.4", - "cborg": "^4.2.3", - "interface-datastore": "^9.0.2", - "multiformats": "^13.2.2", - "protons-runtime": "^5.5.0", - "timestamp-nano": "^1.0.1", - "uint8arraylist": "^2.4.8", - "uint8arrays": "^5.1.0" - } - }, - "node_modules/is-arguments": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.2.0.tgz", - "integrity": "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==", + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", "dev": true, "license": "MIT", "dependencies": { - "call-bound": "^1.0.2", - "has-tostringtag": "^1.0.2" + "flatted": "^3.2.9", + "keyv": "^4.5.4" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=16" } }, - "node_modules/is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "node_modules/flatted": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "dev": true, + "license": "ISC" + }, + "node_modules/for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", "dev": true, "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7" + }, "engines": { "node": ">= 0.4" }, @@ -6854,67 +4323,85 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-core-module": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", - "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "hasown": "^2.0.2" + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" }, "engines": { - "node": ">= 0.4" + "node": ">=14" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, "license": "MIT", "optional": true, - "bin": { - "is-docker": "cli.js" - }, + "os": [ + "darwin" + ], "engines": { - "node": ">=8" - }, + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-electron": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/is-electron/-/is-electron-2.2.2.tgz", - "integrity": "sha512-FO/Rhvz5tuw4MCWkpMzHFKWD2LsfHzIb7i6MdPYZ/KW7AlxawyLkqdy+jPZP1WubqEADE3O4FUENlJHDfQASRg==", + "node_modules/generator-function": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", + "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", + "dev": true, "license": "MIT", - "optional": true + "engines": { + "node": ">= 0.4" + } }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "devOptional": true, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">=6.9.0" } }, - "node_modules/is-generator-function": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", - "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", "dev": true, "license": "MIT", "dependencies": { - "call-bound": "^1.0.4", - "generator-function": "^2.0.0", + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", "get-proto": "^1.0.1", - "has-tostringtag": "^1.0.2", - "safe-regex-test": "^1.1.0" + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -6923,133 +4410,132 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-ip": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/is-ip/-/is-ip-5.0.1.tgz", - "integrity": "sha512-FCsGHdlrOnZQcp0+XT5a+pYowf33itBalCl+7ovNXC/7o5BhIpG14M3OrpPPdBSIQJCm+0M5+9mO7S9VVTTCFw==", + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, "license": "MIT", - "optional": true, "dependencies": { - "ip-regex": "^5.0.0", - "super-regex": "^0.2.0" + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/glob": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" }, - "engines": { - "node": ">=14.16" + "bin": { + "glob": "dist/esm/bin.mjs" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/is-loopback-addr": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-loopback-addr/-/is-loopback-addr-2.0.2.tgz", - "integrity": "sha512-26POf2KRCno/KTNL5Q0b/9TYnL00xEsSaLfiFRmjM7m7Lw7ZMmFybzzuX4CcsLAluZGd+niLUiMRxEooVE3aqg==", - "license": "MIT", - "optional": true - }, - "node_modules/is-nan": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz", - "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==", + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3" + "is-glob": "^4.0.3" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=10.13.0" } }, - "node_modules/is-network-error": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/is-network-error/-/is-network-error-1.3.0.tgz", - "integrity": "sha512-6oIwpsgRfnDiyEDLMay/GqCl3HoAtH5+RUKW29gYkL0QA+ipzpDLA16yQs7/RHCSu+BwgbJaOUqa4A99qNVQVw==", + "node_modules/globals": { + "version": "16.5.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-16.5.0.tgz", + "integrity": "sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==", + "dev": true, "license": "MIT", - "optional": true, "engines": { - "node": ">=16" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, "license": "MIT", - "optional": true, "engines": { - "node": ">=0.12.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-plain-obj": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, "license": "MIT", - "optional": true, "engines": { "node": ">=8" } }, - "node_modules/is-regex": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", - "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "dev": true, "license": "MIT", "dependencies": { - "call-bound": "^1.0.2", - "gopd": "^1.2.0", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" + "es-define-property": "^1.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-regexp": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-3.1.0.tgz", - "integrity": "sha512-rbku49cWloU5bSMI+zaRaXdQHXnthP6DZ/vLnfdSKyL4zUzuWnomtOEiZZOd+ioQ+avFo/qau3KPTc7Fjy1uPA==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-typed-array": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", - "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "dev": true, "license": "MIT", "dependencies": { - "which-typed-array": "^1.1.16" + "has-symbols": "^1.0.3" }, "engines": { "node": ">= 0.4" @@ -7058,549 +4544,377 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "license": "MIT", - "optional": true, - "dependencies": { - "is-docker": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true, - "license": "MIT" - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "devOptional": true, - "license": "ISC" - }, - "node_modules/isomorphic-timers-promises": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/isomorphic-timers-promises/-/isomorphic-timers-promises-1.0.1.tgz", - "integrity": "sha512-u4sej9B1LPSxTGKB/HiuzvEQnXH0ECYkSVQU39koSwmFAxhlEAFl9RdTvLv4TOTQUgBS5O3O5fwUxk6byBZ+IQ==", + "node_modules/hash-base": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.5.tgz", + "integrity": "sha512-vXm0l45VbcHEVlTCzs8M+s0VeYsB2lnlAaThoLKGXr3bE/VWDOelNUnycUPEhKEaXARL2TEFjBOyUiM6+55KBg==", "dev": true, "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", - "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", - "license": "BSD-3-Clause", - "optional": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", - "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", - "license": "BSD-3-Clause", - "optional": true, - "dependencies": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/it-all": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/it-all/-/it-all-3.0.9.tgz", - "integrity": "sha512-fz1oJJ36ciGnu2LntAlE6SA97bFZpW7Rnt0uEc1yazzR2nKokZLr8lIRtgnpex4NsmaBcvHF+Z9krljWFy/mmg==", - "license": "Apache-2.0 OR MIT", - "optional": true - }, - "node_modules/it-byte-stream": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/it-byte-stream/-/it-byte-stream-2.0.4.tgz", - "integrity": "sha512-8pS0OvkBYwQ206pRLgoLDAiHP6c8wYZJ1ig8KDmP5NOrzMxeH2Wv2ktXIjYHwdu7RPOsnxQb0vKo+O784L/m5g==", - "license": "Apache-2.0 OR MIT", - "optional": true, - "dependencies": { - "abort-error": "^1.0.1", - "it-queueless-pushable": "^2.0.0", - "it-stream-types": "^2.0.2", - "race-signal": "^2.0.0", - "uint8arraylist": "^2.4.8" - } - }, - "node_modules/it-drain": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/it-drain/-/it-drain-3.0.10.tgz", - "integrity": "sha512-0w/bXzudlyKIyD1+rl0xUKTI7k4cshcS43LTlBiGFxI8K1eyLydNPxGcsVLsFVtKh1/ieS8AnVWt6KwmozxyEA==", - "license": "Apache-2.0 OR MIT", - "optional": true - }, - "node_modules/it-filter": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/it-filter/-/it-filter-3.1.4.tgz", - "integrity": "sha512-80kWEKgiFEa4fEYD3mwf2uygo1dTQ5Y5midKtL89iXyjinruA/sNXl6iFkTcdNedydjvIsFhWLiqRPQP4fAwWQ==", - "license": "Apache-2.0 OR MIT", - "optional": true, - "dependencies": { - "it-peekable": "^3.0.0" - } - }, - "node_modules/it-first": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/it-first/-/it-first-3.0.9.tgz", - "integrity": "sha512-ZWYun273Gbl7CwiF6kK5xBtIKR56H1NoRaiJek2QzDirgen24u8XZ0Nk+jdnJSuCTPxC2ul1TuXKxu/7eK6NuA==", - "license": "Apache-2.0 OR MIT", - "optional": true - }, - "node_modules/it-foreach": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/it-foreach/-/it-foreach-2.1.5.tgz", - "integrity": "sha512-9tIp+NFVODmGV/49JUKVxW3+8RrPkYrmUaXUM4W6lMC5POM/1gegckNjBmDe5xgBa7+RE9HKBmRTAdY5V+bWSQ==", - "license": "Apache-2.0 OR MIT", - "optional": true, - "dependencies": { - "it-peekable": "^3.0.0" - } - }, - "node_modules/it-length": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/it-length/-/it-length-3.0.9.tgz", - "integrity": "sha512-cPhRPzyulYqyL7x4sX4MOjG/xu3vvEIFAhJ1aCrtrnbfxloCOtejOONib5oC3Bz8tLL6b6ke6+YHu4Bm6HCG7A==", - "license": "Apache-2.0 OR MIT", - "optional": true - }, - "node_modules/it-length-prefixed": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/it-length-prefixed/-/it-length-prefixed-10.0.1.tgz", - "integrity": "sha512-BhyluvGps26u9a7eQIpOI1YN7mFgi8lFwmiPi07whewbBARKAG9LE09Odc8s1Wtbt2MB6rNUrl7j9vvfXTJwdQ==", - "license": "Apache-2.0 OR MIT", - "optional": true, "dependencies": { - "it-reader": "^6.0.1", - "it-stream-types": "^2.0.1", - "uint8-varint": "^2.0.1", - "uint8arraylist": "^2.0.0", - "uint8arrays": "^5.0.1" + "inherits": "^2.0.4", + "safe-buffer": "^5.2.1" }, "engines": { - "node": ">=16.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/it-length-prefixed-stream": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/it-length-prefixed-stream/-/it-length-prefixed-stream-2.0.4.tgz", - "integrity": "sha512-ugHDOQCkC2Dx2pQaJ+W4OIM6nZFBwlpgdQVVOfdX4c1Os47d6PMsfrkTrzRwZdBCMZb+JISZNP2gjU/DHN/z9A==", - "license": "Apache-2.0 OR MIT", - "optional": true, - "dependencies": { - "abort-error": "^1.0.1", - "it-byte-stream": "^2.0.0", - "it-stream-types": "^2.0.2", - "uint8-varint": "^2.0.4", - "uint8arraylist": "^2.4.8" - } - }, - "node_modules/it-map": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/it-map/-/it-map-3.1.4.tgz", - "integrity": "sha512-QB9PYQdE9fUfpVFYfSxBIyvKynUCgblb143c+ktTK6ZuKSKkp7iH58uYFzagqcJ5HcqIfn1xbfaralHWam+3fg==", - "license": "Apache-2.0 OR MIT", - "optional": true, - "dependencies": { - "it-peekable": "^3.0.0" - } - }, - "node_modules/it-merge": { - "version": "3.0.12", - "resolved": "https://registry.npmjs.org/it-merge/-/it-merge-3.0.12.tgz", - "integrity": "sha512-nnnFSUxKlkZVZD7c0jYw6rDxCcAQYcMsFj27thf7KkDhpj0EA0g9KHPxbFzHuDoc6US2EPS/MtplkNj8sbCx4Q==", - "license": "Apache-2.0 OR MIT", - "optional": true, - "dependencies": { - "it-queueless-pushable": "^2.0.0" - } - }, - "node_modules/it-ndjson": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/it-ndjson/-/it-ndjson-1.1.4.tgz", - "integrity": "sha512-ZMgTUrNo/UQCeRUT3KqnC0UaClzU6D+ItSmzVt7Ks7pcJ7DboYeYBSPeFLAaEthf5zlvaApDuACLmOWepgkrRg==", - "license": "Apache-2.0 OR MIT", - "optional": true, - "dependencies": { - "uint8arraylist": "^2.4.8" + "node": ">= 0.10" } }, - "node_modules/it-parallel": { - "version": "3.0.13", - "resolved": "https://registry.npmjs.org/it-parallel/-/it-parallel-3.0.13.tgz", - "integrity": "sha512-85PPJ/O8q97Vj9wmDTSBBXEkattwfQGruXitIzrh0RLPso6RHfiVqkuTqBNufYYtB1x6PSkh0cwvjmMIkFEPHA==", - "license": "Apache-2.0 OR MIT", - "optional": true, + "node_modules/hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "license": "MIT", "dependencies": { - "p-defer": "^4.0.1" + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" } }, - "node_modules/it-peekable": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/it-peekable/-/it-peekable-3.0.8.tgz", - "integrity": "sha512-7IDBQKSp/dtBxXV3Fj0v3qM1jftJ9y9XrWLRIuU1X6RdKqWiN60syNwP0fiDxZD97b8SYM58dD3uklIk1TTQAw==", - "license": "Apache-2.0 OR MIT", + "node_modules/hashlru": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/hashlru/-/hashlru-2.3.0.tgz", + "integrity": "sha512-0cMsjjIC8I+D3M44pOQdsy0OHXGLVz6Z0beRuufhKa0KfaD2wGwAev6jILzXsd3/vpnNQJmWyZtIILqM1N+n5A==", + "license": "MIT", "optional": true }, - "node_modules/it-pipe": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/it-pipe/-/it-pipe-3.0.1.tgz", - "integrity": "sha512-sIoNrQl1qSRg2seYSBH/3QxWhJFn9PKYvOf/bHdtCBF0bnghey44VyASsWzn5dAx0DCDDABq1hZIuzKmtBZmKA==", - "license": "Apache-2.0 OR MIT", - "optional": true, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "license": "MIT", "dependencies": { - "it-merge": "^3.0.0", - "it-pushable": "^3.1.2", - "it-stream-types": "^2.0.1" + "function-bind": "^1.1.2" }, "engines": { - "node": ">=16.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/it-protobuf-stream": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/it-protobuf-stream/-/it-protobuf-stream-2.0.3.tgz", - "integrity": "sha512-Dus9qyylOSnC7l75/3qs6j3Fe9MCM2K5luXi9o175DYijFRne5FPucdOGIYdwaDBDQ4Oy34dNCuFobOpcusvEQ==", - "license": "Apache-2.0 OR MIT", - "optional": true, - "dependencies": { - "abort-error": "^1.0.1", - "it-length-prefixed-stream": "^2.0.0", - "it-stream-types": "^2.0.2", - "uint8arraylist": "^2.4.8" + "node": ">= 0.4" } }, - "node_modules/it-pushable": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/it-pushable/-/it-pushable-3.2.3.tgz", - "integrity": "sha512-gzYnXYK8Y5t5b/BnJUr7glfQLO4U5vyb05gPx/TyTw+4Bv1zM9gFk4YsOrnulWefMewlphCjKkakFvj1y99Tcg==", - "license": "Apache-2.0 OR MIT", - "optional": true, + "node_modules/hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", + "license": "MIT", "dependencies": { - "p-defer": "^4.0.0" + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" } }, - "node_modules/it-queue": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/it-queue/-/it-queue-1.1.1.tgz", - "integrity": "sha512-yeYCV22WF1QDyb3ylw+g3TGEdkmnoHUH2mc12QoGOQuxW4XP1V7Zd3BfsEF1iq2IFBwIK7wCPUcRLTAQVeZ3SQ==", - "license": "Apache-2.0 OR MIT", - "optional": true, - "dependencies": { - "abort-error": "^1.0.1", - "it-pushable": "^3.2.3", - "main-event": "^1.0.0", - "race-event": "^1.3.0", - "race-signal": "^2.0.0" - } + "node_modules/https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==", + "dev": true, + "license": "MIT" }, - "node_modules/it-queueless-pushable": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/it-queueless-pushable/-/it-queueless-pushable-2.0.3.tgz", - "integrity": "sha512-USa5EzTvmQswOcVE7+o6qsj2o2G+6KHCxSogPOs23sGYkDWFidhqVO7dAvv6ve/Z+Q+nvxpEa9rrRo6VEK7w4Q==", - "license": "Apache-2.0 OR MIT", - "optional": true, - "dependencies": { - "abort-error": "^1.0.1", - "p-defer": "^4.0.1", - "race-signal": "^2.0.0" + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" } }, - "node_modules/it-reader": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/it-reader/-/it-reader-6.0.4.tgz", - "integrity": "sha512-XCWifEcNFFjjBHtor4Sfaj8rcpt+FkY0L6WdhD578SCDhV4VUm7fCkF3dv5a+fTcfQqvN9BsxBTvWbYO6iCjTg==", - "license": "Apache-2.0 OR MIT", - "optional": true, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", "dependencies": { - "it-stream-types": "^2.0.1", - "uint8arraylist": "^2.0.0" + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" }, "engines": { - "node": ">=16.0.0", - "npm": ">=7.0.0" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/it-sort": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/it-sort/-/it-sort-3.0.9.tgz", - "integrity": "sha512-jsM6alGaPiQbcAJdzMsuMh00uJcI+kD9TBoScB8TR75zUFOmHvhSsPi+Dmh2zfVkcoca+14EbfeIZZXTUGH63w==", - "license": "Apache-2.0 OR MIT", - "optional": true, - "dependencies": { - "it-all": "^3.0.0" + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" } }, - "node_modules/it-stream-types": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/it-stream-types/-/it-stream-types-2.0.2.tgz", - "integrity": "sha512-Rz/DEZ6Byn/r9+/SBCuJhpPATDF9D+dz5pbgSUyBsCDtza6wtNATrz/jz1gDyNanC3XdLboriHnOC925bZRBww==", - "license": "Apache-2.0 OR MIT", - "optional": true - }, - "node_modules/it-take": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/it-take/-/it-take-3.0.9.tgz", - "integrity": "sha512-XMeUbnjOcgrhFXPUqa7H0VIjYSV/BvyxxjCp76QHVAFDJw2LmR1SHxUFiqyGeobgzJr7P2ZwSRRJQGn4D2BVlA==", - "license": "Apache-2.0 OR MIT", - "optional": true + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" }, - "node_modules/it-to-browser-readablestream": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/it-to-browser-readablestream/-/it-to-browser-readablestream-2.0.12.tgz", - "integrity": "sha512-9pcVGxY8jrfMUgCqPrxjVN0bl6fQXCK1NEbUq5Bi+APlr3q0s2AsQINBPcWYgJbMnSHAfoRDthsi4GHqtkvHgw==", + "node_modules/interface-datastore": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/interface-datastore/-/interface-datastore-9.0.2.tgz", + "integrity": "sha512-jebn+GV/5LTDDoyicNIB4D9O0QszpPqT09Z/MpEWvf3RekjVKpXJCDguM5Au2fwIFxFDAQMZe5bSla0jMamCNg==", "license": "Apache-2.0 OR MIT", "optional": true, "dependencies": { - "get-iterator": "^2.0.1" + "interface-store": "^7.0.0", + "uint8arrays": "^5.1.0" } }, - "node_modules/it-to-buffer": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/it-to-buffer/-/it-to-buffer-4.0.10.tgz", - "integrity": "sha512-dXNHSILSPVv+31nxav+egNxWA/RpSuAHCSurJCLxkFDpmzAyYPJwIkPfLkYiHLoJqyE6Z5nVFILp6aDvz9V5pw==", + "node_modules/interface-store": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/interface-store/-/interface-store-7.0.1.tgz", + "integrity": "sha512-OPRRUO3Cs6Jr/t98BrJLQp1jUTPgrRH0PqFfuNoPAqd+J7ABN1tjFVjQdaOBiybYJTS/AyBSZnZVWLPvp3dW3w==", + "license": "Apache-2.0 OR MIT", + "optional": true + }, + "node_modules/ipns": { + "version": "10.1.3", + "resolved": "https://registry.npmjs.org/ipns/-/ipns-10.1.3.tgz", + "integrity": "sha512-b2Zeh8+7qOV11NjnTsYLpG8K6T13uBMndpzk9N9E2Qjz/u80qsxvKpspSP32sErOLr/GWjdFVVc02E9PMojQNA==", "license": "Apache-2.0 OR MIT", "optional": true, "dependencies": { + "@libp2p/crypto": "^5.0.0", + "@libp2p/interface": "^3.0.2", + "@libp2p/logger": "^6.0.4", + "cborg": "^4.2.3", + "interface-datastore": "^9.0.2", + "multiformats": "^13.2.2", + "protons-runtime": "^5.5.0", + "timestamp-nano": "^1.0.1", + "uint8arraylist": "^2.4.8", "uint8arrays": "^5.1.0" } }, - "node_modules/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "node_modules/is-arguments": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.2.0.tgz", + "integrity": "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==", "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/jest-environment-node": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", - "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", "license": "MIT", - "optional": true, "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-get-type": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", - "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, "license": "MIT", - "optional": true, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-haste-map": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", - "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "dev": true, "license": "MIT", - "optional": true, "dependencies": { - "@jest/types": "^29.6.3", - "@types/graceful-fs": "^4.1.3", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", - "micromatch": "^4.0.4", - "walker": "^1.0.8" + "hasown": "^2.0.2" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">= 0.4" }, - "optionalDependencies": { - "fsevents": "^2.3.2" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-message-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", - "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, "license": "MIT", - "optional": true, - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.6.3", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=0.10.0" } }, - "node_modules/jest-mock": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", - "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, "license": "MIT", - "optional": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-util": "^29.7.0" - }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=8" } }, - "node_modules/jest-regex-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", - "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", + "node_modules/is-generator-function": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", + "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", + "dev": true, "license": "MIT", - "optional": true, + "dependencies": { + "call-bound": "^1.0.4", + "generator-function": "^2.0.0", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", - "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, "license": "MIT", - "optional": true, "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" + "is-extglob": "^2.1.1" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=0.10.0" } }, - "node_modules/jest-util/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "node_modules/is-nan": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz", + "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==", + "dev": true, "license": "MIT", - "optional": true, + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" + }, "engines": { - "node": ">=8.6" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-validate": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", - "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "dev": true, "license": "MIT", - "optional": true, "dependencies": { - "@jest/types": "^29.6.3", - "camelcase": "^6.2.0", - "chalk": "^4.0.0", - "jest-get-type": "^29.6.3", - "leven": "^3.1.0", - "pretty-format": "^29.7.0" + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-validate/node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, "license": "MIT", - "optional": true, "engines": { - "node": ">=10" + "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/jest-worker": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", - "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "dev": true, "license": "MIT", - "optional": true, "dependencies": { - "@types/node": "*", - "jest-util": "^29.7.0", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/isomorphic-timers-promises": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/isomorphic-timers-promises/-/isomorphic-timers-promises-1.0.1.tgz", + "integrity": "sha512-u4sej9B1LPSxTGKB/HiuzvEQnXH0ECYkSVQU39koSwmFAxhlEAFl9RdTvLv4TOTQUgBS5O3O5fwUxk6byBZ+IQ==", + "dev": true, + "license": "MIT", "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=10" } }, - "node_modules/jest-worker/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "license": "MIT", - "optional": true, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" + "@isaacs/cliui": "^8.0.2" }, "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" } }, "node_modules/jiti": { "version": "2.6.1", "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", + "dev": true, "license": "MIT", "bin": { "jiti": "lib/jiti-cli.mjs" @@ -7613,31 +4927,23 @@ "license": "MIT" }, "node_modules/js-yaml": { - "version": "3.14.2", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", - "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "dev": true, "license": "MIT", - "optional": true, "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, - "node_modules/jsc-safe-url": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/jsc-safe-url/-/jsc-safe-url-0.2.4.tgz", - "integrity": "sha512-0wM3YBWtYePOjfyXQH5MWQ8H7sdk5EXSwZvmSLKk2RboVQ2Bu239jycHDz5J/8Blf3K0Qnoy2b6xD+z10MFB+Q==", - "license": "0BSD", - "optional": true - }, "node_modules/jsesc": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", - "devOptional": true, + "dev": true, "license": "MIT", "bin": { "jsesc": "bin/jsesc" @@ -7646,11 +4952,32 @@ "node": ">=6" } }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "devOptional": true, + "dev": true, "license": "MIT", "bin": { "json5": "lib/cli.js" @@ -7659,6 +4986,16 @@ "node": ">=6" } }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, "node_modules/lazystream": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", @@ -7700,347 +5037,38 @@ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "dev": true, - "license": "MIT" - }, - "node_modules/lazystream/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/libp2p": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/libp2p/-/libp2p-3.1.3.tgz", - "integrity": "sha512-Jgl6Km1PfFTKR7krDNDxuuxQ6ya3D6VHFOi/XYJA539F62PmbxOQLd+nqbqozwB9BgJVTxaXRVmGTKo7dyrdQw==", - "license": "Apache-2.0 OR MIT", - "optional": true, - "dependencies": { - "@chainsafe/is-ip": "^2.1.0", - "@chainsafe/netmask": "^2.0.0", - "@libp2p/crypto": "^5.1.13", - "@libp2p/interface": "^3.1.0", - "@libp2p/interface-internal": "^3.0.10", - "@libp2p/logger": "^6.2.2", - "@libp2p/multistream-select": "^7.0.10", - "@libp2p/peer-collections": "^7.0.10", - "@libp2p/peer-id": "^6.0.4", - "@libp2p/peer-store": "^12.0.10", - "@libp2p/utils": "^7.0.10", - "@multiformats/dns": "^1.0.6", - "@multiformats/multiaddr": "^13.0.1", - "@multiformats/multiaddr-matcher": "^3.0.1", - "any-signal": "^4.1.1", - "datastore-core": "^11.0.1", - "interface-datastore": "^9.0.1", - "it-merge": "^3.0.12", - "it-parallel": "^3.0.13", - "main-event": "^1.0.1", - "multiformats": "^13.4.0", - "p-defer": "^4.0.1", - "p-event": "^7.0.0", - "p-retry": "^7.0.0", - "progress-events": "^1.0.1", - "race-signal": "^2.0.0", - "uint8arrays": "^5.1.0" - } - }, - "node_modules/libphonenumber-js": { - "version": "1.12.36", - "resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.12.36.tgz", - "integrity": "sha512-woWhKMAVx1fzzUnMCyOzglgSgf6/AFHLASdOBcchYCyvWSGWt12imw3iu2hdI5d4dGZRsNWAmWiz37sDKUPaRQ==", - "license": "MIT" - }, - "node_modules/lighthouse-logger": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/lighthouse-logger/-/lighthouse-logger-1.4.2.tgz", - "integrity": "sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "debug": "^2.6.9", - "marky": "^1.2.2" - } - }, - "node_modules/lighthouse-logger/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", - "optional": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/lighthouse-logger/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT", - "optional": true - }, - "node_modules/lightningcss": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.2.tgz", - "integrity": "sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==", - "license": "MPL-2.0", - "dependencies": { - "detect-libc": "^2.0.3" - }, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - }, - "optionalDependencies": { - "lightningcss-android-arm64": "1.30.2", - "lightningcss-darwin-arm64": "1.30.2", - "lightningcss-darwin-x64": "1.30.2", - "lightningcss-freebsd-x64": "1.30.2", - "lightningcss-linux-arm-gnueabihf": "1.30.2", - "lightningcss-linux-arm64-gnu": "1.30.2", - "lightningcss-linux-arm64-musl": "1.30.2", - "lightningcss-linux-x64-gnu": "1.30.2", - "lightningcss-linux-x64-musl": "1.30.2", - "lightningcss-win32-arm64-msvc": "1.30.2", - "lightningcss-win32-x64-msvc": "1.30.2" - } - }, - "node_modules/lightningcss-android-arm64": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.30.2.tgz", - "integrity": "sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==", - "cpu": [ - "arm64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-darwin-arm64": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.2.tgz", - "integrity": "sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==", - "cpu": [ - "arm64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-darwin-x64": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.2.tgz", - "integrity": "sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ==", - "cpu": [ - "x64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-freebsd-x64": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.2.tgz", - "integrity": "sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA==", - "cpu": [ - "x64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm-gnueabihf": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.2.tgz", - "integrity": "sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA==", - "cpu": [ - "arm" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm64-gnu": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.2.tgz", - "integrity": "sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A==", - "cpu": [ - "arm64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm64-musl": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.2.tgz", - "integrity": "sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==", - "cpu": [ - "arm64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-x64-gnu": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.2.tgz", - "integrity": "sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==", - "cpu": [ - "x64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-x64-musl": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.2.tgz", - "integrity": "sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==", - "cpu": [ - "x64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } + "license": "MIT" }, - "node_modules/lightningcss-win32-arm64-msvc": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.2.tgz", - "integrity": "sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==", - "cpu": [ - "arm64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "node_modules/lazystream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" } }, - "node_modules/lightningcss-win32-x64-msvc": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.2.tgz", - "integrity": "sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==", - "cpu": [ - "x64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 12.0.0" + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "engines": { + "node": ">= 0.8.0" } }, + "node_modules/libphonenumber-js": { + "version": "1.12.36", + "resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.12.36.tgz", + "integrity": "sha512-woWhKMAVx1fzzUnMCyOzglgSgf6/AFHLASdOBcchYCyvWSGWt12imw3iu2hdI5d4dGZRsNWAmWiz37sDKUPaRQ==", + "license": "MIT" + }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -8064,12 +5092,12 @@ "dev": true, "license": "MIT" }, - "node_modules/lodash.throttle": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", - "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==", - "license": "MIT", - "optional": true + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" }, "node_modules/loose-envify": { "version": "1.4.0", @@ -8087,16 +5115,26 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "devOptional": true, + "dev": true, "license": "ISC", "dependencies": { "yallist": "^3.0.2" } }, + "node_modules/lucide-react": { + "version": "0.552.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.552.0.tgz", + "integrity": "sha512-g9WCjmfwqbexSnZE+2cl21PCfXOcqnGeWeMTNAOGEfpPbm/ZF4YIq77Z8qWrxbu660EKuLB4nSLggoKnCb+isw==", + "license": "ISC", + "peerDependencies": { + "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, "node_modules/magic-string": { "version": "0.30.21", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, "license": "MIT", "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" @@ -8109,28 +5147,11 @@ "license": "Apache-2.0 OR MIT", "optional": true }, - "node_modules/makeerror": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", - "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", - "license": "BSD-3-Clause", - "optional": true, - "dependencies": { - "tmpl": "1.0.5" - } - }, - "node_modules/marky": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/marky/-/marky-1.3.0.tgz", - "integrity": "sha512-ocnPZQLNpvbedwTy9kNrQEsknEfgvcLMvOtz3sFeWApDq1MXH1TqkCIx58xlpESsfwQOnuBO9beyQuNGzVvuhQ==", - "license": "Apache-2.0", - "optional": true - }, "node_modules/math-intrinsics": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "devOptional": true, + "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -8148,433 +5169,18 @@ "safe-buffer": "^5.1.2" } }, - "node_modules/memoize-one": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", - "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==", - "license": "MIT", - "optional": true - }, - "node_modules/merge-options": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/merge-options/-/merge-options-3.0.4.tgz", - "integrity": "sha512-2Sug1+knBjkaMsMgf1ctR1Ujx+Ayku4EdJN4Z+C2+JzoeF7A3OZ9KM2GY0CpQS51NR61LTurMJrRKPhSs3ZRTQ==", - "license": "MIT", - "optional": true, - "dependencies": { - "is-plain-obj": "^2.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "license": "MIT", - "optional": true - }, - "node_modules/metro": { - "version": "0.83.3", - "resolved": "https://registry.npmjs.org/metro/-/metro-0.83.3.tgz", - "integrity": "sha512-+rP+/GieOzkt97hSJ0MrPOuAH/jpaS21ZDvL9DJ35QYRDlQcwzcvUlGUf79AnQxq/2NPiS/AULhhM4TKutIt8Q==", - "license": "MIT", - "optional": true, - "dependencies": { - "@babel/code-frame": "^7.24.7", - "@babel/core": "^7.25.2", - "@babel/generator": "^7.25.0", - "@babel/parser": "^7.25.3", - "@babel/template": "^7.25.0", - "@babel/traverse": "^7.25.3", - "@babel/types": "^7.25.2", - "accepts": "^1.3.7", - "chalk": "^4.0.0", - "ci-info": "^2.0.0", - "connect": "^3.6.5", - "debug": "^4.4.0", - "error-stack-parser": "^2.0.6", - "flow-enums-runtime": "^0.0.6", - "graceful-fs": "^4.2.4", - "hermes-parser": "0.32.0", - "image-size": "^1.0.2", - "invariant": "^2.2.4", - "jest-worker": "^29.7.0", - "jsc-safe-url": "^0.2.2", - "lodash.throttle": "^4.1.1", - "metro-babel-transformer": "0.83.3", - "metro-cache": "0.83.3", - "metro-cache-key": "0.83.3", - "metro-config": "0.83.3", - "metro-core": "0.83.3", - "metro-file-map": "0.83.3", - "metro-resolver": "0.83.3", - "metro-runtime": "0.83.3", - "metro-source-map": "0.83.3", - "metro-symbolicate": "0.83.3", - "metro-transform-plugins": "0.83.3", - "metro-transform-worker": "0.83.3", - "mime-types": "^2.1.27", - "nullthrows": "^1.1.1", - "serialize-error": "^2.1.0", - "source-map": "^0.5.6", - "throat": "^5.0.0", - "ws": "^7.5.10", - "yargs": "^17.6.2" - }, - "bin": { - "metro": "src/cli.js" - }, - "engines": { - "node": ">=20.19.4" - } - }, - "node_modules/metro-babel-transformer": { - "version": "0.83.3", - "resolved": "https://registry.npmjs.org/metro-babel-transformer/-/metro-babel-transformer-0.83.3.tgz", - "integrity": "sha512-1vxlvj2yY24ES1O5RsSIvg4a4WeL7PFXgKOHvXTXiW0deLvQr28ExXj6LjwCCDZ4YZLhq6HddLpZnX4dEdSq5g==", - "license": "MIT", - "optional": true, - "dependencies": { - "@babel/core": "^7.25.2", - "flow-enums-runtime": "^0.0.6", - "hermes-parser": "0.32.0", - "nullthrows": "^1.1.1" - }, - "engines": { - "node": ">=20.19.4" - } - }, - "node_modules/metro-cache": { - "version": "0.83.3", - "resolved": "https://registry.npmjs.org/metro-cache/-/metro-cache-0.83.3.tgz", - "integrity": "sha512-3jo65X515mQJvKqK3vWRblxDEcgY55Sk3w4xa6LlfEXgQ9g1WgMh9m4qVZVwgcHoLy0a2HENTPCCX4Pk6s8c8Q==", - "license": "MIT", - "optional": true, - "dependencies": { - "exponential-backoff": "^3.1.1", - "flow-enums-runtime": "^0.0.6", - "https-proxy-agent": "^7.0.5", - "metro-core": "0.83.3" - }, - "engines": { - "node": ">=20.19.4" - } - }, - "node_modules/metro-cache-key": { - "version": "0.83.3", - "resolved": "https://registry.npmjs.org/metro-cache-key/-/metro-cache-key-0.83.3.tgz", - "integrity": "sha512-59ZO049jKzSmvBmG/B5bZ6/dztP0ilp0o988nc6dpaDsU05Cl1c/lRf+yx8m9WW/JVgbmfO5MziBU559XjI5Zw==", - "license": "MIT", - "optional": true, - "dependencies": { - "flow-enums-runtime": "^0.0.6" - }, - "engines": { - "node": ">=20.19.4" - } - }, - "node_modules/metro-config": { - "version": "0.83.3", - "resolved": "https://registry.npmjs.org/metro-config/-/metro-config-0.83.3.tgz", - "integrity": "sha512-mTel7ipT0yNjKILIan04bkJkuCzUUkm2SeEaTads8VfEecCh+ltXchdq6DovXJqzQAXuR2P9cxZB47Lg4klriA==", - "license": "MIT", - "optional": true, - "dependencies": { - "connect": "^3.6.5", - "flow-enums-runtime": "^0.0.6", - "jest-validate": "^29.7.0", - "metro": "0.83.3", - "metro-cache": "0.83.3", - "metro-core": "0.83.3", - "metro-runtime": "0.83.3", - "yaml": "^2.6.1" - }, - "engines": { - "node": ">=20.19.4" - } - }, - "node_modules/metro-core": { - "version": "0.83.3", - "resolved": "https://registry.npmjs.org/metro-core/-/metro-core-0.83.3.tgz", - "integrity": "sha512-M+X59lm7oBmJZamc96usuF1kusd5YimqG/q97g4Ac7slnJ3YiGglW5CsOlicTR5EWf8MQFxxjDoB6ytTqRe8Hw==", - "license": "MIT", - "optional": true, - "dependencies": { - "flow-enums-runtime": "^0.0.6", - "lodash.throttle": "^4.1.1", - "metro-resolver": "0.83.3" - }, - "engines": { - "node": ">=20.19.4" - } - }, - "node_modules/metro-file-map": { - "version": "0.83.3", - "resolved": "https://registry.npmjs.org/metro-file-map/-/metro-file-map-0.83.3.tgz", - "integrity": "sha512-jg5AcyE0Q9Xbbu/4NAwwZkmQn7doJCKGW0SLeSJmzNB9Z24jBe0AL2PHNMy4eu0JiKtNWHz9IiONGZWq7hjVTA==", - "license": "MIT", - "optional": true, - "dependencies": { - "debug": "^4.4.0", - "fb-watchman": "^2.0.0", - "flow-enums-runtime": "^0.0.6", - "graceful-fs": "^4.2.4", - "invariant": "^2.2.4", - "jest-worker": "^29.7.0", - "micromatch": "^4.0.4", - "nullthrows": "^1.1.1", - "walker": "^1.0.7" - }, - "engines": { - "node": ">=20.19.4" - } - }, - "node_modules/metro-minify-terser": { - "version": "0.83.3", - "resolved": "https://registry.npmjs.org/metro-minify-terser/-/metro-minify-terser-0.83.3.tgz", - "integrity": "sha512-O2BmfWj6FSfzBLrNCXt/rr2VYZdX5i6444QJU0fFoc7Ljg+Q+iqebwE3K0eTvkI6TRjELsXk1cjU+fXwAR4OjQ==", - "license": "MIT", - "optional": true, - "dependencies": { - "flow-enums-runtime": "^0.0.6", - "terser": "^5.15.0" - }, - "engines": { - "node": ">=20.19.4" - } - }, - "node_modules/metro-resolver": { - "version": "0.83.3", - "resolved": "https://registry.npmjs.org/metro-resolver/-/metro-resolver-0.83.3.tgz", - "integrity": "sha512-0js+zwI5flFxb1ktmR///bxHYg7OLpRpWZlBBruYG8OKYxeMP7SV0xQ/o/hUelrEMdK4LJzqVtHAhBm25LVfAQ==", - "license": "MIT", - "optional": true, - "dependencies": { - "flow-enums-runtime": "^0.0.6" - }, - "engines": { - "node": ">=20.19.4" - } - }, - "node_modules/metro-runtime": { - "version": "0.83.3", - "resolved": "https://registry.npmjs.org/metro-runtime/-/metro-runtime-0.83.3.tgz", - "integrity": "sha512-JHCJb9ebr9rfJ+LcssFYA2x1qPYuSD/bbePupIGhpMrsla7RCwC/VL3yJ9cSU+nUhU4c9Ixxy8tBta+JbDeZWw==", - "license": "MIT", - "optional": true, - "dependencies": { - "@babel/runtime": "^7.25.0", - "flow-enums-runtime": "^0.0.6" - }, - "engines": { - "node": ">=20.19.4" - } - }, - "node_modules/metro-source-map": { - "version": "0.83.3", - "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.83.3.tgz", - "integrity": "sha512-xkC3qwUBh2psVZgVavo8+r2C9Igkk3DibiOXSAht1aYRRcztEZNFtAMtfSB7sdO2iFMx2Mlyu++cBxz/fhdzQg==", - "license": "MIT", - "optional": true, - "dependencies": { - "@babel/traverse": "^7.25.3", - "@babel/traverse--for-generate-function-map": "npm:@babel/traverse@^7.25.3", - "@babel/types": "^7.25.2", - "flow-enums-runtime": "^0.0.6", - "invariant": "^2.2.4", - "metro-symbolicate": "0.83.3", - "nullthrows": "^1.1.1", - "ob1": "0.83.3", - "source-map": "^0.5.6", - "vlq": "^1.0.0" - }, - "engines": { - "node": ">=20.19.4" - } - }, - "node_modules/metro-symbolicate": { - "version": "0.83.3", - "resolved": "https://registry.npmjs.org/metro-symbolicate/-/metro-symbolicate-0.83.3.tgz", - "integrity": "sha512-F/YChgKd6KbFK3eUR5HdUsfBqVsanf5lNTwFd4Ca7uuxnHgBC3kR/Hba/RGkenR3pZaGNp5Bu9ZqqP52Wyhomw==", - "license": "MIT", - "optional": true, - "dependencies": { - "flow-enums-runtime": "^0.0.6", - "invariant": "^2.2.4", - "metro-source-map": "0.83.3", - "nullthrows": "^1.1.1", - "source-map": "^0.5.6", - "vlq": "^1.0.0" - }, - "bin": { - "metro-symbolicate": "src/index.js" - }, - "engines": { - "node": ">=20.19.4" - } - }, - "node_modules/metro-transform-plugins": { - "version": "0.83.3", - "resolved": "https://registry.npmjs.org/metro-transform-plugins/-/metro-transform-plugins-0.83.3.tgz", - "integrity": "sha512-eRGoKJU6jmqOakBMH5kUB7VitEWiNrDzBHpYbkBXW7C5fUGeOd2CyqrosEzbMK5VMiZYyOcNFEphvxk3OXey2A==", - "license": "MIT", - "optional": true, - "dependencies": { - "@babel/core": "^7.25.2", - "@babel/generator": "^7.25.0", - "@babel/template": "^7.25.0", - "@babel/traverse": "^7.25.3", - "flow-enums-runtime": "^0.0.6", - "nullthrows": "^1.1.1" - }, - "engines": { - "node": ">=20.19.4" - } - }, - "node_modules/metro-transform-worker": { - "version": "0.83.3", - "resolved": "https://registry.npmjs.org/metro-transform-worker/-/metro-transform-worker-0.83.3.tgz", - "integrity": "sha512-Ztekew9t/gOIMZX1tvJOgX7KlSLL5kWykl0Iwu2cL2vKMKVALRl1hysyhUw0vjpAvLFx+Kfq9VLjnHIkW32fPA==", - "license": "MIT", - "optional": true, - "dependencies": { - "@babel/core": "^7.25.2", - "@babel/generator": "^7.25.0", - "@babel/parser": "^7.25.3", - "@babel/types": "^7.25.2", - "flow-enums-runtime": "^0.0.6", - "metro": "0.83.3", - "metro-babel-transformer": "0.83.3", - "metro-cache": "0.83.3", - "metro-cache-key": "0.83.3", - "metro-minify-terser": "0.83.3", - "metro-source-map": "0.83.3", - "metro-transform-plugins": "0.83.3", - "nullthrows": "^1.1.1" - }, - "engines": { - "node": ">=20.19.4" - } - }, - "node_modules/metro/node_modules/ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "license": "MIT", - "optional": true - }, - "node_modules/metro/node_modules/ws": { - "version": "7.5.10", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", - "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "license": "MIT", - "optional": true, - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/micromatch/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/miller-rabin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", - "dev": true, - "license": "MIT", - "dependencies": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" - }, - "bin": { - "miller-rabin": "bin/miller-rabin" - } - }, - "node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "license": "MIT", - "optional": true, - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "license": "MIT", - "optional": true, - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "node_modules/miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dev": true, "license": "MIT", - "optional": true, - "engines": { - "node": ">=10" + "dependencies": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "bin": { + "miller-rabin": "bin/miller-rabin" } }, "node_modules/minimalistic-assert": { @@ -8605,16 +5211,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "license": "MIT", - "optional": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/minipass": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", @@ -8625,59 +5221,13 @@ "node": ">=16 || 14 >=14.17" } }, - "node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "license": "MIT", - "optional": true, - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/mkdirp-classic": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", - "license": "MIT", - "optional": true - }, - "node_modules/mortice": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/mortice/-/mortice-3.3.1.tgz", - "integrity": "sha512-t3oESfijIPGsmsdLEKjF+grHfrbnKSXflJtgb1wY14cjxZpS6GnhHRXTxxzCAoCCnq1YYfpEPwY3gjiCPhOufQ==", - "license": "Apache-2.0 OR MIT", - "optional": true, - "dependencies": { - "abort-error": "^1.0.0", - "it-queue": "^1.1.0", - "main-event": "^1.0.0" - } - }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "devOptional": true, + "dev": true, "license": "MIT" }, - "node_modules/multicast-dns": { - "version": "7.2.5", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", - "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", - "license": "MIT", - "optional": true, - "dependencies": { - "dns-packet": "^5.2.2", - "thunky": "^1.0.2" - }, - "bin": { - "multicast-dns": "cli.js" - } - }, "node_modules/multiformats": { "version": "13.4.2", "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-13.4.2.tgz", @@ -8685,114 +5235,18 @@ "license": "Apache-2.0 OR MIT", "optional": true }, - "node_modules/nanoid": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.1.6.tgz", - "integrity": "sha512-c7+7RQ+dMB5dPwwCp4ee1/iV/q2P6aK1mTZcfr1BTuVlyW9hJYiMPybJCcnBlQtuSmTIWNeazm/zqNoZSSElBg==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "optional": true, - "bin": { - "nanoid": "bin/nanoid.js" - }, - "engines": { - "node": "^18 || >=20" - } - }, - "node_modules/napi-build-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-2.0.0.tgz", - "integrity": "sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==", - "license": "MIT", - "optional": true - }, - "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/netmask": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", - "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/node-abi": { - "version": "3.87.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.87.0.tgz", - "integrity": "sha512-+CGM1L1CgmtheLcBuleyYOn7NWPVu0s0EJH2C4puxgEZb9h8QpR9G2dBfZJOAUhi7VQxuBPMd0hiISWcTyiYyQ==", - "license": "MIT", - "optional": true, - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/node-abi/node_modules/semver": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", - "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", - "license": "ISC", - "optional": true, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/node-datachannel": { - "version": "0.29.0", - "resolved": "https://registry.npmjs.org/node-datachannel/-/node-datachannel-0.29.0.tgz", - "integrity": "sha512-aCRJA5uZRqxMvQAl2QtOnCkodF1qJa1dCUVaXW9D7rku2p6F7PWe5OuRLcIgOYe+e2ZyJu0LefIQ95TtCn6xxA==", - "hasInstallScript": true, - "license": "MPL 2.0", - "optional": true, - "dependencies": { - "prebuild-install": "^7.1.3" - }, - "engines": { - "node": ">=18.20.0" - } - }, - "node_modules/node-forge": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.3.tgz", - "integrity": "sha512-rLvcdSyRCyouf6jcOIPe/BgwG/d7hKjzMKOas33/pHEr6gbq18IK9zV7DiPvzsz0oBJPme6qr6H6kGZuI9/DZg==", - "license": "(BSD-3-Clause OR GPL-2.0)", - "optional": true, - "engines": { - "node": ">= 6.13.0" - } - }, - "node_modules/node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", - "license": "MIT", - "optional": true + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" }, "node_modules/node-releases": { "version": "2.0.27", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", - "devOptional": true, + "dev": true, "license": "MIT" }, "node_modules/node-stdlib-browser": { @@ -8878,32 +5332,12 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "devOptional": true, + "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" } }, - "node_modules/nullthrows": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/nullthrows/-/nullthrows-1.1.1.tgz", - "integrity": "sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==", - "license": "MIT", - "optional": true - }, - "node_modules/ob1": { - "version": "0.83.3", - "resolved": "https://registry.npmjs.org/ob1/-/ob1-0.83.3.tgz", - "integrity": "sha512-egUxXCDwoWG06NGCS5s5AdcpnumHKJlfd3HH06P3m9TEMwwScfcY35wpQxbm9oHof+dM/lVH9Rfyu1elTVelSA==", - "license": "MIT", - "optional": true, - "dependencies": { - "flow-enums-runtime": "^0.0.6" - }, - "engines": { - "node": ">=20.19.4" - } - }, "node_modules/object-inspect": { "version": "1.13.4", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", @@ -8965,44 +5399,22 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", - "license": "MIT", - "optional": true, - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "license": "ISC", - "optional": true, - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/open": { - "version": "7.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", - "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, "license": "MIT", - "optional": true, "dependencies": { - "is-docker": "^2.0.0", - "is-wsl": "^2.1.1" + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 0.8.0" } }, "node_modules/os-browserify": { @@ -9012,35 +5424,6 @@ "dev": true, "license": "MIT" }, - "node_modules/p-defer": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-4.0.1.tgz", - "integrity": "sha512-Mr5KC5efvAK5VUptYEIopP1bakB85k2IWXaRC0rsh1uwn1L6M0LVml8OIQ4Gudg4oyZakf7FmeRLkMMtZW1i5A==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-event": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/p-event/-/p-event-7.1.0.tgz", - "integrity": "sha512-/lkPs5W1aC3cp6vqZefpdosOn65J571sWodyfOQiF0+tmDCpU+H8Atwpu0vQROCVUlZuToDN5eyTLsMLLc54mg==", - "license": "MIT", - "optional": true, - "dependencies": { - "p-timeout": "^7.0.1" - }, - "engines": { - "node": ">=20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -9090,22 +5473,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/p-retry": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-7.1.1.tgz", - "integrity": "sha512-J5ApzjyRkkf601HpEeykoiCvzHQjWxPAHhyjFcEUP2SWq0+35NKh8TLhpLw+Dkq5TZBFvUM6UigdE9hIVYTl5w==", - "license": "MIT", - "optional": true, - "dependencies": { - "is-network-error": "^1.1.0" - }, - "engines": { - "node": ">=20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/p-timeout": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-7.0.1.tgz", @@ -9119,29 +5486,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/p-wait-for": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/p-wait-for/-/p-wait-for-6.0.0.tgz", - "integrity": "sha512-2kKzMtjS8TVcpCOU/gr3vZ4K/WIyS1AsEFXFWapM/0lERCdyTbB6ZeuCIp+cL1aeLZfQoMdZFCBTHiK4I9UtOw==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/package-json-from-dist": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", @@ -9156,6 +5500,19 @@ "dev": true, "license": "(MIT AND Zlib)" }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/parse-asn1": { "version": "5.1.9", "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.9.tgz", @@ -9173,16 +5530,6 @@ "node": ">= 0.10" } }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/path-browserify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", @@ -9194,27 +5541,17 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "devOptional": true, + "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "devOptional": true, + "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -9273,15 +5610,15 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, "license": "ISC" }, "node_modules/picomatch": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "devOptional": true, + "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -9289,16 +5626,6 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/pirates": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", - "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">= 6" - } - }, "node_modules/pkg-dir": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-5.0.0.tgz", @@ -9326,6 +5653,7 @@ "version": "8.5.6", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "dev": true, "funding": [ { "type": "opencollective", @@ -9341,7 +5669,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", @@ -9351,91 +5678,40 @@ "node": "^10 || ^12 || >=14" } }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true, - "license": "MIT" - }, "node_modules/postcss/node_modules/nanoid": { "version": "3.3.11", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "dev": true, "funding": [ { "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/prebuild-install": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.3.tgz", - "integrity": "sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==", - "license": "MIT", - "optional": true, - "dependencies": { - "detect-libc": "^2.0.0", - "expand-template": "^2.0.3", - "github-from-package": "0.0.0", - "minimist": "^1.2.3", - "mkdirp-classic": "^0.5.3", - "napi-build-utils": "^2.0.0", - "node-abi": "^3.3.0", - "pump": "^3.0.0", - "rc": "^1.2.7", - "simple-get": "^4.0.0", - "tar-fs": "^2.0.0", - "tunnel-agent": "^0.6.0" - }, - "bin": { - "prebuild-install": "bin.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "url": "https://github.com/sponsors/ai" + } + ], "license": "MIT", - "optional": true, - "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" + "bin": { + "nanoid": "bin/nanoid.cjs" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, "license": "MIT", - "optional": true, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": ">= 0.8.0" } }, "node_modules/process": { "version": "0.11.10", "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", - "devOptional": true, + "dev": true, "license": "MIT", "engines": { "node": ">= 0.6.0" @@ -9455,16 +5731,6 @@ "license": "Apache-2.0 OR MIT", "optional": true }, - "node_modules/promise": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", - "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", - "license": "MIT", - "optional": true, - "dependencies": { - "asap": "~2.0.6" - } - }, "node_modules/protons-runtime": { "version": "5.6.0", "resolved": "https://registry.npmjs.org/protons-runtime/-/protons-runtime-5.6.0.tgz", @@ -9477,13 +5743,6 @@ "uint8arrays": "^5.0.1" } }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "license": "MIT", - "optional": true - }, "node_modules/public-encrypt": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", @@ -9499,17 +5758,6 @@ "safe-buffer": "^5.1.2" } }, - "node_modules/pump": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz", - "integrity": "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==", - "license": "MIT", - "optional": true, - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, "node_modules/punycode": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", @@ -9517,26 +5765,6 @@ "dev": true, "license": "MIT" }, - "node_modules/pvtsutils": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/pvtsutils/-/pvtsutils-1.3.6.tgz", - "integrity": "sha512-PLgQXQ6H2FWCaeRak8vvk1GW462lMxB5s3Jm673N82zI4vqtVUPuZdffdZbPDFRoU8kAhItWFtPCWiPpp4/EDg==", - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.8.1" - } - }, - "node_modules/pvutils": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/pvutils/-/pvutils-1.1.5.tgz", - "integrity": "sha512-KTqnxsgGiQ6ZAzZCVlJH5eOjSnvlyEgx1m8bkRJfOhmGRqfo5KLvmAlACQkrjEtOQ4B7wF9TdSLIs9O90MX9xA==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=16.0.0" - } - }, "node_modules/qs": { "version": "6.14.2", "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.2.tgz", @@ -9562,46 +5790,6 @@ "node": ">=0.4.x" } }, - "node_modules/queue": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz", - "integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==", - "license": "MIT", - "optional": true, - "dependencies": { - "inherits": "~2.0.3" - } - }, - "node_modules/race-event": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/race-event/-/race-event-1.6.1.tgz", - "integrity": "sha512-vi7WH5g5KoTFpu2mme/HqZiWH14XSOtg5rfp6raBskBHl7wnmy3F/biAIyY5MsK+BHWhoPhxtZ1Y2R7OHHaWyQ==", - "license": "Apache-2.0 OR MIT", - "optional": true, - "dependencies": { - "abort-error": "^1.0.1" - } - }, - "node_modules/race-signal": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/race-signal/-/race-signal-2.0.0.tgz", - "integrity": "sha512-P31bLhE4ByBX/70QDXMutxnqgwrF1WUXea1O8DXuviAgkdbQ1iQMQotNgzJIBC9yUSn08u/acZrMUhgw7w6GpA==", - "license": "Apache-2.0 OR MIT", - "optional": true - }, - "node_modules/random-int": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/random-int/-/random-int-3.1.0.tgz", - "integrity": "sha512-h8CRz8cpvzj0hC/iH/1Gapgcl2TQ6xtnCpyOI5WvWfXf/yrDx2DOU+tD9rX23j36IF11xg1KqB9W11Z18JPMdw==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", @@ -9623,38 +5811,11 @@ "safe-buffer": "^5.1.0" } }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", - "optional": true, - "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "bin": { - "rc": "cli.js" - } - }, "node_modules/react": { "version": "18.3.1", "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", "license": "MIT", - "peer": true, "dependencies": { "loose-envify": "^1.1.0" }, @@ -9662,39 +5823,6 @@ "node": ">=0.10.0" } }, - "node_modules/react-devtools-core": { - "version": "6.1.5", - "resolved": "https://registry.npmjs.org/react-devtools-core/-/react-devtools-core-6.1.5.tgz", - "integrity": "sha512-ePrwPfxAnB+7hgnEr8vpKxL9cmnp7F322t8oqcPshbIQQhDKgFDW4tjhF2wjVbdXF9O/nyuy3sQWd9JGpiLPvA==", - "license": "MIT", - "optional": true, - "dependencies": { - "shell-quote": "^1.6.1", - "ws": "^7" - } - }, - "node_modules/react-devtools-core/node_modules/ws": { - "version": "7.5.10", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", - "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, "node_modules/react-dom": { "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", @@ -9708,13 +5836,6 @@ "react": "^18.3.1" } }, - "node_modules/react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "license": "MIT", - "optional": true - }, "node_modules/react-refresh": { "version": "0.17.0", "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz", @@ -9729,7 +5850,7 @@ "version": "4.7.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", - "devOptional": true, + "dev": true, "license": "MIT", "dependencies": { "abort-controller": "^3.0.0", @@ -9765,30 +5886,6 @@ "node": ">=10" } }, - "node_modules/reflect-metadata": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz", - "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==", - "license": "Apache-2.0", - "optional": true - }, - "node_modules/regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", - "license": "MIT", - "optional": true - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/resolve": { "version": "1.22.11", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", @@ -9811,83 +5908,13 @@ } }, "node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/retimeable-signal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/retimeable-signal/-/retimeable-signal-1.0.1.tgz", - "integrity": "sha512-Cy26CYfbWnYu8HMoJeDhaMpW/EYFIbne3vMf6G9RSrOyWYXbPehja/BEdzpqmM84uy2bfBD7NPZhoQ4GZEtgvg==", - "license": "Apache-2.0 OR MIT", - "optional": true - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "license": "ISC", - "optional": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rimraf/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, "license": "MIT", - "optional": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/rimraf/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", - "license": "ISC", - "optional": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rimraf/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "license": "ISC", - "optional": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, "engines": { - "node": "*" + "node": ">=4" } }, "node_modules/ripemd160": { @@ -10016,7 +6043,7 @@ "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "devOptional": true, + "dev": true, "funding": [ { "type": "github", @@ -10051,26 +6078,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/sanitize-filename": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.3.tgz", - "integrity": "sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==", - "license": "WTFPL OR ISC", - "optional": true, - "dependencies": { - "truncate-utf8-bytes": "^1.0.0" - } - }, - "node_modules/sax": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.4.tgz", - "integrity": "sha512-1n3r/tGXO6b6VXMdFT54SHzT9ytu9yr7TaELowdYpMqY/Ao7EnlQGmAQ1+RatX7Tkkdm6hONI2owqNx2aZj5Sw==", - "license": "BlueOak-1.0.0", - "optional": true, - "engines": { - "node": ">=11.0.0" - } - }, "node_modules/scheduler": { "version": "0.23.2", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", @@ -10084,123 +6091,12 @@ "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "devOptional": true, + "dev": true, "license": "ISC", "bin": { "semver": "bin/semver.js" } }, - "node_modules/send": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/send/-/send-0.19.2.tgz", - "integrity": "sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==", - "license": "MIT", - "optional": true, - "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "~0.5.2", - "http-errors": "~2.0.1", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "~2.4.1", - "range-parser": "~1.2.1", - "statuses": "~2.0.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/send/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", - "optional": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/send/node_modules/debug/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT", - "optional": true - }, - "node_modules/send/node_modules/encodeurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/send/node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "license": "MIT", - "optional": true, - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/send/node_modules/statuses": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", - "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/serialize-error": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-2.1.0.tgz", - "integrity": "sha512-ghgmKt5o4Tly5yEG/UJp8qTd0AN7Xalw4XBtDEKP655B699qMEtra1WlXeE6WIvdEG481JvRxULKsInq/iNysw==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/serve-static": { - "version": "1.16.3", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.3.tgz", - "integrity": "sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==", - "license": "MIT", - "optional": true, - "dependencies": { - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "~0.19.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/serve-static/node_modules/encodeurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/set-function-length": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", @@ -10226,13 +6122,6 @@ "dev": true, "license": "MIT" }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "license": "ISC", - "optional": true - }, "node_modules/sha.js": { "version": "2.4.12", "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.12.tgz", @@ -10258,7 +6147,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "devOptional": true, + "dev": true, "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" @@ -10271,25 +6160,12 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "devOptional": true, + "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/shell-quote": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz", - "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/side-channel": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", @@ -10379,163 +6255,16 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/simple-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", - "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "optional": true - }, - "node_modules/simple-get": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", - "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "optional": true, - "dependencies": { - "decompress-response": "^6.0.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "license": "BSD-3-Clause", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/source-map-js": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "license": "MIT", - "optional": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/source-map-support/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "license": "BSD-3-Clause", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "license": "BSD-3-Clause", - "optional": true - }, - "node_modules/stack-utils": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", - "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", - "license": "MIT", - "optional": true, - "dependencies": { - "escape-string-regexp": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/stack-utils/node_modules/escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/stackframe": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", - "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==", - "license": "MIT", - "optional": true - }, - "node_modules/stacktrace-parser": { - "version": "0.1.11", - "resolved": "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.11.tgz", - "integrity": "sha512-WjlahMgHmCJpqzU8bIBy4qtsZdU9lRlcZE3Lvyej6t4tuOuv1vk57OW3MBrj6hXBFx/nNoC9MPMTcr5YA7NQbg==", - "license": "MIT", - "optional": true, - "dependencies": { - "type-fest": "^0.7.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">= 0.6" - } - }, "node_modules/stream-browserify": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz", @@ -10606,7 +6335,7 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "devOptional": true, + "dev": true, "license": "MIT", "dependencies": { "safe-buffer": "~5.2.0" @@ -10717,28 +6446,13 @@ } }, "node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/super-regex": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/super-regex/-/super-regex-0.2.0.tgz", - "integrity": "sha512-WZzIx3rC1CvbMDloLsVw0lkZVKJWbrkJ0k1ghKFmcnPrW1+jWbgTkTEWVtD9lMdmI4jZEz40+naBxl1dCUhXXw==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, "license": "MIT", - "optional": true, - "dependencies": { - "clone-regexp": "^3.0.0", - "function-timeout": "^0.1.0", - "time-span": "^5.1.0" - }, "engines": { - "node": ">=14.16" + "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -10774,12 +6488,14 @@ "version": "4.1.18", "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.18.tgz", "integrity": "sha512-4+Z+0yiYyEtUVCScyfHCxOYP06L5Ne+JiHhY2IjR2KWMIWhJOYZKLSGZaP5HkZ8+bY0cxfzwDE5uOmzFXyIwxw==", + "dev": true, "license": "MIT" }, "node_modules/tapable": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", + "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -10789,51 +6505,6 @@ "url": "https://opencollective.com/webpack" } }, - "node_modules/tar-fs": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.4.tgz", - "integrity": "sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==", - "license": "MIT", - "optional": true, - "dependencies": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^2.1.4" - } - }, - "node_modules/tar-fs/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "license": "MIT", - "optional": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/tar-fs/node_modules/tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "license": "MIT", - "optional": true, - "dependencies": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/tar-stream": { "version": "3.1.7", "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", @@ -10861,93 +6532,6 @@ } } }, - "node_modules/terser": { - "version": "5.46.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.46.0.tgz", - "integrity": "sha512-jTwoImyr/QbOWFFso3YoU3ik0jBBDJ6JTOQiy/J2YxVJdZCc+5u7skhNwiOR3FQIygFqVUPHl7qbbxtjW2K3Qg==", - "license": "BSD-2-Clause", - "optional": true, - "dependencies": { - "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.15.0", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/terser/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "license": "MIT", - "optional": true - }, - "node_modules/test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "license": "ISC", - "optional": true, - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/test-exclude/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "license": "MIT", - "optional": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/test-exclude/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", - "license": "ISC", - "optional": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/test-exclude/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "license": "ISC", - "optional": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, "node_modules/text-decoder": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.3.tgz", @@ -10973,36 +6557,6 @@ } } }, - "node_modules/throat": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", - "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", - "license": "MIT", - "optional": true - }, - "node_modules/thunky": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", - "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", - "license": "MIT", - "optional": true - }, - "node_modules/time-span": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/time-span/-/time-span-5.1.0.tgz", - "integrity": "sha512-75voc/9G4rDIJleOo4jPvN4/YC4GRZrY8yy1uU4lwrB3XEQbWve8zXoO5No4eFrGcTAMYyoY67p8jRQdtA1HbA==", - "license": "MIT", - "optional": true, - "dependencies": { - "convert-hrtime": "^5.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/timers-browserify": { "version": "2.0.12", "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", @@ -11030,8 +6584,8 @@ "version": "0.2.15", "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "dev": true, "license": "MIT", - "optional": true, "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.3" @@ -11043,13 +6597,6 @@ "url": "https://github.com/sponsors/SuperchupuDev" } }, - "node_modules/tmpl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", - "license": "BSD-3-Clause", - "optional": true - }, "node_modules/to-buffer": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.2.2.tgz", @@ -11065,63 +6612,24 @@ "node": ">= 0.4" } }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "license": "MIT", - "optional": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.6" - } - }, - "node_modules/truncate-utf8-bytes": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", - "integrity": "sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==", - "license": "WTFPL", - "optional": true, - "dependencies": { - "utf8-byte-length": "^1.0.1" - } - }, - "node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD", - "optional": true - }, - "node_modules/tsyringe": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/tsyringe/-/tsyringe-4.10.0.tgz", - "integrity": "sha512-axr3IdNuVIxnaK5XGEUFTu3YmAQ6lllgrvqfEoR16g/HGnYY/6We4oWENtAnzK6/LpJ2ur9PAb80RBt7/U4ugw==", + "node_modules/ts-api-utils": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.4.0.tgz", + "integrity": "sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==", + "dev": true, "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^1.9.3" - }, "engines": { - "node": ">= 6.0.0" + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" } }, - "node_modules/tsyringe/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, "license": "0BSD", "optional": true }, @@ -11132,37 +6640,17 @@ "dev": true, "license": "MIT" }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", - "license": "Apache-2.0", - "optional": true, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", "dependencies": { - "safe-buffer": "^5.0.1" + "prelude-ls": "^1.2.1" }, "engines": { - "node": "*" - } - }, - "node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/type-fest": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz", - "integrity": "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==", - "license": "(MIT OR CC0-1.0)", - "optional": true, - "engines": { - "node": ">=8" + "node": ">= 0.8.0" } }, "node_modules/typed-array-buffer": { @@ -11194,6 +6682,30 @@ "node": ">=14.17" } }, + "node_modules/typescript-eslint": { + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.56.1.tgz", + "integrity": "sha512-U4lM6pjmBX7J5wk4szltF7I1cGBHXZopnAXCMXb3+fZ3B/0Z3hq3wS/CCUB2NZBNAExK92mCU2tEohWuwVMsDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.56.1", + "@typescript-eslint/parser": "8.56.1", + "@typescript-eslint/typescript-estree": "8.56.1", + "@typescript-eslint/utils": "8.56.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, "node_modules/uint8-varint": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/uint8-varint/-/uint8-varint-2.0.4.tgz", @@ -11225,51 +6737,18 @@ "multiformats": "^13.0.0" } }, - "node_modules/undici": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-7.21.0.tgz", - "integrity": "sha512-Hn2tCQpoDt1wv23a68Ctc8Cr/BHpUSfaPYrkajTXOS9IKpxVRx/X5m1K2YkbK2ipgZgxXSgsUinl3x+2YdSSfg==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=20.18.1" - } - }, "node_modules/undici-types": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", - "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", - "license": "MIT", - "optional": true - }, - "node_modules/unlimited-timeout": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/unlimited-timeout/-/unlimited-timeout-0.1.0.tgz", - "integrity": "sha512-D4g+mxFeQGQHzCfnvij+R35ukJ0658Zzudw7j16p4tBBbNasKkKM4SocYxqhwT5xA7a9JYWDzKkEFyMlRi5sng==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">= 0.8" - } + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz", + "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==", + "dev": true, + "license": "MIT" }, "node_modules/update-browserslist-db": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", - "devOptional": true, + "dev": true, "funding": [ { "type": "opencollective", @@ -11296,6 +6775,26 @@ "browserslist": ">= 4.21.0" } }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/uri-js/node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/url": { "version": "0.11.4", "resolved": "https://registry.npmjs.org/url/-/url-0.11.4.tgz", @@ -11310,13 +6809,6 @@ "node": ">= 0.4" } }, - "node_modules/utf8-byte-length": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.5.tgz", - "integrity": "sha512-Xn0w3MtiQ6zoz2vFyUVruaCL53O/DwUvkEeOvj+uulMm0BkUGYWmBYVyElqZaSLhY6ZD0ulfU3aBra2aVT4xfA==", - "license": "(WTFPL OR MIT)", - "optional": true - }, "node_modules/utf8-codec": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/utf8-codec/-/utf8-codec-1.0.0.tgz", @@ -11342,19 +6834,9 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "devOptional": true, + "dev": true, "license": "MIT" }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">= 0.4.0" - } - }, "node_modules/uuid": { "version": "13.0.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-13.0.0.tgz", @@ -11369,22 +6851,24 @@ } }, "node_modules/vite": { - "version": "5.4.21", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.21.tgz", - "integrity": "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==", + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.1.tgz", + "integrity": "sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "esbuild": "^0.21.3", - "postcss": "^8.4.43", - "rollup": "^4.20.0" + "esbuild": "^0.25.0", + "fdir": "^6.4.4", + "picomatch": "^4.0.2", + "postcss": "^8.5.3", + "rollup": "^4.34.9", + "tinyglobby": "^0.2.13" }, "bin": { "vite": "bin/vite.js" }, "engines": { - "node": "^18.0.0 || >=20.0.0" + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" }, "funding": { "url": "https://github.com/vitejs/vite?sponsor=1" @@ -11393,19 +6877,25 @@ "fsevents": "~2.3.3" }, "peerDependencies": { - "@types/node": "^18.0.0 || >=20.0.0", + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "sass-embedded": "*", "stylus": "*", "sugarss": "*", - "terser": "^5.4.0" + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" }, "peerDependenciesMeta": { "@types/node": { "optional": true }, + "jiti": { + "optional": true + }, "less": { "optional": true }, @@ -11426,6 +6916,12 @@ }, "terser": { "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true } } }, @@ -11446,13 +6942,6 @@ "vite": "^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" } }, - "node_modules/vlq": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/vlq/-/vlq-1.0.1.tgz", - "integrity": "sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w==", - "license": "MIT", - "optional": true - }, "node_modules/vm-browserify": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", @@ -11460,16 +6949,6 @@ "dev": true, "license": "MIT" }, - "node_modules/walker": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", - "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "makeerror": "1.0.12" - } - }, "node_modules/weald": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/weald/-/weald-1.1.1.tgz", @@ -11491,46 +6970,11 @@ "node": ">=18" } }, - "node_modules/webcrypto-core": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/webcrypto-core/-/webcrypto-core-1.8.1.tgz", - "integrity": "sha512-P+x1MvlNCXlKbLSOY4cYrdreqPG5hbzkmawbcXLKN/mf6DZW0SdNNkZ+sjwsqVkI4A4Ko2sPZmkZtCKY58w83A==", - "license": "MIT", - "optional": true, - "dependencies": { - "@peculiar/asn1-schema": "^2.3.13", - "@peculiar/json-schema": "^1.1.12", - "asn1js": "^3.0.5", - "pvtsutils": "^1.3.5", - "tslib": "^2.7.0" - } - }, - "node_modules/whatwg-fetch": { - "version": "3.6.20", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz", - "integrity": "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==", - "license": "MIT", - "optional": true - }, - "node_modules/wherearewe": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/wherearewe/-/wherearewe-2.0.1.tgz", - "integrity": "sha512-XUguZbDxCA2wBn2LoFtcEhXL6AXo+hVjGonwhSTTTU9SzbWG8Xu3onNIpzf9j/mYUcJQ0f+m37SzG77G851uFw==", - "license": "Apache-2.0 OR MIT", - "optional": true, - "dependencies": { - "is-electron": "^2.2.0" - }, - "engines": { - "node": ">=16.0.0", - "npm": ">=7.0.0" - } - }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "devOptional": true, + "dev": true, "license": "ISC", "dependencies": { "isexe": "^2.0.0" @@ -11564,6 +7008,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/wrap-ansi": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", @@ -11662,80 +7116,6 @@ "node": ">=8" } }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "license": "ISC", - "optional": true - }, - "node_modules/write-file-atomic": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", - "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", - "license": "ISC", - "optional": true, - "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/write-file-atomic/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "license": "ISC", - "optional": true - }, - "node_modules/ws": { - "version": "8.19.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.19.0.tgz", - "integrity": "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==", - "license": "MIT", - "optional": true, - "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 - } - } - }, - "node_modules/xml2js": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.6.2.tgz", - "integrity": "sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==", - "license": "MIT", - "optional": true, - "dependencies": { - "sax": ">=0.6.0", - "xmlbuilder": "~11.0.0" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/xmlbuilder": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", - "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=4.0" - } - }, "node_modules/xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", @@ -11746,113 +7126,13 @@ "node": ">=0.4" } }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "license": "ISC", - "optional": true, - "engines": { - "node": ">=10" - } - }, "node_modules/yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "devOptional": true, + "dev": true, "license": "ISC" }, - "node_modules/yaml": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.2.tgz", - "integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==", - "license": "ISC", - "optional": true, - "bin": { - "yaml": "bin.mjs" - }, - "engines": { - "node": ">= 14.6" - }, - "funding": { - "url": "https://github.com/sponsors/eemeli" - } - }, - "node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "license": "MIT", - "optional": true, - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "license": "ISC", - "optional": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT", - "optional": true - }, - "node_modules/yargs/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "license": "MIT", - "optional": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "optional": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", @@ -11880,35 +7160,6 @@ "engines": { "node": ">= 14" } - }, - "node_modules/zustand": { - "version": "5.0.11", - "resolved": "https://registry.npmjs.org/zustand/-/zustand-5.0.11.tgz", - "integrity": "sha512-fdZY+dk7zn/vbWNCYmzZULHRrss0jx5pPFiOuMZ/5HJN6Yv3u+1Wswy/4MpZEkEGhtNH+pwxZB8OKgUBPzYAGg==", - "license": "MIT", - "engines": { - "node": ">=12.20.0" - }, - "peerDependencies": { - "@types/react": ">=18.0.0", - "immer": ">=9.0.6", - "react": ">=18.0.0", - "use-sync-external-store": ">=1.2.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "immer": { - "optional": true - }, - "react": { - "optional": true - }, - "use-sync-external-store": { - "optional": true - } - } } } } diff --git a/package.json b/package.json index f4274d2..28d0d74 100644 --- a/package.json +++ b/package.json @@ -1,38 +1,42 @@ { - "name": "sphere-extension", - "version": "0.1.6", + "name": "sphere-wallet", + "version": "0.2.0", "private": true, "type": "module", "scripts": { "dev": "node scripts/build.js && vite build --watch", "build": "tsc --noEmit && node scripts/build.js", "build:fast": "node scripts/build.js", - "lint": "eslint src --ext .ts,.tsx", + "lint": "eslint . && tsc --noEmit", "package": "node scripts/build.js && node scripts/package.js" }, "dependencies": { - "@noble/curves": "^1.4.0", - "@noble/hashes": "^1.4.0", - "@scure/base": "^1.1.0", - "@tailwindcss/postcss": "^4.1.18", - "@unicitylabs/nostr-js-sdk": "^0.3.2", - "@unicitylabs/sphere-sdk": "^0.4.7", - "@unicitylabs/state-transition-sdk": "^1.6.1-rc.f37cb85", + "@noble/curves": "^1.8.2", + "@noble/hashes": "^1.7.2", + "@scure/base": "^1.2.4", + "@tanstack/react-query": "^5.90.0", + "@unicitylabs/sphere-sdk": "^0.5.4", + "lucide-react": "^0.552.0", "react": "^18.3.1", - "react-dom": "^18.3.1", - "zustand": "^5.0.0" + "react-dom": "^18.3.1" }, "devDependencies": { - "@types/chrome": "^0.0.268", - "@types/react": "^18.3.0", - "@types/react-dom": "^18.3.0", - "@vitejs/plugin-react": "^4.3.0", + "@eslint/js": "^9.39.3", + "@tailwindcss/vite": "^4.1.0", + "@types/chrome": "^0.0.287", + "@types/node": "^25.3.2", + "@types/react": "^18.3.23", + "@types/react-dom": "^18.3.7", + "@vitejs/plugin-react": "^4.5.2", "archiver": "^7.0.1", - "autoprefixer": "^10.4.18", - "postcss": "^8.4.35", - "tailwindcss": "^4.0.0", - "typescript": "^5.5.0", - "vite": "^5.4.0", + "eslint": "^9.39.3", + "eslint-plugin-react-hooks": "^5.2.0", + "eslint-plugin-react-refresh": "^0.4.26", + "globals": "^16.5.0", + "tailwindcss": "^4.1.0", + "typescript": "^5.7.3", + "typescript-eslint": "^8.56.1", + "vite": "^6.3.5", "vite-plugin-node-polyfills": "^0.25.0" } } diff --git a/postcss.config.js b/postcss.config.js deleted file mode 100644 index a34a3d5..0000000 --- a/postcss.config.js +++ /dev/null @@ -1,5 +0,0 @@ -export default { - plugins: { - '@tailwindcss/postcss': {}, - }, -}; diff --git a/public/Union.svg b/public/Union.svg new file mode 100644 index 0000000..3efe916 --- /dev/null +++ b/public/Union.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/public/icons/icon128.png b/public/icons/icon128.png index 45e51a0..ea2178e 100644 Binary files a/public/icons/icon128.png and b/public/icons/icon128.png differ diff --git a/public/icons/icon16.png b/public/icons/icon16.png index dbe757f..ea72c45 100644 Binary files a/public/icons/icon16.png and b/public/icons/icon16.png differ diff --git a/public/icons/icon48.png b/public/icons/icon48.png index 386c3d0..38c0137 100644 Binary files a/public/icons/icon48.png and b/public/icons/icon48.png differ diff --git a/public/manifest.json b/public/manifest.json index 230bc1c..e104264 100644 --- a/public/manifest.json +++ b/public/manifest.json @@ -22,6 +22,9 @@ "activeTab", "scripting" ], + "host_permissions": [ + "https://faucet.unicity.network/*" + ], "background": { "service_worker": "background.js", "type": "module" diff --git a/public/popup.html b/public/popup.html index 067a864..d34f067 100644 --- a/public/popup.html +++ b/public/popup.html @@ -5,16 +5,22 @@ Sphere Wallet
- + diff --git a/scripts/build.js b/scripts/build.js index 0cef60a..0dd711c 100644 --- a/scripts/build.js +++ b/scripts/build.js @@ -7,7 +7,7 @@ import { build } from 'vite'; import { nodePolyfills } from 'vite-plugin-node-polyfills'; import { resolve, dirname } from 'path'; import { fileURLToPath } from 'url'; -import { copyFileSync, existsSync, mkdirSync, rmSync, readdirSync, renameSync, statSync } from 'fs'; +import { copyFileSync, existsSync, mkdirSync, rmSync, readdirSync, renameSync, statSync, readFileSync, writeFileSync } from 'fs'; const __dirname = dirname(fileURLToPath(import.meta.url)); const root = resolve(__dirname, '..'); @@ -57,6 +57,14 @@ async function buildExtension() { console.log('Copying public assets...'); copyDir(publicDir, distDir, ['popup.html']); + // Inject version from package.json into dist/manifest.json + const pkg = JSON.parse(readFileSync(resolve(root, 'package.json'), 'utf-8')); + const manifestPath = resolve(distDir, 'manifest.json'); + const manifest = JSON.parse(readFileSync(manifestPath, 'utf-8')); + manifest.version = pkg.version; + writeFileSync(manifestPath, JSON.stringify(manifest, null, 2) + '\n'); + console.log(`manifest.json version set to ${pkg.version}`); + // Move popup.html from dist/public to dist root const distPublicDir = resolve(distDir, 'public'); if (existsSync(distPublicDir)) { @@ -87,18 +95,17 @@ async function buildExtension() { resolve: { preserveSymlinks: true, alias: { - '@/background': resolve(root, 'src/background'), - '@/content': resolve(root, 'src/content'), - '@/inject': resolve(root, 'src/inject'), - '@/popup': resolve(root, 'src/popup'), '@/shared': resolve(root, 'src/shared'), + '@/sdk': resolve(root, 'src/sdk'), + '@/components': resolve(root, 'src/components'), + '@/platform': resolve(root, 'src/platform'), }, }, build: { outDir: resolve(root, 'dist'), emptyOutDir: false, lib: { - entry: resolve(root, 'src/background/index.ts'), + entry: resolve(root, 'src/platform/extension/background/index.ts'), name: 'background', formats: ['es'], fileName: () => 'background.js', @@ -122,18 +129,17 @@ async function buildExtension() { resolve: { preserveSymlinks: true, alias: { - '@/background': resolve(root, 'src/background'), - '@/content': resolve(root, 'src/content'), - '@/inject': resolve(root, 'src/inject'), - '@/popup': resolve(root, 'src/popup'), '@/shared': resolve(root, 'src/shared'), + '@/sdk': resolve(root, 'src/sdk'), + '@/components': resolve(root, 'src/components'), + '@/platform': resolve(root, 'src/platform'), }, }, build: { outDir: resolve(root, 'dist'), emptyOutDir: false, lib: { - entry: resolve(root, 'src/content/index.ts'), + entry: resolve(root, 'src/platform/extension/content/index.ts'), name: 'content', formats: ['iife'], fileName: () => 'content.js', @@ -157,18 +163,17 @@ async function buildExtension() { resolve: { preserveSymlinks: true, alias: { - '@/background': resolve(root, 'src/background'), - '@/content': resolve(root, 'src/content'), - '@/inject': resolve(root, 'src/inject'), - '@/popup': resolve(root, 'src/popup'), '@/shared': resolve(root, 'src/shared'), + '@/sdk': resolve(root, 'src/sdk'), + '@/components': resolve(root, 'src/components'), + '@/platform': resolve(root, 'src/platform'), }, }, build: { outDir: resolve(root, 'dist'), emptyOutDir: false, lib: { - entry: resolve(root, 'src/inject/index.ts'), + entry: resolve(root, 'src/platform/extension/inject/index.ts'), name: 'inject', formats: ['iife'], fileName: () => 'inject.js', diff --git a/src/background/nostr-service.ts b/src/background/nostr-service.ts deleted file mode 100644 index c5bb993..0000000 --- a/src/background/nostr-service.ts +++ /dev/null @@ -1,19 +0,0 @@ -/** - * NostrService - DEPRECATED - * - * NOSTR operations are now handled by Sphere SDK's TransportProvider. - * This file is kept as a thin compatibility shim for any remaining callers. - * It delegates to the WalletManager's Sphere instance. - */ - -// This module is intentionally empty. -// All NOSTR operations are now handled by sphere-sdk's NostrTransportProvider -// via WalletManager.createSphereFromMnemonic(). -// -// If you need NOSTR functionality, use walletManager methods: -// - walletManager.resolveNametag() for nametag resolution -// - walletManager.registerNametag() for nametag registration -// - sphere.payments.send() for token transfers (SDK handles NOSTR delivery) -// - sphere.on('transfer:incoming', handler) for incoming transfers - -export {}; diff --git a/src/background/providers/chrome-storage-provider.ts b/src/background/providers/chrome-storage-provider.ts deleted file mode 100644 index 9213870..0000000 --- a/src/background/providers/chrome-storage-provider.ts +++ /dev/null @@ -1,168 +0,0 @@ -/** - * Chrome Storage Provider - * Implements StorageProvider using chrome.storage.local for service worker compatibility. - * Service workers have no localStorage, so we use chrome.storage.local instead. - */ - -import type { StorageProvider, ProviderStatus, FullIdentity, TrackedAddressEntry } from '@unicitylabs/sphere-sdk'; - -// ============================================================================= -// Configuration -// ============================================================================= - -export interface ChromeStorageProviderConfig { - /** Key prefix (default: 'sphere_sdk2_') */ - prefix?: string; - /** Enable debug logging */ - debug?: boolean; -} - -// ============================================================================= -// Implementation -// ============================================================================= - -export class ChromeStorageProvider implements StorageProvider { - readonly id = 'chromeStorage'; - readonly name = 'Chrome Storage'; - readonly type = 'local' as const; - readonly description = 'Chrome extension storage for service worker persistence'; - - private prefix: string; - private debug: boolean; - private address: string = 'default'; - private connected = false; - - constructor(config?: ChromeStorageProviderConfig) { - this.prefix = config?.prefix ?? 'sphere_sdk2_'; - this.debug = config?.debug ?? false; - } - - // =========================================================================== - // BaseProvider Implementation - // =========================================================================== - - async connect(): Promise { - if (this.connected) return; - - // Test chrome.storage availability - const testKey = `${this.prefix}_test`; - await chrome.storage.local.set({ [testKey]: 'test' }); - await chrome.storage.local.remove(testKey); - - this.connected = true; - this.log('Connected to chrome.storage.local'); - } - - async disconnect(): Promise { - this.connected = false; - this.log('Disconnected'); - } - - isConnected(): boolean { - return this.connected; - } - - getStatus(): ProviderStatus { - return this.connected ? 'connected' : 'disconnected'; - } - - // =========================================================================== - // StorageProvider Implementation - // =========================================================================== - - setIdentity(identity: FullIdentity): void { - this.address = identity.l1Address; - this.log('Identity set:', identity.l1Address); - } - - async get(key: string): Promise { - this.ensureConnected(); - const fullKey = this.getFullKey(key); - const result = await chrome.storage.local.get(fullKey); - return result[fullKey] ?? null; - } - - async set(key: string, value: string): Promise { - this.ensureConnected(); - const fullKey = this.getFullKey(key); - await chrome.storage.local.set({ [fullKey]: value }); - } - - async remove(key: string): Promise { - this.ensureConnected(); - const fullKey = this.getFullKey(key); - await chrome.storage.local.remove(fullKey); - } - - async has(key: string): Promise { - this.ensureConnected(); - const fullKey = this.getFullKey(key); - const result = await chrome.storage.local.get(fullKey); - return fullKey in result; - } - - async keys(prefix?: string): Promise { - this.ensureConnected(); - const basePrefix = this.getFullKey(''); - const searchPrefix = prefix ? this.getFullKey(prefix) : basePrefix; - - const allData = await chrome.storage.local.get(null); - const result: string[] = []; - - for (const key of Object.keys(allData)) { - if (key.startsWith(searchPrefix)) { - result.push(key.slice(basePrefix.length)); - } - } - - return result; - } - - async clear(prefix?: string): Promise { - this.ensureConnected(); - const keysToRemove = await this.keys(prefix); - for (const key of keysToRemove) { - await this.remove(key); - } - } - - async saveTrackedAddresses(entries: TrackedAddressEntry[]): Promise { - await this.set('tracked_addresses', JSON.stringify(entries)); - } - - async loadTrackedAddresses(): Promise { - const data = await this.get('tracked_addresses'); - if (!data) return []; - return JSON.parse(data) as TrackedAddressEntry[]; - } - - // =========================================================================== - // Private Methods - // =========================================================================== - - private getFullKey(key: string): string { - return `${this.prefix}${this.address}_${key}`; - } - - private ensureConnected(): void { - if (!this.connected) { - throw new Error('ChromeStorageProvider not connected'); - } - } - - private log(...args: unknown[]): void { - if (this.debug) { - console.log('[ChromeStorageProvider]', ...args); - } - } -} - -// ============================================================================= -// Factory Function -// ============================================================================= - -export function createChromeStorageProvider( - config?: ChromeStorageProviderConfig -): ChromeStorageProvider { - return new ChromeStorageProvider(config); -} diff --git a/src/background/providers/index.ts b/src/background/providers/index.ts deleted file mode 100644 index f901875..0000000 --- a/src/background/providers/index.ts +++ /dev/null @@ -1,5 +0,0 @@ -export { - ChromeStorageProvider, - createChromeStorageProvider, -} from './chrome-storage-provider'; -export type { ChromeStorageProviderConfig } from './chrome-storage-provider'; diff --git a/src/background/token-transfer-service.ts b/src/background/token-transfer-service.ts deleted file mode 100644 index 24af4c8..0000000 --- a/src/background/token-transfer-service.ts +++ /dev/null @@ -1,12 +0,0 @@ -/** - * TokenTransferService - DEPRECATED - * - * Incoming token transfers are now handled by Sphere SDK's PaymentsModule. - * The SDK automatically accepts incoming transfers via the TransportProvider - * and updates balances. The WalletManager listens for 'transfer:incoming' - * events to update UI (badge, notifications). - * - * This file is kept empty for reference. - */ - -export {}; diff --git a/src/components/ui/AlertMessage.tsx b/src/components/ui/AlertMessage.tsx new file mode 100644 index 0000000..f11b77e --- /dev/null +++ b/src/components/ui/AlertMessage.tsx @@ -0,0 +1,107 @@ +import { XCircle, AlertTriangle, CheckCircle, Info, X } from 'lucide-react'; +import type { LucideIcon } from 'lucide-react'; +import type { ReactNode } from 'react'; + +type AlertVariant = 'error' | 'warning' | 'success' | 'info'; + +interface AlertMessageProps { + variant: AlertVariant; + children: ReactNode; + /** Optional title for multi-line alerts */ + title?: string; + /** Show dismiss button */ + onDismiss?: () => void; + /** Custom icon override */ + icon?: LucideIcon; +} + +const variantConfig: Record = { + error: { + icon: XCircle, + bgClass: 'bg-red-500/10', + borderClass: 'border-red-500/20', + textClass: 'text-red-600 dark:text-red-400', + iconClass: 'text-red-500 dark:text-red-400', + }, + warning: { + icon: AlertTriangle, + bgClass: 'bg-amber-500/10', + borderClass: 'border-amber-500/20', + textClass: 'text-amber-600 dark:text-amber-400', + iconClass: 'text-amber-500 dark:text-amber-400', + }, + success: { + icon: CheckCircle, + bgClass: 'bg-green-500/10', + borderClass: 'border-green-500/20', + textClass: 'text-green-600 dark:text-green-400', + iconClass: 'text-green-500 dark:text-green-400', + }, + info: { + icon: Info, + bgClass: 'bg-blue-500/10', + borderClass: 'border-blue-500/20', + textClass: 'text-blue-600 dark:text-blue-400', + iconClass: 'text-blue-500 dark:text-blue-400', + }, +}; + +export function AlertMessage({ + variant, + children, + title, + onDismiss, + icon: CustomIcon, +}: AlertMessageProps) { + const config = variantConfig[variant]; + const Icon = CustomIcon || config.icon; + + return ( +
+ {title ? ( + // Layout with title: icon centered with title, description below +
+
+ +

{title}

+ {onDismiss && ( + + )} +
+
+ {children} +
+
+ ) : ( + // Simple layout without title +
+ +
+ {children} +
+ {onDismiss && ( + + )} +
+ )} +
+ ); +} diff --git a/src/components/ui/BaseModal.tsx b/src/components/ui/BaseModal.tsx new file mode 100644 index 0000000..1e9129b --- /dev/null +++ b/src/components/ui/BaseModal.tsx @@ -0,0 +1,79 @@ +import { useEffect, useRef } from 'react'; +import type { ReactNode } from 'react'; + +type ModalSize = 'sm' | 'md' | 'lg'; + +interface BaseModalProps { + isOpen: boolean; + onClose: () => void; + children: ReactNode; + /** Modal max-width: sm (384px), md (448px), lg (512px) */ + size?: ModalSize; + /** Show decorative background orbs */ + showOrbs?: boolean; + /** Additional className for the modal container */ + className?: string; +} + +const sizeClasses: Record = { + sm: 'max-w-sm', + md: 'max-w-md', + lg: 'max-w-lg', +}; + +export function BaseModal({ + isOpen, + onClose, + children, + size = 'md', + showOrbs = true, + className = '', +}: BaseModalProps) { + const backdropRef = useRef(null); + const panelRef = useRef(null); + + // Handle enter/exit transitions via CSS classes + useEffect(() => { + if (isOpen) { + // Trigger enter transition on next frame so the initial state is rendered first + requestAnimationFrame(() => { + backdropRef.current?.classList.add('opacity-100'); + backdropRef.current?.classList.remove('opacity-0'); + panelRef.current?.classList.add('opacity-100', 'scale-100', 'translate-y-0'); + panelRef.current?.classList.remove('opacity-0', 'scale-95', 'translate-y-4'); + }); + } + }, [isOpen]); + + if (!isOpen) return null; + + return ( + <> + {/* Backdrop */} +
+ + {/* Modal Container */} +
+
e.stopPropagation()} + className={`relative w-full ${sizeClasses[size]} max-h-[70dvh] sm:max-h-[600px] bg-white dark:bg-[#111] border border-neutral-200 dark:border-white/10 rounded-3xl shadow-2xl pointer-events-auto flex flex-col overflow-hidden opacity-0 scale-95 translate-y-4 transition-all duration-300 ease-out ${className}`} + > + {/* Background Orbs */} + {showOrbs && ( + <> +
+
+ + )} + + {children} +
+
+ + ); +} diff --git a/src/components/ui/Button.tsx b/src/components/ui/Button.tsx new file mode 100644 index 0000000..99975d0 --- /dev/null +++ b/src/components/ui/Button.tsx @@ -0,0 +1,99 @@ +import { Loader2 } from 'lucide-react'; +import type { LucideIcon } from 'lucide-react'; +import type { ButtonHTMLAttributes } from 'react'; + +type ButtonVariant = 'primary' | 'secondary' | 'danger' | 'success'; +type ButtonSize = 'sm' | 'md' | 'lg'; +type IconPosition = 'left' | 'right'; + +interface ButtonProps extends Omit, 'children'> { + variant?: ButtonVariant; + size?: ButtonSize; + /** Icon */ + icon?: LucideIcon; + /** Icon position */ + iconPosition?: IconPosition; + /** Show loading spinner */ + loading?: boolean; + /** Loading text (defaults to "Loading...") */ + loadingText?: string; + /** Button content */ + children: React.ReactNode; + /** Full width */ + fullWidth?: boolean; +} + +const variantClasses: Record = { + primary: 'bg-orange-500 hover:bg-orange-600 text-white shadow-lg shadow-orange-500/25', + secondary: 'bg-neutral-100 dark:bg-neutral-800 hover:bg-neutral-200 dark:hover:bg-neutral-700 text-neutral-700 dark:text-white', + danger: 'bg-red-500 hover:bg-red-600 text-white shadow-lg shadow-red-500/25', + success: 'bg-emerald-500 hover:bg-emerald-600 text-white shadow-lg shadow-emerald-500/25', +}; + +const sizeClasses: Record = { + sm: 'py-2 px-4 text-sm rounded-lg', + md: 'py-3 px-6 text-sm rounded-xl', + lg: 'py-4 px-8 text-base rounded-xl', +}; + +export function Button({ + variant = 'primary', + size = 'md', + icon: Icon, + iconPosition = 'left', + loading = false, + loadingText = 'Loading...', + children, + fullWidth = false, + disabled, + className = '', + ...props +}: ButtonProps) { + const isDisabled = disabled || loading; + + return ( + + ); +} + +// Convenience exports for common variants +export function PrimaryButton(props: Omit) { + return + ); +} diff --git a/src/components/ui/ModalHeader.tsx b/src/components/ui/ModalHeader.tsx new file mode 100644 index 0000000..6b14e05 --- /dev/null +++ b/src/components/ui/ModalHeader.tsx @@ -0,0 +1,72 @@ +import { X } from 'lucide-react'; +import type { LucideIcon } from 'lucide-react'; +import type { ReactNode } from 'react'; + +type IconVariant = 'gradient' | 'neutral'; + +interface ModalHeaderProps { + title: string; + onClose: () => void; + /** Icon to display in badge */ + icon?: LucideIcon; + /** Icon badge style: 'gradient' (orange) or 'neutral' (grey) */ + iconVariant?: IconVariant; + /** Subtitle text or ReactNode below title */ + subtitle?: ReactNode; + /** Disable close button */ + closeDisabled?: boolean; +} + +const iconVariantClasses: Record = { + gradient: { + badge: 'bg-linear-to-br from-orange-500 to-orange-600 shadow-lg shadow-orange-500/30', + icon: 'text-white', + }, + neutral: { + badge: 'bg-neutral-100 dark:bg-neutral-800', + icon: 'text-neutral-600 dark:text-neutral-400', + }, +}; + +export function ModalHeader({ + title, + onClose, + icon: Icon, + iconVariant = 'gradient', + subtitle, + closeDisabled = false, +}: ModalHeaderProps) { + const iconStyles = iconVariantClasses[iconVariant]; + + return ( +
+
+ {Icon && ( +
+ +
+ )} +
+

{title}

+ {subtitle && ( +
{subtitle}
+ )} +
+
+ + +
+ ); +} diff --git a/src/components/ui/UnionIcon.tsx b/src/components/ui/UnionIcon.tsx new file mode 100644 index 0000000..99a749f --- /dev/null +++ b/src/components/ui/UnionIcon.tsx @@ -0,0 +1,69 @@ +/** + * Sphere Union logo as an inline SVG React component. + * Preserves the original gradient and inner shadow filter. + */ + +interface UnionIconProps { + className?: string; + size?: number; +} + +export function UnionIcon({ className, size = 32 }: UnionIconProps) { + const height = Math.round((size * 30) / 32); + return ( + + + + + + + + + + + + + + + + + + + + + + ); +} diff --git a/src/components/ui/index.ts b/src/components/ui/index.ts new file mode 100644 index 0000000..bed596f --- /dev/null +++ b/src/components/ui/index.ts @@ -0,0 +1,14 @@ +// Modal components +export { BaseModal } from './BaseModal'; +export { ModalHeader } from './ModalHeader'; + +// Feedback components +export { AlertMessage } from './AlertMessage'; +export { EmptyState } from './EmptyState'; + +// Icons +export { UnionIcon } from './UnionIcon'; + +// Button components +export { Button, PrimaryButton, SecondaryButton, DangerButton, SuccessButton } from './Button'; +export { MenuButton } from './MenuButton'; diff --git a/src/components/wallet/L3WalletView.tsx b/src/components/wallet/L3WalletView.tsx new file mode 100644 index 0000000..b85341f --- /dev/null +++ b/src/components/wallet/L3WalletView.tsx @@ -0,0 +1,468 @@ +import { Plus, ArrowUpRight, ArrowDownUp, Sparkles, Loader2, Coins, Layers, Eye, EyeOff, Wifi } from 'lucide-react'; +import { AssetRow } from '@/components/wallet/shared/AssetRow'; +import { TokenRow } from '@/components/wallet/shared/TokenRow'; +import { useEffect, useMemo, useRef, useState, useCallback } from 'react'; +import { useIdentity, useAssets, useTokens, useSphereContext } from '@/sdk'; +import { SendModal } from './modals/SendModal'; +import { SwapModal } from './modals/SwapModal'; +import { PaymentRequestsModal } from './modals/PaymentRequestModal'; +import type { IncomingPaymentRequest } from './modals/PaymentRequestModal'; +import { PaymentRequestStatus } from './modals/PaymentRequestModal'; +import { TopUpModal } from './modals/TopUpModal'; +import { SeedPhraseModal } from './modals/SeedPhraseModal'; +import { TransactionHistoryModal } from './modals/TransactionHistoryModal'; +import { SettingsModal } from './modals/SettingsModal'; +import { BackupWalletModal, LogoutConfirmModal } from '@/components/wallet/shared'; +import { SaveWalletModal } from '@/components/wallet/shared/SaveWalletModal'; + +type Tab = 'assets' | 'tokens'; + +// Static balance display (replaces Framer Motion animated numbers) +function BalanceDisplay({ + totalValue, + showBalances, + onToggle, + isLoading, +}: { + totalValue: number; + showBalances: boolean; + onToggle: () => void; + isLoading?: boolean; +}) { + const formatted = `$${totalValue.toLocaleString('en-US', { minimumFractionDigits: 2, maximumFractionDigits: 2 })}`; + + return ( +
+

+ {isLoading ? ( + + + + ) : showBalances ? ( + {formatted} + ) : ( + '••••••' + )} +

+ +
+ ); +} + +// Inline status line showing current wallet activity +function WalletStatusLine({ + isLoadingAssets, + pendingCount, +}: { + isLoadingAssets: boolean; + pendingCount: number; +}) { + const items: { label: string; spinning?: boolean }[] = []; + + if (isLoadingAssets) items.push({ label: 'Loading assets', spinning: true }); + if (pendingCount > 0) items.push({ label: `${pendingCount} pending transfer${pendingCount > 1 ? 's' : ''}` }); + + if (items.length === 0) return null; + + // Show the first (most relevant) status item + const current = items[0]; + + return ( +
+ {current.spinning ? ( + + ) : ( + + )} + {current.label}... +
+ ); +} + +interface L3WalletViewProps { + showBalances: boolean; + setShowBalances: (value: boolean) => void; + isHistoryOpen: boolean; + setIsHistoryOpen: (value: boolean) => void; + isRequestsOpen: boolean; + setIsRequestsOpen: (value: boolean) => void; + isSettingsOpen: boolean; + setIsSettingsOpen: (value: boolean) => void; + isL1WalletOpen: boolean; + setIsL1WalletOpen: (value: boolean) => void; +} + +export function L3WalletView({ + showBalances, + setShowBalances, + isHistoryOpen, + setIsHistoryOpen, + isRequestsOpen, + setIsRequestsOpen, + isSettingsOpen, + setIsSettingsOpen, + setIsL1WalletOpen: _setIsL1WalletOpen, +}: L3WalletViewProps) { + // SDK hooks + const { identity, isLoading: isLoadingIdentity } = useIdentity(); + const { assets: sdkAssets, isLoading: isLoadingAssets } = useAssets(); + const { tokens: sdkTokens, pendingTokens } = useTokens(); + const { deleteWallet, getMnemonic, exportWallet } = useSphereContext(); + + const assets = sdkAssets; + const tokens = sdkTokens; + const sendableTokens = useMemo(() => tokens.filter((t) => t.coinId !== 'NAMETAG'), [tokens]); + + const [activeTab, setActiveTab] = useState('assets'); + const [isSendModalOpen, setIsSendModalOpen] = useState(false); + const [isSwapModalOpen, setIsSwapModalOpen] = useState(false); + const [isSeedPhraseOpen, setIsSeedPhraseOpen] = useState(false); + const [seedPhrase, setSeedPhrase] = useState([]); + const [isTopUpModalOpen, setIsTopUpModalOpen] = useState(false); + + // Track previous token/asset IDs to detect truly new items + const prevTokenIdsRef = useRef>(new Set()); + const prevAssetCoinIdsRef = useRef>(new Set()); + const isFirstLoadRef = useRef(true); + + // Compute new token IDs by comparing with previous snapshot + const newTokenIds = useMemo(() => { + if (isFirstLoadRef.current) { + return new Set(); // First load - no highlights + } + const newIds = new Set(); + tokens.filter((t) => t.coinId !== 'NAMETAG').forEach((token) => { + if (!prevTokenIdsRef.current.has(token.id)) { + newIds.add(token.id); + } + }); + return newIds; + }, [tokens]); + + // Compute new asset IDs by comparing with previous snapshot + const newAssetCoinIds = useMemo(() => { + if (isFirstLoadRef.current) { + return new Set(); // First load - no highlights + } + const newIds = new Set(); + assets.forEach((asset) => { + if (!prevAssetCoinIdsRef.current.has(asset.coinId)) { + newIds.add(asset.coinId); + } + }); + return newIds; + }, [assets]); + + // Update previous snapshots after render (for next comparison) + useEffect(() => { + const currentIds = new Set(tokens.filter((t) => t.coinId !== 'NAMETAG').map((t) => t.id)); + prevTokenIdsRef.current = currentIds; + isFirstLoadRef.current = false; + }, [tokens]); + + useEffect(() => { + const currentIds = new Set(assets.map((a) => a.coinId)); + prevAssetCoinIdsRef.current = currentIds; + }, [assets]); + + // New modal states + const [isBackupOpen, setIsBackupOpen] = useState(false); + const [isLogoutConfirmOpen, setIsLogoutConfirmOpen] = useState(false); + const [isSaveWalletOpen, setIsSaveWalletOpen] = useState(false); + + // Payment requests (populated via wallet update events) + const [paymentRequests, setPaymentRequests] = useState([]); + + // Stable callback for toggling balance visibility + const handleToggleBalances = useCallback(() => { + setShowBalances(!showBalances); + }, [showBalances, setShowBalances]); + + const totalValue = useMemo(() => { + // Sum up L3 asset values (using SDK-provided fiat values for accuracy) + const l3Value = sdkAssets.reduce((sum, asset) => sum + (asset.fiatValueUsd ?? 0), 0); + return l3Value; + }, [sdkAssets]); + + const handleShowSeedPhrase = async () => { + try { + const mnemonic = await getMnemonic(); + if (mnemonic) { + setSeedPhrase(mnemonic.split(' ')); + setIsSeedPhraseOpen(true); + } else { + alert("Recovery phrase not available.\n\nThis wallet was imported from a file that doesn't contain a mnemonic phrase."); + } + } catch (err) { + console.error('Failed to get mnemonic:', err); + } + }; + + // Handle export wallet file + const handleExportWalletFile = () => { + setIsSaveWalletOpen(true); + }; + + // Handle save wallet + const handleSaveWallet = async (filename: string) => { + try { + const jsonData = await exportWallet(); + const blob = new Blob([jsonData], { type: 'application/json' }); + const url = URL.createObjectURL(blob); + const a = document.createElement('a'); + a.href = url; + a.download = filename.endsWith('.json') ? filename : `${filename}.json`; + a.click(); + URL.revokeObjectURL(url); + setIsSaveWalletOpen(false); + } catch (err) { + console.error('Failed to save wallet:', err); + } + }; + + // Handle logout + const [isLoggingOut, setIsLoggingOut] = useState(false); + const handleLogout = async () => { + try { + setIsLoggingOut(true); + await deleteWallet(); + // In extension context, this will trigger state change via SphereProvider + } catch (err) { + console.error('Failed to logout:', err); + setIsLoggingOut(false); + } + }; + + // Handle backup and logout + const handleBackupAndLogout = () => { + setIsLogoutConfirmOpen(false); + setIsBackupOpen(true); + }; + + if (isLoadingIdentity) { + return ( +
+ + +
+ ); + } + + if (!identity) { + return ( +
+

No identity found. Please create a wallet.

+
+ ); + } + + return ( +
+ {/* Main Balance - Centered with Eye Toggle */} +
+
+ + +
+ + {/* Actions - Speed focused */} +
+ + + + + +
+ +
+ +
+
+ + +
+
+ + {/* Assets List */} +
+
+
+ +

Network Assets

+
+
+ +
+ {isLoadingAssets ? ( +
+ +
+ ) : ( + <> + {/* ASSETS VIEW */} + {activeTab === 'assets' && ( +
+ {assets.length === 0 ? ( + + ) : ( + <> + {/* L3 Assets */} + {assets.map((asset, index) => ( + + ))} + + )} +
+ )} + + {/* TOKENS VIEW */} + {activeTab === 'tokens' && ( +
+ {tokens.filter((t) => t.coinId !== 'NAMETAG').length === 0 ? ( + + ) : ( + tokens + .filter((t) => t.coinId !== 'NAMETAG') + .sort((a, b) => b.createdAt - a.createdAt) + .map((token, index) => ( + + )) + )} +
+ )} + + )} +
+
+ + {/* Modals */} + setIsTopUpModalOpen(false)} /> + setIsSendModalOpen(false)} /> + setIsSwapModalOpen(false)} /> + setIsRequestsOpen(false)} + requests={paymentRequests} + pendingCount={paymentRequests.filter(r => r.status === 'pending').length} + reject={async (req) => { setPaymentRequests(prev => prev.filter(r => r.id !== req.id)); }} + paid={async (req) => { setPaymentRequests(prev => prev.map(r => r.id === req.id ? { ...r, status: PaymentRequestStatus.PAID } : r)); }} + clearProcessed={() => { setPaymentRequests(prev => prev.filter(r => r.status === 'pending')); }} + /> + setIsSeedPhraseOpen(false)} + seedPhrase={seedPhrase} + /> + setIsHistoryOpen(false)} /> + setIsSettingsOpen(false)} + onBackupWallet={() => setIsBackupOpen(true)} + onLogout={() => setIsLogoutConfirmOpen(true)} + /> + setIsBackupOpen(false)} + onExportWalletFile={handleExportWalletFile} + onShowRecoveryPhrase={handleShowSeedPhrase} + hasMnemonic={true} + /> + setIsLogoutConfirmOpen(false)} + onBackupAndLogout={handleBackupAndLogout} + onLogoutWithoutBackup={handleLogout} + isLoggingOut={isLoggingOut} + /> + setIsSaveWalletOpen(false)} + hasMnemonic={true} + /> + +
+ ); +} + +// Helper Component +function EmptyState({ text }: { text?: string }) { + return ( +
+
+ +
+
+ {text || <>Wallet is empty.
Mint some tokens to start!} +
+
+ ); +} diff --git a/src/components/wallet/UnlockWallet.tsx b/src/components/wallet/UnlockWallet.tsx new file mode 100644 index 0000000..b14fcd1 --- /dev/null +++ b/src/components/wallet/UnlockWallet.tsx @@ -0,0 +1,96 @@ +import { useState } from 'react'; +import { Loader2, Lock, AlertCircle } from 'lucide-react'; + +interface UnlockWalletProps { + onUnlock: (password: string) => Promise; +} + +export function UnlockWallet({ onUnlock }: UnlockWalletProps) { + const [password, setPassword] = useState(''); + const [error, setError] = useState(''); + const [isLoading, setIsLoading] = useState(false); + + const handleSubmit = async (e: React.FormEvent) => { + e.preventDefault(); + if (!password.trim() || isLoading) return; + + setError(''); + setIsLoading(true); + + try { + await onUnlock(password); + } catch (err) { + setError((err as Error).message || 'Failed to unlock wallet'); + } finally { + setIsLoading(false); + } + }; + + return ( +
+ {/* Background Gradients */} +
+
+ +
+ {/* Lock Icon */} +
+
+
+ +
+
+ + {/* Title */} +
+

Unlock Wallet

+

+ Enter your password to continue +

+
+ + {/* Form */} +
+
+ { + setPassword(e.target.value); + if (error) setError(''); + }} + placeholder="Password" + required + autoFocus + disabled={isLoading} + className="w-full px-4 py-3 text-sm bg-neutral-50 dark:bg-neutral-800 border border-neutral-200 dark:border-neutral-700 rounded-xl text-neutral-900 dark:text-white placeholder-neutral-400 dark:placeholder-neutral-500 focus:outline-none focus:ring-2 focus:ring-orange-500/50 focus:border-orange-500 disabled:opacity-50 transition-colors" + /> +
+ + {/* Error Display */} + {error && ( +
+ +

{error}

+
+ )} + + +
+
+
+ ); +} diff --git a/src/components/wallet/WalletPanel.tsx b/src/components/wallet/WalletPanel.tsx new file mode 100644 index 0000000..3263182 --- /dev/null +++ b/src/components/wallet/WalletPanel.tsx @@ -0,0 +1,270 @@ +import { Clock, Bell, MoreVertical, Tag, Loader2, RefreshCw } from 'lucide-react'; +import { UnionIcon } from '@/components/ui/UnionIcon'; +import { useState, useEffect } from 'react'; +import { L3WalletView } from './L3WalletView'; +import { useIdentity, useWalletStatus, useSphereContext } from '@/sdk'; +import { AddressSelector, RegisterNametagModal } from '@/components/wallet/shared'; +import { CreateWalletFlow } from './onboarding/CreateWalletFlow'; +import { ConnectApprovalModal } from './modals/ConnectApprovalModal'; +import { ConnectIntentModal } from './modals/ConnectIntentModal'; +import { SendModal, type SendPrefill } from './modals/SendModal'; + +const PANEL_SHELL = "bg-white dark:bg-neutral-900 backdrop-blur-xl rounded-none border-0 overflow-hidden h-full relative flex flex-col transition-all duration-500"; + +export function WalletPanel() { + const [showBalances, setShowBalances] = useState(true); + const [isHistoryOpen, setIsHistoryOpen] = useState(false); + const [isRequestsOpen, setIsRequestsOpen] = useState(false); + const [isSettingsOpen, setIsSettingsOpen] = useState(false); + const [isL1WalletOpen, setIsL1WalletOpen] = useState(false); + const [isNametagModalOpen, setIsNametagModalOpen] = useState(false); + const [isConnectApprovalOpen, setIsConnectApprovalOpen] = useState(false); + const [isConnectIntentOpen, setIsConnectIntentOpen] = useState(false); + // Send intent routed to the existing SendModal + const [isSendIntentOpen, setIsSendIntentOpen] = useState(false); + const [sendIntentPrefill, setSendIntentPrefill] = useState(undefined); + const [pendingSendIntentId, setPendingSendIntentId] = useState(null); + const { isLoading: isWalletLoading, walletExists, error: walletError } = useWalletStatus(); + + // Auto-open ConnectApprovalModal when background has a pending dApp approval + useEffect(() => { + const check = async () => { + try { + const response = await chrome.runtime.sendMessage({ type: 'POPUP_GET_CONNECT_APPROVAL' }); + if (response?.approval && !isConnectApprovalOpen) { + setIsConnectApprovalOpen(true); + } + } catch { + // Ignore — background may not be ready + } + }; + const interval = setInterval(check, 500); + return () => clearInterval(interval); + }, [isConnectApprovalOpen]); + + // Auto-open intent UI when background has a pending dApp intent. + // Routes 'send' to the existing SendModal (with prefill), other actions to ConnectIntentModal. + useEffect(() => { + const check = async () => { + try { + const response = await chrome.runtime.sendMessage({ type: 'POPUP_GET_CONNECT_INTENT' }); + const intent = response?.intent; + if (!intent || isConnectIntentOpen || isSendIntentOpen) return; + + if (intent.action === 'send') { + setSendIntentPrefill({ + to: String(intent.params.recipient ?? intent.params.to ?? ''), + amount: String(intent.params.amount ?? ''), + coinId: String(intent.params.coinId ?? ''), + memo: intent.params.memo ? String(intent.params.memo) : undefined, + }); + setPendingSendIntentId(intent.id); + setIsSendIntentOpen(true); + } else { + setIsConnectIntentOpen(true); + } + } catch { + // Ignore — background may not be ready + } + }; + const interval = setInterval(check, 500); + return () => clearInterval(interval); + }, [isConnectIntentOpen, isSendIntentOpen]); + + // Resolve the pending send intent when SendModal closes + const handleSendIntentClose = async (result?: { success: boolean }) => { + setIsSendIntentOpen(false); + setSendIntentPrefill(undefined); + if (pendingSendIntentId) { + try { + await chrome.runtime.sendMessage({ + type: 'POPUP_RESOLVE_CONNECT_INTENT', + id: pendingSendIntentId, + result: result?.success + ? { result: { approved: true } } + : { error: { code: 4001, message: 'User rejected' } }, + }); + } catch { + // Ignore + } + setPendingSendIntentId(null); + } + }; + const { identity, nametag, isLoading: isLoadingIdentity } = useIdentity(); + const { isLoading: _contextLoading } = useSphereContext(); + + // Initialization error (e.g. IndexedDB timeout after retry) + if (walletError) { + return ( +
+
+
+ +
+
+

Initialization error

+

Please reload the extension

+
+ +
+
+ ); + } + + // Wallet system still initializing + if (isWalletLoading) { + return ( +
+
+
+
+
+
+
+ +
+
+

+ Initializing wallet... +

+
+
+ ); + } + + // No wallet — show onboarding flow inside the panel + if (!walletExists) { + return ( +
+
+
+
+ +
+
+ ); + } + + // Wallet exists but identity still loading + if (isLoadingIdentity || !identity) { + return ( +
+
+
+
+
+
+
+ +
+
+

+ Loading identity... +

+
+
+ ); + } + + return ( +
+ + {/* Background Gradients - Orange theme */} +
+
+ + {/* TOP BAR: Title & Actions */} +
+
+
+ + +
+
+ Wallet + {!nametag && ( + + )} +
+ +
+
+ +
+ + + +
+
+
+ + {/* CONTENT AREA - L3 Only */} +
+ +
+ + setIsNametagModalOpen(false)} + /> + + setIsConnectApprovalOpen(false)} + /> + + setIsConnectIntentOpen(false)} + /> + + {/* Send intent from dApp — routed to the existing Confirm Transfer UI */} + +
+ ); +} diff --git a/src/components/wallet/modals/ConnectApprovalModal.tsx b/src/components/wallet/modals/ConnectApprovalModal.tsx new file mode 100644 index 0000000..d6734ce --- /dev/null +++ b/src/components/wallet/modals/ConnectApprovalModal.tsx @@ -0,0 +1,211 @@ +/** + * ConnectApprovalModal — shown when a dApp requests connection via Connect protocol. + * + * Polls background for pending approval, shows dApp info + per-permission checkboxes, + * and resolves via POPUP_RESOLVE_CONNECT_APPROVAL message. + * identity:read is always granted and cannot be unchecked (mirrors sphere behaviour). + */ + +import { useEffect, useState } from 'react'; +import { Globe, Shield } from 'lucide-react'; +import { PERMISSION_SCOPES } from '@unicitylabs/sphere-sdk/connect'; +import type { PermissionScope } from '@unicitylabs/sphere-sdk/connect'; +import { BaseModal } from '@/components/ui/BaseModal'; +import { ModalHeader } from '@/components/ui/ModalHeader'; +import { Button } from '@/components/ui/Button'; +import { POPUP_MESSAGES } from '@/shared/messages'; + +interface PendingApproval { + id: string; + dapp: { + name: string; + description?: string; + icon?: string; + url: string; + }; + requestedPermissions: PermissionScope[]; +} + +interface ConnectApprovalModalProps { + isOpen: boolean; + onClose: () => void; +} + +const PERMISSION_LABELS: Record = { + [PERMISSION_SCOPES.IDENTITY_READ]: 'View wallet identity', + [PERMISSION_SCOPES.BALANCE_READ]: 'View balances', + [PERMISSION_SCOPES.TOKENS_READ]: 'View tokens', + [PERMISSION_SCOPES.HISTORY_READ]: 'View transaction history', + [PERMISSION_SCOPES.L1_READ]: 'View L1 data', + [PERMISSION_SCOPES.EVENTS_SUBSCRIBE]: 'Subscribe to wallet events', + [PERMISSION_SCOPES.RESOLVE_PEER]: 'Resolve addresses', + [PERMISSION_SCOPES.TRANSFER_REQUEST]: 'Request token transfers', + [PERMISSION_SCOPES.L1_TRANSFER]: 'Request L1 transfers', + [PERMISSION_SCOPES.DM_REQUEST]: 'Send direct messages', + [PERMISSION_SCOPES.DM_READ]: 'Read direct messages', + [PERMISSION_SCOPES.PAYMENT_REQUEST]: 'Create payment requests', + [PERMISSION_SCOPES.SIGN_REQUEST]: 'Sign messages', +}; + +export function ConnectApprovalModal({ isOpen, onClose }: ConnectApprovalModalProps) { + const [approval, setApproval] = useState(null); + const [selected, setSelected] = useState>(new Set()); + const [loading, setLoading] = useState(false); + + // Poll for pending approval when modal is open + useEffect(() => { + if (!isOpen) return; + + const poll = async () => { + try { + const response = await chrome.runtime.sendMessage({ type: POPUP_MESSAGES.GET_CONNECT_APPROVAL }); + if (response?.approval) { + const incoming = response.approval as PendingApproval; + setApproval(incoming); + // Initialise selected set: all requested + identity:read always included + setSelected((prev) => { + if (prev.size > 0) return prev; // already initialised for this approval + const initial = new Set(incoming.requestedPermissions); + initial.add(PERMISSION_SCOPES.IDENTITY_READ as PermissionScope); + return initial; + }); + } else { + setApproval(null); + setSelected(new Set()); + } + } catch { + // Background may not be ready yet + } + }; + + poll(); + const interval = setInterval(poll, 500); + return () => clearInterval(interval); + }, [isOpen]); + + const togglePermission = (perm: PermissionScope) => { + if (perm === PERMISSION_SCOPES.IDENTITY_READ) return; // always granted + setSelected((prev) => { + const next = new Set(prev); + if (next.has(perm)) { + next.delete(perm); + } else { + next.add(perm); + } + return next; + }); + }; + + const handleApprove = async () => { + if (!approval) return; + setLoading(true); + try { + await chrome.runtime.sendMessage({ + type: POPUP_MESSAGES.RESOLVE_CONNECT_APPROVAL, + id: approval.id, + approved: true, + grantedPermissions: [...selected], + }); + setSelected(new Set()); + onClose(); + } catch (err) { + console.error('[ConnectApprovalModal] approve error:', err); + } finally { + setLoading(false); + } + }; + + const handleReject = async () => { + if (!approval) return; + setLoading(true); + try { + await chrome.runtime.sendMessage({ + type: POPUP_MESSAGES.RESOLVE_CONNECT_APPROVAL, + id: approval.id, + approved: false, + grantedPermissions: [], + }); + setSelected(new Set()); + onClose(); + } catch (err) { + console.error('[ConnectApprovalModal] reject error:', err); + } finally { + setLoading(false); + } + }; + + if (!approval) return null; + + const { dapp, requestedPermissions } = approval; + + return ( + + + +
+ {/* dApp identity */} +
+ {dapp.icon ? ( + {dapp.name} + ) : ( +
+ +
+ )} +
+

{dapp.name}

+

{dapp.url}

+ {dapp.description && ( +

{dapp.description}

+ )} +
+
+ + {/* Permissions list with checkboxes */} +
+
+ + + Permissions + +
+
+ {requestedPermissions.map((perm) => { + const isIdentity = perm === PERMISSION_SCOPES.IDENTITY_READ; + return ( + + ); + })} +
+
+
+ + {/* Actions */} +
+ + +
+
+ ); +} diff --git a/src/components/wallet/modals/ConnectIntentModal.tsx b/src/components/wallet/modals/ConnectIntentModal.tsx new file mode 100644 index 0000000..e08dbcc --- /dev/null +++ b/src/components/wallet/modals/ConnectIntentModal.tsx @@ -0,0 +1,530 @@ +/** + * ConnectIntentModal — handles dApp intents via Connect protocol. + * + * Routes each intent action to the appropriate wallet UI: + * send → SendModal (L3 token transfer, prefilled) + * payment_request→ SendPaymentRequestModal (prefilled) + * l1_send → inline L1 send form + * dm → DM confirmation modal with auto-approve option + * sign_message → sign message confirmation modal + * unknown → unsupported message + * + * Intent result is sent back via POPUP_RESOLVE_CONNECT_INTENT. + */ + +import { useEffect, useState, useRef, useCallback } from 'react'; +import { MessageSquare, Key, Zap, Loader2 } from 'lucide-react'; +import { ERROR_CODES } from '@unicitylabs/sphere-sdk/connect'; +import { BaseModal } from '@/components/ui/BaseModal'; +import { ModalHeader } from '@/components/ui/ModalHeader'; +import { Button } from '@/components/ui/Button'; +import { SendModal } from './SendModal'; +import { SendPaymentRequestModal } from './SendPaymentRequestModal'; +import { POPUP_MESSAGES } from '@/shared/messages'; + +interface PendingIntent { + id: string; + action: string; + params: Record; + session: { + sessionId: string; + dapp: { name: string; url: string; icon?: string }; + }; +} + +interface ConnectIntentModalProps { + isOpen: boolean; + onClose: () => void; +} + +// ── helpers ────────────────────────────────────────────────────────────────── + +async function resolveIntent( + id: string, + result: { result?: unknown; error?: { code: number; message: string } }, +): Promise { + await chrome.runtime.sendMessage({ type: POPUP_MESSAGES.RESOLVE_CONNECT_INTENT, id, result }); +} + +async function rejectIntent(id: string, message = 'User cancelled'): Promise { + await resolveIntent(id, { error: { code: ERROR_CODES.USER_REJECTED, message } }); +} + +// ── Main component ──────────────────────────────────────────────────────────── + +export function ConnectIntentModal({ isOpen, onClose }: ConnectIntentModalProps) { + const [intent, setIntent] = useState(null); + + // Poll for pending intent when modal is open + useEffect(() => { + if (!isOpen) return; + + const poll = async () => { + try { + const response = await chrome.runtime.sendMessage({ type: POPUP_MESSAGES.GET_CONNECT_INTENT }); + if (response?.intent) { + setIntent(response.intent); + } else { + setIntent(null); + } + } catch { + // Background may not be ready + } + }; + + poll(); + const interval = setInterval(poll, 500); + return () => clearInterval(interval); + }, [isOpen]); + + const handleClose = useCallback(async () => { + if (intent) await rejectIntent(intent.id); + onClose(); + }, [intent, onClose]); + + if (!intent) return null; + + const { id, action, params, session } = intent; + const dappName = session?.dapp?.name ?? 'Unknown dApp'; + + // ── send ────────────────────────────────────────────────────────────────── + if (action === 'send') { + return ( + { + if (result?.success) { + await resolveIntent(id, { result: { success: true } }); + } else { + await rejectIntent(id); + } + onClose(); + }} + prefill={{ + to: (params.to as string) ?? '', + amount: (params.amount as string) ?? '', + coinId: (params.coinId as string) ?? 'UCT', + memo: params.memo as string | undefined, + }} + /> + ); + } + + // ── payment_request ─────────────────────────────────────────────────────── + if (action === 'payment_request') { + return ( + { + if (result?.success) { + await resolveIntent(id, { result: { success: true, requestId: result.requestId } }); + } else { + await rejectIntent(id); + } + onClose(); + }} + prefill={{ + to: (params.to as string) ?? '', + amount: (params.amount as string) ?? '', + coinId: (params.coinId as string) ?? 'UCT', + message: params.message as string | undefined, + }} + /> + ); + } + + // ── l1_send ─────────────────────────────────────────────────────────────── + if (action === 'l1_send') { + return ( + + ); + } + + // ── dm ──────────────────────────────────────────────────────────────────── + if (action === 'dm') { + return ( + + ); + } + + // ── sign_message ────────────────────────────────────────────────────────── + if (action === 'sign_message') { + return ( + + ); + } + + // ── unknown ─────────────────────────────────────────────────────────────── + return ( + + +
+

Action not supported:

+ + {action} + +
+
+ +
+
+ ); +} + +// ── L1 Send ────────────────────────────────────────────────────────────────── + +type VestingMode = 'all' | 'vested' | 'unvested'; + +interface L1Balances { + vested: string; + unvested: string; + total: string; +} + +function formatAlpha(satoshis: string): string { + const n = Number(satoshis); + if (!n) return '0'; + return (n / 1e8).toFixed(4); +} + +function L1SendIntentModal({ + isOpen, + intent, + dappName, + onClose, +}: { + isOpen: boolean; + intent: PendingIntent; + dappName: string; + onClose: () => void; +}) { + const { id, params } = intent; + + // Convert sats to ALPHA for display if amount looks like an integer in sats + const rawAmount = (params.amount as string) ?? ''; + const defaultAmount = + rawAmount && /^\d+$/.test(rawAmount) && Number(rawAmount) >= 1000 + ? (Number(rawAmount) / 1e8).toString() + : rawAmount; + + const [to, setTo] = useState((params.to as string) ?? ''); + const [amount, setAmount] = useState(defaultAmount); + const [vestingMode, setVestingMode] = useState('all'); + const [balances, setBalances] = useState(null); + const [balancesLoading, setBalancesLoading] = useState(true); + const [loading, setLoading] = useState(false); + const [error, setError] = useState(null); + + // Fetch L1 vesting balances on mount + useEffect(() => { + let cancelled = false; + chrome.runtime.sendMessage({ type: POPUP_MESSAGES.GET_L1_VESTING_BALANCES }).then((res) => { + if (!cancelled && res) setBalances(res); + if (!cancelled) setBalancesLoading(false); + }).catch(() => { + if (!cancelled) setBalancesLoading(false); + }); + return () => { cancelled = true; }; + }, []); + + const handleClose = useCallback(async () => { + await rejectIntent(id); + onClose(); + }, [id, onClose]); + + const handleSend = async () => { + setLoading(true); + setError(null); + try { + const amountAlpha = Number(amount); + if (isNaN(amountAlpha) || amountAlpha <= 0) throw new Error('Invalid amount'); + const amountSatoshis = Math.round(amountAlpha * 1e8).toString(); + const result = await chrome.runtime.sendMessage({ + type: POPUP_MESSAGES.SEND_L1_TOKENS, + to, + amountSatoshis, + vestingMode, + }); + if (!result?.success) throw new Error(result?.error || 'L1 send failed'); + await resolveIntent(id, { result: { success: true, txHash: result.txHash } }); + onClose(); + } catch (e) { + setError(e instanceof Error ? e.message : 'Send failed'); + } finally { + setLoading(false); + } + }; + + const vestingOptions: { value: VestingMode; label: string; balance: string; color: string }[] = [ + { value: 'all', label: 'All', balance: balances?.total ?? '0', color: 'blue' }, + { value: 'vested', label: 'Vested', balance: balances?.vested ?? '0', color: 'green' }, + { value: 'unvested', label: 'Unvested', balance: balances?.unvested ?? '0', color: 'orange' }, + ]; + + return ( + + +
+

+ {dappName} requests an L1 transfer +

+ + {/* Vesting mode selector */} +
+ +
+ {vestingOptions.map((opt) => { + const isSelected = vestingMode === opt.value; + const colorMap = { + blue: isSelected ? 'border-blue-500 bg-blue-500/10 text-blue-600 dark:text-blue-400' : 'border-neutral-200 dark:border-neutral-700 text-neutral-500 dark:text-neutral-400', + green: isSelected ? 'border-green-500 bg-green-500/10 text-green-600 dark:text-green-400' : 'border-neutral-200 dark:border-neutral-700 text-neutral-500 dark:text-neutral-400', + orange: isSelected ? 'border-orange-500 bg-orange-500/10 text-orange-600 dark:text-orange-400' : 'border-neutral-200 dark:border-neutral-700 text-neutral-500 dark:text-neutral-400', + }; + return ( + + ); + })} +
+
+ +
+ + setTo(e.target.value)} + className="w-full bg-neutral-100 dark:bg-neutral-900 border border-neutral-200 dark:border-white/10 rounded-xl py-2.5 px-3 text-neutral-900 dark:text-white font-mono text-xs outline-none focus:border-orange-500" + /> +
+ +
+
+ + {balances && ( + + Available: {formatAlpha(vestingOptions.find(o => o.value === vestingMode)?.balance ?? '0')} ALPHA + + )} +
+ { const v = e.target.value; if (v === '' || /^\d*\.?\d*$/.test(v)) setAmount(v); }} + className="w-full bg-neutral-100 dark:bg-neutral-900 border border-neutral-200 dark:border-white/10 rounded-xl py-2.5 px-3 text-neutral-900 dark:text-white font-mono outline-none focus:border-orange-500 text-lg" + /> +
+ + {error &&

{error}

} +
+ +
+ + +
+
+ ); +} + +// ── DM Intent ───────────────────────────────────────────────────────────────── + +function DmIntentModal({ + isOpen, + intent, + dappName, + onClose, +}: { + isOpen: boolean; + intent: PendingIntent; + dappName: string; + onClose: () => void; +}) { + const { id, params } = intent; + const to = params.to as string; + const message = params.message as string; + + const [loading, setLoading] = useState(false); + const [error, setError] = useState(null); + const [autoApprove, setAutoApprove] = useState(false); + + const handleClose = useCallback(async () => { + await rejectIntent(id); + onClose(); + }, [id, onClose]); + + const handleSend = async () => { + setLoading(true); + setError(null); + try { + const result = await chrome.runtime.sendMessage({ + type: POPUP_MESSAGES.SEND_DM, + recipient: to, + content: message, + }); + if (!result?.success) throw new Error(result?.error || 'DM failed'); + + // Register auto-approve in background ConnectHost so future DMs skip popup + if (autoApprove) { + await chrome.runtime.sendMessage({ type: POPUP_MESSAGES.SET_DM_AUTO_APPROVE }); + } + + await resolveIntent(id, { + result: { sent: true, messageId: result.id, timestamp: result.timestamp }, + }); + onClose(); + } catch (e) { + setError(e instanceof Error ? e.message : 'Failed to send DM'); + } finally { + setLoading(false); + } + }; + + return ( + + +
+

+ {dappName} wants to send a DM +

+ +
+
+ To: {to} +
+
+ {message} +
+
+ + + + {error &&

{error}

} +
+ +
+ + +
+
+ ); +} + +// ── Sign Message Intent ─────────────────────────────────────────────────────── + +function SignMessageIntentModal({ + isOpen, + intent, + dappName, + onClose, +}: { + isOpen: boolean; + intent: PendingIntent; + dappName: string; + onClose: () => void; +}) { + const { id, params } = intent; + const message = params.message as string; + + const [loading, setLoading] = useState(false); + const [error, setError] = useState(null); + const signDoneRef = useRef(false); + + const handleClose = useCallback(async () => { + if (!signDoneRef.current) await rejectIntent(id); + onClose(); + }, [id, onClose]); + + const handleSign = async () => { + setLoading(true); + setError(null); + try { + const signResult = await chrome.runtime.sendMessage({ + type: POPUP_MESSAGES.SIGN_MESSAGE_CONNECT, + message, + }); + if (!signResult?.success) throw new Error(signResult?.error || 'Signing failed'); + signDoneRef.current = true; + await resolveIntent(id, { result: { signature: signResult.signature } }); + onClose(); + } catch (e) { + setError(e instanceof Error ? e.message : 'Signing failed'); + } finally { + setLoading(false); + } + }; + + return ( + + +
+

+ {dappName} requests a message signature +

+ +
+ +
+ {message} +
+
+ +
+ +

+ Signing this message proves ownership of your wallet to the dApp. +

+
+ + {error &&

{error}

} +
+ +
+ + +
+
+ ); +} diff --git a/src/components/wallet/modals/ConnectedSitesModal.tsx b/src/components/wallet/modals/ConnectedSitesModal.tsx new file mode 100644 index 0000000..57475f5 --- /dev/null +++ b/src/components/wallet/modals/ConnectedSitesModal.tsx @@ -0,0 +1,144 @@ +import { useState, useEffect, useCallback } from 'react'; +import { Globe, Trash2, Loader2, Link } from 'lucide-react'; +import { BaseModal, ModalHeader, EmptyState } from '@/components/ui'; +import type { ApprovedOriginEntry } from '@/platform/extension/background/connect-host'; +import { POPUP_MESSAGES } from '@/shared/messages'; + +interface ConnectedSitesModalProps { + isOpen: boolean; + onClose: () => void; +} + +interface SiteEntry { + origin: string; + data: ApprovedOriginEntry; +} + +function formatLastSeen(timestamp: number): string { + const diffMs = Date.now() - timestamp; + const diffMin = Math.floor(diffMs / 60_000); + const diffHours = Math.floor(diffMs / 3_600_000); + const diffDays = Math.floor(diffMs / 86_400_000); + + if (diffMin < 1) return 'Just now'; + if (diffMin < 60) return `${diffMin}m ago`; + if (diffHours < 24) return `${diffHours}h ago`; + if (diffDays === 1) return 'Yesterday'; + if (diffDays < 30) return `${diffDays}d ago`; + return new Date(timestamp).toLocaleDateString(); +} + +function getFaviconUrl(origin: string): string { + return `${origin}/favicon.ico`; +} + +export function ConnectedSitesModal({ isOpen, onClose }: ConnectedSitesModalProps) { + const [sites, setSites] = useState([]); + const [isLoading, setIsLoading] = useState(false); + const [revokingOrigin, setRevokingOrigin] = useState(null); + + const loadSites = useCallback(async () => { + setIsLoading(true); + try { + const response = await chrome.runtime.sendMessage({ type: POPUP_MESSAGES.GET_CONNECTED_SITES }); + if (response?.success && response.sites) { + const entries = Object.entries(response.sites as Record) + .map(([origin, data]) => ({ origin, data })) + .sort((a, b) => b.data.lastSeenAt - a.data.lastSeenAt); + setSites(entries); + } + } catch { + // ignore + } finally { + setIsLoading(false); + } + }, []); + + useEffect(() => { + if (isOpen) { + loadSites(); + } + }, [isOpen, loadSites]); + + const handleRevoke = useCallback(async (origin: string) => { + setRevokingOrigin(origin); + try { + await chrome.runtime.sendMessage({ type: POPUP_MESSAGES.REVOKE_CONNECTED_SITE, origin }); + setSites((prev) => prev.filter((s) => s.origin !== origin)); + } catch { + // ignore + } finally { + setRevokingOrigin(null); + } + }, []); + + return ( + + + +
+ {isLoading ? ( +
+ +
+ ) : sites.length === 0 ? ( + + ) : ( +
+ {sites.map(({ origin, data }) => ( +
+ {/* Favicon */} +
+ { + (e.currentTarget as HTMLImageElement).style.display = 'none'; + (e.currentTarget.parentElement as HTMLElement).innerHTML = + `${origin.replace(/^https?:\/\//, '').charAt(0).toUpperCase()}`; + }} + /> +
+ + {/* Info */} +
+

+ {data.dapp.name || origin.replace(/^https?:\/\//, '')} +

+

+ {origin.replace(/^https?:\/\//, '')} +

+

+ Last seen {formatLastSeen(data.lastSeenAt)} +

+
+ + {/* Disconnect button */} + +
+ ))} +
+ )} +
+
+ ); +} diff --git a/src/components/wallet/modals/LookupModal.tsx b/src/components/wallet/modals/LookupModal.tsx new file mode 100644 index 0000000..281aacf --- /dev/null +++ b/src/components/wallet/modals/LookupModal.tsx @@ -0,0 +1,191 @@ +import { useState, useCallback, useEffect } from 'react'; +import { Key, Search, Loader2, Copy, Check } from 'lucide-react'; +import { BaseModal, ModalHeader } from '@/components/ui'; +import { useSphereContext, useIdentity } from '@/sdk'; + +interface ResolvedInfo { + nametag?: string; + transportPubkey?: string; + chainPubkey?: string; + l1Address?: string; + directAddress?: string; + proxyAddress?: string; +} + +interface LookupModalProps { + isOpen: boolean; + onClose: () => void; +} + +function CopyableField({ label, value, prefix, copied, onCopy }: { + label: string; + value: string; + prefix?: string; + copied: boolean; + onCopy: () => void; +}) { + const display = prefix ? `${prefix}${value}` : value; + return ( +
+ {label} + {display} + +
+ ); +} + +export function LookupModal({ isOpen, onClose }: LookupModalProps) { + const ctx = useSphereContext(); + const { nametag, directAddress, l1Address } = useIdentity(); + const [query, setQuery] = useState(''); + const [result, setResult] = useState(null); + const [myInfo, setMyInfo] = useState(null); + const [error, setError] = useState(null); + const [isLoading, setIsLoading] = useState(false); + const [copied, setCopied] = useState(false); + + // Auto-resolve own keys when modal opens + useEffect(() => { + if (isOpen && ctx.resolve && directAddress) { + ctx.resolve(directAddress).then((info: ResolvedInfo | null) => { + if (info) setMyInfo(info); + }).catch(() => { /* ignore */ }); + setQuery(''); + setResult(null); + setError(null); + } + }, [isOpen, ctx, directAddress]); + + const handleLookup = useCallback(async () => { + const input = query.trim(); + if (!input || !ctx.resolve) return; + + setIsLoading(true); + setError(null); + setResult(null); + + try { + const info = await ctx.resolve(input); + if (!info) { + setError(`Not found: "${input}"`); + } else { + setResult(info as ResolvedInfo); + } + } catch (err) { + setError(err instanceof Error ? err.message : 'Lookup failed'); + } finally { + setIsLoading(false); + } + }, [query, ctx]); + + const handleCopy = useCallback(async (value: string, field: string) => { + try { + await navigator.clipboard.writeText(value); + setCopied(field); + setTimeout(() => setCopied(false), 1500); + } catch { /* ignore */ } + }, []); + + const handleKeyDown = (e: React.KeyboardEvent) => { + if (e.key === 'Enter') { + e.preventDefault(); + handleLookup(); + } + }; + + const toFields = (info: ResolvedInfo, prefix: string) => [ + { label: 'Nametag', value: info.nametag, key: `${prefix}-nametag`, displayPrefix: '@' }, + { label: 'Direct Address', value: info.directAddress, key: `${prefix}-direct` }, + { label: 'Proxy Address', value: info.proxyAddress, key: `${prefix}-proxy` }, + { label: 'L1 Address', value: info.l1Address, key: `${prefix}-l1` }, + { label: 'Chain Pubkey', value: info.chainPubkey, key: `${prefix}-chain` }, + { label: 'Transport Pubkey', value: info.transportPubkey, key: `${prefix}-transport` }, + ].filter((f): f is { label: string; value: string; key: string; displayPrefix?: string } => !!f.value); + + // Fall back to identity data if resolve didn't return full info + const myFields = myInfo ? toFields(myInfo, 'my') : [ + nametag && { label: 'Nametag', value: nametag, key: 'my-nametag', displayPrefix: '@' }, + directAddress && { label: 'Direct Address', value: directAddress, key: 'my-direct' }, + l1Address && { label: 'L1 Address', value: l1Address, key: 'my-l1' }, + ].filter((f): f is { label: string; value: string; key: string; displayPrefix?: string } => !!f); + + const lookupFields = result ? toFields(result, 'lookup') : []; + + return ( + + + +
+ {/* My Keys */} + {myFields.length > 0 && ( +
+
+ {myFields.map(({ label, value, key, displayPrefix }) => ( + handleCopy(displayPrefix ? `${displayPrefix}${value}` : value, key)} + /> + ))} +
+
+ )} + + {/* Lookup */} +
+

+ Lookup +

+ +
+
+ + setQuery(e.target.value)} + onKeyDown={handleKeyDown} + placeholder="@nametag, DIRECT://..., alpha1..." + className="w-full pl-8 pr-3 py-2.5 text-sm bg-neutral-100 dark:bg-neutral-800/50 text-neutral-900 dark:text-white placeholder-neutral-400 rounded-xl border border-neutral-200 dark:border-neutral-700/50 focus:outline-none focus:border-orange-500 transition-colors" + /> +
+ +
+ + {error && ( +

{error}

+ )} + + {lookupFields.length > 0 && ( +
+ {lookupFields.map(({ label, value, key, displayPrefix }) => ( + handleCopy(displayPrefix ? `${displayPrefix}${value}` : value, key)} + /> + ))} +
+ )} +
+
+
+ ); +} diff --git a/src/components/wallet/modals/PaymentRequestModal.tsx b/src/components/wallet/modals/PaymentRequestModal.tsx new file mode 100644 index 0000000..5c08643 --- /dev/null +++ b/src/components/wallet/modals/PaymentRequestModal.tsx @@ -0,0 +1,221 @@ +import { Check, Sparkles, Trash2, Loader2, XIcon, ArrowRight, Clock, Receipt, AlertCircle } from 'lucide-react'; +import { useTransfer } from '@/sdk'; +import { useState } from 'react'; +import { BaseModal, ModalHeader, EmptyState } from '@/components/ui'; + +export enum PaymentRequestStatus { + PENDING = 'pending', + ACCEPTED = 'accepted', + PAID = 'paid', + REJECTED = 'rejected', +} + +export interface IncomingPaymentRequest { + id: string; + requestId: string; + senderPubkey: string; + recipientNametag?: string; + amount: number; + coinId: string; + symbol: string; + message?: string; + timestamp: number; + status: PaymentRequestStatus; +} + +interface PaymentRequestsModalProps { + isOpen: boolean; + onClose: () => void; + requests: IncomingPaymentRequest[]; + pendingCount: number; + reject: (request: IncomingPaymentRequest) => Promise; + paid: (request: IncomingPaymentRequest) => Promise; + clearProcessed: () => void; +} + +export function PaymentRequestsModal({ isOpen, onClose, requests, pendingCount, reject, clearProcessed, paid }: PaymentRequestsModalProps) { + const { transfer } = useTransfer(); + const [processingId, setProcessingId] = useState(null); + const [errors, setErrors] = useState>({}); + + const hasProcessed = requests.some(r => r.status !== PaymentRequestStatus.PENDING); + const isGlobalProcessing = !!processingId; + + const handleSafeClose = () => { + if (!isGlobalProcessing) { + setErrors({}); + onClose(); + } + }; + + const handlePay = async (req: IncomingPaymentRequest) => { + setProcessingId(req.id); + setErrors(prev => ({ ...prev, [req.id]: '' })); + try { + const recipient = req.recipientNametag ? `@${req.recipientNametag}` : req.senderPubkey; + await transfer({ recipient, amount: req.amount.toString(), coinId: req.coinId }); + paid(req); + } catch (error: unknown) { + let errorMessage = 'Transaction failed'; + if (error instanceof Error) { + errorMessage = error.message.includes('Insufficient') ? 'Insufficient funds' : error.message; + } + setErrors(prev => ({ ...prev, [req.id]: errorMessage })); + } finally { + setProcessingId(null); + } + }; + + const subtitle = pendingCount > 0 ? ( +
+ + + + + {pendingCount} pending +
+ ) : undefined; + + return ( + + + +
+ {requests.length === 0 ? ( + + ) : ( + requests.map((req) => ( + handlePay(req)} + onReject={() => reject(req)} + isProcessing={processingId === req.id} + isGlobalDisabled={isGlobalProcessing} + /> + )) + )} +
+ + {hasProcessed && ( +
+ +
+ )} +
+ ); +} + +interface RequestCardProps { + req: IncomingPaymentRequest; + error?: string; + onPay: () => void; + onReject: () => void; + isProcessing: boolean; + isGlobalDisabled: boolean; +} + +function RequestCard({ req, error, onPay, onReject, isProcessing, isGlobalDisabled }: RequestCardProps) { + const isPending = req.status === PaymentRequestStatus.PENDING; + const timeAgo = getTimeAgo(req.timestamp); + + const statusConfig = { + [PaymentRequestStatus.ACCEPTED]: { color: 'text-emerald-500', bg: 'bg-emerald-500/10', border: 'border-emerald-500/20', icon: Check, label: 'Payment Sent' }, + [PaymentRequestStatus.PAID]: { color: 'text-emerald-500', bg: 'bg-emerald-500/10', border: 'border-emerald-500/20', icon: Check, label: 'Paid Successfully' }, + [PaymentRequestStatus.REJECTED]: { color: 'text-red-500', bg: 'bg-red-500/10', border: 'border-red-500/20', icon: XIcon, label: 'Request Declined' }, + [PaymentRequestStatus.PENDING]: { color: 'text-orange-500', bg: 'bg-orange-500/10', border: 'border-orange-500/20', icon: Clock, label: 'Awaiting Payment' }, + }; + + const currentStatus = statusConfig[req.status]; + const StatusIcon = currentStatus.icon; + const isDisabled = isGlobalDisabled && !isProcessing; + + return ( +
+ {isPending &&
} + +
+
+
+ From + + {req.recipientNametag ? `@${req.recipientNametag}` : `${req.senderPubkey.slice(0, 12)}...`} + +
+
+ {timeAgo} +
+
+ +
+
+ {req.amount} {req.symbol} +
+ {req.message && ( +
+ "{req.message}" +
+ )} +
+
+ +
+ {isPending ? ( +
+ {error && ( +
+ + {error} +
+ )} +
+ + +
+
+ ) : ( +
+ + {currentStatus.label} +
+ )} +
+
+ ); +} + +const getTimeAgo = (timestamp: number) => { + const seconds = Math.floor((Date.now() - timestamp) / 1000); + if (seconds < 60) return 'Just now'; + const minutes = Math.floor(seconds / 60); + if (minutes < 60) return `${minutes}m ago`; + const hours = Math.floor(minutes / 60); + if (hours < 24) return `${hours}h ago`; + return new Date(timestamp).toLocaleDateString(undefined, { month: 'short', day: 'numeric' }); +}; diff --git a/src/components/wallet/modals/SeedPhraseModal.tsx b/src/components/wallet/modals/SeedPhraseModal.tsx new file mode 100644 index 0000000..db267bb --- /dev/null +++ b/src/components/wallet/modals/SeedPhraseModal.tsx @@ -0,0 +1,97 @@ +import { Eye, EyeOff, Copy, Check, ShieldAlert } from 'lucide-react'; +import { useState, useEffect } from 'react'; +import { BaseModal, ModalHeader, AlertMessage, Button, SecondaryButton } from '@/components/ui'; + +interface SeedPhraseModalProps { + isOpen: boolean; + onClose: () => void; + seedPhrase: string[]; +} + +export function SeedPhraseModal({ isOpen, onClose, seedPhrase }: SeedPhraseModalProps) { + const [isRevealed, setIsRevealed] = useState(false); + const [copied, setCopied] = useState(false); + + // Reset revealed state when modal closes + useEffect(() => { + if (!isOpen) { + setIsRevealed(false); + setCopied(false); + } + }, [isOpen]); + + const handleCopy = async () => { + try { + await navigator.clipboard.writeText(seedPhrase.join(' ')); + setCopied(true); + setTimeout(() => setCopied(false), 2000); + } catch (err) { + console.error('Failed to copy seed phrase:', err); + } + }; + + return ( + + + + {/* Content */} +
+ {/* Warning */} +
+ + Anyone with these words can access your wallet and steal your funds. + +
+ + {/* Seed phrase grid */} +
+ {!isRevealed ? ( +
+ setIsRevealed(true)}> + Reveal Recovery Phrase + +
+ ) : ( + <> +
+ {seedPhrase.map((word, index) => ( +
+ + {index + 1}. + +
+ {word} +
+
+ ))} +
+ + {/* Action buttons */} +
+ setIsRevealed(false)} className="flex-1"> + Hide + + + +
+ + )} +
+ + {/* Info */} +
+ Write down these 12 words in order and store them safely. You'll need them to recover your wallet. +
+
+
+ ); +} diff --git a/src/components/wallet/modals/SendModal.tsx b/src/components/wallet/modals/SendModal.tsx new file mode 100644 index 0000000..7d290a0 --- /dev/null +++ b/src/components/wallet/modals/SendModal.tsx @@ -0,0 +1,450 @@ +import { useState, useEffect, useRef, useCallback } from 'react'; +import { ArrowRight, Loader2, User, CheckCircle, Coins, Hash, Copy, Check } from 'lucide-react'; +import type { Asset } from '@unicitylabs/sphere-sdk'; +import { useAssets, useTransfer, useSphereContext, CurrencyUtils } from '@/sdk'; +import { BaseModal, ModalHeader, Button } from '@/components/ui'; + +type Step = 'recipient' | 'asset' | 'amount' | 'confirm' | 'processing' | 'success'; + +export interface SendPrefill { + to: string; + amount: string; + coinId: string; + memo?: string; +} + +interface SendModalProps { + isOpen: boolean; + onClose: (result?: { success: boolean }) => void; + prefill?: SendPrefill; +} + +export function SendModal({ isOpen, onClose, prefill }: SendModalProps) { + const { assets } = useAssets(); + const { transfer, isLoading: isTransferring } = useTransfer(); + const ctx = useSphereContext(); + + const [copiedKey, setCopiedKey] = useState(null); + const copyToClipboard = useCallback((text: string, key: string) => { + navigator.clipboard.writeText(text).then(() => { + setCopiedKey(key); + setTimeout(() => setCopiedKey(null), 2000); + }).catch(() => {}); + }, []); + + // State + const [step, setStep] = useState('recipient'); + const [recipientMode, setRecipientMode] = useState<'nametag' | 'direct'>('nametag'); + const [recipient, setRecipient] = useState(''); + const [isCheckingRecipient, setIsCheckingRecipient] = useState(false); + const [recipientError, setRecipientError] = useState(null); + + const [resolvedAddress, setResolvedAddress] = useState(null); + + const [selectedAsset, setSelectedAsset] = useState(null); + const [amountInput, setAmountInput] = useState(''); + const [memoInput, setMemoInput] = useState(''); + + // Pre-fill from connect intent (dApp request) + const prefillApplied = useRef(false); + useEffect(() => { + if (!prefill || !isOpen || prefillApplied.current) return; + if (assets.length === 0) return; // wait for assets to load + + const { to, amount, coinId } = prefill; + + if (to.startsWith('DIRECT://')) { + setRecipientMode('direct'); + setRecipient(to); + } else { + setRecipientMode('nametag'); + setRecipient(to.replace(/^@/, '')); + } + + setAmountInput(amount); + if (prefill.memo) setMemoInput(prefill.memo); + + const asset = assets.find((a) => a.coinId === coinId); + if (asset) { + setSelectedAsset(asset); + setStep('confirm'); + prefillApplied.current = true; + } + }, [prefill, isOpen, assets]); + + const handleRecipientChange = (e: React.ChangeEvent) => { + if (recipientMode === 'nametag') { + const value = e.target.value.toLowerCase(); + if (/^@?[a-z0-9_\-+.]*$/.test(value)) { + setRecipient(value); + setRecipientError(null); + } + } else { + setRecipient(e.target.value); + setRecipientError(null); + } + }; + + const reset = () => { + setStep('recipient'); + setRecipientMode('nametag'); + setRecipient(''); + setResolvedAddress(null); + setSelectedAsset(null); + setAmountInput(''); + setMemoInput(''); + setRecipientError(null); + prefillApplied.current = false; + }; + + const handleClose = () => { + reset(); + onClose(); + }; + + // STEP 1: Validate Recipient via SDK transport + const handleRecipientNext = async () => { + if (!recipient.trim()) return; + setIsCheckingRecipient(true); + setRecipientError(null); + + try { + if (recipientMode === 'direct') { + const addr = recipient.trim(); + if (!addr.startsWith('DIRECT://')) { + setRecipientError('Direct address must start with DIRECT://'); + return; + } + setRecipient(addr); + setResolvedAddress(addr); + setStep('asset'); + } else { + const cleanTag = recipient.replace('@', '').replace('@unicity', '').trim(); + + if (ctx.resolve) { + const peerInfo = await ctx.resolve(`@${cleanTag}`); + if (peerInfo) { + setRecipient(cleanTag); + setResolvedAddress(peerInfo.proxyAddress || null); + setStep('asset'); + } else { + setRecipientError(`User @${cleanTag} not found`); + } + } else { + setRecipient(cleanTag); + setStep('asset'); + } + } + } catch { + setRecipientError("Network error"); + } finally { + setIsCheckingRecipient(false); + } + }; + + // STEP 3: Go to confirm + const handleAmountNext = () => { + if (!selectedAsset || !amountInput) return; + const targetAmount = CurrencyUtils.toSmallestUnit(amountInput, selectedAsset.decimals); + if (targetAmount === '0') return; + setStep('confirm'); + }; + + // STEP 4: Execute transfer via SDK + const handleSend = async () => { + if (!selectedAsset || !amountInput || !recipient) return; + + setStep('processing'); + setRecipientError(null); + + try { + const amount = CurrencyUtils.toSmallestUnit(amountInput, selectedAsset.decimals); + await transfer({ + coinId: selectedAsset.coinId, + amount, + recipient, + ...(memoInput ? { memo: memoInput } : {}), + }); + + setStep('success'); + } catch (e: unknown) { + console.error(e); + setRecipientError(e instanceof Error ? e.message : "Transfer failed"); + setStep('confirm'); + } + }; + + const handleSuccessClose = () => { + reset(); + onClose({ success: true }); + }; + + const getTitle = () => { + switch (step) { + case 'recipient': return 'Send To'; + case 'asset': return 'Select Asset'; + case 'amount': return 'Enter Amount'; + case 'confirm': return 'Confirm Transfer'; + case 'processing': return 'Processing...'; + case 'success': return 'Sent!'; + } + }; + + const formatAmount = (rawAmount: string, decimals: number) => + CurrencyUtils.toHumanReadable(rawAmount, decimals); + + return ( + + + +
+ + {/* 1. RECIPIENT */} + {step === 'recipient' && ( +
+
+ +
+ {recipientMode === 'nametag' && ( + @ + )} + e.key === 'Enter' && handleRecipientNext()} + className={`w-full bg-neutral-100 dark:bg-neutral-900 border border-neutral-200 dark:border-white/10 rounded-xl py-3 pr-4 text-neutral-900 dark:text-white focus:border-orange-500 outline-none ${recipientMode === 'nametag' ? 'pl-8' : 'pl-4 font-mono text-sm'}`} + placeholder={recipientMode === 'nametag' ? 'Unicity ID' : 'DIRECT://...'} + /> +
+ {recipientError &&

{recipientError}

} + +
+ + +
+ )} + + {/* 2. ASSET */} + {step === 'asset' && ( +
+ {assets.map((asset) => ( + + ))} +
+ )} + + {/* 3. AMOUNT */} + {step === 'amount' && selectedAsset && (() => { + const smallestUnit = CurrencyUtils.toSmallestUnit(amountInput || '0', selectedAsset.decimals); + const insufficientBalance = amountInput !== '' && BigInt(smallestUnit) > BigInt(selectedAsset.totalAmount); + return ( +
+
+
+ Amount + + Available: {formatAmount(selectedAsset.totalAmount, selectedAsset.decimals)} + +
+
+ { + const v = e.target.value; + if (v === '' || /^\d*\.?\d*$/.test(v)) setAmountInput(v); + }} + className={`w-full bg-neutral-100 dark:bg-neutral-900 border rounded-xl py-3 px-4 text-neutral-900 dark:text-white text-2xl font-mono outline-none ${insufficientBalance ? 'border-red-500 focus:border-red-500' : 'border-neutral-200 dark:border-white/10 focus:border-orange-500'}`} + placeholder="0.00" + /> + +
+ {insufficientBalance &&

Insufficient balance

} + {recipientError &&

{recipientError}

} +
+
+ + setMemoInput(e.target.value)} + className="w-full bg-neutral-100 dark:bg-neutral-900 border border-neutral-200 dark:border-white/10 rounded-xl py-3 px-4 text-neutral-900 dark:text-white outline-none focus:border-orange-500 text-sm" + placeholder="Add a note to this transfer" + /> +
+ +
+ ); + })()} + + {/* 4. CONFIRM */} + {step === 'confirm' && selectedAsset && ( +
+ + {/* Summary Card */} +
+
You are sending
+
+ {amountInput} {selectedAsset.symbol} +
+ {selectedAsset.priceUsd != null && ( +
+ ≈ ${(parseFloat(amountInput) * selectedAsset.priceUsd).toFixed(2)} USD +
+ )} + {selectedAsset.priceUsd == null &&
} + +
+
+
+ {recipientMode === 'direct' ? ( + + ) : ( + + )} + + {recipientMode === 'direct' ? recipient : `@${recipient}`} + +
+ +
+ {recipientMode === 'nametag' && resolvedAddress && ( +
+ + {resolvedAddress.length > 30 + ? `${resolvedAddress.slice(0, 18)}...${resolvedAddress.slice(-8)}` + : resolvedAddress} + + +
+ )} +
+ {memoInput && ( +
+ “{memoInput}” +
+ )} +
+ + {/* Strategy Info */} +
+
+ +
+
Smart Transfer
+
+ Token splitting and transfer optimization is handled automatically. +
+
+
+
+ + {recipientError &&

{recipientError}

} + + +
+ )} + + {/* 5. PROCESSING */} + {step === 'processing' && ( +
+ +

Sending Transaction...

+

Processing proofs and broadcasting via Nostr

+
+ )} + + {/* 6. SUCCESS */} + {step === 'success' && ( +
+
+ +
+

Success!

+

+ Successfully sent {amountInput} {selectedAsset?.symbol} to {recipientMode === 'direct' ? recipient : `@${recipient}`} +

+ +
+ )} + +
+ + ); +} diff --git a/src/components/wallet/modals/SendPaymentRequestModal.tsx b/src/components/wallet/modals/SendPaymentRequestModal.tsx new file mode 100644 index 0000000..111970f --- /dev/null +++ b/src/components/wallet/modals/SendPaymentRequestModal.tsx @@ -0,0 +1,340 @@ +/** + * SendPaymentRequestModal — sends a payment request to another user via Nostr. + * + * Used both standalone (from wallet UI) and as a Connect protocol intent handler + * when a dApp calls client.intent('payment_request', { to, amount, coinId, message }). + */ + +import { useState, useEffect, useRef } from 'react'; +import { ArrowRight, Loader2, User, CheckCircle, Hash, Receipt } from 'lucide-react'; +import { TokenRegistry, toSmallestUnit } from '@unicitylabs/sphere-sdk'; +import { BaseModal, ModalHeader, Button } from '@/components/ui'; +import { POPUP_MESSAGES } from '@/shared/messages'; + +type Step = 'recipient' | 'coin' | 'amount' | 'confirm' | 'processing' | 'success'; + +interface CoinOption { + coinId: string; + symbol: string; + decimals: number; + iconUrl?: string; +} + +export interface PaymentRequestPrefill { + to: string; + amount: string; + coinId: string; + message?: string; +} + +interface SendPaymentRequestModalProps { + isOpen: boolean; + onClose: (result?: { success: boolean; requestId?: string }) => void; + prefill?: PaymentRequestPrefill; +} + +export function SendPaymentRequestModal({ isOpen, onClose, prefill }: SendPaymentRequestModalProps) { + const [step, setStep] = useState('recipient'); + const [recipientMode, setRecipientMode] = useState<'nametag' | 'direct'>('nametag'); + const [recipient, setRecipient] = useState(''); + const [isCheckingRecipient, setIsCheckingRecipient] = useState(false); + const [recipientError, setRecipientError] = useState(null); + + const [availableCoins, setAvailableCoins] = useState([]); + const [selectedCoin, setSelectedCoin] = useState(null); + const [amountInput, setAmountInput] = useState(''); + const [messageInput, setMessageInput] = useState(''); + const [error, setError] = useState(null); + const [requestId, setRequestId] = useState(null); + + useEffect(() => { + if (!isOpen) return; + const registry = TokenRegistry.getInstance(); + const definitions = registry.getAllDefinitions(); + const coins: CoinOption[] = definitions + .filter((def) => def.assetKind === 'fungible') + .map((def) => ({ + coinId: def.id, + symbol: def.symbol || def.name.toUpperCase(), + decimals: def.decimals || 0, + iconUrl: registry.getIconUrl(def.id) ?? undefined, + })); + setAvailableCoins(coins); + }, [isOpen]); + + const prefillApplied = useRef(false); + useEffect(() => { + if (!prefill || !isOpen || prefillApplied.current) return; + if (availableCoins.length === 0) return; + + const { to, amount, coinId, message } = prefill; + if (to.startsWith('DIRECT://')) { + setRecipientMode('direct'); + setRecipient(to); + } else { + setRecipientMode('nametag'); + setRecipient(to.replace(/^@/, '')); + } + setAmountInput(amount); + if (message) setMessageInput(message); + + const coin = availableCoins.find((c) => c.coinId === coinId); + if (coin) { + setSelectedCoin(coin); + setStep('confirm'); + prefillApplied.current = true; + } + }, [prefill, isOpen, availableCoins]); + + const reset = () => { + setStep('recipient'); + setRecipientMode('nametag'); + setRecipient(''); + setSelectedCoin(null); + setAmountInput(''); + setMessageInput(''); + setRecipientError(null); + setError(null); + setRequestId(null); + prefillApplied.current = false; + }; + + const handleClose = () => { + reset(); + onClose(); + }; + + const handleRecipientNext = async () => { + if (!recipient.trim()) return; + setIsCheckingRecipient(true); + setRecipientError(null); + try { + if (recipientMode === 'direct') { + if (!recipient.trim().startsWith('DIRECT://')) { + setRecipientError('Direct address must start with DIRECT://'); + return; + } + setStep('coin'); + } else { + const cleanTag = recipient.replace('@', '').replace('@unicity', '').trim(); + setRecipient(cleanTag); + setStep('coin'); + } + } catch { + setRecipientError('Network error'); + } finally { + setIsCheckingRecipient(false); + } + }; + + const handleAmountNext = () => { + if (!selectedCoin || !amountInput) return; + const targetAmount = toSmallestUnit(amountInput, selectedCoin.decimals); + if (targetAmount <= 0n) return; + setStep('confirm'); + }; + + const handleSendRequest = async () => { + if (!selectedCoin || !amountInput || !recipient) return; + setStep('processing'); + setError(null); + try { + const amount = toSmallestUnit(amountInput, selectedCoin.decimals).toString(); + const recipientStr = recipientMode === 'nametag' ? `@${recipient}` : recipient; + const result = await chrome.runtime.sendMessage({ + type: POPUP_MESSAGES.SEND_PAYMENT_REQUEST, + recipient: recipientStr, + amount, + coinId: selectedCoin.coinId, + message: messageInput || undefined, + }); + if (!result?.success) { + throw new Error(result?.error || 'Failed to send payment request'); + } + setRequestId(result.requestId || null); + setStep('success'); + } catch (e: unknown) { + setError(e instanceof Error ? e.message : 'Failed to send payment request'); + setStep('confirm'); + } + }; + + const handleSuccessClose = () => { + reset(); + onClose({ success: true, requestId: requestId || undefined }); + }; + + const getTitle = () => { + switch (step) { + case 'recipient': return 'Request From'; + case 'coin': return 'Select Currency'; + case 'amount': return 'Enter Amount'; + case 'confirm': return 'Confirm Request'; + case 'processing': return 'Sending...'; + case 'success': return 'Request Sent!'; + } + }; + + return ( + + + +
+ + {/* RECIPIENT */} + {step === 'recipient' && ( +
+
+ +
+ {recipientMode === 'nametag' && ( + @ + )} + { setRecipient(e.target.value); setRecipientError(null); }} + onKeyDown={(e) => e.key === 'Enter' && handleRecipientNext()} + className={`w-full bg-neutral-100 dark:bg-neutral-900 border border-neutral-200 dark:border-white/10 rounded-xl py-2.5 pr-4 text-neutral-900 dark:text-white focus:border-orange-500 outline-none text-sm ${recipientMode === 'nametag' ? 'pl-7' : 'pl-3 font-mono'}`} + placeholder={recipientMode === 'nametag' ? 'username' : 'DIRECT://...'} + /> +
+ {recipientError &&

{recipientError}

} + +
+ +
+ )} + + {/* COIN */} + {step === 'coin' && ( +
+ {availableCoins.map((coin) => ( + + ))} +
+ )} + + {/* AMOUNT */} + {step === 'amount' && selectedCoin && ( +
+
+ + { const v = e.target.value; if (v === '' || /^\d*\.?\d*$/.test(v)) setAmountInput(v); }} + className="w-full bg-neutral-100 dark:bg-neutral-900 border border-neutral-200 dark:border-white/10 rounded-xl py-3 px-4 text-neutral-900 dark:text-white text-2xl font-mono outline-none focus:border-orange-500" + placeholder="0.00" + /> +
+
+ + setMessageInput(e.target.value)} + className="w-full bg-neutral-100 dark:bg-neutral-900 border border-neutral-200 dark:border-white/10 rounded-xl py-2.5 px-4 text-neutral-900 dark:text-white outline-none focus:border-orange-500 text-sm" + placeholder="e.g. Payment for order #1234" + /> +
+ +
+ )} + + {/* CONFIRM */} + {step === 'confirm' && selectedCoin && ( +
+
+
You are requesting
+
+ {amountInput} {selectedCoin.symbol} +
+
from
+
+ {recipientMode === 'direct' ? ( + + ) : ( + + )} + + {recipientMode === 'direct' ? recipient : `@${recipient}`} + +
+ {messageInput && ( +
“{messageInput}”
+ )} +
+ +
+ +
+
Payment Request
+
+ The recipient will receive a notification and can choose to pay or decline. +
+
+
+ + {error &&

{error}

} + +
+ )} + + {/* PROCESSING */} + {step === 'processing' && ( +
+ +

Sending Payment Request...

+

Delivering via Nostr

+
+ )} + + {/* SUCCESS */} + {step === 'success' && selectedCoin && ( +
+
+ +
+

Request Sent!

+

+ Payment request for {amountInput} {selectedCoin.symbol} sent to{' '} + {recipientMode === 'direct' ? recipient : `@${recipient}`} +

+ +
+ )} +
+
+ ); +} diff --git a/src/components/wallet/modals/SettingsModal.tsx b/src/components/wallet/modals/SettingsModal.tsx new file mode 100644 index 0000000..c2bb4a1 --- /dev/null +++ b/src/components/wallet/modals/SettingsModal.tsx @@ -0,0 +1,85 @@ +import { useState } from 'react'; +import { Settings, Download, LogOut, Key, Link } from 'lucide-react'; +import { BaseModal, ModalHeader, MenuButton } from '@/components/ui'; +import { LookupModal } from './LookupModal'; +import { ConnectedSitesModal } from './ConnectedSitesModal'; + +interface SettingsModalProps { + isOpen: boolean; + onClose: () => void; + onBackupWallet: () => void; + onLogout: () => void; +} + +export function SettingsModal({ + isOpen, + onClose, + onBackupWallet, + onLogout, +}: SettingsModalProps) { + const [isLookupOpen, setIsLookupOpen] = useState(false); + const [isConnectedSitesOpen, setIsConnectedSitesOpen] = useState(false); + + return ( + <> + + + +
+ { + onClose(); + setIsLookupOpen(true); + }} + /> + + { + onClose(); + setIsConnectedSitesOpen(true); + }} + /> + + { + onClose(); + onBackupWallet(); + }} + /> + + { + onClose(); + onLogout(); + }} + /> +
+
+ + setIsLookupOpen(false)} + /> + + setIsConnectedSitesOpen(false)} + /> + + ); +} diff --git a/src/components/wallet/modals/SwapModal.tsx b/src/components/wallet/modals/SwapModal.tsx new file mode 100644 index 0000000..8c4e0f3 --- /dev/null +++ b/src/components/wallet/modals/SwapModal.tsx @@ -0,0 +1,305 @@ +import { useState, useMemo } from 'react'; +import { ArrowDownUp, Loader2, TrendingUp, CheckCircle, ArrowDown } from 'lucide-react'; +import type { Asset } from '@unicitylabs/sphere-sdk'; +import { useIdentity, useAssets, useTransfer } from '@/sdk'; +import { CurrencyUtils } from '@/sdk'; +import { BaseModal, ModalHeader, Button } from '@/components/ui'; + +type Step = 'swap' | 'processing' | 'success'; + +interface SwapModalProps { + isOpen: boolean; + onClose: () => void; +} + +export function SwapModal({ isOpen, onClose }: SwapModalProps) { + const { nametag } = useIdentity(); + const { assets } = useAssets(); + const { transfer } = useTransfer(); + + const [step, setStep] = useState('swap'); + const [fromAsset, setFromAsset] = useState(null); + const [toAsset, setToAsset] = useState(null); + const [fromAmount, setFromAmount] = useState(''); + const [showFromDropdown, setShowFromDropdown] = useState(false); + const [showToDropdown, setShowToDropdown] = useState(false); + const [error, setError] = useState(null); + + // Use user's assets as available swap options + const swappableAssets = useMemo(() => assets, [assets]); + + // Format asset amount from smallest unit to human-readable + const formatAssetAmount = (asset: Asset): string => { + try { + return CurrencyUtils.toHumanReadable(asset.totalAmount, asset.decimals); + } catch { + return '0'; + } + }; + + const resolvePrice = (asset: Asset): number => { + return asset.priceUsd && asset.priceUsd > 0 ? asset.priceUsd : 1.0; + }; + + const exchangeInfo = useMemo(() => { + if (!fromAsset || !toAsset || !fromAmount || parseFloat(fromAmount) <= 0) return null; + const fromAmountNum = parseFloat(fromAmount); + const fromPrice = resolvePrice(fromAsset); + const toPrice = resolvePrice(toAsset); + if (fromPrice === 0 || toPrice === 0) return null; + const rate = fromPrice / toPrice; + const toAmount = fromAmountNum * rate; + return { rate, fromValueUSD: fromAmountNum * fromPrice, toAmount, toValueUSD: toAmount * toPrice }; + }, [fromAsset, toAsset, fromAmount]); + + const isValidAmount = useMemo(() => { + if (!fromAsset || !fromAmount) return false; + const amount = parseFloat(fromAmount); + if (isNaN(amount) || amount <= 0) return false; + const maxAmount = parseFloat(formatAssetAmount(fromAsset)); + return amount <= maxAmount; + }, [fromAsset, fromAmount]); + + const reset = () => { + setStep('swap'); + setFromAsset(null); + setToAsset(null); + setFromAmount(''); + setError(null); + setShowFromDropdown(false); + setShowToDropdown(false); + }; + + const handleClose = () => { reset(); onClose(); }; + + const handleSwap = async () => { + if (!fromAsset || !toAsset || !fromAmount || !exchangeInfo || !nametag) return; + setStep('processing'); + setError(null); + try { + const fromAmountSmallest = CurrencyUtils.toSmallestUnit(fromAmount, fromAsset.decimals); + await transfer({ recipient: 'swap', amount: fromAmountSmallest.toString(), coinId: fromAsset.coinId }); + // Request swapped tokens from faucet + const coinName = (toAsset.name || toAsset.symbol || '').toLowerCase(); + await fetch(`https://faucet.unicity.network/api/faucet/request?nametag=${encodeURIComponent(nametag)}&coin=${encodeURIComponent(coinName)}&amount=${exchangeInfo.toAmount}`); + setStep('success'); + } catch (e: unknown) { + console.error('Swap failed:', e); + setError(e instanceof Error ? e.message : 'Swap failed'); + setStep('swap'); + } + }; + + const handleFlipAssets = () => { + if (!fromAsset || !toAsset) return; + const newFrom = assets.find((a) => a.coinId === toAsset.coinId); + if (!newFrom) { + setError(`You don't have any ${toAsset.symbol} to swap from`); + return; + } + const newTo = swappableAssets.find((a) => a.coinId === fromAsset.coinId); + setFromAsset(newFrom); + setToAsset(newTo || fromAsset); + setError(null); + if (exchangeInfo && exchangeInfo.toAmount > 0) { + setFromAmount(parseFloat(exchangeInfo.toAmount.toFixed(6)).toString()); + } else { + setFromAmount(''); + } + }; + + const getTitle = () => { + switch (step) { + case 'swap': return 'Swap Tokens'; + case 'processing': return 'Processing Swap...'; + case 'success': return 'Swap Complete!'; + } + }; + + return ( + + + +
+ {/* SWAP INTERFACE */} + {step === 'swap' && ( +
+ {/* FROM */} +
+
+ From + {fromAsset && ( + + Balance: {formatAssetAmount(fromAsset)} + + )} +
+
+
+
+ + {showFromDropdown && ( +
+ {assets.map((asset) => ( + + ))} +
+ )} +
+ setFromAmount(e.target.value)} + placeholder="0.00" + disabled={!fromAsset} + className="flex-1 bg-transparent text-right text-xl font-mono text-neutral-900 dark:text-white outline-none disabled:opacity-50 min-w-0" + /> +
+ {fromAsset && fromAmount && ( +
+ ≈ ${(parseFloat(fromAmount) * resolvePrice(fromAsset)).toFixed(2)} +
+ )} +
+
+ + {/* Flip */} +
+ +
+ + {/* TO */} +
+
+ To +
+
+
+
+ + {showToDropdown && ( +
+ {swappableAssets.filter((a) => a.coinId !== fromAsset?.coinId).map((asset) => ( + + ))} +
+ )} +
+
+ {exchangeInfo ? exchangeInfo.toAmount.toFixed(6) : '0.00'} +
+
+ {exchangeInfo && ( +
+ ≈ ${exchangeInfo.toValueUSD.toFixed(2)} +
+ )} +
+
+ + {/* Exchange Rate */} + {exchangeInfo && fromAsset && toAsset && ( +
+
+ + Exchange Rate +
+
+ 1 {fromAsset.symbol} = {exchangeInfo.rate.toFixed(6)} {toAsset.symbol} +
+
+ )} + + {error && ( +
+

{error}

+
+ )} + + +
+ )} + + {/* PROCESSING */} + {step === 'processing' && ( +
+ +

Processing Swap...

+

Sending tokens and requesting swap

+
+ )} + + {/* SUCCESS */} + {step === 'success' && fromAsset && toAsset && exchangeInfo && ( +
+
+ +
+

Swap Complete!

+

+ Swapped {fromAmount} {fromAsset.symbol} +

+

+ for {exchangeInfo.toAmount.toFixed(6)} {toAsset.symbol} +

+ +
+ )} +
+
+ ); +} diff --git a/src/components/wallet/modals/TopUpModal.tsx b/src/components/wallet/modals/TopUpModal.tsx new file mode 100644 index 0000000..5fb6913 --- /dev/null +++ b/src/components/wallet/modals/TopUpModal.tsx @@ -0,0 +1,131 @@ +import { useState } from 'react'; +import { Plus, Sparkles, CheckCircle, XCircle } from 'lucide-react'; +import { useIdentity } from '@/sdk'; +import { BaseModal, ModalHeader, Button } from '@/components/ui'; + +const FAUCET_API_URL = 'https://faucet.unicity.network/api/v1/faucet/request'; + +const FAUCET_COINS = [ + { coin: 'unicity', amount: 100 }, + { coin: 'bitcoin', amount: 1 }, + { coin: 'solana', amount: 1000 }, + { coin: 'ethereum', amount: 42 }, + { coin: 'tether', amount: 1000 }, + { coin: 'usd-coin', amount: 1000 }, + { coin: 'unicity-usd', amount: 1000 }, +]; + +async function requestTokens(unicityId: string, coin: string, amount: number) { + const response = await fetch(FAUCET_API_URL, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ unicityId, coin, amount }), + }); + if (!response.ok) { + const errorText = await response.text(); + throw new Error(`Failed to request ${coin}: ${response.statusText} - ${errorText}`); + } + return { success: true, coin, amount, ...(await response.json()) }; +} + +interface TopUpModalProps { + isOpen: boolean; + onClose: () => void; +} + +export function TopUpModal({ isOpen, onClose }: TopUpModalProps) { + const { nametag } = useIdentity(); + + const [isFaucetLoading, setIsFaucetLoading] = useState(false); + const [faucetSuccess, setFaucetSuccess] = useState(false); + const [faucetError, setFaucetError] = useState(null); + + const handleFaucetRequest = async () => { + if (!nametag) return; + + setIsFaucetLoading(true); + setFaucetError(null); + setFaucetSuccess(false); + + try { + const results = await Promise.all( + FAUCET_COINS.map(({ coin, amount }) => + requestTokens(nametag, coin, amount).catch((error) => ({ + success: false, + coin, + amount, + message: error instanceof Error ? error.message : 'Unknown error', + })) + ) + ); + const failedRequests = results.filter((r) => !r.success); + + if (failedRequests.length > 0) { + const failedCoins = failedRequests.map((r) => r.coin).join(', '); + setFaucetError(`Failed to request: ${failedCoins}`); + } else { + setFaucetSuccess(true); + setTimeout(() => setFaucetSuccess(false), 3000); + } + } catch (error) { + setFaucetError(error instanceof Error ? error.message : 'Failed to request tokens'); + } finally { + setIsFaucetLoading(false); + } + }; + + const handleClose = () => { + setFaucetError(null); + setFaucetSuccess(false); + onClose(); + }; + + return ( + + + +
+
+
+ +
+

+ Request test tokens from the Unicity faucet +

+ + {!nametag ? ( +

+ Nametag is required to request tokens +

+ ) : ( + <> + + + {faucetError && ( +
+ +

{faucetError}

+
+ )} + + )} +
+
+
+ ); +} diff --git a/src/components/wallet/modals/TransactionHistoryModal.tsx b/src/components/wallet/modals/TransactionHistoryModal.tsx new file mode 100644 index 0000000..535aa5d --- /dev/null +++ b/src/components/wallet/modals/TransactionHistoryModal.tsx @@ -0,0 +1,320 @@ +import { useMemo, useState, useCallback } from 'react'; +import { ArrowUpRight, ArrowDownLeft, Loader2, Clock, ChevronDown, Copy, Check } from 'lucide-react'; +import type { TransactionHistoryEntry } from '@unicitylabs/sphere-sdk'; +import { TokenRegistry } from '@unicitylabs/sphere-sdk'; +import { useTransactionHistory } from '@/sdk'; +import { BaseModal, ModalHeader, EmptyState } from '@/components/ui'; + +interface FormattedHistoryEntry extends TransactionHistoryEntry { + formattedAmount: string; + formattedTokenIds?: Array<{ + id: string; + amount: string; + source: 'split' | 'direct'; + formattedAmount: string; + }>; + date: string; + time: string; + iconUrl?: string | null; +} + +/** Copy text to clipboard, return true on success */ +function useCopyToClipboard() { + const [copiedKey, setCopiedKey] = useState(null); + + const copy = useCallback(async (text: string, key: string) => { + try { + await navigator.clipboard.writeText(text); + setCopiedKey(key); + setTimeout(() => setCopiedKey(null), 2000); + } catch { + // Ignore + } + }, []); + + return { copiedKey, copy }; +} + +/** Truncate middle of string: "DIRECT://abc...xyz" */ +function truncateMiddle(str: string, startLen = 14, endLen = 6): string { + if (str.length <= startLen + endLen + 3) return str; + return `${str.slice(0, startLen)}...${str.slice(-endLen)}`; +} + +/** Format raw amount (smallest units) to human-readable with given decimals */ +function formatRawAmount(raw: string, decimals: number): string { + const val = BigInt(raw || '0'); + if (decimals === 0) return val.toString(); + const divisor = BigInt(10 ** decimals); + const intPart = val / divisor; + const fracPart = val % divisor; + const fracStr = fracPart.toString().padStart(decimals, '0'); + return `${intPart}.${fracStr}`.replace(/\.?0+$/, ''); +} + +/** Single detail row with copy button */ +function DetailRow({ label, value, copyKey, copiedKey, onCopy }: { + label: string; + value: string; + copyKey: string; + copiedKey: string | null; + onCopy: (text: string, key: string) => void; +}) { + return ( +
+ {label} +
+ + {truncateMiddle(value)} + + +
+
+ ); +} + +interface TransactionHistoryModalProps { + isOpen: boolean; + onClose: () => void; +} + +export function TransactionHistoryModal({ isOpen, onClose }: TransactionHistoryModalProps) { + const { history, isLoading } = useTransactionHistory(); + const [expandedId, setExpandedId] = useState(null); + const { copiedKey, copy } = useCopyToClipboard(); + + const formattedHistory = useMemo(() => { + const registry = TokenRegistry.getInstance(); + return history.map((entry): FormattedHistoryEntry => { + const decimals = registry.getDecimals(entry.coinId); + + return { + ...entry, + iconUrl: registry.getIconUrl(entry.coinId), + formattedAmount: formatRawAmount(entry.amount, decimals), + formattedTokenIds: entry.tokenIds?.map((t) => ({ + ...t, + formattedAmount: formatRawAmount(t.amount, decimals), + })), + date: new Date(entry.timestamp).toLocaleDateString('en-US', { + month: 'short', + day: 'numeric', + year: 'numeric', + }), + time: new Date(entry.timestamp).toLocaleTimeString('en-US', { + hour: '2-digit', + minute: '2-digit', + }), + }; + }); + }, [history]); + + const toggleExpand = (id: string) => { + setExpandedId(prev => prev === id ? null : id); + }; + + return ( + + + + {/* Content - Scrollable */} +
+ {isLoading ? ( +
+ +
+ ) : history.length === 0 ? ( + + ) : ( +
+ {formattedHistory.map((entry) => { + const isExpanded = expandedId === entry.id; + const peerLabel = entry.type === 'RECEIVED' + ? (entry.senderNametag ? `@${entry.senderNametag}` : entry.senderAddress ? truncateMiddle(entry.senderAddress) : entry.senderPubkey ? `${entry.senderPubkey.slice(0, 4)}...${entry.senderPubkey.slice(-4)}` : null) + : (entry.recipientNametag ? `@${entry.recipientNametag}` : entry.recipientAddress ? truncateMiddle(entry.recipientAddress) : null); + + return ( +
toggleExpand(entry.id)} + > + {/* Main row */} +
+ {/* Icon with badge */} +
+ {entry.iconUrl ? ( + + ) : ( +
+ + {entry.symbol?.slice(0, 2) || '??'} + +
+ )} +
+ {entry.type === 'RECEIVED' ? ( + + ) : ( + + )} +
+
+ + {/* Title & Subtitle */} +
+
+ {entry.type === 'RECEIVED' ? 'Received' : 'Sent'} + {peerLabel && ( + + {entry.type === 'RECEIVED' ? 'from' : 'to'} {peerLabel} + + )} +
+
+ {entry.date} • {entry.time} +
+ {entry.memo && ( +
+ “{entry.memo}” +
+ )} +
+ + {/* Amount + chevron */} +
+
+ {entry.type === 'RECEIVED' ? '+' : '-'}{entry.formattedAmount} {entry.symbol} +
+ +
+
+ + {/* Expandable detail panel */} + {isExpanded && ( +
+
+
+ {/* Peer info */} + {entry.type === 'RECEIVED' && ( + <> + {entry.senderNametag && ( + + )} + {entry.senderAddress && ( + + )} + {entry.senderPubkey && ( + + )} + + )} + {entry.type === 'SENT' && ( + <> + {entry.recipientNametag && ( + + )} + {entry.recipientAddress && ( + + )} + {entry.recipientPubkey && ( + + )} + + )} + + {/* Memo */} + {entry.memo && ( +
+ Memo +
+ “{entry.memo}” +
+
+ )} + + {/* Token breakdown (V6 combined transfers) */} + {entry.formattedTokenIds && entry.formattedTokenIds.length > 1 && ( +
+ + Tokens ({entry.formattedTokenIds.length}) + +
+ {entry.formattedTokenIds.map((t, idx) => ( +
+
+ + {t.source} + + + {truncateMiddle(t.id, 8, 6)} + + +
+ + {t.formattedAmount} {entry.symbol} + +
+ ))} +
+
+ )} + + {/* Common fields */} + {entry.tokenId && !entry.formattedTokenIds?.length && ( + + )} + {entry.transferId && ( + + )} +
+ Amount (raw) + {entry.amount} +
+
+
+
+ )} +
+ ); + })} +
+ )} +
+
+ ); +} diff --git a/src/components/wallet/modals/index.ts b/src/components/wallet/modals/index.ts new file mode 100644 index 0000000..0684bd0 --- /dev/null +++ b/src/components/wallet/modals/index.ts @@ -0,0 +1,11 @@ +export { SendModal } from './SendModal'; +export type { SendPrefill } from './SendModal'; +export { TransactionHistoryModal } from './TransactionHistoryModal'; +export { SettingsModal } from './SettingsModal'; +export { SeedPhraseModal } from './SeedPhraseModal'; +export { LookupModal } from './LookupModal'; +export { TopUpModal } from './TopUpModal'; +export { SwapModal } from './SwapModal'; +export { PaymentRequestsModal } from './PaymentRequestModal'; +export { PaymentRequestStatus } from './PaymentRequestModal'; +export type { IncomingPaymentRequest } from './PaymentRequestModal'; diff --git a/src/components/wallet/onboarding/CreateWalletFlow.tsx b/src/components/wallet/onboarding/CreateWalletFlow.tsx new file mode 100644 index 0000000..4494268 --- /dev/null +++ b/src/components/wallet/onboarding/CreateWalletFlow.tsx @@ -0,0 +1,145 @@ +/** + * CreateWalletFlow - Main onboarding flow component + * Extension-adapted: no framer-motion, password-based wallet creation + * + * Create flow: start → nametag → passwordSetup → processing → mnemonicBackup → done + * Restore flow: start → restoreMethod → restore → passwordSetup → processing → done + */ +import { useOnboardingFlow } from "./useOnboardingFlow"; +import { StartScreen } from "./StartScreen"; +import { RestoreMethodScreen } from "./RestoreMethodScreen"; +import { RestoreScreen } from "./RestoreScreen"; +import { PasswordSetupScreen } from "./PasswordSetupScreen"; +import { ProcessingScreen } from "./ProcessingScreen"; +import { MnemonicBackupScreen } from "./MnemonicBackupScreen"; +import { NametagScreen } from "./NametagScreen"; + +export type { OnboardingStep } from "./useOnboardingFlow"; + +export function CreateWalletFlow() { + const { + // Step management + step, + setStep, + goToStart, + + // State + isBusy, + error, + isRestoreFlow, + + // Password state + password, + setPassword, + confirmPassword, + setConfirmPassword, + + // Mnemonic restore state + seedWords, + setSeedWords, + + // Generated mnemonic + generatedMnemonic, + + // Nametag state + nametagInput, + setNametagInput, + nametagAvailability, + + // Processing state + processingStatus, + processingStep, + processingTotalSteps, + processingTitle, + processingCompleteTitle, + isProcessingComplete, + + // Actions + handleCreateKeys, + handleStartRestore, + handleRestoreWallet, + handleMintNametag, + handleSkipNametag, + handlePasswordConfirm, + handleProcessingComplete, + handleMnemonicBackupConfirm, + } = useOnboardingFlow(); + + return ( +
+ {step === "start" && ( + + )} + + {step === "restoreMethod" && ( + setStep("restore")} + onBack={goToStart} + /> + )} + + {step === "restore" && ( + setStep("restoreMethod")} + /> + )} + + {step === "nametag" && ( + + )} + + {step === "passwordSetup" && ( + setStep(isRestoreFlow ? "restore" : "nametag")} + /> + )} + + {step === "processing" && ( + + )} + + {step === "mnemonicBackup" && generatedMnemonic && ( + + )} +
+ ); +} diff --git a/src/components/wallet/onboarding/MnemonicBackupScreen.tsx b/src/components/wallet/onboarding/MnemonicBackupScreen.tsx new file mode 100644 index 0000000..c3c60a6 --- /dev/null +++ b/src/components/wallet/onboarding/MnemonicBackupScreen.tsx @@ -0,0 +1,117 @@ +/** + * MnemonicBackupScreen - Extension-specific screen for mnemonic backup + * Shows the generated mnemonic words in a grid for user backup + * Uses same styling patterns as the rest of the onboarding flow + */ +import { ShieldAlert, Copy, Check } from "lucide-react"; +import { useState, useCallback } from "react"; + +interface MnemonicBackupScreenProps { + mnemonic: string; + onConfirm: () => void; +} + +export function MnemonicBackupScreen({ + mnemonic, + onConfirm, +}: MnemonicBackupScreenProps) { + const [copied, setCopied] = useState(false); + const words = mnemonic.split(" "); + + const handleCopy = useCallback(async () => { + try { + await navigator.clipboard.writeText(mnemonic); + setCopied(true); + setTimeout(() => setCopied(false), 2000); + } catch { + // Fallback for environments where clipboard API is not available + const textarea = document.createElement("textarea"); + textarea.value = mnemonic; + textarea.style.position = "fixed"; + textarea.style.opacity = "0"; + document.body.appendChild(textarea); + textarea.select(); + document.execCommand("copy"); + document.body.removeChild(textarea); + setCopied(true); + setTimeout(() => setCopied(false), 2000); + } + }, [mnemonic]); + + return ( +
+ {/* Warning Icon */} +
+
+
+ +
+
+ +

+ Back Up Recovery Phrase +

+ +

+ Write down these 12 words in order and keep them safe.{" "} + + This is the only way to recover your wallet. + +

+ + {/* Mnemonic word grid */} +
+ {words.map((word, index) => ( +
+ + {index + 1}. + + + {word} + +
+ ))} +
+ + {/* Copy button */} + + + {/* Warning notice */} +
+

+ Never share your recovery phrase with anyone. Anyone with these words + can access your wallet and funds. +

+
+ + {/* Confirm button */} + +
+ ); +} diff --git a/src/components/wallet/onboarding/NametagScreen.tsx b/src/components/wallet/onboarding/NametagScreen.tsx new file mode 100644 index 0000000..369e33e --- /dev/null +++ b/src/components/wallet/onboarding/NametagScreen.tsx @@ -0,0 +1,154 @@ +/** + * NametagScreen - Unicity ID creation screen + * Extension-adapted: removed framer-motion animations + * Keeps real-time availability checking UI + */ +import { ShieldCheck, ArrowRight, ArrowLeft, Loader2, CheckCircle2, AlertCircle } from "lucide-react"; + +export type NametagAvailability = "idle" | "checking" | "available" | "taken"; + +interface NametagScreenProps { + nametagInput: string; + isBusy: boolean; + error: string | null; + availability: NametagAvailability; + onNametagChange: (value: string) => void; + onSubmit: () => void; + onSkip?: () => void; + onBack?: () => void; +} + +export function NametagScreen({ + nametagInput, + isBusy, + error, + availability, + onNametagChange, + onSubmit, + onSkip, + onBack, +}: NametagScreenProps) { + const handleChange = (e: React.ChangeEvent) => { + const value = e.target.value.toLowerCase(); + // Allow only valid nametag characters + if (/^[a-z0-9_\-+.]*$/.test(value)) { + onNametagChange(value); + } + }; + + const canSubmit = nametagInput && !isBusy && availability !== "taken" && availability !== "checking"; + + const handleKeyDown = (e: React.KeyboardEvent) => { + if (e.key === "Enter" && canSubmit) { + onSubmit(); + } + }; + + return ( +
+ {/* Success Icon */} +
+
+
+ +
+
+ +

+ Choose Unicity ID +

+ +

+ Choose a unique{" "} + + Unicity ID + {" "} + to receive tokens easily without long addresses. +

+ + {/* Input Field */} +
+
+ {availability === "checking" && } + {availability === "available" && } + {availability === "taken" && } + + @unicity + +
+ +
+
+ + {/* Availability status -- fixed height to prevent layout shift */} +
+ {availability === "taken" && !error && ( +

+ @{nametagInput} is already taken +

+ )} + {availability === "available" && ( +

+ @{nametagInput} is available +

+ )} +
+ + {/* Continue Button */} + + + {/* Skip Button */} + {onSkip && ( + + )} + + {/* Back Button */} + {onBack && ( + + )} + + {error && ( +

+ {error} +

+ )} +
+ ); +} diff --git a/src/components/wallet/onboarding/PasswordSetupScreen.tsx b/src/components/wallet/onboarding/PasswordSetupScreen.tsx new file mode 100644 index 0000000..732a089 --- /dev/null +++ b/src/components/wallet/onboarding/PasswordSetupScreen.tsx @@ -0,0 +1,142 @@ +/** + * PasswordSetupScreen - Extension-specific encryption password step + * Not in sphere web app — required for encrypted mnemonic storage in chrome.storage + */ +import { Lock, ArrowLeft, ArrowRight, Loader2, Eye, EyeOff } from "lucide-react"; +import { useState } from "react"; + +interface PasswordSetupScreenProps { + password: string; + confirmPassword: string; + isBusy: boolean; + error: string | null; + onPasswordChange: (value: string) => void; + onConfirmPasswordChange: (value: string) => void; + onConfirm: () => void; + onBack: () => void; +} + +export function PasswordSetupScreen({ + password, + confirmPassword, + isBusy, + error, + onPasswordChange, + onConfirmPasswordChange, + onConfirm, + onBack, +}: PasswordSetupScreenProps) { + const [showPassword, setShowPassword] = useState(false); + const [showConfirm, setShowConfirm] = useState(false); + + const handleKeyDown = (e: React.KeyboardEvent) => { + if (e.key === "Enter" && password && confirmPassword && !isBusy) { + onConfirm(); + } + }; + + return ( +
+ {/* Icon */} +
+
+
+ +
+
+ +

+ Set Encryption Password +

+

+ This password encrypts your wallet locally.{" "} + + You'll need it each time you open the extension. + +

+ + {/* Password inputs */} +
+
+ onPasswordChange(e.target.value)} + onKeyDown={handleKeyDown} + placeholder="Create password (min 8 characters)" + disabled={isBusy} + className="w-full bg-neutral-100 dark:bg-neutral-800/50 border border-neutral-200 dark:border-neutral-700/50 rounded-xl py-3 pl-3 pr-10 text-sm text-neutral-900 dark:text-white placeholder-neutral-400 dark:placeholder-neutral-600 focus:outline-none focus:border-blue-500 focus:bg-white dark:focus:bg-neutral-800 transition-all disabled:opacity-50" + autoFocus + /> + +
+ +
+ onConfirmPasswordChange(e.target.value)} + onKeyDown={handleKeyDown} + placeholder="Confirm password" + disabled={isBusy} + className="w-full bg-neutral-100 dark:bg-neutral-800/50 border border-neutral-200 dark:border-neutral-700/50 rounded-xl py-3 pl-3 pr-10 text-sm text-neutral-900 dark:text-white placeholder-neutral-400 dark:placeholder-neutral-600 focus:outline-none focus:border-blue-500 focus:bg-white dark:focus:bg-neutral-800 transition-all disabled:opacity-50" + /> + +
+
+ + {/* Buttons */} +
+ + + +
+ + {error && ( +

+ {error} +

+ )} +
+ ); +} diff --git a/src/components/wallet/onboarding/ProcessingScreen.tsx b/src/components/wallet/onboarding/ProcessingScreen.tsx new file mode 100644 index 0000000..4071745 --- /dev/null +++ b/src/components/wallet/onboarding/ProcessingScreen.tsx @@ -0,0 +1,112 @@ +/** + * ProcessingScreen - Shows progress during wallet creation/import + * Ported from sphere web app — CSS animations instead of framer-motion + */ +import { Loader2, CheckCircle2 } from "lucide-react"; + +interface ProcessingScreenProps { + status: string; + currentStep?: number; + totalSteps?: number; + title?: string; + completeTitle?: string; + completeButtonText?: string; + isComplete?: boolean; + onComplete?: () => void; +} + +export function ProcessingScreen({ + status, + currentStep = 0, + totalSteps = 3, + title = "Setting up Profile...", + completeTitle = "Profile Ready!", + completeButtonText = "Let's go!", + isComplete = false, + onComplete, +}: ProcessingScreenProps) { + return ( +
+ {/* Loading Spinner or Success Icon */} +
+ {!isComplete ? ( + <> + {/* Outer Ring */} +
+ {/* Middle Ring */} +
+ {/* Inner Glow */} +
+ {/* Center Icon */} +
+ +
+ + ) : ( + /* Success State */ +
+
+
+ +
+
+ )} +
+ +

+ {isComplete ? completeTitle : title} +

+ + {/* Dynamic Progress Status */} +
+ {/* Current status indicator */} +
+
+ + {status || "Initializing..."} + +
+ + {/* Step indicators */} +
+ {Array.from({ length: totalSteps }).map((_, i) => ( +
+ ))} +
+
+ + {!isComplete && ( +

+ This may take a few moments... +

+ )} + + {/* Complete Button */} + {isComplete && onComplete && ( + + )} +
+ ); +} diff --git a/src/components/wallet/onboarding/RestoreMethodScreen.tsx b/src/components/wallet/onboarding/RestoreMethodScreen.tsx new file mode 100644 index 0000000..ed2e88c --- /dev/null +++ b/src/components/wallet/onboarding/RestoreMethodScreen.tsx @@ -0,0 +1,101 @@ +/** + * RestoreMethodScreen - Choose restore method + * Ported from sphere web app — minus framer-motion + */ +import { KeyRound, Upload, ArrowRight, ArrowLeft } from "lucide-react"; + +interface RestoreMethodScreenProps { + isBusy: boolean; + error: string | null; + onSelectMnemonic: () => void; + onBack: () => void; +} + +export function RestoreMethodScreen({ + isBusy, + error, + onSelectMnemonic, + onBack, +}: RestoreMethodScreenProps) { + return ( +
+ {/* Icon */} +
+
+
+ +
+
+ +

+ Restore Wallet +

+

+ Choose how you want to restore your wallet +

+ +
+ {/* Recovery Phrase Option */} + + + {/* Import from File Option — disabled for now */} + +
+ + {/* Back Button */} + + + {error && ( +

+ {error} +

+ )} +
+ ); +} diff --git a/src/components/wallet/onboarding/RestoreScreen.tsx b/src/components/wallet/onboarding/RestoreScreen.tsx new file mode 100644 index 0000000..33cccdb --- /dev/null +++ b/src/components/wallet/onboarding/RestoreScreen.tsx @@ -0,0 +1,133 @@ +/** + * RestoreScreen - Mnemonic recovery phrase input screen + * Ported from sphere web app — no password fields (password is a separate step) + */ +import { KeyRound, ArrowLeft, ArrowRight, Loader2 } from "lucide-react"; + +interface RestoreScreenProps { + seedWords: string[]; + isBusy: boolean; + error: string | null; + onSeedWordsChange: (words: string[]) => void; + onRestore: () => void; + onBack: () => void; +} + +export function RestoreScreen({ + seedWords, + isBusy, + error, + onSeedWordsChange, + onRestore, + onBack, +}: RestoreScreenProps) { + const handleWordChange = (index: number, value: string) => { + const newWords = [...seedWords]; + newWords[index] = value; + onSeedWordsChange(newWords); + }; + + const handlePaste = (e: React.ClipboardEvent) => { + const pastedText = e.clipboardData.getData("text").trim(); + const words = pastedText.split(/\s+/).filter((w) => w.length > 0); + if (words.length > 1) { + e.preventDefault(); + const newWords = Array(12).fill(""); + words.slice(0, 12).forEach((word, i) => { + newWords[i] = word.toLowerCase(); + }); + onSeedWordsChange(newWords); + } + }; + + const handleKeyDown = (e: React.KeyboardEvent, index: number) => { + if (e.key === "Enter" && index < 11) { + const nextInput = (e.currentTarget as HTMLElement).parentElement + ?.nextElementSibling?.querySelector("input"); + nextInput?.focus(); + } else if (e.key === "Enter" && index === 11 && isComplete) { + onRestore(); + } + }; + + const isComplete = seedWords.every((w) => w.trim()); + + return ( +
+ {/* Icon */} +
+
+
+ +
+
+ +

+ Restore Wallet +

+

+ Enter your 12-word recovery phrase to restore your wallet +

+ + {/* 12-word grid */} +
+ {Array.from({ length: 12 }).map((_, index) => ( +
+ + {index + 1}. + + handleWordChange(index, e.target.value)} + onPaste={handlePaste} + onKeyDown={(e) => handleKeyDown(e, index)} + placeholder="word" + className="w-full bg-neutral-100 dark:bg-neutral-800/50 border border-neutral-200 dark:border-neutral-700/50 rounded-lg py-2.5 pl-8 pr-2 text-sm text-neutral-900 dark:text-white placeholder-neutral-400 dark:placeholder-neutral-600 focus:outline-none focus:border-blue-500 focus:bg-white dark:focus:bg-neutral-800 transition-all" + autoFocus={index === 0} + /> +
+ ))} +
+ + {/* Buttons */} +
+ + + +
+ + {error && ( +

+ {error} +

+ )} +
+ ); +} diff --git a/src/components/wallet/onboarding/StartScreen.tsx b/src/components/wallet/onboarding/StartScreen.tsx new file mode 100644 index 0000000..01887e8 --- /dev/null +++ b/src/components/wallet/onboarding/StartScreen.tsx @@ -0,0 +1,87 @@ +/** + * StartScreen - Initial onboarding screen + * Ported from sphere web app — no passwords, clean layout + */ +import { ArrowRight, Loader2, KeyRound } from "lucide-react"; +import { UnionIcon } from "@/components/ui/UnionIcon"; + +interface StartScreenProps { + isBusy: boolean; + error: string | null; + progressMessage?: string | null; + onCreateWallet: () => void; + onRestore: () => void; +} + +export function StartScreen({ + isBusy, + error, + progressMessage, + onCreateWallet, + onRestore, +}: StartScreenProps) { + return ( +
+ {/* Icon with glow effect */} +
+
+
+ +
+
+ +

+ No Wallet Found +

+

+ Create a new secure wallet to start using{" "} + + the Unicity Network + +

+ + + + {isBusy && progressMessage && ( +
+ + {progressMessage} +
+ )} + + + + {error && ( +

+ {error} +

+ )} +
+ ); +} diff --git a/src/components/wallet/onboarding/index.ts b/src/components/wallet/onboarding/index.ts new file mode 100644 index 0000000..5eedbad --- /dev/null +++ b/src/components/wallet/onboarding/index.ts @@ -0,0 +1,11 @@ +export { CreateWalletFlow } from "./CreateWalletFlow"; +export type { OnboardingStep } from "./CreateWalletFlow"; +export { StartScreen } from "./StartScreen"; +export { RestoreMethodScreen } from "./RestoreMethodScreen"; +export { RestoreScreen } from "./RestoreScreen"; +export { PasswordSetupScreen } from "./PasswordSetupScreen"; +export { ProcessingScreen } from "./ProcessingScreen"; +export { MnemonicBackupScreen } from "./MnemonicBackupScreen"; +export { NametagScreen } from "./NametagScreen"; +export type { NametagAvailability } from "./useOnboardingFlow"; +export { useOnboardingFlow } from "./useOnboardingFlow"; diff --git a/src/components/wallet/onboarding/useOnboardingFlow.ts b/src/components/wallet/onboarding/useOnboardingFlow.ts new file mode 100644 index 0000000..2a78b3f --- /dev/null +++ b/src/components/wallet/onboarding/useOnboardingFlow.ts @@ -0,0 +1,321 @@ +/** + * useOnboardingFlow - Manages onboarding flow state and navigation + * Matches sphere web app flow with extension-specific additions: + * - passwordSetup step (encrypted mnemonic storage) + * - mnemonicBackup step (show recovery phrase after create) + * + * Create flow: start → nametag → passwordSetup → processing → mnemonicBackup → done + * Restore flow: start → restoreMethod → restore → passwordSetup → processing → done + */ +import { useState, useCallback, useEffect } from "react"; +import { useSphereContext } from "@/sdk/context"; + +export type NametagAvailability = "idle" | "checking" | "available" | "taken"; + +export type OnboardingStep = + | "start" + | "restoreMethod" + | "restore" + | "nametag" + | "passwordSetup" + | "processing" + | "mnemonicBackup"; + +export function useOnboardingFlow() { + const { + createWallet, + importWallet, + isNametagAvailable, + registerNametag, + } = useSphereContext(); + + // Step management + const [step, setStep] = useState("start"); + + // Common state + const [isBusy, setIsBusy] = useState(false); + const [error, setError] = useState(null); + + // Track which flow we're in (create vs restore) + const [isRestoreFlow, setIsRestoreFlow] = useState(false); + + // Password state (collected in passwordSetup step) + const [password, setPassword] = useState(""); + const [confirmPassword, setConfirmPassword] = useState(""); + + // Mnemonic restore state + const [seedWords, setSeedWords] = useState(Array(12).fill("")); + + // Generated mnemonic (from create flow) + const [generatedMnemonic, setGeneratedMnemonic] = useState(null); + + // Nametag state (collected before wallet creation, like sphere) + const [nametagInput, setNametagInput] = useState(""); + const [nametagAvailability, setNametagAvailability] = useState("idle"); + const [pendingNametag, setPendingNametag] = useState(null); + + // Processing state + const [processingStatus, setProcessingStatus] = useState(""); + const [processingStep, setProcessingStep] = useState(0); + const [processingTotalSteps, setProcessingTotalSteps] = useState(3); + const [processingTitle, setProcessingTitle] = useState("Setting up Profile..."); + const [processingCompleteTitle, setProcessingCompleteTitle] = useState("Profile Ready!"); + const [isProcessingComplete, setIsProcessingComplete] = useState(false); + + // Debounced nametag availability check + useEffect(() => { + const cleanTag = nametagInput.trim().replace(/^@/, ""); + if (!cleanTag || cleanTag.length < 2) { + setNametagAvailability("idle"); + return; + } + + let cancelled = false; + setNametagAvailability("checking"); + + const timer = setTimeout(async () => { + const maxAttempts = 2; + for (let attempt = 1; attempt <= maxAttempts; attempt++) { + if (cancelled) return; + try { + const available = await isNametagAvailable(cleanTag); + if (!cancelled) { + setNametagAvailability(available ? "available" : "taken"); + } + return; + } catch { + if (attempt < maxAttempts) { + await new Promise((r) => setTimeout(r, 1500)); + } + } + } + if (!cancelled) { + setNametagAvailability("idle"); + } + }, 500); + + return () => { + cancelled = true; + clearTimeout(timer); + }; + }, [nametagInput, isNametagAvailable]); + + // Go back to start screen — reset all state + const goToStart = useCallback(() => { + setStep("start"); + setSeedWords(Array(12).fill("")); + setPassword(""); + setConfirmPassword(""); + setGeneratedMnemonic(null); + setPendingNametag(null); + setIsRestoreFlow(false); + setError(null); + }, []); + + // ---- CREATE FLOW ---- + + // Step 1: User clicks "Create New Wallet" → go to nametag (like sphere) + const handleCreateKeys = useCallback(() => { + setIsRestoreFlow(false); + setError(null); + setStep("nametag"); + }, []); + + // Step 2a: User enters nametag → store it, go to passwordSetup + const handleMintNametag = useCallback(() => { + if (!nametagInput.trim()) return; + const cleanTag = nametagInput.trim().replace("@", ""); + setPendingNametag(cleanTag); + setError(null); + setStep("passwordSetup"); + }, [nametagInput]); + + // Step 2b: User skips nametag → go to passwordSetup + const handleSkipNametag = useCallback(() => { + setPendingNametag(null); + setError(null); + setStep("passwordSetup"); + }, []); + + // ---- RESTORE FLOW ---- + + // Step 1: User clicks "Restore" → go to restoreMethod + const handleStartRestore = useCallback(() => { + setIsRestoreFlow(true); + setError(null); + setStep("restoreMethod"); + }, []); + + // Step 2: User validates seed words → go to passwordSetup + const handleRestoreWallet = useCallback(() => { + const words = seedWords.map((w) => w.trim().toLowerCase()); + const missingIndex = words.findIndex((w) => w === ""); + + if (missingIndex !== -1) { + setError(`Please fill in word ${missingIndex + 1}`); + return; + } + + setError(null); + setStep("passwordSetup"); + }, [seedWords]); + + // ---- PASSWORD STEP (shared by both flows) ---- + + const handlePasswordConfirm = useCallback(async () => { + if (!password) { + setError("Please enter a password"); + return; + } + if (password.length < 8) { + setError("Password must be at least 8 characters"); + return; + } + if (password !== confirmPassword) { + setError("Passwords do not match"); + return; + } + + setIsBusy(true); + setError(null); + + // Go to processing and execute wallet creation/import + setStep("processing"); + setProcessingStep(0); + setIsProcessingComplete(false); + + if (isRestoreFlow) { + // RESTORE: import wallet with mnemonic + password + setProcessingTitle("Importing Wallet..."); + setProcessingCompleteTitle("Import Complete!"); + setProcessingTotalSteps(3); + setProcessingStatus("Importing wallet..."); + + try { + const mnemonic = seedWords.map((w) => w.trim().toLowerCase()).join(" "); + setProcessingStep(1); + setProcessingStatus("Restoring wallet..."); + + await importWallet(mnemonic, password); + + setProcessingStep(2); + setProcessingStatus("Setup complete!"); + setIsProcessingComplete(true); + } catch (e) { + const message = e instanceof Error ? e.message : "Invalid recovery phrase"; + setError(message); + setStep("restore"); + } finally { + setIsBusy(false); + } + } else { + // CREATE: create wallet with password + optional nametag + setProcessingTotalSteps(pendingNametag ? 3 : 2); + setProcessingTitle("Setting up Profile..."); + setProcessingCompleteTitle("Profile Ready!"); + setProcessingStatus("Creating wallet..."); + + try { + // Step 1: Create wallet + setProcessingStep(0); + setProcessingStatus("Creating wallet..."); + + const result = await createWallet(password); + setGeneratedMnemonic(result.mnemonic); + + // Step 2: Register nametag if provided + if (pendingNametag) { + setProcessingStep(1); + setProcessingStatus("Registering Unicity ID..."); + + try { + await registerNametag(pendingNametag); + setProcessingStep(2); + } catch (e) { + // Nametag registration failed but wallet was created + console.error("Nametag registration failed:", e); + setProcessingStep(2); + } + } else { + setProcessingStep(1); + } + + setProcessingStatus("Setup complete!"); + setIsProcessingComplete(true); + } catch (e) { + const message = e instanceof Error ? e.message : "Failed to create wallet"; + setError(message); + setStep("passwordSetup"); + } finally { + setIsBusy(false); + } + } + }, [password, confirmPassword, isRestoreFlow, seedWords, pendingNametag, createWallet, importWallet, registerNametag]); + + // ---- PROCESSING COMPLETE ---- + + const handleProcessingComplete = useCallback(() => { + if (isRestoreFlow) { + // Restore flow: done, reload + window.location.reload(); + } else { + // Create flow: show mnemonic backup + setStep("mnemonicBackup"); + } + }, [isRestoreFlow]); + + // ---- MNEMONIC BACKUP ---- + + const handleMnemonicBackupConfirm = useCallback(() => { + // Done — reload to show main wallet UI + window.location.reload(); + }, []); + + return { + // Step management + step, + setStep, + goToStart, + + // State + isBusy, + error, + isRestoreFlow, + + // Password state + password, + setPassword, + confirmPassword, + setConfirmPassword, + + // Mnemonic restore state + seedWords, + setSeedWords, + + // Generated mnemonic + generatedMnemonic, + + // Nametag state + nametagInput, + setNametagInput, + nametagAvailability, + + // Processing state + processingStatus, + processingStep, + processingTotalSteps, + processingTitle, + processingCompleteTitle, + isProcessingComplete, + + // Actions + handleCreateKeys, + handleStartRestore, + handleRestoreWallet, + handleMintNametag, + handleSkipNametag, + handlePasswordConfirm, + handleProcessingComplete, + handleMnemonicBackupConfirm, + }; +} diff --git a/src/components/wallet/shared/AddressSelector.tsx b/src/components/wallet/shared/AddressSelector.tsx new file mode 100644 index 0000000..be031e3 --- /dev/null +++ b/src/components/wallet/shared/AddressSelector.tsx @@ -0,0 +1,98 @@ +import { useState, useCallback } from 'react'; +import { Copy, Check } from 'lucide-react'; +import { useIdentity } from '@/sdk'; + +/** Truncate long nametags: show first 6 chars + ... + last 3 chars */ +function truncateNametag(nametag: string, maxLength: number = 20): string { + if (nametag.length <= maxLength) return nametag; + return `${nametag.slice(0, 6)}...${nametag.slice(-3)}`; +} + +interface AddressSelectorProps { + /** Compact mode - just show nametag with copy button */ + compact?: boolean; +} + +export function AddressSelector({ compact = true }: AddressSelectorProps) { + const [copied, setCopied] = useState<'nametag' | 'address' | false>(false); + const { nametag, directAddress } = useIdentity(); + + const handleCopyNametag = useCallback(async () => { + if (!nametag) return; + try { + await navigator.clipboard.writeText(`@${nametag}`); + setCopied('nametag'); + setTimeout(() => setCopied(false), 2000); + } catch (err) { + console.error('Failed to copy nametag:', err); + } + }, [nametag]); + + const handleCopyDirectAddress = useCallback(async () => { + if (!directAddress) return; + try { + await navigator.clipboard.writeText(directAddress); + setCopied('address'); + setTimeout(() => setCopied(false), 2000); + } catch (err) { + console.error('Failed to copy direct address:', err); + } + }, [directAddress]); + + if (compact) { + return ( +
+ {nametag ? ( + <> + + @{truncateNametag(nametag)} + + + + ) : directAddress ? ( + <> + + {directAddress.slice(0, 8)}...{directAddress.slice(-4)} + + + + ) : null} +
+ ); + } + + // Full mode (placeholder for future use) + return ( +
+ {nametag ? ( + @{nametag} + ) : directAddress ? ( + + {directAddress.slice(0, 8)}...{directAddress.slice(-6)} + + ) : ( + ... + )} +
+ ); +} diff --git a/src/components/wallet/shared/AssetRow.tsx b/src/components/wallet/shared/AssetRow.tsx new file mode 100644 index 0000000..0017c5f --- /dev/null +++ b/src/components/wallet/shared/AssetRow.tsx @@ -0,0 +1,136 @@ +import { type Asset, TokenRegistry } from '@unicitylabs/sphere-sdk'; +import { Box, Loader2 } from 'lucide-react'; +import { memo } from 'react'; + +interface AssetRowProps { + asset: Asset; + showBalances: boolean; + delay: number; + onClick?: () => void; + layer?: 'L1' | 'L3'; + /** If true, animate entrance. If false, render without animation (asset was already shown) */ + isNew?: boolean; +} + +// Custom comparison: allow re-render when amount or price changes +function areAssetPropsEqual(prev: AssetRowProps, next: AssetRowProps): boolean { + return ( + prev.asset.coinId === next.asset.coinId && + prev.asset.symbol === next.asset.symbol && + prev.asset.totalAmount === next.asset.totalAmount && + prev.asset.tokenCount === next.asset.tokenCount && + prev.asset.unconfirmedTokenCount === next.asset.unconfirmedTokenCount && + prev.asset.transferringTokenCount === next.asset.transferringTokenCount && + prev.asset.priceUsd === next.asset.priceUsd && + prev.asset.change24h === next.asset.change24h && + prev.asset.iconUrl === next.asset.iconUrl && + prev.showBalances === next.showBalances && + prev.layer === next.layer && + prev.isNew === next.isNew && + prev.delay === next.delay + ); +} + +// Static fiat value display (replaces AnimatedFiatValue) +function FiatValue({ value, showBalances }: { value: number; showBalances: boolean }) { + if (!showBalances) return ••••••; + const formatted = `$${value.toLocaleString('en-US', { minimumFractionDigits: 2, maximumFractionDigits: 2 })}`; + return {formatted}; +} + +// Static amount display (replaces AnimatedAmount) +function AmountDisplay({ value, symbol, decimals, showBalances }: { + value: number; + symbol: string; + decimals: number; + showBalances: boolean; +}) { + if (!showBalances) return ••••; + const formatted = value.toLocaleString('en-US', { + minimumFractionDigits: Math.min(decimals, 4), + maximumFractionDigits: Math.min(decimals, 4) + }); + return {formatted} {symbol}; +} + +export const AssetRow = memo(function AssetRow({ asset, showBalances, delay: _delay, onClick, layer, isNew: _isNew = true }: AssetRowProps) { + const change24h = asset.change24h ?? 0; + const changeColor = change24h >= 0 ? 'text-emerald-500 dark:text-emerald-400' : 'text-red-500 dark:text-red-400'; + const changeSign = change24h >= 0 ? '+' : ''; + + const fiatValue = asset.fiatValueUsd ?? 0; + const numericAmount = Number(asset.totalAmount) / Math.pow(10, asset.decimals); + + const className = `p-3 rounded-xl transition-all group border border-transparent hover:border-neutral-200/50 dark:hover:border-white/5 ${onClick ? 'cursor-pointer hover:translate-x-1' : ''}`; + + const content = ( +
+
+
+ {(asset.iconUrl || TokenRegistry.getInstance().getIconUrl(asset.coinId)) ? ( + {asset.symbol} + ) : ( + + )} +
+ +
+
+
{asset.symbol}
+ {layer && ( + + {layer} + + )} +
+ {asset.name} +
+ {asset.transferringTokenCount > 0 && ( + + + {asset.transferringTokenCount} sending + + )} + {asset.unconfirmedTokenCount - asset.transferringTokenCount > 0 && ( + + + {asset.unconfirmedTokenCount - asset.transferringTokenCount} pending + + )} +
+
+ +
+
+
+ +
+
+ +
+
+ {changeSign}{change24h.toFixed(2)}% +
+
+
+ ); + + return ( +
+ {content} +
+ ); +}, areAssetPropsEqual); diff --git a/src/components/wallet/shared/BackupWalletModal.tsx b/src/components/wallet/shared/BackupWalletModal.tsx new file mode 100644 index 0000000..5f609fa --- /dev/null +++ b/src/components/wallet/shared/BackupWalletModal.tsx @@ -0,0 +1,57 @@ +import { Download, Key, ShieldCheck } from 'lucide-react'; +import { BaseModal, MenuButton } from '@/components/ui'; + +interface BackupWalletModalProps { + isOpen: boolean; + onClose: () => void; + onExportWalletFile: () => void; + onShowRecoveryPhrase: () => void; + hasMnemonic?: boolean; +} + +export function BackupWalletModal({ + isOpen, + onClose, + onExportWalletFile, + onShowRecoveryPhrase, + hasMnemonic = true, +}: BackupWalletModalProps) { + return ( + +
+
+ +
+

Backup Wallet

+

+ Choose how you want to backup your wallet +

+
+
+ { onClose(); onExportWalletFile(); }} + /> + { onClose(); onShowRecoveryPhrase(); }} + /> + +
+
+ ); +} diff --git a/src/components/wallet/shared/LogoutConfirmModal.tsx b/src/components/wallet/shared/LogoutConfirmModal.tsx new file mode 100644 index 0000000..470ab98 --- /dev/null +++ b/src/components/wallet/shared/LogoutConfirmModal.tsx @@ -0,0 +1,80 @@ +import { useState, useEffect } from 'react'; +import { AlertTriangle, Download, LogOut, Loader2 } from 'lucide-react'; +import { BaseModal, Button } from '@/components/ui'; + +interface LogoutConfirmModalProps { + isOpen: boolean; + onClose: () => void; + onBackupAndLogout: () => void; + onLogoutWithoutBackup: () => void; + isLoggingOut?: boolean; +} + +export function LogoutConfirmModal({ + isOpen, + onClose, + onBackupAndLogout, + onLogoutWithoutBackup, + isLoggingOut = false, +}: LogoutConfirmModalProps) { + const [logoutStatus, setLogoutStatus] = useState('Closing connections...'); + + useEffect(() => { + if (!isLoggingOut) { + setLogoutStatus('Closing connections...'); + return; + } + const timer = setTimeout(() => { + setLogoutStatus('Clearing wallet data...'); + }, 800); + return () => clearTimeout(timer); + }, [isLoggingOut]); + + return ( + {} : onClose} size="sm" showOrbs={false}> +
+
+ +
+

Logout from Wallet?

+

+ All local data will be deleted. Make sure you have a backup to restore your wallet later. +

+
+ +
+ {isLoggingOut ? ( +
+ + Logging out... +
+
+ {logoutStatus} +
+
+ ) : ( + <> + + + + + + + )} +
+ + ); +} diff --git a/src/components/wallet/shared/RegisterNametagModal.tsx b/src/components/wallet/shared/RegisterNametagModal.tsx new file mode 100644 index 0000000..90f02db --- /dev/null +++ b/src/components/wallet/shared/RegisterNametagModal.tsx @@ -0,0 +1,216 @@ +import { useState, useCallback, useEffect } from 'react'; +import { X, Loader2, ArrowRight, Tag, CheckCircle2, AlertCircle } from 'lucide-react'; +import { useQueryClient } from '@tanstack/react-query'; +import { useSphereContext } from '@/sdk/context'; +import { SPHERE_KEYS } from '@/sdk/queryKeys'; + +type NametagAvailability = 'idle' | 'checking' | 'available' | 'taken'; + +interface RegisterNametagModalProps { + isOpen: boolean; + onClose: () => void; +} + +export function RegisterNametagModal({ isOpen, onClose }: RegisterNametagModalProps) { + const [nametagInput, setNametagInput] = useState(''); + const [error, setError] = useState(null); + const [isBusy, setIsBusy] = useState(false); + const [success, setSuccess] = useState(false); + const [availability, setAvailability] = useState('idle'); + + const { registerNametag, isNametagAvailable } = useSphereContext(); + const queryClient = useQueryClient(); + + // Debounced nametag availability check + useEffect(() => { + const cleanTag = nametagInput.trim().replace(/^@/, ''); + if (!cleanTag || cleanTag.length < 2) { + setAvailability('idle'); + return; + } + + setAvailability('checking'); + const timer = setTimeout(async () => { + try { + const available = await isNametagAvailable(cleanTag); + setAvailability(available ? 'available' : 'taken'); + } catch { + setAvailability('idle'); + } + }, 500); + + return () => clearTimeout(timer); + }, [nametagInput, isNametagAvailable]); + + // Reset state when modal closes + useEffect(() => { + if (!isOpen) { + setNametagInput(''); + setError(null); + setAvailability('idle'); + setSuccess(false); + } + }, [isOpen]); + + const handleChange = (e: React.ChangeEvent) => { + const value = e.target.value.toLowerCase(); + if (/^[a-z0-9_\-+.]*$/.test(value)) { + setNametagInput(value); + setError(null); + } + }; + + const canSubmit = nametagInput.trim().length >= 2 && !isBusy && availability !== 'taken' && availability !== 'checking'; + + const handleSubmit = useCallback(async () => { + if (!nametagInput.trim() || isBusy) return; + + setIsBusy(true); + setError(null); + + try { + const cleanTag = nametagInput.trim().replace('@', ''); + + // Double-check availability (debounced check may be stale) + const available = await isNametagAvailable(cleanTag); + if (!available) { + setError(`@${cleanTag} is already taken`); + setAvailability('taken'); + setIsBusy(false); + return; + } + + await registerNametag(cleanTag); + + queryClient.invalidateQueries({ queryKey: SPHERE_KEYS.identity.all }); + queryClient.invalidateQueries({ queryKey: SPHERE_KEYS.payments.all }); + window.dispatchEvent(new Event('wallet-updated')); + + setSuccess(true); + setTimeout(() => { + onClose(); + setSuccess(false); + setNametagInput(''); + }, 1500); + } catch (e) { + setError(e instanceof Error ? e.message : 'Registration failed'); + } finally { + setIsBusy(false); + } + }, [nametagInput, isBusy, isNametagAvailable, registerNametag, queryClient, onClose]); + + const handleKeyDown = (e: React.KeyboardEvent) => { + if (e.key === 'Enter' && canSubmit) { + handleSubmit(); + } + }; + + if (!isOpen) return null; + + return ( + <> +
+
+
e.stopPropagation()} + > + {/* Header */} +
+
+ + Register Unicity ID +
+ +
+ + {/* Content */} +
+

+ Choose a unique ID to receive tokens easily without sharing long addresses. +

+ + {success ? ( +
+

Registered successfully!

+
+ ) : ( + <> +
+
+ {availability === 'checking' && } + {availability === 'available' && } + {availability === 'taken' && } + + @unicity + +
+ +
+ + {/* Availability status -- fixed height to prevent layout shift */} +
+ {availability === 'taken' && !error && ( +

+ @{nametagInput} is already taken +

+ )} + {availability === 'available' && ( +

+ @{nametagInput} is available +

+ )} +
+ + + + {error && ( +

+ {error} +

+ )} + + )} +
+
+
+ + ); +} diff --git a/src/components/wallet/shared/SaveWalletModal.tsx b/src/components/wallet/shared/SaveWalletModal.tsx new file mode 100644 index 0000000..7b8bf03 --- /dev/null +++ b/src/components/wallet/shared/SaveWalletModal.tsx @@ -0,0 +1,116 @@ +import { useState } from 'react'; +import { Shield, AlertCircle, FileJson } from 'lucide-react'; +import { BaseModal } from '@/components/ui'; + +interface SaveWalletModalProps { + show: boolean; + onConfirm: (filename: string, password?: string) => void; + onCancel: () => void; + hasMnemonic?: boolean; +} + +export function SaveWalletModal({ show, onConfirm, onCancel, hasMnemonic }: SaveWalletModalProps) { + const [filename, setFilename] = useState('alpha_wallet_backup'); + const [password, setPassword] = useState(''); + const [passwordConfirm, setPasswordConfirm] = useState(''); + const [error, setError] = useState(''); + + if (!show) return null; + + const handleConfirm = () => { + setError(''); + if (password) { + if (password !== passwordConfirm) { + setError('Passwords do not match!'); + return; + } + if (password.length < 4) { + setError('Password must be at least 4 characters'); + return; + } + } + onConfirm(filename, password || undefined); + setFilename('alpha_wallet_backup'); + setPassword(''); + setPasswordConfirm(''); + setError(''); + }; + + return ( + +
+
+ +
+

Backup Wallet

+

+ Export your wallet keys to a JSON file. Keep this safe! +

+
+ +
+ {/* Format indicator */} +
+ + JSON Format + {hasMnemonic && ( + + +mnemonic + + )} +
+ +

+ Includes verification address{hasMnemonic ? ' and recovery phrase' : ''} +

+ + + setFilename(e.target.value)} + className="w-full mb-3 px-3 py-2 bg-neutral-100 dark:bg-neutral-800 rounded text-neutral-800 dark:text-neutral-200 placeholder-neutral-400 border border-neutral-200 dark:border-neutral-700 focus:border-blue-500 outline-none transition-colors" + /> + + + setPassword(e.target.value)} + className="w-full mb-3 px-3 py-2 bg-neutral-100 dark:bg-neutral-800 rounded text-neutral-800 dark:text-neutral-200 placeholder-neutral-400 border border-neutral-200 dark:border-neutral-700 focus:border-blue-500 outline-none transition-colors" + /> + + setPasswordConfirm(e.target.value)} + className="w-full mb-4 px-3 py-2 bg-neutral-100 dark:bg-neutral-800 rounded text-neutral-800 dark:text-neutral-200 placeholder-neutral-400 border border-neutral-200 dark:border-neutral-700 focus:border-blue-500 outline-none transition-colors" + /> + + {error && ( +
+ + {error} +
+ )} + +
+ + +
+
+
+ ); +} diff --git a/src/components/wallet/shared/TokenRow.tsx b/src/components/wallet/shared/TokenRow.tsx new file mode 100644 index 0000000..ad5b712 --- /dev/null +++ b/src/components/wallet/shared/TokenRow.tsx @@ -0,0 +1,136 @@ +import type { Token } from '@unicitylabs/sphere-sdk'; +import { TokenRegistry } from '@unicitylabs/sphere-sdk'; +import { Box, Copy, CheckCircle2, Loader2 } from 'lucide-react'; +import { useState, memo } from 'react'; + +interface TokenRowProps { + token: Token; + delay: number; + /** If true, animate entrance. If false, render without animation (token was already shown) */ + isNew?: boolean; +} + +// Custom comparison: allow re-render when amount changes +function areTokenPropsEqual(prev: TokenRowProps, next: TokenRowProps): boolean { + return ( + prev.token.id === next.token.id && + prev.token.status === next.token.status && + prev.token.symbol === next.token.symbol && + prev.isNew === next.isNew && + prev.delay === next.delay + ); +} + +// Helper to parse token amount to numeric value +function parseTokenAmount(amount: string | undefined, coinId: string | undefined): number { + try { + if (!amount || !coinId) return 0; + const amountFloat = parseFloat(amount); + const registry = TokenRegistry.getInstance(); + const def = registry.getDefinition(coinId); + const decimals = def?.decimals ?? 6; + const divisor = Math.pow(10, decimals); + return amountFloat / divisor; + } catch { + return 0; + } +} + +// Helper to format numeric value back to display string +function formatTokenAmount(value: number, coinId: string | undefined): string { + try { + if (!coinId) return value.toString(); + const registry = TokenRegistry.getInstance(); + const def = registry.getDefinition(coinId); + const decimals = def?.decimals ?? 6; + return new Intl.NumberFormat('en-US', { + maximumFractionDigits: Math.min(decimals, 6) + }).format(value); + } catch { + return value.toString(); + } +} + +// Static token amount display (replaces AnimatedTokenAmount) +function TokenAmountDisplay({ amount, coinId, symbol }: { + amount: string | undefined; + coinId: string | undefined; + symbol: string | undefined; +}) { + const numericAmount = parseTokenAmount(amount, coinId); + const formatted = formatTokenAmount(numericAmount, coinId); + return {formatted} {symbol || ''}; +} + +export const TokenRow = memo(function TokenRow({ token, delay: _delay, isNew: _isNew = true }: TokenRowProps) { + const [copied, setCopied] = useState(false); + + const handleCopyId = (e: React.MouseEvent) => { + e.stopPropagation(); + navigator.clipboard.writeText(token.id); + setCopied(true); + setTimeout(() => setCopied(false), 2000); + }; + + const className = "p-3 rounded-xl bg-neutral-50 dark:bg-neutral-800/30 border border-neutral-200/50 dark:border-white/5 hover:border-neutral-300 dark:hover:border-white/10 transition-all group"; + + const amountDisplay = ( + + ); + + const tokenContent = ( +
+
+
+ {(token.iconUrl || TokenRegistry.getInstance().getIconUrl(token.coinId)) ? ( + {token.symbol} + ) : ( + + )} +
+
+
+ {amountDisplay} +
+
+ ID: {token.id.slice(0, 8)}... + {copied ? : } +
+
+
+
+ {token.status === 'confirmed' ? ( + + Confirmed + + ) : token.status === 'transferring' ? ( + + + Sending + + ) : ( + + + Pending + + )} + + {new Date(token.createdAt).toLocaleDateString()} + +
+
+ ); + + return ( +
+ {tokenContent} +
+ ); +}, areTokenPropsEqual); diff --git a/src/components/wallet/shared/index.ts b/src/components/wallet/shared/index.ts new file mode 100644 index 0000000..3be050a --- /dev/null +++ b/src/components/wallet/shared/index.ts @@ -0,0 +1,6 @@ +export { AssetRow } from './AssetRow'; +export { TokenRow } from './TokenRow'; +export { AddressSelector } from './AddressSelector'; +export { RegisterNametagModal } from './RegisterNametagModal'; +export { BackupWalletModal } from './BackupWalletModal'; +export { LogoutConfirmModal } from './LogoutConfirmModal'; diff --git a/src/platform/extension/SphereProvider.tsx b/src/platform/extension/SphereProvider.tsx new file mode 100644 index 0000000..b7aecdc --- /dev/null +++ b/src/platform/extension/SphereProvider.tsx @@ -0,0 +1,293 @@ +import React, { useEffect, useState, useCallback, useRef } from 'react'; +import { useQueryClient } from '@tanstack/react-query'; +import { TokenRegistry, NETWORKS } from '@unicitylabs/sphere-sdk'; +import { SphereContext, type SphereContextValue } from '@/sdk/context'; +import { SPHERE_KEYS } from '@/sdk/queryKeys'; +import type { WalletIdentity } from '@/sdk/types'; +import type { Asset, Token, TransactionHistoryEntry } from '@unicitylabs/sphere-sdk'; +import type { AggregatorConfig, NametagInfo, NametagResolution, PendingTransaction } from '@/shared/types'; + +async function sendMessage>(message: Record): Promise { + return new Promise((resolve, reject) => { + chrome.runtime.sendMessage(message, (response) => { + if (chrome.runtime.lastError) { + reject(new Error(chrome.runtime.lastError.message)); + return; + } + if (response?.success === false) { + reject(new Error(response.error || 'Unknown error')); + return; + } + resolve(response as T); + }); + }); +} + +export function ExtensionSphereProvider({ children }: { children: React.ReactNode }) { + const queryClient = useQueryClient(); + const [walletExists, setWalletExists] = useState(false); + const [isUnlocked, setIsUnlocked] = useState(false); + const [isLoading, setIsLoading] = useState(true); + const [error, setError] = useState(null); + const [identity, setIdentity] = useState(null); + const [nametag, setNametag] = useState(null); + const updateCallbacksRef = useRef void>>(new Set()); + + // Configure TokenRegistry singleton for popup bundle (same as sphere web app) + useEffect(() => { + const netConfig = NETWORKS['testnet']; + TokenRegistry.configure({ + remoteUrl: netConfig.tokenRegistryUrl, + }); + }, []); + + // Fetch initial state + useEffect(() => { + (async () => { + try { + const res = await sendMessage<{ state: { hasWallet: boolean; isUnlocked: boolean } }>({ type: 'POPUP_GET_STATE' }); + setWalletExists(res.state.hasWallet); + setIsUnlocked(res.state.isUnlocked); + + if (res.state.isUnlocked) { + try { + const idRes = await sendMessage<{ identities?: Array<{ publicKey: string; id: string; label?: string }> }>({ type: 'POPUP_GET_IDENTITIES' }); + const ntRes = await sendMessage<{ nametag?: { nametag: string } }>({ type: 'POPUP_GET_MY_NAMETAG' }); + + // Resolve nametag: prefer stored nametag, fall back to identity label + const storedNametag = ntRes.nametag?.nametag ?? null; + const labelNametag = idRes.identities?.[0]?.label?.startsWith('@') + ? idRes.identities[0].label.slice(1) + : undefined; + const resolvedNametag = storedNametag ?? labelNametag ?? null; + + if (idRes.identities?.[0]) { + const id = idRes.identities[0]; + setIdentity({ + chainPubkey: id.publicKey, + l1Address: id.id, + directAddress: id.id, + nametag: resolvedNametag ?? undefined, + }); + } + if (resolvedNametag) { + setNametag(resolvedNametag); + } + } catch { /* non-fatal — identity loaded without nametag */ } + } + } catch (err) { + setError((err as Error).message); + } finally { + setIsLoading(false); + } + })(); + }, []); + + // Listen for background broadcasts + useEffect(() => { + const listener = (message: { type?: string }) => { + if (message.type === 'BALANCES_UPDATED' || message.type === 'WALLET_UPDATE') { + queryClient.invalidateQueries({ queryKey: SPHERE_KEYS.payments.all }); + queryClient.invalidateQueries({ queryKey: SPHERE_KEYS.identity.all }); + updateCallbacksRef.current.forEach(cb => cb()); + } + if (message.type === 'PAYMENT_REQUEST_INCOMING') { + updateCallbacksRef.current.forEach(cb => cb()); + } + }; + chrome.runtime.onMessage.addListener(listener); + return () => chrome.runtime.onMessage.removeListener(listener); + }, [queryClient]); + + type IdentityPayload = { publicKey: string; id: string; label?: string }; + + const createWallet = useCallback(async (password: string) => { + const res = await sendMessage<{ identity?: IdentityPayload; mnemonic: string }>({ type: 'POPUP_CREATE_WALLET', password }); + setWalletExists(true); + setIsUnlocked(true); + if (res.identity) { + setIdentity({ + chainPubkey: res.identity.publicKey, + l1Address: res.identity.id, + directAddress: res.identity.id, + }); + } + return { mnemonic: res.mnemonic }; + }, []); + + const importWallet = useCallback(async (mnemonic: string, password: string) => { + const res = await sendMessage<{ identity?: IdentityPayload }>({ type: 'POPUP_IMPORT_WALLET', mnemonic, password }); + setWalletExists(true); + setIsUnlocked(true); + if (res.identity) { + setIdentity({ + chainPubkey: res.identity.publicKey, + l1Address: res.identity.id, + directAddress: res.identity.id, + }); + } + }, []); + + const unlockWallet = useCallback(async (password: string) => { + const res = await sendMessage<{ identity?: IdentityPayload }>({ type: 'POPUP_UNLOCK_WALLET', password }); + setIsUnlocked(true); + if (res.identity) { + setIdentity({ + chainPubkey: res.identity.publicKey, + l1Address: res.identity.id, + directAddress: res.identity.id, + nametag: res.identity.label?.startsWith('@') ? res.identity.label.slice(1) : undefined, + }); + } + // Fetch nametag + try { + const ntRes = await sendMessage<{ nametag?: { nametag: string } }>({ type: 'POPUP_GET_MY_NAMETAG' }); + if (ntRes.nametag) setNametag(ntRes.nametag.nametag); + } catch { /* non-fatal — nametag fetch failed, continue without it */ } + }, []); + + const lockWallet = useCallback(async () => { + await sendMessage({ type: 'POPUP_LOCK_WALLET' }); + setIsUnlocked(false); + setIdentity(null); + setNametag(null); + queryClient.clear(); + }, [queryClient]); + + const deleteWallet = useCallback(async () => { + await sendMessage({ type: 'POPUP_RESET_WALLET' }); + setWalletExists(false); + setIsUnlocked(false); + setIdentity(null); + setNametag(null); + queryClient.clear(); + }, [queryClient]); + + const getAssets = useCallback(async () => { + const res = await sendMessage<{ assets?: Asset[] }>({ type: 'POPUP_GET_ASSETS' }); + return res.assets ?? []; + }, []); + + const getTokens = useCallback(async () => { + const res = await sendMessage<{ tokens?: Token[] }>({ type: 'POPUP_GET_TOKENS' }); + return res.tokens ?? []; + }, []); + + const getTransactionHistory = useCallback(async () => { + const res = await sendMessage<{ history?: TransactionHistoryEntry[] }>({ type: 'POPUP_GET_TRANSACTION_HISTORY' }); + return res.history ?? []; + }, []); + + const getIdentity = useCallback(async () => { + const res = await sendMessage<{ identity?: WalletIdentity | null }>({ type: 'POPUP_GET_IDENTITY' }); + return res.identity ?? null; + }, []); + + const send = useCallback(async (params: { coinId: string; amount: string; recipient: string; memo?: string }) => { + return sendMessage<{ transactionId?: string }>({ type: 'POPUP_SEND_TOKENS', ...params }); + }, []); + + const resolve = useCallback(async (recipient: string) => { + const res = await sendMessage<{ resolution?: NametagResolution | null }>({ type: 'POPUP_RESOLVE_NAMETAG', nametag: recipient }); + return res.resolution ?? null; + }, []); + + const registerNametag = useCallback(async (tag: string) => { + const res = await sendMessage<{ nametag?: NametagInfo }>({ type: 'POPUP_REGISTER_NAMETAG', nametag: tag }); + const cleanTag = tag.replace('@', '').trim().toLowerCase(); + if (res.nametag) { + setNametag(res.nametag.nametag); + } else { + // Even if response doesn't include nametag info, set it locally + // (NOSTR binding may have succeeded even if mint failed) + setNametag(cleanTag); + } + // Also update identity with the nametag so useIdentity picks it up + setIdentity(prev => prev ? { ...prev, nametag: cleanTag } : prev); + return res.nametag as NametagInfo; + }, []); + + const isNametagAvailable = useCallback(async (tag: string) => { + const res = await sendMessage<{ available?: boolean }>({ type: 'POPUP_CHECK_NAMETAG_AVAILABLE', nametag: tag }); + return res.available ?? false; + }, []); + + const getMyNametag = useCallback(async () => { + const res = await sendMessage<{ nametag?: NametagInfo | null }>({ type: 'POPUP_GET_MY_NAMETAG' }); + return res.nametag ?? null; + }, []); + + const getMnemonic = useCallback(async () => { + const res = await sendMessage<{ mnemonic?: string | null }>({ type: 'POPUP_GET_MNEMONIC' }); + return res.mnemonic ?? null; + }, []); + + const exportWallet = useCallback(async () => { + const res = await sendMessage<{ walletJson?: string }>({ type: 'POPUP_EXPORT_WALLET' }); + return res.walletJson ?? ''; + }, []); + + const getPendingTransactions = useCallback(async () => { + const res = await sendMessage<{ transactions?: PendingTransaction[] }>({ type: 'POPUP_GET_PENDING_TRANSACTIONS' }); + return res.transactions ?? []; + }, []); + + const approveTransaction = useCallback(async (requestId: string) => { + await sendMessage({ type: 'POPUP_APPROVE_TRANSACTION', requestId }); + }, []); + + const rejectTransaction = useCallback(async (requestId: string) => { + await sendMessage({ type: 'POPUP_REJECT_TRANSACTION', requestId }); + }, []); + + const getAggregatorConfig = useCallback(async () => { + const res = await sendMessage<{ config: AggregatorConfig }>({ type: 'POPUP_GET_AGGREGATOR_CONFIG' }); + return res.config; + }, []); + + const setAggregatorConfig = useCallback(async (config: AggregatorConfig) => { + await sendMessage({ type: 'POPUP_SET_AGGREGATOR_CONFIG', config }); + }, []); + + const onWalletUpdate = useCallback((callback: () => void) => { + updateCallbacksRef.current.add(callback); + return () => { updateCallbacksRef.current.delete(callback); }; + }, []); + + const value: SphereContextValue = { + walletExists, + isUnlocked, + isLoading, + error, + identity, + nametag, + createWallet, + importWallet, + unlockWallet, + lockWallet, + deleteWallet, + getAssets, + getTokens, + getTransactionHistory, + getIdentity, + send, + resolve, + registerNametag, + isNametagAvailable, + getMyNametag, + getMnemonic, + exportWallet, + getPendingTransactions, + approveTransaction, + rejectTransaction, + getAggregatorConfig, + setAggregatorConfig, + onWalletUpdate, + }; + + return ( + + {children} + + ); +} diff --git a/src/platform/extension/background/connect-host.ts b/src/platform/extension/background/connect-host.ts new file mode 100644 index 0000000..7d0657d --- /dev/null +++ b/src/platform/extension/background/connect-host.ts @@ -0,0 +1,297 @@ +/** + * ConnectHost manager for the extension background service worker. + * + * Bridges the Sphere Connect protocol to the extension's existing wallet infrastructure: + * - Creates a ConnectHost backed by ExtensionTransport when the wallet is unlocked + * - Routes onConnectionRequest → extension popup (ConnectApprovalModal) + * - Routes onIntent → extension popup (existing SendPanel / SignMessagePanel etc.) + * - Exposes pending approval/intent queues that the popup polls via POPUP_* messages + */ + +import { ConnectHost } from '@unicitylabs/sphere-sdk/connect'; +import { ExtensionTransport } from '@unicitylabs/sphere-sdk/connect/browser'; +import type { DAppMetadata, ConnectSession } from '@unicitylabs/sphere-sdk/connect'; +import type { PermissionScope } from '@unicitylabs/sphere-sdk/connect'; +import { walletManager } from './wallet-manager'; + +// ============================================================================= +// Persistent approved origins stored in chrome.storage.local +// ============================================================================= + +const APPROVED_ORIGINS_KEY = 'sphere_approved_origins'; + +export interface ApprovedOriginEntry { + permissions: PermissionScope[]; + connectedAt: number; + lastSeenAt: number; + dapp: DAppMetadata; +} + +async function getApprovedOrigins(): Promise> { + const result = await chrome.storage.local.get(APPROVED_ORIGINS_KEY); + return (result[APPROVED_ORIGINS_KEY] as Record) ?? {}; +} + +async function saveApprovedOrigin( + origin: string, + dapp: DAppMetadata, + permissions: PermissionScope[], +): Promise { + const current = await getApprovedOrigins(); + current[origin] = { permissions, connectedAt: Date.now(), lastSeenAt: Date.now(), dapp }; + await chrome.storage.local.set({ [APPROVED_ORIGINS_KEY]: current }); +} + +/** Returns all approved sites (for settings UI). */ +export async function getConnectedSites(): Promise> { + return getApprovedOrigins(); +} + +/** Revoke a previously approved site (from settings UI). */ +export async function revokeConnectedSite(origin: string): Promise { + const current = await getApprovedOrigins(); + delete current[origin]; + await chrome.storage.local.set({ [APPROVED_ORIGINS_KEY]: current }); +} + +// ============================================================================= +// Pending approval / intent types (shared with popup via POPUP_* messages) +// ============================================================================= + +export interface PendingConnectApproval { + id: string; + dapp: DAppMetadata; + requestedPermissions: PermissionScope[]; + resolve: (result: { approved: boolean; grantedPermissions: PermissionScope[] }) => void; +} + +export interface PendingConnectIntent { + id: string; + action: string; + params: Record; + session: ConnectSession; + resolve: (result: { result?: unknown; error?: { code: number; message: string } }) => void; +} + +// ============================================================================= +// State +// ============================================================================= + +/** Pending dApp connection approval waiting for user decision in popup. */ +let pendingApproval: PendingConnectApproval | null = null; + +/** Pending intent waiting for user action in popup. */ +let pendingIntent: PendingConnectIntent | null = null; + +/** Active ConnectHost instance. Recreated each time wallet is unlocked. */ +let connectHost: ConnectHost | null = null; + +// ============================================================================= +// Popup helpers +// ============================================================================= + +export function isConnectHostActive(): boolean { + return connectHost !== null; +} + +export async function openPopupForConnect(): Promise { + try { + await chrome.action.openPopup(); + } catch { + try { + await chrome.windows.create({ url: 'popup.html', type: 'popup', width: 380, height: 600 }); + } catch { + // Ignore — popup may already be open + } + } +} + +// ============================================================================= +// ConnectHost lifecycle +// ============================================================================= + +/** + * Initialize (or reinitialize) ConnectHost with the current sphere instance. + * Called after wallet unlock. Destroys any previous host first. + */ +export function initConnectHost(): void { + destroyConnectHost(); + + const sphere = walletManager.getSphereInstance(); + if (!sphere) return; + + const transport = ExtensionTransport.forHost({ onMessage: chrome.runtime.onMessage, tabs: chrome.tabs }); + + connectHost = new ConnectHost({ + sphere, + transport, + + onConnectionRequest: async (dapp, requestedPermissions, silent) => { + // If this origin was previously approved, restore silently without any UI. + try { + const origin = new URL(dapp.url).origin; + const approved = await getApprovedOrigins(); + if (approved[origin]) { + // Update lastSeenAt so UI shows recent activity + approved[origin].lastSeenAt = Date.now(); + await chrome.storage.local.set({ [APPROVED_ORIGINS_KEY]: approved }); + return { approved: true, grantedPermissions: approved[origin].permissions }; + } + } catch { + // Invalid URL — fall through + } + + // Silent mode (auto-connect on page load): reject immediately without opening any UI. + // This prevents popup windows from appearing when the origin is no longer approved. + if (silent) { + return { approved: false, grantedPermissions: [] }; + } + + // First-time connection — open popup to show ConnectApprovalModal + await openPopupForConnect(); + + return new Promise<{ approved: boolean; grantedPermissions: PermissionScope[] }>((resolve) => { + pendingApproval = { + id: crypto.randomUUID(), + dapp, + requestedPermissions, + resolve: (result) => { + // Persist approval so subsequent connects skip the popup + if (result.approved) { + try { + const origin = new URL(dapp.url).origin; + saveApprovedOrigin(origin, dapp, result.grantedPermissions).catch(console.error); + } catch { + // ignore + } + } + resolve(result); + }, + }; + + // Timeout: reject after 2 minutes if user doesn't respond + setTimeout(() => { + if (pendingApproval) { + pendingApproval.resolve({ approved: false, grantedPermissions: [] }); + pendingApproval = null; + } + }, 120_000); + }); + }, + + onDisconnect: async (session) => { + // dApp explicitly disconnected — remove from approved origins + try { + const origin = new URL(session.dapp.url).origin; + await revokeConnectedSite(origin); + } catch { + // ignore + } + }, + + onIntent: async (action, params, session) => { + // Open popup to show intent UI (SendPanel, SignMessagePanel, etc.) + await openPopupForConnect(); + + return new Promise<{ result?: unknown; error?: { code: number; message: string } }>((resolve) => { + pendingIntent = { + id: crypto.randomUUID(), + action, + params, + session, + resolve, + }; + + // Timeout: reject after 5 minutes if user doesn't respond + setTimeout(() => { + if (pendingIntent) { + pendingIntent.resolve({ error: { code: 4001, message: 'User rejected' } }); + pendingIntent = null; + } + }, 300_000); + }); + }, + }); +} + +/** + * Register a DM auto-approve handler on the active ConnectHost. + * After the user checks "Allow this dApp to send DMs without confirmation", + * subsequent dm intents are executed silently without opening the popup. + */ +export function setDmAutoApprove(): void { + if (!connectHost) return; + connectHost.setIntentAutoApprove('dm', async (_action, params) => { + try { + const dm = await walletManager.sendDM( + params.to as string, + params.message as string, + ); + return { result: { sent: true, messageId: dm.id, timestamp: dm.timestamp } }; + } catch (err) { + return { + error: { + code: 5000, + message: err instanceof Error ? err.message : 'DM failed', + }, + }; + } + }); +} + +/** Destroy the active ConnectHost and clear pending queues. */ +export function destroyConnectHost(): void { + if (connectHost) { + connectHost.destroy(); + connectHost = null; + } + if (pendingApproval) { + pendingApproval.resolve({ approved: false, grantedPermissions: [] }); + pendingApproval = null; + } + if (pendingIntent) { + pendingIntent.resolve({ error: { code: 4001, message: 'User rejected' } }); + pendingIntent = null; + } +} + +// ============================================================================= +// Popup message handlers (called from message-handler.ts POPUP_* routing) +// ============================================================================= + +/** Popup polls this to render ConnectApprovalModal. */ +export function getConnectApproval(): Omit | null { + if (!pendingApproval) return null; + const { id, dapp, requestedPermissions } = pendingApproval; + return { id, dapp, requestedPermissions }; +} + +/** Popup calls this when user approves/rejects the dApp connection. */ +export function resolveConnectApproval( + id: string, + approved: boolean, + grantedPermissions: PermissionScope[], +): boolean { + if (!pendingApproval || pendingApproval.id !== id) return false; + pendingApproval.resolve({ approved, grantedPermissions }); + pendingApproval = null; + return true; +} + +/** Popup polls this to render intent UI. */ +export function getConnectIntent(): Omit | null { + if (!pendingIntent) return null; + const { id, action, params, session } = pendingIntent; + return { id, action, params, session }; +} + +/** Popup calls this with the intent result. */ +export function resolveConnectIntent( + id: string, + result: { result?: unknown; error?: { code: number; message: string } }, +): boolean { + if (!pendingIntent || pendingIntent.id !== id) return false; + pendingIntent.resolve(result); + pendingIntent = null; + return true; +} diff --git a/src/background/index.ts b/src/platform/extension/background/index.ts similarity index 57% rename from src/background/index.ts rename to src/platform/extension/background/index.ts index c1284a6..ba217a5 100644 --- a/src/background/index.ts +++ b/src/platform/extension/background/index.ts @@ -8,11 +8,26 @@ */ import { handleContentMessage, handlePopupMessage } from './message-handler'; +import { initConnectHost, destroyConnectHost, isConnectHostActive, openPopupForConnect } from './connect-host'; +import { isExtensionConnectEnvelope, EXT_MSG_TO_HOST } from '@unicitylabs/sphere-sdk/connect/browser'; console.log('Sphere Wallet background service worker started'); // Listen for messages from content scripts and popup chrome.runtime.onMessage.addListener((message, sender, sendResponse) => { + // Intercept Connect protocol envelopes (sphere-connect-ext:tohost). + // Chrome calls ALL onMessage listeners, so ExtensionHostTransport will also + // receive this message when it's registered (wallet unlocked). + // Our job here: open the popup if the wallet is locked so the user can unlock first. + if (isExtensionConnectEnvelope(message) && message.type === EXT_MSG_TO_HOST) { + if (!isConnectHostActive()) { + // Wallet locked — open popup so user can unlock, then retry Connect + openPopupForConnect(); + } + sendResponse({ handled: true }); + return true; + } + const { type } = message; if (!type) { @@ -41,6 +56,21 @@ chrome.runtime.onMessage.addListener((message, sender, sendResponse) => { return true; }); +// Initialize ConnectHost if wallet is already unlocked on startup +if (typeof chrome !== 'undefined' && chrome.runtime) { + initConnectHost(); +} + +// Re-initialize ConnectHost when wallet is unlocked/locked (triggered via message handler) +chrome.runtime.onMessage.addListener((message) => { + if (message?.type === 'INTERNAL_WALLET_UNLOCKED') { + initConnectHost(); + } else if (message?.type === 'INTERNAL_WALLET_LOCKED') { + destroyConnectHost(); + } + // Non-blocking — always return undefined (handled by primary listener above) +}); + // Handle extension installation/update chrome.runtime.onInstalled.addListener((details) => { console.log('Sphere Wallet extension installed:', details.reason); diff --git a/src/background/message-handler.ts b/src/platform/extension/background/message-handler.ts similarity index 86% rename from src/background/message-handler.ts rename to src/platform/extension/background/message-handler.ts index 29ad7a8..6375c3a 100644 --- a/src/background/message-handler.ts +++ b/src/platform/extension/background/message-handler.ts @@ -9,6 +9,18 @@ */ import { walletManager } from './wallet-manager'; +import { + initConnectHost, + destroyConnectHost, + getConnectApproval, + resolveConnectApproval, + getConnectIntent, + resolveConnectIntent, + getConnectedSites, + revokeConnectedSite, + setDmAutoApprove, +} from './connect-host'; +import type { PermissionScope } from '@unicitylabs/sphere-sdk/connect'; import { nametagMintService } from './nametag-mint-service'; import { addPendingTransaction, @@ -121,20 +133,6 @@ export async function handleContentMessage( message.eventHash as string ); - case 'SPHERE_NIP44_ENCRYPT': - return handleNip44Encrypt( - origin, - message.recipientPubkey as string, - message.plaintext as string - ); - - case 'SPHERE_NIP44_DECRYPT': - return handleNip44Decrypt( - origin, - message.senderPubkey as string, - message.ciphertext as string - ); - case 'SPHERE_RESOLVE_NAMETAG': return handleResolveNametag(origin, message.nametag as string); @@ -182,6 +180,7 @@ export async function handlePopupMessage( case 'POPUP_CREATE_WALLET': { const password = message.password as string; const { identity, mnemonic } = await walletManager.createWallet(password); + initConnectHost(); return { success: true, identity, @@ -194,6 +193,7 @@ export async function handlePopupMessage( const mnemonic = message.mnemonic as string; const password = message.password as string; const identity = await walletManager.importWallet(mnemonic, password); + initConnectHost(); return { success: true, identity, @@ -208,6 +208,9 @@ export async function handlePopupMessage( // Resolve any pending connect requests now that wallet is unlocked resolvePendingConnectRequests(); + // (Re)initialize ConnectHost with the freshly unlocked sphere instance + initConnectHost(); + return { success: true, identity, @@ -217,6 +220,8 @@ export async function handlePopupMessage( case 'POPUP_LOCK_WALLET': await walletManager.lock(); + // Destroy ConnectHost — no sphere instance available while locked + destroyConnectHost(); return { success: true, state: await walletManager.getState(), @@ -331,19 +336,107 @@ export async function handlePopupMessage( return handlePopupResolveNametag(nametag); } - case 'POPUP_CHECK_TOKEN_HEALTH': { - const result = await walletManager.checkTokenHealth(); + case 'POPUP_FINALIZE_TOKENS': { + const result = await walletManager.finalizeTokens(); return { success: true, ...result }; } - case 'POPUP_PURGE_INVALID_TOKENS': { - const result = await walletManager.purgeInvalidTokens(); - return { success: true, ...result }; + case 'POPUP_GET_ASSETS': + return { + success: true, + assets: await walletManager.getAssets(), + }; + + case 'POPUP_GET_TOKENS': + return { + success: true, + tokens: walletManager.getTokenList(), + }; + + case 'POPUP_GET_TRANSACTION_HISTORY': + return { + success: true, + history: walletManager.getTransactionHistory(), + }; + + case 'POPUP_GET_IDENTITY': + return { + success: true, + identity: walletManager.getFullIdentity(), + }; + + // --- Connect protocol: approval / intent --- + + case 'POPUP_GET_CONNECT_APPROVAL': + return { success: true, approval: getConnectApproval() }; + + case 'POPUP_RESOLVE_CONNECT_APPROVAL': { + const { id, approved, grantedPermissions } = message as { + id: string; + approved: boolean; + grantedPermissions: string[]; + }; + const ok = resolveConnectApproval(id, approved, grantedPermissions as PermissionScope[]); + return { success: ok }; } - case 'POPUP_FINALIZE_TOKENS': { - const result = await walletManager.finalizeTokens(); - return { success: true, ...result }; + case 'POPUP_GET_CONNECT_INTENT': + return { success: true, intent: getConnectIntent() }; + + case 'POPUP_GET_CONNECTED_SITES': + return { success: true, sites: await getConnectedSites() }; + + case 'POPUP_REVOKE_CONNECTED_SITE': { + const { origin } = message as { origin: string }; + await revokeConnectedSite(origin); + return { success: true }; + } + + case 'POPUP_RESOLVE_CONNECT_INTENT': { + const { id, result } = message as { + id: string; + result: { result?: unknown; error?: { code: number; message: string } }; + }; + const ok = resolveConnectIntent(id, result); + return { success: ok }; + } + + case 'POPUP_SEND_DM': { + const { recipient, content } = message as { recipient: string; content: string }; + const dm = await walletManager.sendDM(recipient, content); + return { success: true, id: dm.id, timestamp: dm.timestamp }; + } + + case 'POPUP_SEND_L1_TOKENS': { + const { to, amountSatoshis, vestingMode } = message as { to: string; amountSatoshis: string; vestingMode?: 'all' | 'vested' | 'unvested' }; + const result = await walletManager.sendL1Tokens(to, amountSatoshis, vestingMode); + return result; + } + + case 'POPUP_GET_L1_VESTING_BALANCES': { + return walletManager.getL1VestingBalances(); + } + + case 'POPUP_SEND_PAYMENT_REQUEST': { + const { recipient, amount, coinId, message: msg } = message as { + recipient: string; + amount: string; + coinId: string; + message?: string; + }; + const result = await walletManager.sendPaymentRequest(recipient, { amount, coinId, message: msg }); + return result; + } + + case 'POPUP_SET_DM_AUTO_APPROVE': { + setDmAutoApprove(); + return { success: true }; + } + + case 'POPUP_SIGN_MESSAGE_CONNECT': { + const { message: msgToSign } = message as { message: string }; + const signature = walletManager.signMessageWithIdentity(msgToSign); + return { success: true, signature }; } default: @@ -598,89 +691,6 @@ async function handleGetNostrPublicKey(origin: string): Promise<{ }; } -async function handleNip44Encrypt( - origin: string, - recipientPubkey: string, - plaintext: string -): Promise<{ - type: string; - success: boolean; - ciphertext?: string; - error?: string; -}> { - if (!connectedSites.has(origin)) { - return { - type: 'SPHERE_NIP44_ENCRYPT_RESPONSE', - success: false, - error: 'Not connected. Call connect() first.', - }; - } - - if (!walletManager.isUnlocked()) { - return { - type: 'SPHERE_NIP44_ENCRYPT_RESPONSE', - success: false, - error: 'Wallet is locked.', - }; - } - - try { - const ciphertext = walletManager.nip44Encrypt(recipientPubkey, plaintext); - return { - type: 'SPHERE_NIP44_ENCRYPT_RESPONSE', - success: true, - ciphertext, - }; - } catch (error) { - return { - type: 'SPHERE_NIP44_ENCRYPT_RESPONSE', - success: false, - error: (error as Error).message, - }; - } -} - -async function handleNip44Decrypt( - origin: string, - senderPubkey: string, - ciphertext: string -): Promise<{ - type: string; - success: boolean; - plaintext?: string; - error?: string; -}> { - if (!connectedSites.has(origin)) { - return { - type: 'SPHERE_NIP44_DECRYPT_RESPONSE', - success: false, - error: 'Not connected. Call connect() first.', - }; - } - - if (!walletManager.isUnlocked()) { - return { - type: 'SPHERE_NIP44_DECRYPT_RESPONSE', - success: false, - error: 'Wallet is locked.', - }; - } - - try { - const plaintext = walletManager.nip44Decrypt(senderPubkey, ciphertext); - return { - type: 'SPHERE_NIP44_DECRYPT_RESPONSE', - success: true, - plaintext, - }; - } catch (error) { - return { - type: 'SPHERE_NIP44_DECRYPT_RESPONSE', - success: false, - error: (error as Error).message, - }; - } -} async function handleSignNostrEventRequest( _requestId: string, @@ -807,10 +817,8 @@ async function handleCheckNametagAvailable( async function handlePopupCheckNametagAvailable( nametag: string ): Promise<{ success: boolean; available?: boolean; error?: string }> { - if (!walletManager.isUnlocked()) { - return { success: false, error: 'Wallet is locked' }; - } - + // NOTE: No wallet-locked guard — nametag availability check works without a wallet + // (uses standalone Nostr transport with dummy identity when wallet is locked). try { const available = await nametagMintService.isAvailable(nametag); return { success: true, available }; diff --git a/src/background/nametag-mint-service.ts b/src/platform/extension/background/nametag-mint-service.ts similarity index 100% rename from src/background/nametag-mint-service.ts rename to src/platform/extension/background/nametag-mint-service.ts diff --git a/src/background/nostr-keys.ts b/src/platform/extension/background/nostr-keys.ts similarity index 100% rename from src/background/nostr-keys.ts rename to src/platform/extension/background/nostr-keys.ts diff --git a/src/background/storage.ts b/src/platform/extension/background/storage.ts similarity index 100% rename from src/background/storage.ts rename to src/platform/extension/background/storage.ts diff --git a/src/background/wallet-manager.ts b/src/platform/extension/background/wallet-manager.ts similarity index 76% rename from src/background/wallet-manager.ts rename to src/platform/extension/background/wallet-manager.ts index 8de7191..17420a4 100644 --- a/src/background/wallet-manager.ts +++ b/src/platform/extension/background/wallet-manager.ts @@ -12,29 +12,21 @@ */ import { Sphere } from '@unicitylabs/sphere-sdk'; -import { NIP44 } from '@unicitylabs/nostr-js-sdk'; -import { - createNostrTransportProvider, - createUnicityAggregatorProvider, - createIndexedDBTokenStorageProvider, -} from '@unicitylabs/sphere-sdk/impl/browser'; -import { createChromeStorageProvider } from './providers'; +import type { Asset, Token, TransactionHistoryEntry } from '@unicitylabs/sphere-sdk'; +import { createBrowserProviders } from '@unicitylabs/sphere-sdk/impl/browser'; + +type BrowserProviders = ReturnType; import type { IdentityInfo, TokenBalance, - TokenHealthInfo, - TokenHealthResult, WalletState, SendTokensResult, NametagResolution, StoredNametag, NametagInfo, - AggregatorConfig, } from '@/shared/types'; -import { COIN_SYMBOLS, COIN_DECIMALS, DEFAULT_DECIMALS, ALPHA_COIN_ID, GATEWAY_URL, DEFAULT_NOSTR_RELAYS } from '@/shared/constants'; +import { COIN_SYMBOLS, COIN_DECIMALS, DEFAULT_DECIMALS, ALPHA_COIN_ID } from '@/shared/constants'; import { deriveNostrKeyPair, signNostrEvent, signMessage } from './nostr-keys'; -import { Token as SdkToken } from '@unicitylabs/state-transition-sdk/lib/token/Token'; -import { PredicateEngineService } from '@unicitylabs/state-transition-sdk/lib/predicate/PredicateEngineService'; // Storage key for the encrypted mnemonic const ENCRYPTED_MNEMONIC_KEY = 'encryptedMnemonic'; @@ -96,8 +88,8 @@ async function decryptMnemonic(encrypted: string, password: string): Promise k.startsWith('sphere_sdk2_')); - if (sdkKeys.length > 0) { - await chrome.storage.local.remove(sdkKeys); + // Clear SDK data from IndexedDB (like sphere web app's deleteWallet) + if (this.providers) { + try { + await Promise.allSettled([ + this.providers.storage.disconnect(), + this.providers.tokenStorage.disconnect(), + ]); + const clearDone = Sphere.clear({ + storage: this.providers.storage, + tokenStorage: this.providers.tokenStorage, + }); + await Promise.race([clearDone, new Promise(r => setTimeout(r, 5000))]); + } catch (e) { + console.warn('[WalletManager] Sphere.clear() failed:', e); + } + this.providers = null; } - // Clear IndexedDB token storage used by SDK + // Safety net: delete all IndexedDB databases try { const dbs = await indexedDB.databases(); for (const db of dbs) { @@ -252,6 +247,15 @@ export class WalletManager { console.warn('[WalletManager] Could not clear IndexedDB:', e); } + // Clear any legacy chrome.storage SDK keys (from old installs) + try { + const all = await chrome.storage.local.get(null); + const sdkKeys = Object.keys(all).filter((k) => k.startsWith('sphere_sdk2_')); + if (sdkKeys.length > 0) { + await chrome.storage.local.remove(sdkKeys); + } + } catch { /* ignore */ } + console.log('[WalletManager] Wallet reset complete'); } @@ -267,28 +271,19 @@ export class WalletManager { } } this.sphere = null; + this.providers = null; this.password = null; - this.cachedAggregatorConfig = null; } - // ============ Aggregator Config ============ - - private async loadAggregatorConfig(): Promise { - const result = await chrome.storage.local.get(['aggregatorConfig']); - this.cachedAggregatorConfig = result.aggregatorConfig || null; - } + // ============ Aggregator Config (no-op, SDK handles via createBrowserProviders) ============ - async getAggregatorConfig(): Promise { + async getAggregatorConfig(): Promise<{ gatewayUrl: string; apiKey?: string }> { const result = await chrome.storage.local.get(['aggregatorConfig']); - return result.aggregatorConfig || { - gatewayUrl: GATEWAY_URL, - apiKey: undefined, - }; + return result.aggregatorConfig || { gatewayUrl: '' }; } - async setAggregatorConfig(config: AggregatorConfig): Promise { + async setAggregatorConfig(config: { gatewayUrl: string; apiKey?: string }): Promise { await chrome.storage.local.set({ aggregatorConfig: config }); - this.cachedAggregatorConfig = config; } // ============ State Checks ============ @@ -297,6 +292,11 @@ export class WalletManager { return this.sphere !== null; } + /** Returns the active Sphere instance or null when wallet is locked. */ + getSphereInstance(): Sphere | null { + return this.sphere; + } + private getSphere(): Sphere { if (!this.sphere) { throw new Error('Wallet is locked'); @@ -378,99 +378,91 @@ export class WalletManager { return balances; } - getBalance(coinId: string): bigint { + /** + * Get assets list (v0.5.3 API or fallback). + */ + async getAssets(): Promise { const sphere = this.getSphere(); try { - const tokens = sphere.payments.getTokens({ coinId, status: 'confirmed' }); - let total = 0n; - for (const tok of tokens) { - total += BigInt(tok.amount); + // Try v0.5.3 API first + if (typeof sphere.payments.getAssets === 'function') { + return await sphere.payments.getAssets(); } - return total; - } catch { - return 0n; + // Fallback: aggregate from tokens (legacy path, cast to Asset) + return this.getBalances().map(b => ({ + coinId: b.coinId, + symbol: b.symbol, + totalAmount: b.amount, + confirmedAmount: b.amount, + unconfirmedAmount: b.pendingAmount || '0', + decimals: COIN_DECIMALS[b.coinId] ?? DEFAULT_DECIMALS, + })) as Asset[]; + } catch (error) { + console.error('[WalletManager] Error getting assets:', error); + return []; } } - canAfford(coinId: string, amount: bigint): boolean { - return this.getBalance(coinId) >= amount; - } - - // ============ Token Health ============ - - async checkTokenHealth(): Promise { + /** + * Get individual tokens list. + */ + getTokenList(): Token[] { const sphere = this.getSphere(); - const allTokens = sphere.payments.getTokens(); - const oracle = (sphere as any).getOracle?.() ?? (sphere as any)._oracle; - const validTokens: typeof allTokens = []; - const invalidTokens: { token: typeof allTokens[0]; reason: string }[] = []; - - // Get wallet's signing public key for ownership check via public SDK API - let walletPubkey: Uint8Array | null = null; try { - walletPubkey = await sphere.payments.getSigningPublicKey(); - } catch (e) { - console.warn('[WalletManager] Could not get signing pubkey:', e); + return sphere.payments.getTokens(); + } catch (error) { + console.error('[WalletManager] Error getting tokens:', error); + return []; } + } - for (const token of allTokens) { - try { - const tokenData = token.sdkData ? JSON.parse(token.sdkData) : null; - if (!tokenData) { - invalidTokens.push({ token, reason: 'No token data' }); - continue; - } - - // Chain validity check - const result = await oracle.validateToken(tokenData); - if (!result.valid || result.spent) { - invalidTokens.push({ token, reason: result.spent ? 'Token already spent' : 'Chain verification failed' }); - continue; - } - - // Ownership check — does the wallet's key match the token's state predicate? - if (walletPubkey) { - const sdkToken = await SdkToken.fromJSON(tokenData); - const predicate = await PredicateEngineService.createPredicate(sdkToken.state.predicate); - const isOwner = await predicate.isOwner(walletPubkey); - const pubkeyHex = Array.from(walletPubkey).map(b => b.toString(16).padStart(2, '0')).join(''); - console.log('[WalletManager] Ownership check:', token.id.slice(0, 8), 'isOwner:', isOwner, 'pubkey:', pubkeyHex.slice(0, 16) + '...'); - if (!isOwner) { - invalidTokens.push({ token, reason: 'Ownership mismatch — wallet key does not match token predicate' }); - continue; - } - } - - validTokens.push(token); - } catch (error) { - console.warn('[WalletManager] Token validation failed:', token.id, error); - invalidTokens.push({ token, reason: 'Validation error' }); + /** + * Get transaction history. + */ + getTransactionHistory(): TransactionHistoryEntry[] { + const sphere = this.getSphere(); + try { + if (typeof sphere.payments.getHistory === 'function') { + return sphere.payments.getHistory(); } + return []; + } catch (error) { + console.error('[WalletManager] Error getting history:', error); + return []; } + } - const invalidInfos: TokenHealthInfo[] = invalidTokens.map(({ token: tok, reason }) => ({ - id: tok.id, - coinId: tok.coinId, - symbol: COIN_SYMBOLS[tok.coinId] || tok.symbol || 'TOKEN', - amount: tok.amount, - status: tok.status, - isValid: false, - reason, - })); - + /** + * Get full identity info for the popup. + */ + getFullIdentity(): { chainPubkey: string; l1Address: string; directAddress?: string; nametag?: string } | null { + const sphere = this.getSphere(); + const identity = sphere.identity; + if (!identity) return null; return { - total: allTokens.length, - valid: validTokens.length, - invalid: invalidInfos, + chainPubkey: identity.chainPubkey, + l1Address: identity.l1Address, + directAddress: identity.directAddress, + nametag: identity.nametag, }; } - async purgeInvalidTokens(): Promise<{ purged: number }> { - const { invalid } = await this.checkTokenHealth(); - for (const tok of invalid) { - await this.getSphere().payments.removeToken(tok.id, undefined, true); + getBalance(coinId: string): bigint { + const sphere = this.getSphere(); + try { + const tokens = sphere.payments.getTokens({ coinId, status: 'confirmed' }); + let total = 0n; + for (const tok of tokens) { + total += BigInt(tok.amount); + } + return total; + } catch { + return 0n; } - return { purged: invalid.length }; + } + + canAfford(coinId: string, amount: bigint): boolean { + return this.getBalance(coinId) >= amount; } // ============ Address Methods ============ @@ -527,24 +519,54 @@ export class WalletManager { return signNostrEvent(keyPair.privateKey, hashBytes); } - nip44Encrypt(recipientPubkeyHex: string, plaintext: string): string { + signMessageWithIdentity(message: string): string { const sphere = this.getSphere(); const keyPair = deriveNostrKeyPair(sphere); - const privKeyHex = bytesToHex(keyPair.privateKey); - return NIP44.encryptHex(plaintext, privKeyHex, recipientPubkeyHex); + return signMessage(keyPair.privateKey, message); + } + + // ============ Communications (DM + Payment Requests) ============ + + async sendDM(recipient: string, content: string): Promise<{ id: string; timestamp: number }> { + const sphere = this.getSphere(); + const dm = await sphere.communications.sendDM(recipient, content); + return { id: dm.id, timestamp: dm.timestamp }; } - nip44Decrypt(senderPubkeyHex: string, ciphertext: string): string { + async sendPaymentRequest( + recipient: string, + options: { amount: string; coinId: string; message?: string }, + ): Promise<{ success: boolean; requestId?: string; error?: string }> { const sphere = this.getSphere(); - const keyPair = deriveNostrKeyPair(sphere); - const privKeyHex = bytesToHex(keyPair.privateKey); - return NIP44.decryptHex(ciphertext, privKeyHex, senderPubkeyHex); + return sphere.payments.sendPaymentRequest(recipient, options); } - signMessageWithIdentity(message: string): string { + // ============ L1 Payments ============ + + async sendL1Tokens( + to: string, + amountSatoshis: string, + vestingMode?: 'all' | 'vested' | 'unvested', + ): Promise<{ success: boolean; txHash?: string; error?: string }> { const sphere = this.getSphere(); - const keyPair = deriveNostrKeyPair(sphere); - return signMessage(keyPair.privateKey, message); + if (!sphere.payments.l1) throw new Error('L1 payments not available'); + // Map UI vesting mode to SDK useVested boolean param + let useVested: boolean | undefined; + if (vestingMode === 'vested') useVested = true; + else if (vestingMode === 'unvested') useVested = false; + const result = await sphere.payments.l1.send({ to, amount: amountSatoshis, useVested }); + return result; + } + + async getL1VestingBalances(): Promise<{ vested: string; unvested: string; total: string }> { + const sphere = this.getSphere(); + if (!sphere.payments.l1) return { vested: '0', unvested: '0', total: '0' }; + try { + const balance = await sphere.payments.l1.getBalance(); + return { vested: balance.vested, unvested: balance.unvested, total: balance.total }; + } catch { + return { vested: '0', unvested: '0', total: '0' }; + } } // ============ Export ============ @@ -596,23 +618,58 @@ export class WalletManager { } async isNametagAvailable(nametag: string): Promise { - const sphere = this.getSphere(); const cleanTag = nametag.replace('@', '').trim().toLowerCase(); - // If this wallet already owns this nametag (NOSTR binding done, mint may be pending), - // treat it as "available" so the user can retry the mint. - if (sphere.identity?.nametag === cleanTag) { - console.log(`[WalletManager] isNametagAvailable: @${cleanTag} is owned by this wallet, treating as available`); - return true; + // If wallet is unlocked, use the SDK's built-in check + if (this.sphere) { + // If this wallet already owns this nametag (NOSTR binding done, mint may be pending), + // treat it as "available" so the user can retry the mint. + if (this.sphere.identity?.nametag === cleanTag) { + console.log(`[WalletManager] isNametagAvailable: @${cleanTag} is owned by this wallet, treating as available`); + return true; + } + + try { + const result = await this.sphere.isNametagAvailable(cleanTag); + console.log('[WalletManager] isNametagAvailable result for', cleanTag, ':', result); + return result; + } catch (error) { + console.error('[WalletManager] Nametag availability check error:', error); + return false; + } } + // Wallet is locked / not created yet — use standalone transport for read-only check + // (like sphere web app does with dummy identity) + return this.isNametagAvailableStandalone(cleanTag); + } + + /** + * Check nametag availability via a temporary transport (no wallet required). + * Mirrors sphere web app's resolveNametag() approach with dummy identity. + */ + private async isNametagAvailableStandalone(cleanTag: string): Promise { + let tempProviders: BrowserProviders | null = null; try { - const result = await sphere.isNametagAvailable(cleanTag); - console.log('[WalletManager] isNametagAvailable result for', cleanTag, ':', result); - return result; + tempProviders = createBrowserProviders({ network: 'testnet' }); + const transport = tempProviders.transport; + await transport.connect(); + // Set dummy identity for read-only queries (like sphere SphereProvider.tsx) + await transport.setIdentity({ + privateKey: '0000000000000000000000000000000000000000000000000000000000000001', + chainPubkey: '000000000000000000000000000000000000000000000000000000000000000000', + l1Address: '', + }); + + const resolved = await transport.resolveNametag?.(cleanTag); + const available = !resolved; + console.log(`[WalletManager] Standalone nametag check for @${cleanTag}: ${available ? 'available' : 'taken'}`); + return available; } catch (error) { - console.error('[WalletManager] Nametag availability check error:', error); + console.error('[WalletManager] Standalone nametag check error:', error); return false; + } finally { + try { await tempProviders?.transport?.disconnect?.(); } catch { /* ignore */ } } } @@ -633,19 +690,6 @@ export class WalletManager { await sphere.registerNametag(cleanTag); } - // Mint on-chain nametag token (required for receiving PROXY transfers) - if (!(sphere as any)._payments?.hasNametag?.()) { - console.log('[WalletManager] Minting nametag token on-chain...'); - const mintResult = await (sphere as any).mintNametag(cleanTag); - if (!mintResult.success) { - console.error('[WalletManager] Nametag mint failed:', JSON.stringify(mintResult)); - throw new Error(`Nametag mint failed: ${JSON.stringify(mintResult.error)}`); - } - console.log('[WalletManager] Nametag minted on-chain:', cleanTag); - } else { - console.log('[WalletManager] Nametag token already present, skipping mint'); - } - const nametagInfo: NametagInfo = { nametag: cleanTag, proxyAddress: sphere.identity?.directAddress ?? '', @@ -653,7 +697,8 @@ export class WalletManager { status: 'active', }; - // Save to chrome storage for local lookup + // Save to chrome storage BEFORE minting — so nametag is persisted even if mint fails. + // On next unlock the SDK will re-read the binding from the relay. await this.saveNametag({ name: cleanTag, tokenJson: '{}', @@ -661,6 +706,27 @@ export class WalletManager { timestamp: Date.now(), }); + // Mint on-chain nametag token (required for receiving PROXY transfers). + // Failure here is non-fatal — the nametag is already bound on Nostr + // and saved locally. The mint can be retried later. + try { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + if (!(sphere as any)._payments?.hasNametag?.()) { + console.log('[WalletManager] Minting nametag token on-chain...'); + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const mintResult = await (sphere as any).mintNametag(cleanTag); + if (!mintResult.success) { + console.warn('[WalletManager] Nametag mint failed (non-fatal):', JSON.stringify(mintResult)); + } else { + console.log('[WalletManager] Nametag minted on-chain:', cleanTag); + } + } else { + console.log('[WalletManager] Nametag token already present, skipping mint'); + } + } catch (mintErr) { + console.warn('[WalletManager] Nametag mint error (non-fatal):', mintErr); + } + return nametagInfo; } @@ -749,6 +815,7 @@ export class WalletManager { // The old token was minted with old identity's signing predicates — PROXY // finalization will fail with "Recipient verification failed" until re-minted. console.log(`[WalletManager] Step 2: Re-minting nametag token with new identity...`); + // eslint-disable-next-line @typescript-eslint/no-explicit-any const payments = (sphere as any)._payments; if (payments?.clearNametag) { await payments.clearNametag(); @@ -782,6 +849,7 @@ export class WalletManager { console.log(`[WalletManager] Nametag token migration: clearing old token and re-minting @${nametagName}...`); // Clear old nametag token (minted with old identity's predicates) + // eslint-disable-next-line @typescript-eslint/no-explicit-any const payments = (sphere as any)._payments; if (payments?.clearNametag) { await payments.clearNametag(); @@ -802,33 +870,16 @@ export class WalletManager { // ============ Sphere Instance Creation ============ private async createSphereFromMnemonic(mnemonic: string): Promise { - const config = this.cachedAggregatorConfig; - const gatewayUrl = config?.gatewayUrl || GATEWAY_URL; - - const storage = createChromeStorageProvider({ prefix: 'sphere_sdk2_', debug: true }); - await storage.connect(); - - const transport = createNostrTransportProvider({ - relays: DEFAULT_NOSTR_RELAYS, - debug: true, - }); - - const oracle = createUnicityAggregatorProvider({ - url: gatewayUrl, - apiKey: config?.apiKey, - trustBaseUrl: 'https://raw.githubusercontent.com/unicitynetwork/unicity-ids/refs/heads/main/bft-trustbase.testnet.json', - debug: true, - }); - - const tokenStorage = createIndexedDBTokenStorageProvider(); + // Create providers exactly like sphere web app — SDK handles all URLs/relays + const browserProviders = createBrowserProviders({ network: 'testnet' }); + this.providers = browserProviders; // Use init() which auto-loads existing or creates new const { sphere } = await Sphere.init({ + ...browserProviders, mnemonic, - storage, - transport, - oracle, - tokenStorage, + l1: {}, + discoverAddresses: false, }); // Migrate data from old address format if needed (SDK 0.1.2 → 0.1.9 changed address encoding) @@ -841,21 +892,15 @@ export class WalletManager { const idbMigrated = await migrateOldIndexedDBData(directAddress); if (chrMigrated || idbMigrated) { console.log('[WalletManager] Migrated old data, destroying first sphere and reloading...'); - // Destroy first instance to clean up transport handlers before re-init try { await sphere.destroy(); } catch { /* ignore */ } // Re-create providers (transport was disconnected by destroy) - const storage2 = createChromeStorageProvider({ prefix: 'sphere_sdk2_', debug: true }); - await storage2.connect(); - const transport2 = createNostrTransportProvider({ relays: DEFAULT_NOSTR_RELAYS, debug: true }); - const oracle2 = createUnicityAggregatorProvider({ - url: gatewayUrl, - apiKey: config?.apiKey, - trustBaseUrl: 'https://raw.githubusercontent.com/unicitynetwork/unicity-ids/refs/heads/main/bft-trustbase.testnet.json', - debug: true, - }); - const tokenStorage2 = createIndexedDBTokenStorageProvider(); + const browserProviders2 = createBrowserProviders({ network: 'testnet' }); + this.providers = browserProviders2; const { sphere: reloaded } = await Sphere.init({ - mnemonic, storage: storage2, transport: transport2, oracle: oracle2, tokenStorage: tokenStorage2, + ...browserProviders2, + mnemonic, + l1: {}, + discoverAddresses: false, }); return reloaded; } @@ -952,11 +997,6 @@ function formatSmallestUnits(amount: string, decimals: number): string { return integerPart; } -function bytesToHex(bytes: Uint8Array): string { - return Array.from(bytes) - .map((b) => b.toString(16).padStart(2, '0')) - .join(''); -} function hexToBytes(hex: string): Uint8Array { if (hex.length % 2 !== 0) { diff --git a/src/platform/extension/connect/ExtensionTransport.ts b/src/platform/extension/connect/ExtensionTransport.ts new file mode 100644 index 0000000..4a6429e --- /dev/null +++ b/src/platform/extension/connect/ExtensionTransport.ts @@ -0,0 +1,86 @@ +/** + * ExtensionTransport — Host-side Chrome Extension transport for Sphere Connect. + * + * Implements ConnectTransport for the extension background service worker. + * Receives messages from content script via chrome.runtime.onMessage and + * sends responses back via chrome.tabs.sendMessage. + * + * The dApp page sends messages via window.postMessage with type + * 'sphere-connect-ext:tohost'. The content script relays them here. + * Responses are sent back with type 'sphere-connect-ext:toclient'. + */ + +import type { ConnectTransport, SphereConnectMessage } from '@unicitylabs/sphere-sdk/connect'; +import { isSphereConnectMessage } from '@unicitylabs/sphere-sdk/connect'; + +export const EXT_MSG_TO_HOST = 'sphere-connect-ext:tohost'; +export const EXT_MSG_TO_CLIENT = 'sphere-connect-ext:toclient'; + +interface ExtConnectEnvelope { + type: typeof EXT_MSG_TO_HOST | typeof EXT_MSG_TO_CLIENT; + payload: unknown; +} + +function isExtConnectEnvelope(data: unknown): data is ExtConnectEnvelope { + return ( + typeof data === 'object' && + data !== null && + 'type' in data && + ((data as ExtConnectEnvelope).type === EXT_MSG_TO_HOST || + (data as ExtConnectEnvelope).type === EXT_MSG_TO_CLIENT) && + 'payload' in data + ); +} + +export interface ExtensionHostMessagingApi { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + onMessage: { addListener(fn: (msg: unknown, sender: any) => void): void; removeListener(fn: (msg: unknown, sender: any) => void): void }; + tabs: { sendMessage(tabId: number, msg: unknown): void }; +} + +class ExtensionHostTransportImpl implements ConnectTransport { + private handlers: Set<(message: SphereConnectMessage) => void> = new Set(); + private activeTabId: number | null = null; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + private listener: ((msg: unknown, sender: any) => void) | null = null; + private readonly api: ExtensionHostMessagingApi; + + constructor(api: ExtensionHostMessagingApi) { + this.api = api; + + this.listener = (msg: unknown, sender: { tab?: { id?: number } }) => { + if (!isExtConnectEnvelope(msg)) return; + if (msg.type !== EXT_MSG_TO_HOST) return; + + if (sender.tab?.id !== undefined) this.activeTabId = sender.tab.id; + + if (!isSphereConnectMessage(msg.payload)) return; + for (const h of this.handlers) { + try { h(msg.payload); } catch { /* ignore */ } + } + }; + + this.api.onMessage.addListener(this.listener); + } + + send(message: SphereConnectMessage): void { + if (this.activeTabId === null) return; + const envelope: ExtConnectEnvelope = { type: EXT_MSG_TO_CLIENT, payload: message }; + try { this.api.tabs.sendMessage(this.activeTabId, envelope); } catch { /* tab closed */ } + } + + onMessage(handler: (message: SphereConnectMessage) => void): () => void { + this.handlers.add(handler); + return () => { this.handlers.delete(handler); }; + } + + destroy(): void { + if (this.listener) { this.api.onMessage.removeListener(this.listener); this.listener = null; } + this.handlers.clear(); + this.activeTabId = null; + } +} + +export function createExtensionHostTransport(api: ExtensionHostMessagingApi): ConnectTransport { + return new ExtensionHostTransportImpl(api); +} diff --git a/src/content/index.ts b/src/platform/extension/content/index.ts similarity index 64% rename from src/content/index.ts rename to src/platform/extension/content/index.ts index a4680e2..e9af27a 100644 --- a/src/content/index.ts +++ b/src/platform/extension/content/index.ts @@ -7,6 +7,7 @@ */ import { isSphereRequest, isSphereResponse } from '@/shared/messages'; +import { isExtensionConnectEnvelope, EXT_MSG_TO_HOST, EXT_MSG_TO_CLIENT } from '@unicitylabs/sphere-sdk/connect/browser'; console.log('Sphere content script loaded'); @@ -21,6 +22,34 @@ function injectScript() { injectScript(); +// =========================================================================== +// Connect protocol relay (ExtensionTransport) +// =========================================================================== + +// Forward sphere-connect-ext:tohost messages from dApp page → background +window.addEventListener('message', (event) => { + if (event.source !== window) return; + if (!isExtensionConnectEnvelope(event.data)) return; + if (event.data.type !== EXT_MSG_TO_HOST) return; + + // Fire-and-forget: background ConnectHost listens via chrome.runtime.onMessage + chrome.runtime.sendMessage(event.data).catch(() => { + // Background may not be ready yet — ignore + }); +}); + +// Forward sphere-connect-ext:toclient messages from background → dApp page +chrome.runtime.onMessage.addListener((message) => { + if (!isExtensionConnectEnvelope(message)) return; + if (message.type !== EXT_MSG_TO_CLIENT) return; + window.postMessage(message, '*'); + // Return false: synchronous, no response needed +}); + +// =========================================================================== +// Legacy SPHERE_* relay (existing custom protocol) +// =========================================================================== + // Listen for messages from the page (inject script) window.addEventListener('message', async (event) => { // Only accept messages from the same window diff --git a/src/inject/index.ts b/src/platform/extension/inject/index.ts similarity index 90% rename from src/inject/index.ts rename to src/platform/extension/inject/index.ts index 3e1fea3..547d86b 100644 --- a/src/inject/index.ts +++ b/src/platform/extension/inject/index.ts @@ -162,28 +162,6 @@ class SphereAPI { return response.signature; } - /** - * NIP-44 encryption/decryption. - * Auto-approved for connected sites (no popup). - */ - nip44 = { - encrypt: async (recipientPubkey: string, plaintext: string): Promise => { - const response = await this.createRequest<{ ciphertext: string }>( - 'SPHERE_NIP44_ENCRYPT', - { recipientPubkey, plaintext } - ); - return response.ciphertext; - }, - - decrypt: async (senderPubkey: string, ciphertext: string): Promise => { - const response = await this.createRequest<{ plaintext: string }>( - 'SPHERE_NIP44_DECRYPT', - { senderPubkey, ciphertext } - ); - return response.plaintext; - }, - }; - /** * Get the user's registered nametag, if any. */ diff --git a/src/platform/extension/popup/PopupApp.tsx b/src/platform/extension/popup/PopupApp.tsx new file mode 100644 index 0000000..f0c8fa6 --- /dev/null +++ b/src/platform/extension/popup/PopupApp.tsx @@ -0,0 +1,27 @@ +import React from 'react'; +import { useWalletStatus } from '@/sdk/hooks'; +import { useSphereContext } from '@/sdk/context'; +import { WalletPanel } from '@/components/wallet/WalletPanel'; +import { UnlockWallet } from '@/components/wallet/UnlockWallet'; + +export function PopupApp() { + const { walletExists, isLoading, isUnlocked } = useWalletStatus(); + const ctx = useSphereContext(); + + if (isLoading) { + return ( +
+
+
+

Loading...

+
+
+ ); + } + + if (walletExists && !isUnlocked) { + return ; + } + + return ; +} diff --git a/src/platform/extension/popup/main.tsx b/src/platform/extension/popup/main.tsx new file mode 100644 index 0000000..228f2fd --- /dev/null +++ b/src/platform/extension/popup/main.tsx @@ -0,0 +1,25 @@ +import React from 'react'; +import ReactDOM from 'react-dom/client'; +import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; +import { ExtensionSphereProvider } from '../SphereProvider'; +import { PopupApp } from './PopupApp'; +import './styles.css'; + +const queryClient = new QueryClient({ + defaultOptions: { + queries: { + staleTime: 30_000, + retry: 1, + }, + }, +}); + +ReactDOM.createRoot(document.getElementById('root')!).render( + + + + + + + +); diff --git a/src/platform/extension/popup/styles.css b/src/platform/extension/popup/styles.css new file mode 100644 index 0000000..f6321bc --- /dev/null +++ b/src/platform/extension/popup/styles.css @@ -0,0 +1,37 @@ +@import "tailwindcss"; + +@layer base { + html, body { + width: 375px; + height: 667px; + margin: 0; + padding: 0; + overflow: hidden; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + background-color: white; + color: #171717; + } + + #root { + width: 375px; + height: 667px; + overflow: hidden; + } + + /* Custom scrollbar — hidden by default, visible on hover */ + ::-webkit-scrollbar { + width: 4px; + } + ::-webkit-scrollbar-track { + background: transparent; + } + ::-webkit-scrollbar-thumb { + background: transparent; + border-radius: 2px; + } + *:hover::-webkit-scrollbar-thumb { + background: #a3a3a3; + } +} diff --git a/src/popup/App.tsx b/src/popup/App.tsx deleted file mode 100644 index 421c897..0000000 --- a/src/popup/App.tsx +++ /dev/null @@ -1,81 +0,0 @@ -/** - * Main popup application component. - */ - -import { useEffect } from 'react'; -import { useStore } from './store'; -import { useWallet } from './hooks/useWallet'; -import { CreateWallet } from './components/CreateWallet'; -import { ImportWallet } from './components/ImportWallet'; -import { UnlockWallet } from './components/UnlockWallet'; -import { Dashboard } from './components/Dashboard'; -import { Send } from './components/Send'; -import { Receive } from './components/Receive'; -import { RegisterNametag } from './components/RegisterNametag'; -import { Settings } from './components/Settings'; -import { PendingTransactions } from './components/PendingTransactions'; - -export default function App() { - const { view, loading, error } = useStore(); - const { initialize } = useWallet(); - - // Initialize on mount - useEffect(() => { - initialize(); - }, [initialize]); - - // Loading state - if (view === 'loading') { - return ( -
-
-
-

{error || 'Loading...'}

- {error && ( - - )} -
-
- ); - } - - - return ( -
- {/* Header - only show on certain views */} - {(view === 'create-wallet' || view === 'import-wallet') && ( -
-
-

Sphere Wallet

-
- )} - - {/* Main content based on view */} -
- {view === 'create-wallet' && } - {view === 'import-wallet' && } - {view === 'unlock' && } - {view === 'dashboard' && } - {view === 'send' && } - {view === 'receive' && } - {view === 'register-nametag' && } - {view === 'settings' && } - {view === 'pending-transactions' && } -
- - {/* Global loading overlay - shown when loading but not on initial load */} - {loading && ( -
-
-
- )} -
- ); -} diff --git a/src/popup/components/CreateWallet.tsx b/src/popup/components/CreateWallet.tsx deleted file mode 100644 index c267eb7..0000000 --- a/src/popup/components/CreateWallet.tsx +++ /dev/null @@ -1,132 +0,0 @@ -/** - * Create wallet view - initial setup flow. - */ - -import { useState } from 'react'; -import { useStore } from '../store'; -import { useWallet } from '../hooks/useWallet'; - -export function CreateWallet() { - const [password, setPassword] = useState(''); - const [confirmPassword, setConfirmPassword] = useState(''); - const [error, setError] = useState(''); - const [mnemonic, setMnemonic] = useState(null); - const { loading, setView } = useStore(); - const { createWallet } = useWallet(); - - const handleSubmit = async (e: React.FormEvent) => { - e.preventDefault(); - setError(''); - - if (password.length < 8) { - setError('Password must be at least 8 characters'); - return; - } - - if (password !== confirmPassword) { - setError('Passwords do not match'); - return; - } - - try { - const m = await createWallet(password); - setMnemonic(m); - } catch (err) { - setError((err as Error).message); - } - }; - - // Show mnemonic backup screen after wallet creation - if (mnemonic) { - return ( -
-

Backup Recovery Phrase

- -
-

- Write down these words in order and store them safely. - Anyone with this phrase can access your wallet. -

-
- {mnemonic} -
-
- - -
- ); - } - - return ( -
-

Create New Wallet

- -
-
- - setPassword(e.target.value)} - placeholder="Enter password (min 8 characters)" - required - className="w-full bg-gray-800 border border-gray-700 rounded-lg px-3 py-2 - text-white placeholder-gray-500 - focus:outline-none focus:border-purple-500" - /> -
- -
- - setConfirmPassword(e.target.value)} - placeholder="Confirm password" - required - className="w-full bg-gray-800 border border-gray-700 rounded-lg px-3 py-2 - text-white placeholder-gray-500 - focus:outline-none focus:border-purple-500" - /> -
- - {error && ( -
{error}
- )} - - -
- -
-

- Already have a wallet?{' '} - -

-
-
- ); -} diff --git a/src/popup/components/Dashboard.tsx b/src/popup/components/Dashboard.tsx deleted file mode 100644 index 3d9e401..0000000 --- a/src/popup/components/Dashboard.tsx +++ /dev/null @@ -1,174 +0,0 @@ -/** - * Main dashboard view - shows balances and quick actions. - */ - -import { useState, useEffect } from 'react'; -import { useStore } from '../store'; -import { useWallet } from '../hooks/useWallet'; -import { ALPHA_COIN_ID, DEFAULT_COIN_SYMBOL } from '@/shared/constants'; - -export function Dashboard() { - const { activeIdentity, balances, setView } = useStore(); - const { lockWallet, getAddress } = useWallet(); - const [address, setAddress] = useState(''); - const [copied, setCopied] = useState(false); - - useEffect(() => { - getAddress().then(setAddress).catch(console.error); - }, [getAddress]); - - // Get primary balance (first balance or one matching ALPHA_COIN_ID) - const primaryBalance = balances.find((b) => b.coinId === ALPHA_COIN_ID) || balances[0]; - - const formatBalance = (amount: string): string => { - const num = parseFloat(amount); - if (isNaN(num) || num === 0) return '0'; - if (num < 0.0001 && num > 0) return '< 0.0001'; - return num.toLocaleString(undefined, { maximumFractionDigits: 4 }); - }; - - const truncateAddress = (addr: string): string => { - if (!addr) return ''; - return `${addr.slice(0, 12)}...${addr.slice(-8)}`; - }; - - const copyAddress = async () => { - await navigator.clipboard.writeText(address); - setCopied(true); - setTimeout(() => setCopied(false), 2000); - }; - - return ( -
- {/* Header */} -
-
-
-
-
- {activeIdentity?.label || 'Default'} -
-
-
- -
- - {/* Balance Card */} -
-
Total Balance
-
- {formatBalance(primaryBalance?.amount || '0')} {primaryBalance?.symbol || DEFAULT_COIN_SYMBOL} -
- {primaryBalance?.pendingAmount && primaryBalance.pendingAmount !== '0' && ( -
- +{formatBalance(primaryBalance.pendingAmount)} finalizing... -
- )} - - {/* Address */} -
- - {truncateAddress(address)} - - - {copied ? 'Copied!' : 'Copy'} - -
-
- - {/* Quick Actions */} -
- - - -
- - {/* Token List */} -
-

Tokens

-
- {balances.map((balance) => ( -
-
-
- - {balance.symbol.slice(0, 2)} - -
- {balance.symbol} -
-
- - {formatBalance(balance.amount)} - - {balance.pendingAmount && balance.pendingAmount !== '0' && ( -
- +{formatBalance(balance.pendingAmount)} finalizing -
- )} -
-
- ))} - - {balances.length === 0 && ( -
- No tokens yet -
- )} -
-
- - {/* Lock Button */} - -
- ); -} diff --git a/src/popup/components/ImportWallet.tsx b/src/popup/components/ImportWallet.tsx deleted file mode 100644 index 739373f..0000000 --- a/src/popup/components/ImportWallet.tsx +++ /dev/null @@ -1,127 +0,0 @@ -/** - * Import wallet view - restore from backup. - */ - -import { useState } from 'react'; -import { useStore } from '../store'; -import { useWallet } from '../hooks/useWallet'; - -export function ImportWallet() { - const [walletJson, setWalletJson] = useState(''); - const [password, setPassword] = useState(''); - const [error, setError] = useState(''); - const { loading, setView } = useStore(); - const { importWallet } = useWallet(); - - const handleFileUpload = (e: React.ChangeEvent) => { - const file = e.target.files?.[0]; - if (!file) return; - - const reader = new FileReader(); - reader.onload = (event) => { - setWalletJson(event.target?.result as string); - }; - reader.readAsText(file); - }; - - const handleSubmit = async (e: React.FormEvent) => { - e.preventDefault(); - setError(''); - - if (!walletJson.trim()) { - setError('Please paste wallet JSON or upload a file'); - return; - } - - if (!password) { - setError('Password is required'); - return; - } - - try { - await importWallet(walletJson, password); - } catch (err) { - setError((err as Error).message); - } - }; - - return ( -
-

Import Wallet

- -
-
- - -
- -
or
- -
- -