diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml
new file mode 100644
index 0000000..acd9303
--- /dev/null
+++ b/.github/workflows/publish.yml
@@ -0,0 +1,48 @@
+name: publish
+
+on:
+ release:
+ types: [published]
+
+jobs:
+ test:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v3
+
+ - name: Set up Node 22.19.0
+ uses: actions/setup-node@v4
+ with:
+ node-version: '22.19.0'
+ cache: 'npm'
+ registry-url: 'https://registry.npmjs.org'
+
+ - name: Install dependencies
+ run: npm clean-install
+ env:
+ NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
+
+ publish:
+ needs: test
+ runs-on: ubuntu-latest
+ environment: npm-publish
+
+ steps:
+ - uses: actions/checkout@v3
+
+ - name: Set up Node 22.19.0
+ uses: actions/setup-node@v4
+ with:
+ node-version: '22.19.0'
+ cache: 'npm'
+ registry-url: 'https://registry.npmjs.org'
+
+ - name: Install dependencies
+ run: npm clean-install
+ env:
+ NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
+
+ - name: Publish to npm
+ run: npm publish
+ env:
+ NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
diff --git a/.gitignore b/.gitignore
index c4f4bf8..4f985c3 100644
--- a/.gitignore
+++ b/.gitignore
@@ -29,3 +29,5 @@ yarn-error.log*
.env
.env.local
+# Docs
+docs/
\ No newline at end of file
diff --git a/README.md b/README.md
index 8e5df27..5670cef 100644
--- a/README.md
+++ b/README.md
@@ -6,6 +6,7 @@ Core functionality for React Native wallets - wallet management, balance fetchin
- [Quick Start](#quick-start)
- [Installation](#installation)
+- [Bundle Configuration](#bundle-configuration)
- [Core Concepts](#core-concepts)
- [Usage Examples](#usage-examples)
- [API Reference](#api-reference)
@@ -17,46 +18,62 @@ Core functionality for React Native wallets - wallet management, balance fetchin
## Quick Start
```typescript
-import { WdkAppProvider, useWdkApp, useWallet, useBalance } from '@tetherto/wdk-react-native-core'
-import { createSecureStorage } from '@tetherto/wdk-react-native-secure-storage'
+import { WdkAppProvider, useWdkApp, useWallet, useBalance, BaseAsset } from '@tetherto/wdk-react-native-core'
+// Import bundle from your generated .wdk folder (see Bundle Configuration)
+import { bundle } from './.wdk'
function App() {
- const secureStorage = createSecureStorage()
- const networkConfigs = {
- ethereum: { chainId: 1, blockchain: 'ethereum' }
- }
- const tokenConfigs = {
- ethereum: {
- native: { address: null, symbol: 'ETH', name: 'Ethereum', decimals: 18 },
- tokens: []
+ const wdkConfigs = {
+ networks: {
+ ethereum: {
+ blockchain: 'ethereum',
+ // Network-specific configurations go inside config
+ config: {
+ chainId: 1,
+ provider: 'https://eth.drpc.org'
+ }
+ }
}
}
return (
)
}
+// Define your assets
+const ethAsset = new BaseAsset({
+ id: 'eth',
+ network: 'ethereum',
+ symbol: 'ETH',
+ name: 'Ethereum',
+ decimals: 18,
+ isNative: true,
+ address: null
+})
+
function WalletScreen() {
const { status, isReady } = useWdkApp()
const { addresses } = useWallet()
- const { data: balance, isLoading } = useBalance({
- network: 'ethereum',
- accountIndex: 0,
- tokenAddress: null
- })
+
+ // Use the asset object for balance fetching
+ const { data: balance, isLoading } = useBalance(
+ 'ethereum', // network
+ 0, // accountIndex
+ ethAsset // asset
+ )
if (!isReady) return Loading...
return (
Address: {addresses.ethereum?.[0]}
- Balance: {balance || '0'}
+ Balance: {balance?.balance || '0'}
{isLoading && Updating...}
)
@@ -90,6 +107,121 @@ Or add to your `package.json`:
}
```
+## Bundle Configuration
+
+The `WdkAppProvider` requires a **bundle** prop containing the worklet bundle. You have two options for obtaining this bundle:
+
+### Option A: Generate a Custom Bundle (Recommended)
+
+Use the `@tetherto/wdk-worklet-bundler` CLI to generate a bundle with only the blockchain modules you need:
+
+```bash
+# 1. Install the bundler CLI
+npm install -g @tetherto/wdk-worklet-bundler
+
+# 2. Initialize configuration in your React Native project
+wdk-worklet-bundler init
+
+# 3. Edit wdk.config.js to configure your networks (see example below)
+
+# 4. Install required WDK modules
+npm install @tetherto/wdk @tetherto/wdk-wallet-evm-erc-4337
+
+# 5. Generate the bundle
+wdk-worklet-bundler generate
+```
+
+Example `wdk.config.js`:
+
+```javascript
+module.exports = {
+ modules: {
+ core: '@tetherto/wdk',
+ erc4337: '@tetherto/wdk-wallet-evm-erc-4337',
+ },
+ networks: {
+ ethereum: {
+ module: 'erc4337',
+ chainId: 1,
+ blockchain: 'ethereum',
+ provider: 'https://eth.drpc.org',
+ },
+ polygon: {
+ module: 'erc4337',
+ chainId: 137,
+ blockchain: 'polygon',
+ provider: 'https://polygon.drpc.org',
+ },
+ },
+}
+```
+
+After running `wdk-worklet-bundler generate`, import and use the bundle:
+
+```typescript
+import { bundle } from './.wdk'
+
+const wdkConfigs = {
+ // Your runtime configurations matching wdk.config.js networks
+ networks: {
+ ethereum: {
+ blockchain: 'ethereum',
+ config: {
+ chainId: 1,
+ provider: 'https://eth.drpc.org'
+ }
+ },
+ polygon: {
+ blockchain: 'polygon',
+ config: {
+ chainId: 137,
+ provider: 'https://polygon.drpc.org'
+ }
+ }
+ }
+}
+
+
+
+
+```
+
+For full bundler documentation, see [wdk-worklet-bundler](https://github.com/tetherto/wdk-worklet-bundler).
+
+### Option B: Use Pre-built Bundle (pear-wrk-wdk)
+
+For quick prototyping, you can use the pre-built `pear-wrk-wdk` package which includes all blockchain modules:
+
+```bash
+npm install pear-wrk-wdk
+```
+
+```typescript
+import { bundle } from 'pear-wrk-wdk'
+
+
+
+
+```
+
+> **Note**: The pre-built bundle includes all blockchain modules, resulting in a larger bundle size. For production apps, we recommend generating a custom bundle with only the modules you need.
+
+### TypeScript Configuration
+
+If using a generated bundle, add the `.wdk` folder to your TypeScript includes:
+
+```json
+{
+ "include": ["**/*.ts", "**/*.tsx", ".wdk/**/*"]
+}
+```
+
## Core Concepts
### WdkAppProvider
@@ -97,9 +229,11 @@ Or add to your `package.json`:
The root provider that manages wallet initialization and worklet lifecycle. Wrap your app with it:
```typescript
+import { bundle } from './.wdk'
+
{children}
@@ -122,10 +256,10 @@ const { status, isReady, error } = useWdkApp()
if (!isReady) return
```
-### Wallet Lifecycle (Create, Load, Import, Delete)
+### Wallet Lifecycle (Create, Unlock, Restore, Delete)
Use `useWalletManager()` for wallet setup - this is the ONLY hook for wallet lifecycle:
```typescript
-const { createWallet, loadWallet, importWallet, hasWallet, deleteWallet } = useWalletManager(networkConfigs)
+const { createWallet, unlock, restoreWallet, wallets, deleteWallet } = useWalletManager()
```
### Wallet Operations (After Initialization)
@@ -137,11 +271,11 @@ const { addresses, getAddress, callAccountMethod } = useWallet()
### Balance Fetching
Use `useBalance()` for balances:
```typescript
-const { data: balance, isLoading } = useBalance({
- network: 'ethereum',
- accountIndex: 0,
- tokenAddress: null
-})
+const { data: balance, isLoading } = useBalance(
+ 'ethereum', // network
+ 0, // accountIndex
+ ethAsset // asset object
+)
```
### State Management
@@ -156,10 +290,16 @@ const { data: balance, isLoading } = useBalance({
```typescript
import { WdkAppProvider, useWdkApp, useWalletManager } from '@tetherto/wdk-react-native-core'
+import { bundle } from './.wdk'
function App() {
+ const wdkConfigs = { /* ... */ }
+
return (
-
+
)
@@ -167,19 +307,21 @@ function App() {
function WalletSetup() {
const { status, isReady } = useWdkApp()
- const { createWallet, loadWallet, hasWallet } = useWalletManager()
+ const { createWallet, unlock, wallets } = useWalletManager()
useEffect(() => {
const init = async () => {
- const exists = await hasWallet()
- if (exists) {
- await loadWallet()
+ // Check if default wallet exists in the loaded list
+ const defaultWallet = wallets.find(w => w.identifier === 'default')
+
+ if (defaultWallet?.exists) {
+ await unlock('default')
} else {
- await createWallet()
+ await createWallet('default')
}
}
if (isReady) init()
- }, [isReady])
+ }, [isReady, wallets])
if (!isReady) return
@@ -190,25 +332,46 @@ function WalletSetup() {
### Fetching Balances
```typescript
-import { useBalance, useBalancesForWallet } from '@tetherto/wdk-react-native-core'
+import { useBalance, useBalancesForWallet, BaseAsset } from '@tetherto/wdk-react-native-core'
+
+// Define assets
+const eth = new BaseAsset({
+ id: 'eth',
+ network: 'ethereum',
+ symbol: 'ETH',
+ name: 'Ethereum',
+ decimals: 18,
+ isNative: true,
+ address: null
+})
+
+const usdt = new BaseAsset({
+ id: 'usdt',
+ network: 'ethereum',
+ symbol: 'USDT',
+ name: 'Tether',
+ decimals: 6,
+ isNative: false,
+ address: '0x...'
+})
function BalanceDisplay() {
// Single balance
- const { data: balance, isLoading, error } = useBalance({
- network: 'ethereum',
- accountIndex: 0,
- tokenAddress: null // null for native token
- })
+ const { data: balance, isLoading, error } = useBalance(
+ 'ethereum',
+ 0,
+ eth
+ )
// All balances for a wallet
- const { data: allBalances } = useBalancesForWallet({
- accountIndex: 0,
- networks: ['ethereum', 'spark']
- })
+ const { data: allBalances } = useBalancesForWallet(
+ 0, // accountIndex
+ [eth, usdt] // array of assets to fetch
+ )
return (
- ETH Balance: {balance || '0'}
+ ETH Balance: {balance?.balance || '0'}
{isLoading && Loading...}
{error && Error: {error.message}}
@@ -252,6 +415,24 @@ function AccountOperations() {
}
}
+ // Multi-argument methods: pass array to spread as positional arguments
+ const handleTransfer = async (to: string, amount: string) => {
+ try {
+ const result = await callAccountMethod(
+ 'ethereum',
+ 0,
+ 'transfer',
+ [
+ { to, amount }, // 1st arg: options
+ { paymasterToken: '0x...', transferMaxFee: '100' } // 2nd arg: config
+ ]
+ )
+ console.log('Transfer result:', result)
+ } catch (error) {
+ console.error('Failed:', error)
+ }
+ }
+
if (!isInitialized) return Not initialized
return (
@@ -293,8 +474,11 @@ function RefreshButton() {
refreshBalance({
network: 'ethereum',
accountIndex: 0,
- tokenAddress: null
+ assetId: 'eth' // refresh specific asset
})
+
+ // OR refresh all balances for account
+ // refreshBalance({ accountIndex: 0, type: 'wallet' })
}
return
@@ -307,8 +491,18 @@ function RefreshButton() {
```typescript
interface WdkAppProviderProps {
- networkConfigs: NetworkConfigs
- tokenConfigs: TokenConfigs
+ /** Worklet bundle configuration */
+ bundle: {
+ bundle: string // The worklet bundle code
+ }
+ /** Network & protocol configurations */
+ wdkConfigs: WdkConfigs
+ /** Enable automatic wallet initialization on app restart (default: true) */
+ enableAutoInitialization?: boolean
+ /** Current user's identifier for wallet association */
+ currentUserId?: string | null
+ /** Clear sensitive data on app background (default: false) */
+ clearSensitiveDataOnBackground?: boolean
children: React.ReactNode
}
```
@@ -356,16 +550,13 @@ interface UseWalletResult {
### useBalance()
```typescript
-function useBalance(options: {
- network: string
- accountIndex: number
- tokenAddress: string | null
- walletId?: string
- enabled?: boolean
- refetchInterval?: number
- staleTime?: number
-}): {
- data: string | null
+function useBalance(
+ network: string,
+ accountIndex: number,
+ asset: IAsset,
+ options?: BalanceQueryOptions
+): {
+ data: BalanceFetchResult | undefined
isLoading: boolean
error: Error | null
refetch: () => void
@@ -376,13 +567,38 @@ function useBalance(options: {
```typescript
interface UseWalletManagerResult {
- createWallet: (identifier?: string) => Promise
- loadWallet: (identifier?: string) => Promise
- importWallet: (mnemonic: string, identifier?: string) => Promise
- deleteWallet: (identifier: string) => Promise
- hasWallet: (identifier?: string) => Promise
- getWalletList: () => Wallet[]
+ /** The currently "Active" Wallet ID (Seed) loaded in the engine. */
activeWalletId: string | null
+
+ /** The current state of the active wallet. */
+ status: 'LOCKED' | 'UNLOCKED' | 'NO_WALLET' | 'LOADING' | 'ERROR'
+
+ /** List of backing Wallets (Seeds) managed by the device. */
+ wallets: WalletInfo[]
+
+ /** Create a new Wallet (Seed). */
+ createWallet: (walletId: string) => Promise
+
+ /** Restore a Wallet from Seed Phrase. Returns the new walletId. */
+ restoreWallet: (mnemonic: string, walletId: string) => Promise
+
+ /** Delete/Remove a wallet and all associated data. */
+ deleteWallet: (walletId: string) => Promise
+
+ /**
+ * Unlocks the currently active wallet.
+ * This typically triggers a biometric prompt to decrypt and load the wallet.
+ */
+ unlock: (walletId?: string) => Promise
+
+ /** Locks the wallet. Clears sensitive data from memory. */
+ lock: () => void
+
+ /** Generate a mnemonic phrase. */
+ generateMnemonic: (wordCount?: 12 | 24) => Promise
+
+ /** Create a temporary wallet for previewing addresses */
+ createTemporaryWallet: (mnemonic?: string) => Promise
}
```
@@ -482,10 +698,9 @@ The `WdkAppProvider` uses a **consolidated effect** for wallet state synchroniza
**Symptoms**: `status` is `ERROR`, `error` is set
**Solutions**:
-1. Check that `networkConfigs` are valid (use `validateNetworkConfigs()`)
-2. Verify `tokenConfigs` are properly configured
-3. Check console logs for detailed error messages
-4. Try calling `retry()` method from context
+1. Check that `wdkConfigs` are valid (use `validateWdkConfigs()`)
+2. Check console logs for detailed error messages
+3. Try calling `retry()` method from context
**Common Errors**:
- "WDK not initialized" → Worklet failed to start, check network configs
@@ -497,7 +712,7 @@ The `WdkAppProvider` uses a **consolidated effect** for wallet state synchroniza
**Symptoms**: Balances not updating, `isLoading` stuck true
**Solutions**:
-1. Verify `tokenConfigs` are properly configured
+1. Verify `asset` properties are correct (especially address and network)
2. Check network connectivity and RPC endpoint availability
3. Ensure wallet is initialized (`status === 'READY'`)
4. Check token addresses are valid Ethereum addresses
@@ -507,7 +722,7 @@ The `WdkAppProvider` uses a **consolidated effect** for wallet state synchroniza
**Symptoms**: Runtime errors about invalid types
**Solutions**:
-1. Use `validateNetworkConfigs()` and `validateTokenConfigs()` before passing to provider
+1. Use `validateWdkConfigs()` before passing to provider
2. Ensure token addresses match Ethereum address format
3. Verify account indices are non-negative integers
4. Use type guards from exports for runtime validation
@@ -537,4 +752,4 @@ npm run typecheck
## License
-Apache-2.0
+Apache-2.0
\ No newline at end of file
diff --git a/jest.config.cjs b/jest.config.cjs
index 061b49d..b26e5cf 100644
--- a/jest.config.cjs
+++ b/jest.config.cjs
@@ -9,35 +9,34 @@ module.exports = {
'ts-jest',
{
diagnostics: {
- ignoreCodes: [151002], // Ignore "Could not find a declaration file" warnings
- },
- },
- ],
+ ignoreCodes: [151002] // Ignore "Could not find a declaration file" warnings
+ }
+ }
+ ]
},
collectCoverageFrom: [
'src/**/*.{ts,tsx}',
'!src/**/*.d.ts',
'!src/**/__tests__/**',
- '!src/index.ts',
+ '!src/index.ts'
],
coverageThreshold: {
global: {
branches: 80,
functions: 80,
lines: 80,
- statements: 80,
- },
+ statements: 80
+ }
},
moduleNameMapper: {
'^@tetherto/wdk-react-native-secure-storage$': '/src/__mocks__/secureStorage.ts',
- '^react$': '/src/__mocks__/react.ts',
+ '^react$': '/src/__mocks__/react.ts'
},
setupFilesAfterEnv: ['/src/__tests__/setup.ts'],
// Ignore React Native modules if not available
modulePathIgnorePatterns: ['/node_modules/'],
// Allow tests to run without all dependencies
transformIgnorePatterns: [
- 'node_modules/(?!(react-native|@react-native|react-native-mmkv|react-native-bare-kit|@tetherto/pear-wrk-wdk)/)',
- ],
-};
-
+ 'node_modules/(?!(react-native|@react-native|react-native-mmkv|react-native-bare-kit|@tetherto/pear-wrk-wdk)/)'
+ ]
+}
diff --git a/package-lock.json b/package-lock.json
index b389cd2..fe38945 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,21 +1,21 @@
{
"name": "@tetherto/wdk-react-native-core",
- "version": "1.0.0",
+ "version": "1.0.0-beta.1",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "@tetherto/wdk-react-native-core",
- "version": "1.0.0",
+ "version": "1.0.0-beta.1",
"hasInstallScript": true,
"license": "Apache-2.0",
"dependencies": {
"@tanstack/react-query": "^5.0.0",
- "@tetherto/pear-wrk-wdk": "github:tetherto/pear-wrk-wdk#v2",
+ "@tetherto/pear-wrk-wdk": "github:nampc1/pear-wrk-wdk-v2-fork#2.0.0-beta.1",
"@tetherto/wdk-react-native-secure-storage": "github:tetherto/wdk-react-native-secure-storage",
"expo-crypto": "^15.0.8",
"immer": "^11.1.3",
- "react-native-bare-kit": "^0.11.0",
+ "react-native-bare-kit": "^0.12.0",
"react-native-mmkv": "^4.1.0",
"zod": "^3.22.0",
"zustand": "^5.0.9"
@@ -29,6 +29,7 @@
"jest": "^29.7.0",
"jest-environment-node": "^29.7.0",
"ts-jest": "^29.1.0",
+ "ts-standard": "12.0.2",
"typescript": "^5.3.3"
},
"peerDependencies": {
@@ -50,12 +51,6 @@
}
}
},
- "node_modules/@adraffy/ens-normalize": {
- "version": "1.10.1",
- "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.10.1.tgz",
- "integrity": "sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw==",
- "license": "MIT"
- },
"node_modules/@babel/code-frame": {
"version": "7.10.4",
"resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz",
@@ -66,29 +61,29 @@
}
},
"node_modules/@babel/compat-data": {
- "version": "7.28.6",
- "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.6.tgz",
- "integrity": "sha512-2lfu57JtzctfIrcGMz992hyLlByuzgIk58+hhGCxjKZ3rWI82NnVLjXcaTqkI2NvlcvOskZaiZ5kjUALo3Lpxg==",
+ "version": "7.29.0",
+ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.0.tgz",
+ "integrity": "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==",
"license": "MIT",
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/core": {
- "version": "7.28.6",
- "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.6.tgz",
- "integrity": "sha512-H3mcG6ZDLTlYfaSNi0iOKkigqMFvkTKlGUYlD8GW7nNOYRrevuA46iTypPyv+06V3fEmvvazfntkBU34L0azAw==",
+ "version": "7.29.0",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz",
+ "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==",
"license": "MIT",
"dependencies": {
- "@babel/code-frame": "^7.28.6",
- "@babel/generator": "^7.28.6",
+ "@babel/code-frame": "^7.29.0",
+ "@babel/generator": "^7.29.0",
"@babel/helper-compilation-targets": "^7.28.6",
"@babel/helper-module-transforms": "^7.28.6",
"@babel/helpers": "^7.28.6",
- "@babel/parser": "^7.28.6",
+ "@babel/parser": "^7.29.0",
"@babel/template": "^7.28.6",
- "@babel/traverse": "^7.28.6",
- "@babel/types": "^7.28.6",
+ "@babel/traverse": "^7.29.0",
+ "@babel/types": "^7.29.0",
"@jridgewell/remapping": "^2.3.5",
"convert-source-map": "^2.0.0",
"debug": "^4.1.0",
@@ -105,9 +100,9 @@
}
},
"node_modules/@babel/core/node_modules/@babel/code-frame": {
- "version": "7.28.6",
- "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.28.6.tgz",
- "integrity": "sha512-JYgintcMjRiCvS8mMECzaEn+m3PfoQiyqukOMCCVQtoJGYJw8j/8LBJEiqkHLkfwCcs74E3pbAUFNg7d9VNJ+Q==",
+ "version": "7.29.0",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz",
+ "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==",
"license": "MIT",
"dependencies": {
"@babel/helper-validator-identifier": "^7.28.5",
@@ -128,13 +123,13 @@
}
},
"node_modules/@babel/generator": {
- "version": "7.28.6",
- "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.6.tgz",
- "integrity": "sha512-lOoVRwADj8hjf7al89tvQ2a1lf53Z+7tiXMgpZJL3maQPDxh0DgLMN62B2MKUOFcoodBHLMbDM6WAbKgNy5Suw==",
+ "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==",
"license": "MIT",
"dependencies": {
- "@babel/parser": "^7.28.6",
- "@babel/types": "^7.28.6",
+ "@babel/parser": "^7.29.0",
+ "@babel/types": "^7.29.0",
"@jridgewell/gen-mapping": "^0.3.12",
"@jridgewell/trace-mapping": "^0.3.28",
"jsesc": "^3.0.2"
@@ -242,17 +237,17 @@
}
},
"node_modules/@babel/helper-define-polyfill-provider": {
- "version": "0.6.5",
- "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.5.tgz",
- "integrity": "sha512-uJnGFcPsWQK8fvjgGP5LZUZZsYGIoPeRjSF5PGwrelYgq7Q15/Ft9NGFp1zglwgIv//W0uG4BevRuSJRyylZPg==",
+ "version": "0.6.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.6.tgz",
+ "integrity": "sha512-mOAsxeeKkUKayvZR3HeTYD/fICpCPLJrU5ZjelT/PA6WHtNDBOE436YiaEUvHN454bRM3CebhDsIpieCc4texA==",
"license": "MIT",
"peer": true,
"dependencies": {
- "@babel/helper-compilation-targets": "^7.27.2",
- "@babel/helper-plugin-utils": "^7.27.1",
- "debug": "^4.4.1",
+ "@babel/helper-compilation-targets": "^7.28.6",
+ "@babel/helper-plugin-utils": "^7.28.6",
+ "debug": "^4.4.3",
"lodash.debounce": "^4.0.8",
- "resolve": "^1.22.10"
+ "resolve": "^1.22.11"
},
"peerDependencies": {
"@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
@@ -525,12 +520,12 @@
}
},
"node_modules/@babel/parser": {
- "version": "7.28.6",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.6.tgz",
- "integrity": "sha512-TeR9zWR18BvbfPmGbLampPMW+uW1NZnJlRuuHso8i87QZNq2JRF9i6RgxRqtEq+wQGsS19NNTWr2duhnE49mfQ==",
+ "version": "7.29.0",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.0.tgz",
+ "integrity": "sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==",
"license": "MIT",
"dependencies": {
- "@babel/types": "^7.28.6"
+ "@babel/types": "^7.29.0"
},
"bin": {
"parser": "bin/babel-parser.js"
@@ -540,9 +535,9 @@
}
},
"node_modules/@babel/plugin-proposal-decorators": {
- "version": "7.28.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.28.6.tgz",
- "integrity": "sha512-RVdFPPyY9fCRAX68haPmOk2iyKW8PKJFthmm8NeSI3paNxKWGZIn99+VbIf0FrtCpFnPgnpF/L48tadi617ULg==",
+ "version": "7.29.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.29.0.tgz",
+ "integrity": "sha512-CVBVv3VY/XRMxRYq5dwr2DS7/MvqPm23cOCjbwNnVrfOqcWlnefua1uUs0sjdKOGjvPUG633o07uWzJq4oI6dA==",
"license": "MIT",
"peer": true,
"dependencies": {
@@ -873,15 +868,15 @@
}
},
"node_modules/@babel/plugin-transform-async-generator-functions": {
- "version": "7.28.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.28.6.tgz",
- "integrity": "sha512-9knsChgsMzBV5Yh3kkhrZNxH3oCYAfMBkNNaVN4cP2RVlFPe8wYdwwcnOsAbkdDoV9UjFtOXWrWB52M8W4jNeA==",
+ "version": "7.29.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.29.0.tgz",
+ "integrity": "sha512-va0VdWro4zlBr2JsXC+ofCPB2iG12wPtVGTWFx2WLDOM3nYQZZIGP82qku2eW/JR83sD+k2k+CsNtyEbUqhU6w==",
"license": "MIT",
"peer": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.28.6",
"@babel/helper-remap-async-to-generator": "^7.27.1",
- "@babel/traverse": "^7.28.6"
+ "@babel/traverse": "^7.29.0"
},
"engines": {
"node": ">=6.9.0"
@@ -1131,14 +1126,14 @@
}
},
"node_modules/@babel/plugin-transform-named-capturing-groups-regex": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.27.1.tgz",
- "integrity": "sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng==",
+ "version": "7.29.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.29.0.tgz",
+ "integrity": "sha512-1CZQA5KNAD6ZYQLPw7oi5ewtDNxH/2vuCh+6SmvgDfhumForvs8a1o9n0UrEoBD8HU4djO2yWngTQlXl1NDVEQ==",
"license": "MIT",
"peer": true,
"dependencies": {
- "@babel/helper-create-regexp-features-plugin": "^7.27.1",
- "@babel/helper-plugin-utils": "^7.27.1"
+ "@babel/helper-create-regexp-features-plugin": "^7.28.5",
+ "@babel/helper-plugin-utils": "^7.28.6"
},
"engines": {
"node": ">=6.9.0"
@@ -1385,9 +1380,9 @@
}
},
"node_modules/@babel/plugin-transform-regenerator": {
- "version": "7.28.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.28.6.tgz",
- "integrity": "sha512-eZhoEZHYQLL5uc1gS5e9/oTknS0sSSAtd5TkKMUp3J+S/CaUjagc0kOUPsEbDmMeva0nC3WWl4SxVY6+OBuxfw==",
+ "version": "7.29.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.29.0.tgz",
+ "integrity": "sha512-FijqlqMA7DmRdg/aINBSs04y8XNTYw/lr1gJ2WsmBnnaNw1iS43EPkJW+zK7z65auG3AWRFXWj+NcTQwYptUog==",
"license": "MIT",
"peer": true,
"dependencies": {
@@ -1401,14 +1396,14 @@
}
},
"node_modules/@babel/plugin-transform-runtime": {
- "version": "7.28.5",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.28.5.tgz",
- "integrity": "sha512-20NUVgOrinudkIBzQ2bNxP08YpKprUkRTiRSd2/Z5GOdPImJGkoN4Z7IQe1T5AdyKI1i5L6RBmluqdSzvaq9/w==",
+ "version": "7.29.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.29.0.tgz",
+ "integrity": "sha512-jlaRT5dJtMaMCV6fAuLbsQMSwz/QkvaHOHOSXRitGGwSpR1blCY4KUKoyP2tYO8vJcqYe8cEj96cqSztv3uF9w==",
"license": "MIT",
"peer": true,
"dependencies": {
- "@babel/helper-module-imports": "^7.27.1",
- "@babel/helper-plugin-utils": "^7.27.1",
+ "@babel/helper-module-imports": "^7.28.6",
+ "@babel/helper-plugin-utils": "^7.28.6",
"babel-plugin-polyfill-corejs2": "^0.4.14",
"babel-plugin-polyfill-corejs3": "^0.13.0",
"babel-plugin-polyfill-regenerator": "^0.6.5",
@@ -1582,9 +1577,9 @@
}
},
"node_modules/@babel/template/node_modules/@babel/code-frame": {
- "version": "7.28.6",
- "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.28.6.tgz",
- "integrity": "sha512-JYgintcMjRiCvS8mMECzaEn+m3PfoQiyqukOMCCVQtoJGYJw8j/8LBJEiqkHLkfwCcs74E3pbAUFNg7d9VNJ+Q==",
+ "version": "7.29.0",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz",
+ "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==",
"license": "MIT",
"dependencies": {
"@babel/helper-validator-identifier": "^7.28.5",
@@ -1596,17 +1591,17 @@
}
},
"node_modules/@babel/traverse": {
- "version": "7.28.6",
- "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.6.tgz",
- "integrity": "sha512-fgWX62k02qtjqdSNTAGxmKYY/7FSL9WAS1o2Hu5+I5m9T0yxZzr4cnrfXQ/MX0rIifthCSs6FKTlzYbJcPtMNg==",
+ "version": "7.29.0",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz",
+ "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==",
"license": "MIT",
"dependencies": {
- "@babel/code-frame": "^7.28.6",
- "@babel/generator": "^7.28.6",
+ "@babel/code-frame": "^7.29.0",
+ "@babel/generator": "^7.29.0",
"@babel/helper-globals": "^7.28.0",
- "@babel/parser": "^7.28.6",
+ "@babel/parser": "^7.29.0",
"@babel/template": "^7.28.6",
- "@babel/types": "^7.28.6",
+ "@babel/types": "^7.29.0",
"debug": "^4.3.1"
},
"engines": {
@@ -1615,17 +1610,17 @@
},
"node_modules/@babel/traverse--for-generate-function-map": {
"name": "@babel/traverse",
- "version": "7.28.6",
- "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.6.tgz",
- "integrity": "sha512-fgWX62k02qtjqdSNTAGxmKYY/7FSL9WAS1o2Hu5+I5m9T0yxZzr4cnrfXQ/MX0rIifthCSs6FKTlzYbJcPtMNg==",
+ "version": "7.29.0",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz",
+ "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==",
"license": "MIT",
"dependencies": {
- "@babel/code-frame": "^7.28.6",
- "@babel/generator": "^7.28.6",
+ "@babel/code-frame": "^7.29.0",
+ "@babel/generator": "^7.29.0",
"@babel/helper-globals": "^7.28.0",
- "@babel/parser": "^7.28.6",
+ "@babel/parser": "^7.29.0",
"@babel/template": "^7.28.6",
- "@babel/types": "^7.28.6",
+ "@babel/types": "^7.29.0",
"debug": "^4.3.1"
},
"engines": {
@@ -1633,9 +1628,9 @@
}
},
"node_modules/@babel/traverse--for-generate-function-map/node_modules/@babel/code-frame": {
- "version": "7.28.6",
- "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.28.6.tgz",
- "integrity": "sha512-JYgintcMjRiCvS8mMECzaEn+m3PfoQiyqukOMCCVQtoJGYJw8j/8LBJEiqkHLkfwCcs74E3pbAUFNg7d9VNJ+Q==",
+ "version": "7.29.0",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz",
+ "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==",
"license": "MIT",
"dependencies": {
"@babel/helper-validator-identifier": "^7.28.5",
@@ -1647,9 +1642,9 @@
}
},
"node_modules/@babel/traverse/node_modules/@babel/code-frame": {
- "version": "7.28.6",
- "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.28.6.tgz",
- "integrity": "sha512-JYgintcMjRiCvS8mMECzaEn+m3PfoQiyqukOMCCVQtoJGYJw8j/8LBJEiqkHLkfwCcs74E3pbAUFNg7d9VNJ+Q==",
+ "version": "7.29.0",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz",
+ "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==",
"license": "MIT",
"dependencies": {
"@babel/helper-validator-identifier": "^7.28.5",
@@ -1661,9 +1656,9 @@
}
},
"node_modules/@babel/types": {
- "version": "7.28.6",
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.6.tgz",
- "integrity": "sha512-0ZrskXVEHSWIqZM/sQZ4EV3jZJXRkio/WCxaqKZP1g//CEWEPSfeZFcms4XeKBCHU0ZKnIkdJeU/kF+eRp5lBg==",
+ "version": "7.29.0",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz",
+ "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==",
"license": "MIT",
"dependencies": {
"@babel/helper-string-parser": "^7.27.1",
@@ -1680,96 +1675,97 @@
"dev": true,
"license": "MIT"
},
- "node_modules/@bufbuild/protobuf": {
- "version": "2.10.2",
- "resolved": "https://registry.npmjs.org/@bufbuild/protobuf/-/protobuf-2.10.2.tgz",
- "integrity": "sha512-uFsRXwIGyu+r6AMdz+XijIIZJYpoWeYzILt5yZ2d3mCjQrWUTVpVD9WL/jZAbvp+Ed04rOhrsk7FiTcEDseB5A==",
- "license": "(Apache-2.0 AND BSD-3-Clause)"
- },
- "node_modules/@buildonspark/bare": {
- "version": "0.0.30",
- "resolved": "https://registry.npmjs.org/@buildonspark/bare/-/bare-0.0.30.tgz",
- "integrity": "sha512-aJYHQvnm9V34r4s0vLFJQGLI0llrKUTwMtGIOSHe7W7bqMXRx0Ejo9J/sm4W0E1RgG1cHxdRr9COeuU4+Os8UA==",
- "license": "Apache-2.0",
+ "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": {
- "@buildonspark/spark-frost-bare-addon": "0.0.5",
- "@buildonspark/spark-sdk": "0.5.1",
- "bare-node-runtime": "^1.1.4"
+ "eslint-visitor-keys": "^3.4.3"
},
"engines": {
- "node": ">=18.0.0"
+ "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/@buildonspark/spark-frost-bare-addon": {
- "version": "0.0.5",
- "resolved": "https://registry.npmjs.org/@buildonspark/spark-frost-bare-addon/-/spark-frost-bare-addon-0.0.5.tgz",
- "integrity": "sha512-5/VlLgryYFKvhHXVJGPq1dL0+k2UMMRXs3noXEMHVRwmquKwLiYac0FHTnZzvWwxBolW6lK4+E6D9ghCTOxL+w==",
- "license": "Apache-2.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/@buildonspark/spark-sdk": {
- "version": "0.5.1",
- "resolved": "https://registry.npmjs.org/@buildonspark/spark-sdk/-/spark-sdk-0.5.1.tgz",
- "integrity": "sha512-Va8N/2j1hyRa4M8M2ZRtsyZpCXInaWkHmBXCr1fi77PkYDvHWm+H8AShvNLx5HePDurfDqtQYmyX5/gVgPqhlQ==",
- "license": "Apache-2.0",
+ "node_modules/@eslint/eslintrc": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz",
+ "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "@bufbuild/protobuf": "^2.2.5",
- "@lightsparkdev/core": "^1.4.4",
- "@noble/curves": "^1.8.0",
- "@noble/hashes": "^1.7.0",
- "@opentelemetry/api": "^1.9.0",
- "@opentelemetry/context-async-hooks": "^2.0.0",
- "@opentelemetry/core": "^2.0.0",
- "@opentelemetry/instrumentation": "^0.203.0",
- "@opentelemetry/instrumentation-undici": "^0.14.0",
- "@opentelemetry/sdk-trace-base": "^2.0.0",
- "@opentelemetry/sdk-trace-node": "^2.0.1",
- "@opentelemetry/sdk-trace-web": "^2.0.1",
- "@scure/base": "^1.2.4",
- "@scure/bip32": "^1.6.2",
- "@scure/bip39": "^1.5.4",
- "@scure/btc-signer": "^1.5.0",
- "abort-controller-x": "^0.4.3",
- "abortcontroller-polyfill": "^1.7.8",
- "async-mutex": "^0.5.0",
- "bare-crypto": "^1.9.2",
- "bare-fetch": "^2.4.1",
- "buffer": "^6.0.3",
- "eventemitter3": "^5.0.1",
- "js-base64": "^3.7.7",
- "light-bolt11-decoder": "^3.2.0",
- "nice-grpc": "^2.1.10",
- "nice-grpc-client-middleware-retry": "^3.1.10",
- "nice-grpc-common": "^2.0.2",
- "nice-grpc-opentelemetry": "^0.1.18",
- "nice-grpc-web": "^3.3.7",
- "ts-proto": "2.8.3",
- "ua-parser-js": "^2.0.6",
- "uuidv7": "^1.0.2"
+ "ajv": "^6.12.4",
+ "debug": "^4.3.2",
+ "espree": "^9.6.0",
+ "globals": "^13.19.0",
+ "ignore": "^5.2.0",
+ "import-fresh": "^3.2.1",
+ "js-yaml": "^4.1.0",
+ "minimatch": "^3.1.2",
+ "strip-json-comments": "^3.1.1"
},
"engines": {
- "node": ">=18.0.0"
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
},
- "peerDependencies": {
- "react": ">=18.2.0",
- "react-native": ">=0.71.0",
- "react-native-get-random-values": ">=1.11.0"
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "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": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/@eslint/eslintrc/node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
},
- "peerDependenciesMeta": {
- "react": {
- "optional": true
- },
- "react-native": {
- "optional": true
- },
- "react-native-get-random-values": {
- "optional": true
- }
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/@eslint/js": {
+ "version": "8.57.1",
+ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz",
+ "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
}
},
"node_modules/@expo/cli": {
- "version": "54.0.21",
- "resolved": "https://registry.npmjs.org/@expo/cli/-/cli-54.0.21.tgz",
- "integrity": "sha512-L/FdpyZDsg/Nq6xW6kfiyF9DUzKfLZCKFXEVZcDqCNar6bXxQVotQyvgexRvtUF5nLinuT/UafLOdC3FUALUmA==",
+ "version": "54.0.23",
+ "resolved": "https://registry.npmjs.org/@expo/cli/-/cli-54.0.23.tgz",
+ "integrity": "sha512-km0h72SFfQCmVycH/JtPFTVy69w6Lx1cHNDmfLfQqgKFYeeHTjx7LVDP4POHCtNxFP2UeRazrygJhlh4zz498g==",
"license": "MIT",
"peer": true,
"dependencies": {
@@ -1782,9 +1778,9 @@
"@expo/image-utils": "^0.8.8",
"@expo/json-file": "^10.0.8",
"@expo/metro": "~54.2.0",
- "@expo/metro-config": "~54.0.13",
+ "@expo/metro-config": "~54.0.14",
"@expo/osascript": "^2.3.8",
- "@expo/package-manager": "^1.9.9",
+ "@expo/package-manager": "^1.9.10",
"@expo/plist": "^0.4.8",
"@expo/prebuild-config": "^54.0.8",
"@expo/schema-utils": "^0.1.8",
@@ -2050,9 +2046,9 @@
}
},
"node_modules/@expo/metro-config": {
- "version": "54.0.13",
- "resolved": "https://registry.npmjs.org/@expo/metro-config/-/metro-config-54.0.13.tgz",
- "integrity": "sha512-RRufMCgLR2Za1WGsh02OatIJo5qZFt31yCnIOSfoubNc3Qqe92Z41pVsbrFnmw5CIaisv1NgdBy05DHe7pEyuw==",
+ "version": "54.0.14",
+ "resolved": "https://registry.npmjs.org/@expo/metro-config/-/metro-config-54.0.14.tgz",
+ "integrity": "sha512-hxpLyDfOR4L23tJ9W1IbJJsG7k4lv2sotohBm/kTYyiG+pe1SYCAWsRmgk+H42o/wWf/HQjE5k45S5TomGLxNA==",
"license": "MIT",
"peer": true,
"dependencies": {
@@ -2088,9 +2084,9 @@
}
},
"node_modules/@expo/metro-config/node_modules/@babel/code-frame": {
- "version": "7.28.6",
- "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.28.6.tgz",
- "integrity": "sha512-JYgintcMjRiCvS8mMECzaEn+m3PfoQiyqukOMCCVQtoJGYJw8j/8LBJEiqkHLkfwCcs74E3pbAUFNg7d9VNJ+Q==",
+ "version": "7.29.0",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz",
+ "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==",
"license": "MIT",
"peer": true,
"dependencies": {
@@ -2117,9 +2113,9 @@
}
},
"node_modules/@expo/package-manager": {
- "version": "1.9.9",
- "resolved": "https://registry.npmjs.org/@expo/package-manager/-/package-manager-1.9.9.tgz",
- "integrity": "sha512-Nv5THOwXzPprMJwbnXU01iXSrCp3vJqly9M4EJ2GkKko9Ifer2ucpg7x6OUsE09/lw+npaoUnHMXwkw7gcKxlg==",
+ "version": "1.9.10",
+ "resolved": "https://registry.npmjs.org/@expo/package-manager/-/package-manager-1.9.10.tgz",
+ "integrity": "sha512-axJm+NOj3jVxep49va/+L3KkF3YW/dkV+RwzqUJedZrv4LeTqOG4rhrCaCPXHTvLqCTDKu6j0Xyd28N7mnxsGA==",
"license": "MIT",
"peer": true,
"dependencies": {
@@ -2219,146 +2215,97 @@
"peer": true
},
"node_modules/@expo/xcpretty": {
- "version": "4.3.2",
- "resolved": "https://registry.npmjs.org/@expo/xcpretty/-/xcpretty-4.3.2.tgz",
- "integrity": "sha512-ReZxZ8pdnoI3tP/dNnJdnmAk7uLT4FjsKDGW7YeDdvdOMz2XCQSmSCM9IWlrXuWtMF9zeSB6WJtEhCQ41gQOfw==",
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/@expo/xcpretty/-/xcpretty-4.4.0.tgz",
+ "integrity": "sha512-o2qDlTqJ606h4xR36H2zWTywmZ3v3842K6TU8Ik2n1mfW0S580VHlt3eItVYdLYz+klaPp7CXqanja8eASZjRw==",
"license": "BSD-3-Clause",
"peer": true,
"dependencies": {
- "@babel/code-frame": "7.10.4",
+ "@babel/code-frame": "^7.20.0",
"chalk": "^4.1.0",
- "find-up": "^5.0.0",
"js-yaml": "^4.1.0"
},
"bin": {
"excpretty": "build/cli.js"
}
},
- "node_modules/@gelatonetwork/relay-sdk": {
- "version": "5.6.1",
- "resolved": "https://registry.npmjs.org/@gelatonetwork/relay-sdk/-/relay-sdk-5.6.1.tgz",
- "integrity": "sha512-Ho6XSyXiM5N4Em5kMr/rEjP7xVZ0gLDB3ml3tg/et6cDxb3ZMfZc7zVl0N4rF1PKgoZInwv5llYaoqrKMVcFyA==",
- "license": "ISC",
- "dependencies": {
- "axios": "1.13.2",
- "ethers": "6.13.4",
- "isomorphic-ws": "^5.0.0",
- "ws": "^8.18.0"
- },
- "engines": {
- "node": ">=14.0.0"
- }
- },
- "node_modules/@gelatonetwork/relay-sdk/node_modules/@noble/curves": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.2.0.tgz",
- "integrity": "sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==",
+ "node_modules/@expo/xcpretty/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==",
"license": "MIT",
+ "peer": true,
"dependencies": {
- "@noble/hashes": "1.3.2"
+ "@babel/helper-validator-identifier": "^7.28.5",
+ "js-tokens": "^4.0.0",
+ "picocolors": "^1.1.1"
},
- "funding": {
- "url": "https://paulmillr.com/funding/"
- }
- },
- "node_modules/@gelatonetwork/relay-sdk/node_modules/@noble/hashes": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz",
- "integrity": "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==",
- "license": "MIT",
"engines": {
- "node": ">= 16"
- },
- "funding": {
- "url": "https://paulmillr.com/funding/"
+ "node": ">=6.9.0"
}
},
- "node_modules/@gelatonetwork/relay-sdk/node_modules/ethers": {
- "version": "6.13.4",
- "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.13.4.tgz",
- "integrity": "sha512-21YtnZVg4/zKkCQPjrDj38B1r4nQvTZLopUGMLQ1ePU2zV/joCfDC3t3iKQjWRzjjjbzR+mdAIoikeBRNkdllA==",
- "funding": [
- {
- "type": "individual",
- "url": "https://github.com/sponsors/ethers-io/"
- },
- {
- "type": "individual",
- "url": "https://www.buymeacoffee.com/ricmoo"
- }
- ],
- "license": "MIT",
+ "node_modules/@humanwhocodes/config-array": {
+ "version": "0.13.0",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz",
+ "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==",
+ "deprecated": "Use @eslint/config-array instead",
+ "dev": true,
+ "license": "Apache-2.0",
"dependencies": {
- "@adraffy/ens-normalize": "1.10.1",
- "@noble/curves": "1.2.0",
- "@noble/hashes": "1.3.2",
- "@types/node": "22.7.5",
- "aes-js": "4.0.0-beta.5",
- "tslib": "2.7.0",
- "ws": "8.17.1"
+ "@humanwhocodes/object-schema": "^2.0.3",
+ "debug": "^4.3.1",
+ "minimatch": "^3.0.5"
},
"engines": {
- "node": ">=14.0.0"
+ "node": ">=10.10.0"
}
},
- "node_modules/@gelatonetwork/relay-sdk/node_modules/ethers/node_modules/ws": {
- "version": "8.17.1",
- "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz",
- "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==",
+ "node_modules/@humanwhocodes/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",
- "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
- }
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
}
},
- "node_modules/@gelatonetwork/relay-sdk/node_modules/tslib": {
- "version": "2.7.0",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz",
- "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==",
- "license": "0BSD"
- },
- "node_modules/@grpc/grpc-js": {
- "version": "1.14.3",
- "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.14.3.tgz",
- "integrity": "sha512-Iq8QQQ/7X3Sac15oB6p0FmUg/klxQvXLeileoqrTRGJYLV+/9tubbr9ipz0GKHjmXVsgFPo/+W+2cA8eNcR+XA==",
- "license": "Apache-2.0",
+ "node_modules/@humanwhocodes/config-array/node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "license": "ISC",
"dependencies": {
- "@grpc/proto-loader": "^0.8.0",
- "@js-sdsl/ordered-map": "^4.4.2"
+ "brace-expansion": "^1.1.7"
},
"engines": {
- "node": ">=12.10.0"
+ "node": "*"
}
},
- "node_modules/@grpc/proto-loader": {
- "version": "0.8.0",
- "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.8.0.tgz",
- "integrity": "sha512-rc1hOQtjIWGxcxpb9aHAfLpIctjEnsDehj0DAiVfBlmT84uvR0uUtN2hEi/ecvWVjXUGf5qPF4qEgiLOx1YIMQ==",
+ "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",
- "dependencies": {
- "lodash.camelcase": "^4.3.0",
- "long": "^5.0.0",
- "protobufjs": "^7.5.3",
- "yargs": "^17.7.2"
- },
- "bin": {
- "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js"
- },
"engines": {
- "node": ">=6"
+ "node": ">=12.22"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/nzakas"
}
},
+ "node_modules/@humanwhocodes/object-schema": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz",
+ "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==",
+ "deprecated": "Use @eslint/object-schema instead",
+ "dev": true,
+ "license": "BSD-3-Clause"
+ },
"node_modules/@isaacs/balanced-match": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz",
@@ -2370,9 +2317,9 @@
}
},
"node_modules/@isaacs/brace-expansion": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/@isaacs/brace-expansion/-/brace-expansion-5.0.0.tgz",
- "integrity": "sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==",
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/@isaacs/brace-expansion/-/brace-expansion-5.0.1.tgz",
+ "integrity": "sha512-WMz71T1JS624nWj2n2fnYAuPovhv7EUhk69R6i9dsVyzxt5eM3bjwvgk9L+APE1TRscGysAVMANkB0jh0LQZrQ==",
"license": "MIT",
"peer": true,
"dependencies": {
@@ -2429,19 +2376,6 @@
"sprintf-js": "~1.0.2"
}
},
- "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==",
- "license": "MIT",
- "dependencies": {
- "locate-path": "^5.0.0",
- "path-exists": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
"node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": {
"version": "3.14.2",
"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz",
@@ -2455,45 +2389,6 @@
"js-yaml": "bin/js-yaml.js"
}
},
- "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",
- "dependencies": {
- "p-locate": "^4.1.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "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",
- "dependencies": {
- "p-try": "^2.0.0"
- },
- "engines": {
- "node": ">=6"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "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",
- "dependencies": {
- "p-limit": "^2.2.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
"node_modules/@istanbuljs/schema": {
"version": "0.1.3",
"resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz",
@@ -2715,7 +2610,7 @@
"version": "7.2.3",
"resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
"integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
- "deprecated": "Glob versions prior to v9 are no longer supported",
+ "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": {
@@ -2903,313 +2798,56 @@
"@jridgewell/sourcemap-codec": "^1.4.14"
}
},
- "node_modules/@js-sdsl/ordered-map": {
- "version": "4.4.2",
- "resolved": "https://registry.npmjs.org/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz",
- "integrity": "sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==",
+ "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": {
- "type": "opencollective",
- "url": "https://opencollective.com/js-sdsl"
+ "url": "https://paulmillr.com/funding/"
}
},
- "node_modules/@lightsparkdev/core": {
- "version": "1.4.8",
- "resolved": "https://registry.npmjs.org/@lightsparkdev/core/-/core-1.4.8.tgz",
- "integrity": "sha512-ZnDJPQS6nrjqaDb++PAfI3KV/cWgaca76zTrQNPZOKF8Uhya8v6O0fIWmjlZR8GmBXx825PI4mwbcycZdfq3bA==",
- "license": "Apache-2.0",
+ "node_modules/@nodelib/fs.scandir": {
+ "version": "2.1.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
+ "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "dayjs": "^1.11.7",
- "graphql": "^16.6.0",
- "graphql-ws": "^5.11.3",
- "secp256k1": "^5.0.1",
- "ws": "^8.12.1",
- "zen-observable-ts": "^1.1.0"
+ "@nodelib/fs.stat": "2.0.5",
+ "run-parallel": "^1.1.9"
},
"engines": {
- "node": ">=18"
+ "node": ">= 8"
}
},
- "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==",
+ "node_modules/@nodelib/fs.stat": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
+ "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
+ "dev": true,
"license": "MIT",
"engines": {
- "node": "^14.21.3 || >=16"
- },
- "funding": {
- "url": "https://paulmillr.com/funding/"
+ "node": ">= 8"
}
},
- "node_modules/@noble/curves": {
- "version": "1.9.2",
- "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.2.tgz",
- "integrity": "sha512-HxngEd2XUcg9xi20JkwlLCtYwfoFw4JGkuZpT+WlsPD4gB/cxkvTD8fSsoAnphGZhFdZYKeQIPCuFlWPm1uE0g==",
+ "node_modules/@nodelib/fs.walk": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
+ "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
+ "dev": true,
"license": "MIT",
"dependencies": {
- "@noble/hashes": "1.8.0"
+ "@nodelib/fs.scandir": "2.1.5",
+ "fastq": "^1.6.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/@noble/secp256k1": {
- "version": "2.2.3",
- "resolved": "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-2.2.3.tgz",
- "integrity": "sha512-l7r5oEQym9Us7EAigzg30/PQAvynhMt2uoYtT3t26eGDVm9Yii5mZ5jWSWmZ/oSIR2Et0xfc6DXrG0bZ787V3w==",
- "license": "MIT",
- "funding": {
- "url": "https://paulmillr.com/funding/"
- }
- },
- "node_modules/@opentelemetry/api": {
- "version": "1.9.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz",
- "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==",
- "license": "Apache-2.0",
- "engines": {
- "node": ">=8.0.0"
- }
- },
- "node_modules/@opentelemetry/api-logs": {
- "version": "0.203.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.203.0.tgz",
- "integrity": "sha512-9B9RU0H7Ya1Dx/Rkyc4stuBZSGVQF27WigitInx2QQoj6KUpEFYPKoWjdFTunJYxmXmh17HeBvbMa1EhGyPmqQ==",
- "license": "Apache-2.0",
- "dependencies": {
- "@opentelemetry/api": "^1.3.0"
- },
- "engines": {
- "node": ">=8.0.0"
- }
- },
- "node_modules/@opentelemetry/context-async-hooks": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-2.3.0.tgz",
- "integrity": "sha512-hGcsT0qDP7Il1L+qT3JFpiGl1dCjF794Bb4yCRCYdr7XC0NwHtOF3ngF86Gk6TUnsakbyQsDQ0E/S4CU0F4d4g==",
- "license": "Apache-2.0",
- "engines": {
- "node": "^18.19.0 || >=20.6.0"
- },
- "peerDependencies": {
- "@opentelemetry/api": ">=1.0.0 <1.10.0"
- }
- },
- "node_modules/@opentelemetry/core": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.3.0.tgz",
- "integrity": "sha512-PcmxJQzs31cfD0R2dE91YGFcLxOSN4Bxz7gez5UwSUjCai8BwH/GI5HchfVshHkWdTkUs0qcaPJgVHKXUp7I3A==",
- "license": "Apache-2.0",
- "dependencies": {
- "@opentelemetry/semantic-conventions": "^1.29.0"
- },
- "engines": {
- "node": "^18.19.0 || >=20.6.0"
- },
- "peerDependencies": {
- "@opentelemetry/api": ">=1.0.0 <1.10.0"
- }
- },
- "node_modules/@opentelemetry/instrumentation": {
- "version": "0.203.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.203.0.tgz",
- "integrity": "sha512-ke1qyM+3AK2zPuBPb6Hk/GCsc5ewbLvPNkEuELx/JmANeEp6ZjnZ+wypPAJSucTw0wvCGrUaibDSdcrGFoWxKQ==",
- "license": "Apache-2.0",
- "dependencies": {
- "@opentelemetry/api-logs": "0.203.0",
- "import-in-the-middle": "^1.8.1",
- "require-in-the-middle": "^7.1.1"
- },
- "engines": {
- "node": "^18.19.0 || >=20.6.0"
- },
- "peerDependencies": {
- "@opentelemetry/api": "^1.3.0"
- }
- },
- "node_modules/@opentelemetry/instrumentation-undici": {
- "version": "0.14.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-undici/-/instrumentation-undici-0.14.0.tgz",
- "integrity": "sha512-2HN+7ztxAReXuxzrtA3WboAKlfP5OsPA57KQn2AdYZbJ3zeRPcLXyW4uO/jpLE6PLm0QRtmeGCmfYpqRlwgSwg==",
- "license": "Apache-2.0",
- "dependencies": {
- "@opentelemetry/core": "^2.0.0",
- "@opentelemetry/instrumentation": "^0.203.0"
- },
- "engines": {
- "node": "^18.19.0 || >=20.6.0"
- },
- "peerDependencies": {
- "@opentelemetry/api": "^1.7.0"
- }
- },
- "node_modules/@opentelemetry/resources": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.3.0.tgz",
- "integrity": "sha512-shlr2l5g+87J8wqYlsLyaUsgKVRO7RtX70Ckd5CtDOWtImZgaUDmf4Z2ozuSKQLM2wPDR0TE/3bPVBNJtRm/cQ==",
- "license": "Apache-2.0",
- "dependencies": {
- "@opentelemetry/core": "2.3.0",
- "@opentelemetry/semantic-conventions": "^1.29.0"
- },
- "engines": {
- "node": "^18.19.0 || >=20.6.0"
- },
- "peerDependencies": {
- "@opentelemetry/api": ">=1.3.0 <1.10.0"
- }
- },
- "node_modules/@opentelemetry/sdk-trace-base": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-2.3.0.tgz",
- "integrity": "sha512-B0TQ2e9h0ETjpI+eGmCz8Ojb+lnYms0SE3jFwEKrN/PK4aSVHU28AAmnOoBmfub+I3jfgPwvDJgomBA5a7QehQ==",
- "license": "Apache-2.0",
- "dependencies": {
- "@opentelemetry/core": "2.3.0",
- "@opentelemetry/resources": "2.3.0",
- "@opentelemetry/semantic-conventions": "^1.29.0"
- },
- "engines": {
- "node": "^18.19.0 || >=20.6.0"
- },
- "peerDependencies": {
- "@opentelemetry/api": ">=1.3.0 <1.10.0"
- }
- },
- "node_modules/@opentelemetry/sdk-trace-node": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-node/-/sdk-trace-node-2.3.0.tgz",
- "integrity": "sha512-oGsG3vIiC8zYjOWE4CgtS6d2gQhp4pT04AI9UL1wtJOxTSNVZiiIPgHnOp/qKJSwkD4YJHSohi6inSilPmGM2Q==",
- "license": "Apache-2.0",
- "dependencies": {
- "@opentelemetry/context-async-hooks": "2.3.0",
- "@opentelemetry/core": "2.3.0",
- "@opentelemetry/sdk-trace-base": "2.3.0"
- },
- "engines": {
- "node": "^18.19.0 || >=20.6.0"
- },
- "peerDependencies": {
- "@opentelemetry/api": ">=1.0.0 <1.10.0"
- }
- },
- "node_modules/@opentelemetry/sdk-trace-web": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-web/-/sdk-trace-web-2.3.0.tgz",
- "integrity": "sha512-HwsfSVbG1JnW/KfxCQ0G6LtzWiSeEUyyj3s/HIxFenaLRsCQMB18N9y64Kkx6t/aLRCPkSZVqITxWbbqqvl5Xw==",
- "license": "Apache-2.0",
- "dependencies": {
- "@opentelemetry/core": "2.3.0",
- "@opentelemetry/sdk-trace-base": "2.3.0"
- },
- "engines": {
- "node": "^18.19.0 || >=20.6.0"
- },
- "peerDependencies": {
- "@opentelemetry/api": ">=1.0.0 <1.10.0"
- }
- },
- "node_modules/@opentelemetry/semantic-conventions": {
- "version": "1.38.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.38.0.tgz",
- "integrity": "sha512-kocjix+/sSggfJhwXqClZ3i9Y/MI0fp7b+g7kCRm6psy2dsf8uApTRclwG18h8Avm7C9+fnt+O36PspJ/OzoWg==",
- "license": "Apache-2.0",
- "engines": {
- "node": ">=14"
- }
- },
- "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/@protobufjs/aspromise": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz",
- "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==",
- "license": "BSD-3-Clause"
- },
- "node_modules/@protobufjs/base64": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz",
- "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==",
- "license": "BSD-3-Clause"
- },
- "node_modules/@protobufjs/codegen": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz",
- "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==",
- "license": "BSD-3-Clause"
- },
- "node_modules/@protobufjs/eventemitter": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz",
- "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==",
- "license": "BSD-3-Clause"
- },
- "node_modules/@protobufjs/fetch": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz",
- "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==",
- "license": "BSD-3-Clause",
- "dependencies": {
- "@protobufjs/aspromise": "^1.1.1",
- "@protobufjs/inquire": "^1.1.0"
+ "node": ">= 8"
}
},
- "node_modules/@protobufjs/float": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz",
- "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==",
- "license": "BSD-3-Clause"
- },
- "node_modules/@protobufjs/inquire": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz",
- "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==",
- "license": "BSD-3-Clause"
- },
- "node_modules/@protobufjs/path": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz",
- "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==",
- "license": "BSD-3-Clause"
- },
- "node_modules/@protobufjs/pool": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz",
- "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==",
- "license": "BSD-3-Clause"
- },
- "node_modules/@protobufjs/utf8": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz",
- "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==",
- "license": "BSD-3-Clause"
- },
"node_modules/@react-native/assets-registry": {
"version": "0.83.1",
"resolved": "https://registry.npmjs.org/@react-native/assets-registry/-/assets-registry-0.83.1.tgz",
@@ -3330,7 +2968,7 @@
"version": "7.2.3",
"resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
"integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
- "deprecated": "Glob versions prior to v9 are no longer supported",
+ "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",
"peer": true,
"dependencies": {
@@ -3548,30 +3186,13 @@
}
}
},
- "node_modules/@safe-global/safe-deployments": {
- "version": "1.37.50",
- "resolved": "https://registry.npmjs.org/@safe-global/safe-deployments/-/safe-deployments-1.37.50.tgz",
- "integrity": "sha512-WUgH0YeVmHm0Uv5dQ8QW4nEAMs8Pm6DhObglBSUlW8ur+RGDd4/xmhFJKm8up/qbDVB/n5Skf+5d+eWZIPRClg==",
- "license": "MIT",
- "dependencies": {
- "semver": "^7.6.2"
- }
- },
- "node_modules/@safe-global/safe-modules-deployments": {
- "version": "2.2.21",
- "resolved": "https://registry.npmjs.org/@safe-global/safe-modules-deployments/-/safe-modules-deployments-2.2.21.tgz",
- "integrity": "sha512-fveOlRv0ccwsuaZjP1u7ZbXrwCyqMTYYiqETOGo8NdzTaceRUyR9TNzagSWovOSuHPVyUGJ9lnsxizikt/+PiQ==",
+ "node_modules/@rtsao/scc": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz",
+ "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==",
+ "dev": true,
"license": "MIT"
},
- "node_modules/@safe-global/types-kit": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/@safe-global/types-kit/-/types-kit-2.0.1.tgz",
- "integrity": "sha512-4xKjTBlyFSIKziqvjrGMBAgs7Z2+s/5A2wjAXg2gBA1BuvV6w1THk1Y/WMZg8+6/PlRaVMVo4LoSNMRSsZZhjw==",
- "license": "MIT",
- "dependencies": {
- "abitype": "^1.0.2"
- }
- },
"node_modules/@scure/base": {
"version": "1.2.6",
"resolved": "https://registry.npmjs.org/@scure/base/-/base-1.2.6.tgz",
@@ -3581,20 +3202,6 @@
"url": "https://paulmillr.com/funding/"
}
},
- "node_modules/@scure/bip32": {
- "version": "1.7.0",
- "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.7.0.tgz",
- "integrity": "sha512-E4FFX/N3f4B80AKWp5dP6ow+flD1LQZo/w8UnLGYZO674jS6YnYeepycOOksv+vLPSpgN35wgKgy+ybfTb2SMw==",
- "license": "MIT",
- "dependencies": {
- "@noble/curves": "~1.9.0",
- "@noble/hashes": "~1.8.0",
- "@scure/base": "~1.2.5"
- },
- "funding": {
- "url": "https://paulmillr.com/funding/"
- }
- },
"node_modules/@scure/bip39": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.6.0.tgz",
@@ -3608,25 +3215,10 @@
"url": "https://paulmillr.com/funding/"
}
},
- "node_modules/@scure/btc-signer": {
- "version": "1.8.1",
- "resolved": "https://registry.npmjs.org/@scure/btc-signer/-/btc-signer-1.8.1.tgz",
- "integrity": "sha512-8nX9T++dFyKpvqksNHfSi9CgRsGnHAQtCdIQ1y1GmbCGLpV97v4MUyemUUT6uDumKL3oo3m4niyY6A32nmdLuQ==",
- "license": "MIT",
- "dependencies": {
- "@noble/curves": "~1.9.0",
- "@noble/hashes": "~1.8.0",
- "@scure/base": "~1.2.5",
- "micro-packed": "~0.7.3"
- },
- "funding": {
- "url": "https://paulmillr.com/funding/"
- }
- },
"node_modules/@sinclair/typebox": {
- "version": "0.27.8",
- "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz",
- "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==",
+ "version": "0.27.10",
+ "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.10.tgz",
+ "integrity": "sha512-MTBk/3jGLNB2tVxv6uLlFh1iu64iYOQ2PbdOSK3NW8JZsmlaOh2q6sdtKowBhfw8QFLmYNzTW4/oK4uATIi6ZA==",
"license": "MIT"
},
"node_modules/@sinonjs/commons": {
@@ -3647,18 +3239,10 @@
"@sinonjs/commons": "^3.0.0"
}
},
- "node_modules/@sparkscan/api-node-sdk-client": {
- "version": "0.1.8",
- "resolved": "https://registry.npmjs.org/@sparkscan/api-node-sdk-client/-/api-node-sdk-client-0.1.8.tgz",
- "integrity": "sha512-iwVL7CdpKNhZv9KxQyaCof0pOxgjtFOoIWrgOBAKBsYNZfZj/yN0GFILWUoJVdrm3L84SUtK2g4frAfrgThNeQ==",
- "dependencies": {
- "axios": "^1.6.2"
- }
- },
"node_modules/@tanstack/query-core": {
- "version": "5.90.16",
- "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.90.16.tgz",
- "integrity": "sha512-MvtWckSVufs/ja463/K4PyJeqT+HMlJWtw6PrCpywznd2NSgO3m4KwO9RqbFqGg6iDE8vVMFWMeQI4Io3eEYww==",
+ "version": "5.90.20",
+ "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.90.20.tgz",
+ "integrity": "sha512-OMD2HLpNouXEfZJWcKeVKUgQ5n+n3A2JFmBaScpNDUqSrQSjiveC7dKMe53uJUg1nDG16ttFPz2xfilz6i2uVg==",
"license": "MIT",
"funding": {
"type": "github",
@@ -3666,12 +3250,12 @@
}
},
"node_modules/@tanstack/react-query": {
- "version": "5.90.16",
- "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.90.16.tgz",
- "integrity": "sha512-bpMGOmV4OPmif7TNMteU/Ehf/hoC0Kf98PDc0F4BZkFrEapRMEqI/V6YS0lyzwSV6PQpY1y4xxArUIfBW5LVxQ==",
+ "version": "5.90.20",
+ "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.90.20.tgz",
+ "integrity": "sha512-vXBxa+qeyveVO7OA0jX1z+DeyCA4JKnThKv411jd5SORpBKgkcVnYKCiBgECvADvniBX7tobwBmg01qq9JmMJw==",
"license": "MIT",
"dependencies": {
- "@tanstack/query-core": "5.90.16"
+ "@tanstack/query-core": "5.90.20"
},
"funding": {
"type": "github",
@@ -3725,38 +3309,18 @@
}
},
"node_modules/@tetherto/pear-wrk-wdk": {
- "name": "@wdk/bare",
"version": "0.1.1",
- "resolved": "git+ssh://git@github.com/tetherto/pear-wrk-wdk.git#ed8cd00fc27781fdf4fed90a2d489d6868d1ab9b",
- "hasInstallScript": true,
+ "resolved": "git+ssh://git@github.com/nampc1/pear-wrk-wdk-v2-fork.git#5652744e06ea7d7b41f487a9fa08b50f270ddab9",
"license": "Apache-2.0",
"dependencies": {
"@scure/bip39": "^1.6.0",
- "@tetherto/wdk": "1.0.0-beta.4",
- "@tetherto/wdk-wallet-evm-erc-4337": "github:itsdeka/wdk-wallet-evm-erc-4337-1#fix/temp-relay-kit",
- "@tetherto/wdk-wallet-spark": "1.0.0-beta.6",
- "bare-pack": "^2.0.0",
- "bufferutil": "^4.1.0",
- "hrpc": "4.0.1",
- "hyperschema": "1.12.4",
- "text-encoding": "0.7.0",
- "utf-8-validate": "5.0.10"
- }
- },
- "node_modules/@tetherto/wdk": {
- "version": "1.0.0-beta.4",
- "resolved": "https://registry.npmjs.org/@tetherto/wdk/-/wdk-1.0.0-beta.4.tgz",
- "integrity": "sha512-8drxqQifoKpxRc/JtL/s/PsJtATYtJi+/H9tomXJdeGbm2A05S4wfvSPkay19WgRwXpj0oe7jgtsN8kbNZQv2g==",
- "license": "Apache-2.0",
- "dependencies": {
- "@tetherto/wdk-wallet": "^1.0.0-beta.4",
- "bare-node-runtime": "^1.1.4"
+ "hrpc": "^4.0.1",
+ "hyperschema": "^1.12.4"
}
},
"node_modules/@tetherto/wdk-react-native-secure-storage": {
"version": "1.0.0",
- "resolved": "git+ssh://git@github.com/tetherto/wdk-react-native-secure-storage.git#5ca4bc1e9e7b93947f1d5e82ed1e38483d114092",
- "hasInstallScript": true,
+ "resolved": "git+ssh://git@github.com/tetherto/wdk-react-native-secure-storage.git#22982bce68472acb07f8e499d4f2623cd85ff0c8",
"license": "Apache-2.0",
"dependencies": {
"expo-crypto": "^15.0.8",
@@ -3767,139 +3331,6 @@
"react-native": ">=0.70.0"
}
},
- "node_modules/@tetherto/wdk-wallet": {
- "version": "1.0.0-beta.6",
- "resolved": "https://registry.npmjs.org/@tetherto/wdk-wallet/-/wdk-wallet-1.0.0-beta.6.tgz",
- "integrity": "sha512-McEyTlNFysSpUgA8GxjMUp1RPSm2FsxlNB0ecIXWyqS52TEevjS2BRgXw/h7vUaa4gien0x8Dt4eBWf13l56Xw==",
- "license": "Apache-2.0",
- "dependencies": {
- "bare-node-runtime": "^1.1.4",
- "bip39": "3.1.0"
- }
- },
- "node_modules/@tetherto/wdk-wallet-evm": {
- "version": "1.0.0-beta.4",
- "resolved": "https://registry.npmjs.org/@tetherto/wdk-wallet-evm/-/wdk-wallet-evm-1.0.0-beta.4.tgz",
- "integrity": "sha512-kRRXfL3qe7RY/jqg5XS/lB3SaeZEeV7aVHVrxbR/Na/LSfzEnTMWcYWCn2KkiOXjtdG+Uu+Bx0u6eFgcvLu/HQ==",
- "license": "Apache-2.0",
- "dependencies": {
- "@noble/curves": "1.9.2",
- "@noble/hashes": "1.8.0",
- "@noble/secp256k1": "2.2.3",
- "@tetherto/wdk-wallet": "^1.0.0-beta.1",
- "bare-node-runtime": "^1.1.4",
- "bip39": "3.1.0",
- "ethers": "6.14.3",
- "sodium-universal": "5.0.1"
- }
- },
- "node_modules/@tetherto/wdk-wallet-evm-erc-4337": {
- "version": "1.0.0-beta.4",
- "resolved": "git+ssh://git@github.com/itsdeka/wdk-wallet-evm-erc-4337-1.git#691efbada07b328984db08f3b8e7e0d5e5639fc6",
- "license": "Apache-2.0",
- "dependencies": {
- "@tetherto/wdk-wallet": "^1.0.0-beta.1",
- "@tetherto/wdk-wallet-evm": "^1.0.0-beta.3",
- "@wdk-safe-global/relay-kit": "npm:@jonpdunne/relay-kit@^4.1.0",
- "bare-node-runtime": "^1.1.4",
- "ethers": "6.14.4"
- }
- },
- "node_modules/@tetherto/wdk-wallet-evm/node_modules/ethers": {
- "version": "6.14.3",
- "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.14.3.tgz",
- "integrity": "sha512-qq7ft/oCJohoTcsNPFaXSQUm457MA5iWqkf1Mb11ujONdg7jBI6sAOrHaTi3j0CBqIGFSCeR/RMc+qwRRub7IA==",
- "funding": [
- {
- "type": "individual",
- "url": "https://github.com/sponsors/ethers-io/"
- },
- {
- "type": "individual",
- "url": "https://www.buymeacoffee.com/ricmoo"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "@adraffy/ens-normalize": "1.10.1",
- "@noble/curves": "1.2.0",
- "@noble/hashes": "1.3.2",
- "@types/node": "22.7.5",
- "aes-js": "4.0.0-beta.5",
- "tslib": "2.7.0",
- "ws": "8.17.1"
- },
- "engines": {
- "node": ">=14.0.0"
- }
- },
- "node_modules/@tetherto/wdk-wallet-evm/node_modules/ethers/node_modules/@noble/curves": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.2.0.tgz",
- "integrity": "sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==",
- "license": "MIT",
- "dependencies": {
- "@noble/hashes": "1.3.2"
- },
- "funding": {
- "url": "https://paulmillr.com/funding/"
- }
- },
- "node_modules/@tetherto/wdk-wallet-evm/node_modules/ethers/node_modules/@noble/hashes": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz",
- "integrity": "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==",
- "license": "MIT",
- "engines": {
- "node": ">= 16"
- },
- "funding": {
- "url": "https://paulmillr.com/funding/"
- }
- },
- "node_modules/@tetherto/wdk-wallet-evm/node_modules/tslib": {
- "version": "2.7.0",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz",
- "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==",
- "license": "0BSD"
- },
- "node_modules/@tetherto/wdk-wallet-evm/node_modules/ws": {
- "version": "8.17.1",
- "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz",
- "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==",
- "license": "MIT",
- "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/@tetherto/wdk-wallet-spark": {
- "version": "1.0.0-beta.6",
- "resolved": "https://registry.npmjs.org/@tetherto/wdk-wallet-spark/-/wdk-wallet-spark-1.0.0-beta.6.tgz",
- "integrity": "sha512-cDrMVyC43cuvxjDoPM1PlMaw3zNFwsJ8+GcTLPvdXR8dMP7tWVZmz4jeoMIutS8zsjRSaWIYg/QxV1CSrr2pPA==",
- "license": "Apache-2.0",
- "dependencies": {
- "@buildonspark/bare": "0.0.30",
- "@buildonspark/spark-sdk": "0.5.1",
- "@scure/bip32": "1.7.0",
- "@sparkscan/api-node-sdk-client": "0.1.8",
- "@tetherto/wdk-wallet": "^1.0.0-beta.1",
- "bare-node-runtime": "^1.1.4",
- "bip39": "3.1.0",
- "sodium-universal": "5.0.1"
- }
- },
"node_modules/@types/babel__core": {
"version": "7.20.5",
"resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz",
@@ -3985,19 +3416,33 @@
"pretty-format": "^29.0.0"
}
},
+ "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/@types/json5": {
+ "version": "0.0.29",
+ "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz",
+ "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/@types/node": {
- "version": "22.7.5",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.5.tgz",
- "integrity": "sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ==",
+ "version": "25.2.2",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-25.2.2.tgz",
+ "integrity": "sha512-BkmoP5/FhRYek5izySdkOneRyXYN35I860MFAGupTdebyE66uZaR+bXLHq8k4DirE5DwQi3NuhvRU1jqTVwUrQ==",
"license": "MIT",
"dependencies": {
- "undici-types": "~6.19.2"
+ "undici-types": "~7.16.0"
}
},
"node_modules/@types/react": {
- "version": "19.2.8",
- "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.8.tgz",
- "integrity": "sha512-3MbSL37jEchWZz2p2mjntRZtPt837ij10ApxKfgmXCTuHWagYg7iA5bqPw6C8BMPfwidlvfPI/fxOc42HLhcyg==",
+ "version": "19.2.13",
+ "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.13.tgz",
+ "integrity": "sha512-KkiJeU6VbYbUOp5ITMIc7kBfqlYkKA5KhEHVrGMmUUMt7NeaZg65ojdPk+FtNrBAOXNVM5QM72jnADjM+XVRAQ==",
"devOptional": true,
"license": "MIT",
"dependencies": {
@@ -4015,7 +3460,14 @@
"react-native": "*"
}
},
- "node_modules/@types/stack-utils": {
+ "node_modules/@types/semver": {
+ "version": "7.7.1",
+ "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.7.1.tgz",
+ "integrity": "sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "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==",
@@ -4036,18 +3488,207 @@
"integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==",
"license": "MIT"
},
- "node_modules/@types/zen-observable": {
- "version": "0.8.3",
- "resolved": "https://registry.npmjs.org/@types/zen-observable/-/zen-observable-0.8.3.tgz",
- "integrity": "sha512-fbF6oTd4sGGy0xjHPKAt+eS2CrxJ3+6gQ3FGcBoIJR2TLAyCkCyI8JqZNy+FeON0AhVgNJoUumVoZQjBFUqHkw==",
- "license": "MIT"
+ "node_modules/@typescript-eslint/eslint-plugin": {
+ "version": "5.62.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz",
+ "integrity": "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@eslint-community/regexpp": "^4.4.0",
+ "@typescript-eslint/scope-manager": "5.62.0",
+ "@typescript-eslint/type-utils": "5.62.0",
+ "@typescript-eslint/utils": "5.62.0",
+ "debug": "^4.3.4",
+ "graphemer": "^1.4.0",
+ "ignore": "^5.2.0",
+ "natural-compare-lite": "^1.4.0",
+ "semver": "^7.3.7",
+ "tsutils": "^3.21.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "@typescript-eslint/parser": "^5.0.0",
+ "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/parser": {
+ "version": "5.62.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz",
+ "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "@typescript-eslint/scope-manager": "5.62.0",
+ "@typescript-eslint/types": "5.62.0",
+ "@typescript-eslint/typescript-estree": "5.62.0",
+ "debug": "^4.3.4"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/scope-manager": {
+ "version": "5.62.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz",
+ "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/types": "5.62.0",
+ "@typescript-eslint/visitor-keys": "5.62.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/type-utils": {
+ "version": "5.62.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz",
+ "integrity": "sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/typescript-estree": "5.62.0",
+ "@typescript-eslint/utils": "5.62.0",
+ "debug": "^4.3.4",
+ "tsutils": "^3.21.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "*"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/types": {
+ "version": "5.62.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz",
+ "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree": {
+ "version": "5.62.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz",
+ "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "@typescript-eslint/types": "5.62.0",
+ "@typescript-eslint/visitor-keys": "5.62.0",
+ "debug": "^4.3.4",
+ "globby": "^11.1.0",
+ "is-glob": "^4.0.3",
+ "semver": "^7.3.7",
+ "tsutils": "^3.21.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/utils": {
+ "version": "5.62.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz",
+ "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.2.0",
+ "@types/json-schema": "^7.0.9",
+ "@types/semver": "^7.3.12",
+ "@typescript-eslint/scope-manager": "5.62.0",
+ "@typescript-eslint/types": "5.62.0",
+ "@typescript-eslint/typescript-estree": "5.62.0",
+ "eslint-scope": "^5.1.1",
+ "semver": "^7.3.7"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ }
+ },
+ "node_modules/@typescript-eslint/visitor-keys": {
+ "version": "5.62.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz",
+ "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/types": "5.62.0",
+ "eslint-visitor-keys": "^3.3.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
},
"node_modules/@ungap/structured-clone": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz",
"integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==",
- "license": "ISC",
- "peer": true
+ "license": "ISC"
},
"node_modules/@urql/core": {
"version": "5.2.0",
@@ -4074,43 +3715,6 @@
"@urql/core": "^5.0.0"
}
},
- "node_modules/@wdk-safe-global/protocol-kit": {
- "version": "6.0.8",
- "resolved": "https://registry.npmjs.org/@wdk-safe-global/protocol-kit/-/protocol-kit-6.0.8.tgz",
- "integrity": "sha512-0cvwUT+ZzCrinrf0DvRLQQtME8h1dUy/UJ1L3DXxpfROxsFj91fY+jH9ugwb4OoHdHekWWea7y+uhkyLfs2flQ==",
- "license": "MIT",
- "dependencies": {
- "@safe-global/safe-deployments": "^1.37.32",
- "@safe-global/safe-modules-deployments": "^2.2.8",
- "@safe-global/types-kit": "^2.0.1",
- "abitype": "^1.0.2",
- "semver": "^7.7.1",
- "viem": "^2.21.8"
- },
- "optionalDependencies": {
- "@noble/curves": "^1.6.0",
- "@peculiar/asn1-schema": "^2.3.13"
- },
- "peerDependencies": {
- "ethers": "^6.13.7"
- }
- },
- "node_modules/@wdk-safe-global/relay-kit": {
- "name": "@jonpdunne/relay-kit",
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/@jonpdunne/relay-kit/-/relay-kit-4.1.2.tgz",
- "integrity": "sha512-ySo3gV8dfUGuxvoRp6SxXfsHEAdn1JK78vwFjGw0WQSW9bfIBBZODlg7ihcpgmPudDFoacUV5Nt9UMlzsw1kTQ==",
- "license": "MIT",
- "dependencies": {
- "@gelatonetwork/relay-sdk": "^5.6.1",
- "@safe-global/safe-deployments": "^1.37.42",
- "@safe-global/safe-modules-deployments": "^2.2.8",
- "@safe-global/types-kit": "^2.0.1",
- "@wdk-safe-global/protocol-kit": "^6.0.8",
- "semver": "^7.7.1",
- "viem": "^2.21.8"
- }
- },
"node_modules/@xmldom/xmldom": {
"version": "0.8.11",
"resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.11.tgz",
@@ -4121,27 +3725,6 @@
"node": ">=10.0.0"
}
},
- "node_modules/abitype": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/abitype/-/abitype-1.2.3.tgz",
- "integrity": "sha512-Ofer5QUnuUdTFsBRwARMoWKOH1ND5ehwYhJ3OJ/BQO+StkwQjHw0XyVh4vDttzHB7QOFhPHa/o413PJ82gU/Tg==",
- "license": "MIT",
- "funding": {
- "url": "https://github.com/sponsors/wevm"
- },
- "peerDependencies": {
- "typescript": ">=5.0.4",
- "zod": "^3.22.0 || ^4.0.0"
- },
- "peerDependenciesMeta": {
- "typescript": {
- "optional": true
- },
- "zod": {
- "optional": true
- }
- }
- },
"node_modules/abort-controller": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz",
@@ -4154,18 +3737,6 @@
"node": ">=6.5"
}
},
- "node_modules/abort-controller-x": {
- "version": "0.4.3",
- "resolved": "https://registry.npmjs.org/abort-controller-x/-/abort-controller-x-0.4.3.tgz",
- "integrity": "sha512-VtUwTNU8fpMwvWGn4xE93ywbogTYsuT+AUxAXOeelbXuQVIwNmC5YLeho9sH4vZ4ITW8414TTAOG1nW6uIVHCA==",
- "license": "MIT"
- },
- "node_modules/abortcontroller-polyfill": {
- "version": "1.7.8",
- "resolved": "https://registry.npmjs.org/abortcontroller-polyfill/-/abortcontroller-polyfill-1.7.8.tgz",
- "integrity": "sha512-9f1iZ2uWh92VcrU9Y8x+LdM4DLj75VE0MJB8zuF1iUnroEptStw+DQ8EQPMUdfe5k+PkB1uUfDQfWbhstH8LrQ==",
- "license": "MIT"
- },
"node_modules/accepts": {
"version": "1.3.8",
"resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
@@ -4191,21 +3762,16 @@
"node": ">=0.4.0"
}
},
- "node_modules/acorn-import-attributes": {
- "version": "1.9.5",
- "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz",
- "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==",
+ "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",
"peerDependencies": {
- "acorn": "^8"
+ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
}
},
- "node_modules/aes-js": {
- "version": "4.0.0-beta.5",
- "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-4.0.0-beta.5.tgz",
- "integrity": "sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==",
- "license": "MIT"
- },
"node_modules/agent-base": {
"version": "7.1.4",
"resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz",
@@ -4215,6 +3781,23 @@
"node": ">= 14"
}
},
+ "node_modules/ajv": {
+ "version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "dev": true,
+ "license": "MIT",
+ "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/anser": {
"version": "1.4.10",
"resolved": "https://registry.npmjs.org/anser/-/anser-1.4.10.tgz",
@@ -4303,112 +3886,266 @@
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
"integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
- "license": "Python-2.0",
- "peer": true
+ "license": "Python-2.0"
},
- "node_modules/asap": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
- "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==",
- "license": "MIT"
- },
- "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,
+ "node_modules/array-buffer-byte-length": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz",
+ "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "pvtsutils": "^1.3.6",
- "pvutils": "^1.1.3",
- "tslib": "^2.8.1"
+ "call-bound": "^1.0.3",
+ "is-array-buffer": "^3.0.5"
},
"engines": {
- "node": ">=12.0.0"
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/async-limiter": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz",
- "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==",
- "license": "MIT",
- "peer": true
- },
- "node_modules/async-mutex": {
- "version": "0.5.0",
- "resolved": "https://registry.npmjs.org/async-mutex/-/async-mutex-0.5.0.tgz",
- "integrity": "sha512-1A94B18jkJ3DYq284ohPxoXbfTA5HsQ7/Mf4DEhcyLx3Bz27Rh59iScbB6EPiP+B+joue6YCxcMXSbFC1tZKwA==",
+ "node_modules/array-includes": {
+ "version": "3.1.9",
+ "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz",
+ "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==",
+ "dev": true,
"license": "MIT",
"dependencies": {
- "tslib": "^2.4.0"
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.4",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.24.0",
+ "es-object-atoms": "^1.1.1",
+ "get-intrinsic": "^1.3.0",
+ "is-string": "^1.1.1",
+ "math-intrinsics": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "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"
- },
- "node_modules/axios": {
- "version": "1.13.2",
- "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.2.tgz",
- "integrity": "sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==",
+ "node_modules/array-union": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
+ "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
+ "dev": true,
"license": "MIT",
- "dependencies": {
- "follow-redirects": "^1.15.6",
- "form-data": "^4.0.4",
- "proxy-from-env": "^1.1.0"
+ "engines": {
+ "node": ">=8"
}
},
- "node_modules/b4a": {
- "version": "1.7.3",
- "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.7.3.tgz",
- "integrity": "sha512-5Q2mfq2WfGuFp3uS//0s6baOJLMoVduPYVeNmDYxu5OUA1/cBfvr2RIS7vi62LdNj/urk1hfmj867I3qt6uZ7Q==",
- "license": "Apache-2.0",
- "peerDependencies": {
- "react-native-b4a": "*"
+ "node_modules/array.prototype.findlast": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz",
+ "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.2",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.0.0",
+ "es-shim-unscopables": "^1.0.2"
},
- "peerDependenciesMeta": {
- "react-native-b4a": {
- "optional": true
- }
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "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/array.prototype.findlastindex": {
+ "version": "1.2.6",
+ "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz",
+ "integrity": "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==",
+ "dev": true,
"license": "MIT",
"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"
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.4",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.9",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.1.1",
+ "es-shim-unscopables": "^1.1.0"
},
"engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "node": ">= 0.4"
},
- "peerDependencies": {
- "@babel/core": "^7.8.0"
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "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/array.prototype.flat": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz",
+ "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==",
+ "dev": true,
+ "license": "MIT",
"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"
+ "call-bind": "^1.0.8",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.5",
+ "es-shim-unscopables": "^1.0.2"
},
"engines": {
- "node": ">=8"
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array.prototype.flatmap": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz",
+ "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.5",
+ "es-shim-unscopables": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array.prototype.tosorted": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz",
+ "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.3",
+ "es-errors": "^1.3.0",
+ "es-shim-unscopables": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/arraybuffer.prototype.slice": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz",
+ "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "array-buffer-byte-length": "^1.0.1",
+ "call-bind": "^1.0.8",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.5",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.6",
+ "is-array-buffer": "^3.0.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/asap": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
+ "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==",
+ "license": "MIT"
+ },
+ "node_modules/async-function": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz",
+ "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/async-limiter": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz",
+ "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==",
+ "license": "MIT",
+ "peer": true
+ },
+ "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": {
+ "possible-typed-array-names": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/b4a": {
+ "version": "1.7.3",
+ "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.7.3.tgz",
+ "integrity": "sha512-5Q2mfq2WfGuFp3uS//0s6baOJLMoVduPYVeNmDYxu5OUA1/cBfvr2RIS7vi62LdNj/urk1hfmj867I3qt6uZ7Q==",
+ "license": "Apache-2.0",
+ "peerDependencies": {
+ "react-native-b4a": "*"
+ },
+ "peerDependenciesMeta": {
+ "react-native-b4a": {
+ "optional": true
+ }
+ }
+ },
+ "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==",
+ "license": "MIT",
+ "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"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.8.0"
+ }
+ },
+ "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",
+ "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"
+ },
+ "engines": {
+ "node": ">=8"
}
},
"node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": {
@@ -4452,14 +4189,14 @@
}
},
"node_modules/babel-plugin-polyfill-corejs2": {
- "version": "0.4.14",
- "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.14.tgz",
- "integrity": "sha512-Co2Y9wX854ts6U8gAAPXfn0GmAyctHuK8n0Yhfjd6t30g7yvKjspvvOo9yG+z52PZRgFErt7Ka2pYnXCjLKEpg==",
+ "version": "0.4.15",
+ "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.15.tgz",
+ "integrity": "sha512-hR3GwrRwHUfYwGfrisXPIDP3JcYfBrW7wKE7+Au6wDYl7fm/ka1NEII6kORzxNU556JjfidZeBsO10kYvtV1aw==",
"license": "MIT",
"peer": true,
"dependencies": {
- "@babel/compat-data": "^7.27.7",
- "@babel/helper-define-polyfill-provider": "^0.6.5",
+ "@babel/compat-data": "^7.28.6",
+ "@babel/helper-define-polyfill-provider": "^0.6.6",
"semver": "^6.3.1"
},
"peerDependencies": {
@@ -4491,13 +4228,13 @@
}
},
"node_modules/babel-plugin-polyfill-regenerator": {
- "version": "0.6.5",
- "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.5.tgz",
- "integrity": "sha512-ISqQ2frbiNU9vIJkzg7dlPpznPZ4jOiUQ1uSmB0fEHeowtN3COYRsXr/xexn64NpU13P06jc/L5TgiJXOgrbEg==",
+ "version": "0.6.6",
+ "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.6.tgz",
+ "integrity": "sha512-hYm+XLYRMvupxiQzrvXUj7YyvFFVfv5gI0R71AJzudg1g2AI2vyCPPIFEBjk162/wFzti3inBHo7isWFuEVS/A==",
"license": "MIT",
"peer": true,
"dependencies": {
- "@babel/helper-define-polyfill-provider": "^0.6.5"
+ "@babel/helper-define-polyfill-provider": "^0.6.6"
},
"peerDependencies": {
"@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
@@ -4567,9 +4304,9 @@
}
},
"node_modules/babel-preset-expo": {
- "version": "54.0.9",
- "resolved": "https://registry.npmjs.org/babel-preset-expo/-/babel-preset-expo-54.0.9.tgz",
- "integrity": "sha512-8J6hRdgEC2eJobjoft6mKJ294cLxmi3khCUy2JJQp4htOYYkllSLUq6vudWJkTJiIuGdVR4bR6xuz2EvJLWHNg==",
+ "version": "54.0.10",
+ "resolved": "https://registry.npmjs.org/babel-preset-expo/-/babel-preset-expo-54.0.10.tgz",
+ "integrity": "sha512-wTt7POavLFypLcPW/uC5v8y+mtQKDJiyGLzYCjqr9tx0Qc3vCXcDKk1iCFIj/++Iy5CWhhTflEa7VvVPNWeCfw==",
"license": "MIT",
"peer": true,
"dependencies": {
@@ -4632,19 +4369,10 @@
"integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
"license": "MIT"
},
- "node_modules/bare-abort-controller": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/bare-abort-controller/-/bare-abort-controller-1.0.0.tgz",
- "integrity": "sha512-RSUPsS16TC0EfqfjZUlQwLAtFCUUl7NA0CYaE4/Sl9ExFx3q0WIogBHmW5Zn16NRZUHDJqEffmtnvIyw6LFUjA==",
- "license": "Apache-2.0",
- "dependencies": {
- "bare-events": "^2.7.0"
- }
- },
"node_modules/bare-addon-resolve": {
- "version": "1.9.6",
- "resolved": "https://registry.npmjs.org/bare-addon-resolve/-/bare-addon-resolve-1.9.6.tgz",
- "integrity": "sha512-hvOQY1zDK6u0rSr27T6QlULoVLwi8J2k8HHHJlxSfT7XQdQ/7bsS+AnjYkHtu/TkL+gm3aMXAKucJkJAbrDG/g==",
+ "version": "1.9.7",
+ "resolved": "https://registry.npmjs.org/bare-addon-resolve/-/bare-addon-resolve-1.9.7.tgz",
+ "integrity": "sha512-cIo93Y4Maw8ZNrfq5qlvRBqCHUyeSzMyFBqJRNi91SOspeWiFq3ixiq0ExYWmtOBauIkCLod2Mng73xr7fmkXA==",
"license": "Apache-2.0",
"dependencies": {
"bare-module-resolve": "^1.10.0",
@@ -4659,13 +4387,43 @@
}
}
},
- "node_modules/bare-ansi-escapes": {
- "version": "2.2.3",
- "resolved": "https://registry.npmjs.org/bare-ansi-escapes/-/bare-ansi-escapes-2.2.3.tgz",
- "integrity": "sha512-02ES4/E2RbrtZSnHJ9LntBhYkLA6lPpSEeP8iqS3MccBIVhVBlEmruF1I7HZqx5Q8aiTeYfQVeqmrU9YO2yYoQ==",
+ "node_modules/bare-env": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/bare-env/-/bare-env-3.0.0.tgz",
+ "integrity": "sha512-0u964P5ZLAxTi+lW4Kjp7YRJQ5gZr9ycYOtjLxsSrupgMz3sn5Z9n4SH/JIifHwvadsf1brA2JAjP+9IOWwTiw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "bare-os": "^3.0.1"
+ }
+ },
+ "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==",
+ "license": "Apache-2.0",
+ "peerDependencies": {
+ "bare-abort-controller": "*"
+ },
+ "peerDependenciesMeta": {
+ "bare-abort-controller": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/bare-fs": {
+ "version": "4.5.3",
+ "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.5.3.tgz",
+ "integrity": "sha512-9+kwVx8QYvt3hPWnmb19tPnh38c6Nihz8Lx3t0g9+4GoIf3/fTgYwM4Z6NxgI+B9elLQA7mLE9PpqcWtOMRDiQ==",
"license": "Apache-2.0",
"dependencies": {
- "bare-stream": "^2.6.5"
+ "bare-events": "^2.5.4",
+ "bare-path": "^3.0.0",
+ "bare-stream": "^2.6.4",
+ "bare-url": "^2.2.2",
+ "fast-fifo": "^1.3.2"
+ },
+ "engines": {
+ "bare": ">=1.16.0"
},
"peerDependencies": {
"bare-buffer": "*"
@@ -4676,283 +4434,143 @@
}
}
},
- "node_modules/bare-assert": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/bare-assert/-/bare-assert-1.2.0.tgz",
- "integrity": "sha512-c6uvgvTJBspTDxtVnPgrBKmLgcpW3Fp72NVKDLg6oT4QjQbhGtvrkHMhGYMK1sh4vjBHOBmuUalyt9hSzV37fQ==",
+ "node_modules/bare-lief": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/bare-lief/-/bare-lief-0.1.4.tgz",
+ "integrity": "sha512-2b5+zLOzFDCRLhNwFOEb8dR3NajNPP/Jh/mRITB019qXdIAz6dDzvV+OOBodZwNayOboYXIO1NAqNY6z7JIBnw==",
"license": "Apache-2.0",
"dependencies": {
- "bare-inspect": "^3.1.2"
+ "require-addon": "^1.2.0"
}
},
- "node_modules/bare-async-hooks": {
- "version": "0.0.0",
- "resolved": "https://registry.npmjs.org/bare-async-hooks/-/bare-async-hooks-0.0.0.tgz",
- "integrity": "sha512-xNfGwUobaomCGMGAqohAekS3uMCj+4tvI4AoOaJnO7NfpN+dvFdkC5xkeQtmZzs2vxf2TR5J6i5FDd1ImCZERw==",
- "license": "Apache-2.0"
- },
- "node_modules/bare-buffer": {
- "version": "3.4.2",
- "resolved": "https://registry.npmjs.org/bare-buffer/-/bare-buffer-3.4.2.tgz",
- "integrity": "sha512-e3s+hh+7KsEPA9Gg1q0e6vkvMaO+vyARkDrU/LPfojg4Q2G5wj+fjr8YDFELibSokECMhJmzhJMRwPRKVqPh+g==",
+ "node_modules/bare-link": {
+ "version": "2.1.10",
+ "resolved": "https://registry.npmjs.org/bare-link/-/bare-link-2.1.10.tgz",
+ "integrity": "sha512-oqoh5RJ6kuPRozDfOvVFpdcbRRFmUoxz4LU/bjMbBGWvAwO3f2v1i38GScyMUAs5MMtiyoSmIzZqw0QbLM5Erg==",
"license": "Apache-2.0",
- "engines": {
- "bare": ">=1.20.0"
+ "dependencies": {
+ "bare-fs": "^4.0.0",
+ "bare-lief": "^0.1.0",
+ "bare-module-resolve": "^1.12.0",
+ "bare-os": "^3.2.0",
+ "bare-path": "^3.0.0",
+ "bare-subprocess": "^5.0.2",
+ "bare-url": "^2.0.9",
+ "paparam": "^1.5.0"
+ },
+ "bin": {
+ "bare-link": "bin.js"
}
},
- "node_modules/bare-bundle": {
- "version": "1.10.0",
- "resolved": "https://registry.npmjs.org/bare-bundle/-/bare-bundle-1.10.0.tgz",
- "integrity": "sha512-4LVlnJAHr00Hh6Vu6ZUJS38rcEtJT3b3vChXSsBsJ2mk1TN0lQ+gzd+Dw5L0aV7uqDZv84smuwW+O02X7PfDlw==",
+ "node_modules/bare-module-resolve": {
+ "version": "1.12.1",
+ "resolved": "https://registry.npmjs.org/bare-module-resolve/-/bare-module-resolve-1.12.1.tgz",
+ "integrity": "sha512-hbmAPyFpEq8FoZMd5sFO3u6MC5feluWoGE8YKlA8fCrl6mNtx68Wjg4DTiDJcqRJaovTvOYKfYngoBUnbaT7eg==",
"license": "Apache-2.0",
+ "dependencies": {
+ "bare-semver": "^1.0.0"
+ },
"peerDependencies": {
- "bare-buffer": "*",
"bare-url": "*"
},
"peerDependenciesMeta": {
- "bare-buffer": {
- "optional": true
- },
"bare-url": {
"optional": true
}
}
},
- "node_modules/bare-bundle-id": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/bare-bundle-id/-/bare-bundle-id-1.0.2.tgz",
- "integrity": "sha512-RG/y1J/s6zWmsqUIDtclXh+xxMRTh1jo/10vFL58FKhe9UESchMNkwn0Cz10o5AdA/35WR/KUGoHhIGdyCjQrg==",
- "license": "Apache-2.0",
- "dependencies": {
- "sodium-native": "^5.0.9"
- },
- "peerDependencies": {
- "bare-buffer": "*",
- "bare-bundle": "*"
- }
- },
- "node_modules/bare-channel": {
- "version": "5.2.2",
- "resolved": "https://registry.npmjs.org/bare-channel/-/bare-channel-5.2.2.tgz",
- "integrity": "sha512-lM5nPZKV4mWB0djziPr+FaLeoaMmNeUjlbtRZ84ad0FbZEWjlrEIj3ShufHx5xXMXgot0GZk+iLtubCYZVoSNQ==",
+ "node_modules/bare-os": {
+ "version": "3.6.2",
+ "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-3.6.2.tgz",
+ "integrity": "sha512-T+V1+1srU2qYNBmJCXZkUY5vQ0B4FSlL3QDROnKQYOqeiQR8UbjNHlPa+TIbM4cuidiN9GaTaOZgSEgsvPbh5A==",
"license": "Apache-2.0",
- "dependencies": {
- "bare-events": "^2.0.0",
- "bare-stream": "^2.7.0",
- "bare-structured-clone": "^1.4.0"
- },
"engines": {
- "bare": ">=1.7.0"
+ "bare": ">=1.14.0"
}
},
- "node_modules/bare-console": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/bare-console/-/bare-console-6.1.0.tgz",
- "integrity": "sha512-BziGTEIyVh0zn78842mmpOLGTEFE7/S4A5Tb0d2iIu7bryVdoiF0przraYMetJckHxm0P5ITTZrYfRuYRr9n/Q==",
+ "node_modules/bare-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-3.0.0.tgz",
+ "integrity": "sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==",
"license": "Apache-2.0",
"dependencies": {
- "bare-hrtime": "^2.0.0",
- "bare-logger": "^2.0.0",
- "bare-system-logger": "^1.0.2"
+ "bare-os": "^3.0.1"
}
},
- "node_modules/bare-cov": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/bare-cov/-/bare-cov-1.2.1.tgz",
- "integrity": "sha512-SHNqb/WG9udUEj8m5qGSehoUQ9o0Xzv8nrf4HIdmG+KNU/XdhPLhTP5VPrHnSAMAXhAzEB4Q+2IYZ0x9qPzN1g==",
+ "node_modules/bare-pipe": {
+ "version": "4.1.3",
+ "resolved": "https://registry.npmjs.org/bare-pipe/-/bare-pipe-4.1.3.tgz",
+ "integrity": "sha512-DqQsx93rAzre6yJ9T6l/Vgh+X+bntkVMB1X5ggtXjXtqtMmF2Y2RVlCzxxy/09R6yeR9FSWBEUIaMYJL1/5VDA==",
"license": "Apache-2.0",
"dependencies": {
- "bare-fs": "^4.1.2",
- "bare-inspector": "^4.0.1",
- "bare-path": "^3.0.0",
- "bare-process": "^4.2.1",
- "bare-url": "^2.1.5",
- "bare-v8-to-istanbul": "^1.0.2",
- "picomatch": "^4.0.2",
- "which-runtime": "^1.2.1"
+ "bare-events": "^2.0.0",
+ "bare-stream": "^2.0.0"
+ },
+ "engines": {
+ "bare": ">=1.16.0"
}
},
- "node_modules/bare-cov/node_modules/bare-inspector": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/bare-inspector/-/bare-inspector-4.0.3.tgz",
- "integrity": "sha512-yYk6+7tTVKJKHOja5+QBn989ETv8oVsmwoH0nCM+QYC6w5MC03GC4aQNK+lipAZSz1EaAj42WZ8Wewjpy0L9TA==",
+ "node_modules/bare-rpc": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/bare-rpc/-/bare-rpc-1.1.0.tgz",
+ "integrity": "sha512-8cDLnat9IROS5cdVmsaTTvtws4drayZksTYYMd6VXqBWOEowOeztZlekO9DepxMf+q4+FBQStqTyso2BXqvYMg==",
"license": "Apache-2.0",
"dependencies": {
- "bare-events": "^2.1.0",
- "bare-http1": "^4.0.0",
- "bare-stream": "^2.0.0",
- "bare-url": "^2.0.0",
- "bare-ws": "^2.0.0"
- },
- "engines": {
- "bare": ">=1.2.0"
+ "b4a": "^1.6.6",
+ "bare-stream": "^2.1.3",
+ "compact-encoding": "^2.15.0",
+ "safety-catch": "^1.0.2"
},
"peerDependencies": {
- "bare-tcp": "*"
+ "bare-buffer": "*"
},
"peerDependenciesMeta": {
- "bare-tcp": {
+ "bare-buffer": {
"optional": true
}
}
},
- "node_modules/bare-cov/node_modules/picomatch": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz",
- "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
- "license": "MIT",
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/sponsors/jonschlinkert"
- }
- },
- "node_modules/bare-crypto": {
- "version": "1.13.0",
- "resolved": "https://registry.npmjs.org/bare-crypto/-/bare-crypto-1.13.0.tgz",
- "integrity": "sha512-RQl13yD+YTACWUZHMMck0C6LNjXgGgRyhVC557ag0xIrkxXf4IQwpnc8WOB58f4k5kSzKhIjy05oW3HUBrFpSQ==",
- "license": "Apache-2.0",
- "dependencies": {
- "bare-stream": "^2.6.3"
- },
- "peerDependencies": {
- "bare-buffer": "*"
- },
- "peerDependenciesMeta": {
- "bare-buffer": {
- "optional": true
- }
- }
- },
- "node_modules/bare-debug-log": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/bare-debug-log/-/bare-debug-log-2.0.0.tgz",
- "integrity": "sha512-Vi42PkMQsNV9PUpx2Gl1hikshx5O9FzMJ6o9Nnopseg7qLBBK7Nl31d0RHcfwLEAfmcPApytpc0ZFfq68u22FQ==",
- "license": "Apache-2.0",
- "dependencies": {
- "bare-os": "^3.0.1"
- }
- },
- "node_modules/bare-dgram": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/bare-dgram/-/bare-dgram-1.0.1.tgz",
- "integrity": "sha512-EdsyRErrkWgN8fENdrDdXFEE9HAuJ/m6ehXz13fVj9JhdCaLWIA+L8o5aYNRLt66x08RlyG2vbrRAZoxGfcdlg==",
- "license": "Apache-2.0",
- "dependencies": {
- "bare-events": "^2.5.0",
- "udx-native": "^1.11.2"
- }
- },
- "node_modules/bare-diagnostics-channel": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/bare-diagnostics-channel/-/bare-diagnostics-channel-1.1.0.tgz",
- "integrity": "sha512-Reu+EQo+eLpB+a5p8UykFEdXndFaRaSgKV38uAMh/qhE2eTeJcdwAwo74hKYyeN8GD3DIFqC9ZlM4bnDc03CIg==",
+ "node_modules/bare-semver": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/bare-semver/-/bare-semver-1.0.2.tgz",
+ "integrity": "sha512-ESVaN2nzWhcI5tf3Zzcq9aqCZ676VWzqw07eEZ0qxAcEOAFYBa0pWq8sK34OQeHLY3JsfKXZS9mDyzyxGjeLzA==",
"license": "Apache-2.0"
},
- "node_modules/bare-dns": {
- "version": "2.1.4",
- "resolved": "https://registry.npmjs.org/bare-dns/-/bare-dns-2.1.4.tgz",
- "integrity": "sha512-abwjHmpWqSRNB7V5615QxPH92L71AVzFm/kKTs8VYiNTAi2xVdonpv0BjJ0hwXLwomoW+xsSOPjW6PZPO14asg==",
- "license": "Apache-2.0",
- "engines": {
- "bare": ">=1.7.0"
- }
- },
- "node_modules/bare-encoding": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/bare-encoding/-/bare-encoding-1.0.0.tgz",
- "integrity": "sha512-9T5CSCaytaIWZpFWx9LQLJ6/z/m2Slnan9tQBKmOvoq/UtPBbOKT/B2fo29Xhi4X1FFtNx8DFdtrFgqm2yse/Q==",
- "license": "Apache-2.0",
- "peerDependencies": {
- "bare-buffer": "*"
- },
- "peerDependenciesMeta": {
- "bare-buffer": {
- "optional": true
- }
- }
- },
- "node_modules/bare-env": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/bare-env/-/bare-env-3.0.0.tgz",
- "integrity": "sha512-0u964P5ZLAxTi+lW4Kjp7YRJQ5gZr9ycYOtjLxsSrupgMz3sn5Z9n4SH/JIifHwvadsf1brA2JAjP+9IOWwTiw==",
- "license": "Apache-2.0",
- "dependencies": {
- "bare-os": "^3.0.1"
- }
- },
- "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==",
- "license": "Apache-2.0",
- "peerDependencies": {
- "bare-abort-controller": "*"
- },
- "peerDependenciesMeta": {
- "bare-abort-controller": {
- "optional": true
- }
- }
- },
- "node_modules/bare-fetch": {
- "version": "2.5.1",
- "resolved": "https://registry.npmjs.org/bare-fetch/-/bare-fetch-2.5.1.tgz",
- "integrity": "sha512-BdJie1S9y3TW0pzF6Q/dP95QDjlUPXexiJWSnKFIM/OHID6ITJk2XEQQ25rsGqwLqxQ4felfGkj13mC/ao27mg==",
+ "node_modules/bare-stream": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.7.0.tgz",
+ "integrity": "sha512-oyXQNicV1y8nc2aKffH+BUHFRXmx6VrPzlnaEvMhram0nPBrKcEdcyBg5r08D0i8VxngHFAiVyn1QKXpSG0B8A==",
"license": "Apache-2.0",
"dependencies": {
- "bare-form-data": "^1.1.3",
- "bare-http1": "^4.0.2",
- "bare-https": "^2.0.0",
- "bare-stream": "^2.7.0",
- "bare-zlib": "^1.3.0"
+ "streamx": "^2.21.0"
},
"peerDependencies": {
"bare-buffer": "*",
- "bare-url": "*"
+ "bare-events": "*"
},
"peerDependenciesMeta": {
"bare-buffer": {
"optional": true
},
- "bare-url": {
+ "bare-events": {
"optional": true
}
}
},
- "node_modules/bare-form-data": {
- "version": "1.1.6",
- "resolved": "https://registry.npmjs.org/bare-form-data/-/bare-form-data-1.1.6.tgz",
- "integrity": "sha512-q1IN7dVo/lEhTlVkVQdULZvoBx6eTI94co0NtO7/A3JLFL/aZGA1wAHgcNEPrlkqTK9jTEdtzQXSoqGzlVjzgg==",
- "license": "Apache-2.0",
- "dependencies": {
- "bare-stream": "^2.6.5"
- }
- },
- "node_modules/bare-format": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/bare-format/-/bare-format-1.0.1.tgz",
- "integrity": "sha512-1oS+LZrWK6tnYnvNSHDGljc2MPunRxwhpFriuCgzNF+oklrnwmBKD91tS0yt+jpl2j3UgcSDzBIMiVTvLs9A8w==",
- "license": "Apache-2.0",
- "dependencies": {
- "bare-inspect": "^3.0.0"
- }
- },
- "node_modules/bare-fs": {
- "version": "4.5.2",
- "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.5.2.tgz",
- "integrity": "sha512-veTnRzkb6aPHOvSKIOy60KzURfBdUflr5VReI+NSaPL6xf+XLdONQgZgpYvUuZLVQ8dCqxpBAudaOM1+KpAUxw==",
+ "node_modules/bare-subprocess": {
+ "version": "5.2.2",
+ "resolved": "https://registry.npmjs.org/bare-subprocess/-/bare-subprocess-5.2.2.tgz",
+ "integrity": "sha512-L6oXgQ1aWs25RtG5Ky0bDD06p3RAcVVrDDMWb1DfXpHtyEWxamcyIWUbSykxMTWrpLlmSj6ytbb6yoKehGFfmw==",
"license": "Apache-2.0",
"dependencies": {
+ "bare-env": "^3.0.0",
"bare-events": "^2.5.4",
- "bare-path": "^3.0.0",
- "bare-stream": "^2.6.4",
- "bare-url": "^2.2.2",
- "fast-fifo": "^1.3.2"
+ "bare-os": "^3.0.1",
+ "bare-pipe": "^4.0.0",
+ "bare-url": "^2.2.2"
},
"engines": {
- "bare": ">=1.16.0"
+ "bare": ">=1.7.0"
},
"peerDependencies": {
"bare-buffer": "*"
@@ -4963,935 +4581,1340 @@
}
}
},
- "node_modules/bare-hrtime": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/bare-hrtime/-/bare-hrtime-2.1.1.tgz",
- "integrity": "sha512-VMb3tHo05gsnbu3OXTmkDiwTjMlOsbQmKoysKqKEyR09m77TuDrYFbj3Q5GGk10dAKsUHrnXmwCaeJqzVpB5ZA==",
- "license": "Apache-2.0"
- },
- "node_modules/bare-http-parser": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/bare-http-parser/-/bare-http-parser-1.0.1.tgz",
- "integrity": "sha512-A3LTDTcELcmNJ3g5liIaS038v/BQxOhA9cjhBESn7eoV7QCuMoIRBKLDadDe08flxyLbxI2f+1l2MZ/5+HnKPA==",
- "license": "Apache-2.0"
- },
- "node_modules/bare-http1": {
- "version": "4.2.2",
- "resolved": "https://registry.npmjs.org/bare-http1/-/bare-http1-4.2.2.tgz",
- "integrity": "sha512-XL1aeSSjKNIIjyo5czdWZb7C1fVWiL7Y0CPLLgKy6fWMOXZksLY84QjRmvKTAfRN2beNQuIexccCWknI8sStNg==",
+ "node_modules/bare-url": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/bare-url/-/bare-url-2.3.2.tgz",
+ "integrity": "sha512-ZMq4gd9ngV5aTMa5p9+UfY0b3skwhHELaDkhEHetMdX0LRkW9kzaym4oo/Eh+Ghm0CCDuMTsRIGM/ytUc1ZYmw==",
"license": "Apache-2.0",
"dependencies": {
- "bare-events": "^2.6.0",
- "bare-http-parser": "^1.0.0",
- "bare-stream": "^2.3.0",
- "bare-tcp": "^2.2.0"
- },
- "peerDependencies": {
- "bare-buffer": "*",
- "bare-url": "*"
- },
- "peerDependenciesMeta": {
- "bare-buffer": {
- "optional": true
+ "bare-path": "^3.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"
},
- "bare-url": {
- "optional": true
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
}
- }
+ ],
+ "license": "MIT"
},
- "node_modules/bare-https": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/bare-https/-/bare-https-2.1.2.tgz",
- "integrity": "sha512-Q+TTydUDsuKQJvh8dX2dvOXCR9fM3xR5TBmKaFrs5p7Lj7XbKX7v4vIUJ36H0SXg2xCOQxXKIbjwrLg5tfJNYg==",
+ "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==",
"license": "Apache-2.0",
- "dependencies": {
- "bare-http1": "^4.0.0",
- "bare-tcp": "^2.2.0",
- "bare-tls": "^2.0.0"
+ "bin": {
+ "baseline-browser-mapping": "dist/cli.js"
}
},
- "node_modules/bare-inspect": {
- "version": "3.1.4",
- "resolved": "https://registry.npmjs.org/bare-inspect/-/bare-inspect-3.1.4.tgz",
- "integrity": "sha512-jfW5KRA84o3REpI6Vr4nbvMn+hqVAw8GU1mMdRwUsY5yJovQamxYeKGVKGqdzs+8ZbG4jRzGUXP/3Ji/DnqfPg==",
- "license": "Apache-2.0",
+ "node_modules/better-opn": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/better-opn/-/better-opn-3.0.2.tgz",
+ "integrity": "sha512-aVNobHnJqLiUelTaHat9DZ1qM2w0C0Eym4LPI/3JxOnSokGVdsl1T1kN7TFvsEAD8G47A6VKQ0TVHqbBnYMJlQ==",
+ "license": "MIT",
+ "peer": true,
"dependencies": {
- "bare-ansi-escapes": "^2.1.0",
- "bare-type": "^1.0.0"
+ "open": "^8.0.4"
},
"engines": {
- "bare": ">=1.18.0"
+ "node": ">=12.0.0"
}
},
- "node_modules/bare-inspector": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/bare-inspector/-/bare-inspector-5.0.0.tgz",
- "integrity": "sha512-blObRFPBK6yn0/wZbrRgkGcOuLUQUYVvkKbsEp5p3bWJB+uNrAh+qUqOijQHS6mZjGvyGCE86VERp3EiUR2TyA==",
- "license": "Apache-2.0",
+ "node_modules/better-opn/node_modules/open": {
+ "version": "8.4.2",
+ "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz",
+ "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==",
+ "license": "MIT",
+ "peer": true,
"dependencies": {
- "bare-events": "^2.1.0",
- "bare-http1": "^4.0.0",
- "bare-stream": "^2.0.0",
- "bare-url": "^2.0.0",
- "bare-ws": "^2.0.0"
+ "define-lazy-prop": "^2.0.0",
+ "is-docker": "^2.1.1",
+ "is-wsl": "^2.2.0"
},
"engines": {
- "bare": ">=1.2.0"
- },
- "peerDependencies": {
- "bare-tcp": "*"
+ "node": ">=12"
},
- "peerDependenciesMeta": {
- "bare-tcp": {
- "optional": true
- }
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/bare-lief": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/bare-lief/-/bare-lief-0.1.4.tgz",
- "integrity": "sha512-2b5+zLOzFDCRLhNwFOEb8dR3NajNPP/Jh/mRITB019qXdIAz6dDzvV+OOBodZwNayOboYXIO1NAqNY6z7JIBnw==",
- "license": "Apache-2.0",
+ "node_modules/big-integer": {
+ "version": "1.6.52",
+ "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz",
+ "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==",
+ "license": "Unlicense",
+ "peer": true,
+ "engines": {
+ "node": ">=0.6"
+ }
+ },
+ "node_modules/bplist-creator": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/bplist-creator/-/bplist-creator-0.1.0.tgz",
+ "integrity": "sha512-sXaHZicyEEmY86WyueLTQesbeoH/mquvarJaQNbjuOQO+7gbFcDEWqKmcWA4cOTLzFlfgvkiVxolk1k5bBIpmg==",
+ "license": "MIT",
+ "peer": true,
"dependencies": {
- "require-addon": "^1.2.0"
+ "stream-buffers": "2.2.x"
}
},
- "node_modules/bare-link": {
- "version": "2.1.10",
- "resolved": "https://registry.npmjs.org/bare-link/-/bare-link-2.1.10.tgz",
- "integrity": "sha512-oqoh5RJ6kuPRozDfOvVFpdcbRRFmUoxz4LU/bjMbBGWvAwO3f2v1i38GScyMUAs5MMtiyoSmIzZqw0QbLM5Erg==",
- "license": "Apache-2.0",
+ "node_modules/bplist-parser": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.2.tgz",
+ "integrity": "sha512-apC2+fspHGI3mMKj+dGevkGo/tCqVB8jMb6i+OX+E29p0Iposz07fABkRIfVUPNd5A5VbuOz1bZbnmkKLYF+wQ==",
+ "license": "MIT",
+ "peer": true,
"dependencies": {
- "bare-fs": "^4.0.0",
- "bare-lief": "^0.1.0",
- "bare-module-resolve": "^1.12.0",
- "bare-os": "^3.2.0",
- "bare-path": "^3.0.0",
- "bare-subprocess": "^5.0.2",
- "bare-url": "^2.0.9",
- "paparam": "^1.5.0"
+ "big-integer": "1.6.x"
},
- "bin": {
- "bare-link": "bin.js"
+ "engines": {
+ "node": ">= 5.10.0"
}
},
- "node_modules/bare-logger": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/bare-logger/-/bare-logger-2.0.0.tgz",
- "integrity": "sha512-Oc/jYOFVXnNtIp+BLttGBnOmJU0ved1/R2uUZZNW6VXXP0f6N5v5+tc2sJan7p21VMDPvKCHV+CyUO3QL9lkaA==",
- "license": "Apache-2.0",
+ "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==",
+ "license": "MIT",
+ "peer": true,
"dependencies": {
- "bare-format": "^1.0.0"
+ "balanced-match": "^1.0.0"
}
},
- "node_modules/bare-module": {
- "version": "6.1.3",
- "resolved": "https://registry.npmjs.org/bare-module/-/bare-module-6.1.3.tgz",
- "integrity": "sha512-5XWsVHsvtWMH4tK4DQWgpNTV0t/sg3ZrAaQLIxrwjrS5+u8Q9vEgc/zQ4QaDPWDse/y/5h+d+YG1Q0JfSMt0zA==",
- "license": "Apache-2.0",
+ "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==",
+ "license": "MIT",
"dependencies": {
- "bare-bundle": "^1.3.0",
- "bare-module-lexer": "^1.0.0",
- "bare-module-resolve": "^1.8.0",
- "bare-path": "^3.0.0",
- "bare-url": "^2.0.1"
+ "fill-range": "^7.1.1"
},
"engines": {
- "bare": ">=1.23.0"
- },
- "peerDependencies": {
- "bare-buffer": "*"
- },
- "peerDependenciesMeta": {
- "bare-buffer": {
- "optional": true
- }
+ "node": ">=8"
}
},
- "node_modules/bare-module-lexer": {
- "version": "1.4.7",
- "resolved": "https://registry.npmjs.org/bare-module-lexer/-/bare-module-lexer-1.4.7.tgz",
- "integrity": "sha512-0klU4eMsjh/wcxi8FdHmNom2j2F4kmkXOhyJFL9qTaSFp2lE3m6BtbKgMHY8R5miqC9r8/IfA8wzXnC5Os14WA==",
- "license": "Apache-2.0",
- "dependencies": {
- "require-addon": "^1.0.2"
- },
- "peerDependencies": {
- "bare-buffer": "*"
- },
- "peerDependenciesMeta": {
- "bare-buffer": {
- "optional": true
+ "node_modules/browserslist": {
+ "version": "4.28.1",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz",
+ "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==",
+ "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": {
+ "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/bs-logger": {
+ "version": "0.2.6",
+ "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz",
+ "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fast-json-stable-stringify": "2.x"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "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",
+ "dependencies": {
+ "node-int64": "^0.4.0"
+ }
+ },
+ "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"
+ }
+ ],
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "base64-js": "^1.3.1",
+ "ieee754": "^1.1.13"
+ }
+ },
+ "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"
+ },
+ "node_modules/builtins": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.1.0.tgz",
+ "integrity": "sha512-SW9lzGTLvWTP1AY8xeAMZimqDrIaSdLQUcVr9DMef51niJ022Ri87SwRRKYm4A6iHfkPaiVUu/Duw2Wc4J7kKg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "semver": "^7.0.0"
+ }
+ },
+ "node_modules/bytes": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
+ "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "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": {
+ "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/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",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "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,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.2",
+ "get-intrinsic": "^1.3.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "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/camelcase": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
+ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
+ "license": "MIT",
+ "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==",
+ "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/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/char-regex": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz",
+ "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/chownr": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz",
+ "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==",
+ "license": "BlueOak-1.0.0",
+ "peer": true,
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "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",
+ "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"
+ },
+ "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",
+ "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_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"
}
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/cjs-module-lexer": {
+ "version": "1.4.3",
+ "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz",
+ "integrity": "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/cli-cursor": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz",
+ "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "restore-cursor": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/cli-spinners": {
+ "version": "2.9.2",
+ "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz",
+ "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "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",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.1",
+ "wrap-ansi": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/clone": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
+ "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=0.8"
+ }
+ },
+ "node_modules/co": {
+ "version": "4.6.0",
+ "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
+ "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "iojs": ">= 1.0.0",
+ "node": ">= 0.12.0"
+ }
+ },
+ "node_modules/collect-v8-coverage": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.3.tgz",
+ "integrity": "sha512-1L5aqIkwPfiodaMgQunkF1zRhNqifHBmtbbbxcr6yVxxBnliw4TDOW6NxpO8DJLgJ16OT+Y4ztZqP6p/FtXnAw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "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==",
+ "license": "MIT",
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "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==",
+ "license": "MIT"
+ },
+ "node_modules/commander": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz",
+ "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">= 10"
}
},
- "node_modules/bare-module-resolve": {
- "version": "1.12.1",
- "resolved": "https://registry.npmjs.org/bare-module-resolve/-/bare-module-resolve-1.12.1.tgz",
- "integrity": "sha512-hbmAPyFpEq8FoZMd5sFO3u6MC5feluWoGE8YKlA8fCrl6mNtx68Wjg4DTiDJcqRJaovTvOYKfYngoBUnbaT7eg==",
+ "node_modules/compact-encoding": {
+ "version": "2.18.0",
+ "resolved": "https://registry.npmjs.org/compact-encoding/-/compact-encoding-2.18.0.tgz",
+ "integrity": "sha512-goACAOlhMI2xo5jGOMUDfOLnGdRE1jGfyZ+zie8N5114nHrbPIqf6GLUtzbLof6DSyrERlYRm3EcBplte5LcQw==",
"license": "Apache-2.0",
"dependencies": {
- "bare-semver": "^1.0.0"
- },
- "peerDependencies": {
- "bare-url": "*"
- },
- "peerDependenciesMeta": {
- "bare-url": {
- "optional": true
- }
+ "b4a": "^1.3.0"
}
},
- "node_modules/bare-module-traverse": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/bare-module-traverse/-/bare-module-traverse-2.0.0.tgz",
- "integrity": "sha512-5fmfLFfu30IB6aTH8Aq5OSFWT9q00K2jtuluNlmZZJ4CEdQlyOiJS7PZfVkF7Q/qrV1UpzhOVQhdeGeht/Mw4w==",
- "license": "Apache-2.0",
+ "node_modules/compressible": {
+ "version": "2.0.18",
+ "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz",
+ "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==",
+ "license": "MIT",
+ "peer": true,
"dependencies": {
- "bare-addon-resolve": "^1.5.0",
- "bare-module-lexer": "^1.4.0",
- "bare-module-resolve": "^1.7.0"
- },
- "peerDependencies": {
- "bare-buffer": "*",
- "bare-url": "*"
+ "mime-db": ">= 1.43.0 < 2"
},
- "peerDependenciesMeta": {
- "bare-buffer": {
- "optional": true
- },
- "bare-url": {
- "optional": true
- }
+ "engines": {
+ "node": ">= 0.6"
}
},
- "node_modules/bare-net": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/bare-net/-/bare-net-2.2.0.tgz",
- "integrity": "sha512-UF7cAbHsGE+H6uEqWF5IULBow1x58chZz4g3ALgHtv7wZsFcCbRDt0JKWEumf5Oma3QWS1Q6aLi0Rpll8RElMg==",
- "license": "Apache-2.0",
+ "node_modules/compression": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/compression/-/compression-1.8.1.tgz",
+ "integrity": "sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w==",
+ "license": "MIT",
+ "peer": true,
"dependencies": {
- "bare-events": "^2.2.2",
- "bare-pipe": "^4.0.0",
- "bare-stream": "^2.0.0",
- "bare-tcp": "^2.0.0"
+ "bytes": "3.1.2",
+ "compressible": "~2.0.18",
+ "debug": "2.6.9",
+ "negotiator": "~0.6.4",
+ "on-headers": "~1.1.0",
+ "safe-buffer": "5.2.1",
+ "vary": "~1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
}
},
- "node_modules/bare-node-runtime": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/bare-node-runtime/-/bare-node-runtime-1.1.4.tgz",
- "integrity": "sha512-Scer2k81VcuTsPmyEX/PCiFqvLZvVNvrmnHCgU/l5/7BM+m9W1wy+oaLkWnU1r33UTHL+Cmxoe0l5HtOgybZOQ==",
- "license": "Apache-2.0",
+ "node_modules/compression/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",
+ "peer": true,
"dependencies": {
- "bare-abort-controller": "^1.0.0",
- "bare-assert": "^1.1.0",
- "bare-async-hooks": "^0.0.0",
- "bare-buffer": "^3.3.1",
- "bare-console": "^6.0.1",
- "bare-crypto": "^1.11.2",
- "bare-dgram": "^1.0.1",
- "bare-diagnostics-channel": "^1.1.0",
- "bare-dns": "^2.1.4",
- "bare-events": "^2.7.0",
- "bare-fetch": "^2.5.0",
- "bare-fs": "^4.2.3",
- "bare-http1": "^4.0.4",
- "bare-https": "^2.0.0",
- "bare-inspector": "^5.0.0",
- "bare-module": "^6.1.2",
- "bare-net": "^2.0.2",
- "bare-os": "^3.6.2",
- "bare-path": "^3.0.0",
- "bare-performance": "^1.1.0",
- "bare-process": "^4.2.1",
- "bare-punycode": "^0.0.0",
- "bare-querystring": "^1.0.0",
- "bare-readline": "^1.1.0",
- "bare-repl": "^6.0.1",
- "bare-stream": "^2.7.0",
- "bare-string-decoder": "^1.0.0",
- "bare-subprocess": "^5.1.1",
- "bare-timers": "^3.0.3",
- "bare-tls": "^2.1.3",
- "bare-tty": "^5.0.3",
- "bare-url": "^2.2.2",
- "bare-utils": "^1.5.1",
- "bare-v8": "^1.0.1",
- "bare-vm": "^1.0.0",
- "bare-worker": "^4.0.0",
- "bare-zlib": "^1.3.1"
+ "ms": "2.0.0"
}
},
- "node_modules/bare-os": {
- "version": "3.6.2",
- "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-3.6.2.tgz",
- "integrity": "sha512-T+V1+1srU2qYNBmJCXZkUY5vQ0B4FSlL3QDROnKQYOqeiQR8UbjNHlPa+TIbM4cuidiN9GaTaOZgSEgsvPbh5A==",
- "license": "Apache-2.0",
+ "node_modules/compression/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/compression/node_modules/negotiator": {
+ "version": "0.6.4",
+ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz",
+ "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==",
+ "license": "MIT",
+ "peer": true,
"engines": {
- "bare": ">=1.14.0"
+ "node": ">= 0.6"
}
},
- "node_modules/bare-pack": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/bare-pack/-/bare-pack-2.0.0.tgz",
- "integrity": "sha512-pyz9qzjtKB7pU5/oFGF6/UYIEZsRKYjKDh0jzkSJmlV3gLxNsgP9m+yuu+ppLuiTJK554YQgm5mZq0W1qi+YcA==",
- "license": "Apache-2.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==",
+ "license": "MIT"
+ },
+ "node_modules/connect": {
+ "version": "3.7.0",
+ "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz",
+ "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==",
+ "license": "MIT",
"dependencies": {
- "bare-bundle": "^1.8.3",
- "bare-bundle-id": "^1.0.0",
- "bare-fs": "^4.2.1",
- "bare-module-traverse": "~2.0.0",
- "bare-path": "^3.0.0",
- "bare-url": "*",
- "paparam": "^1.5.0",
- "promaphore": "^1.0.0"
- },
- "bin": {
- "bare-pack": "bin.js"
- },
- "peerDependencies": {
- "bare-buffer": "*",
- "bare-url": "*"
+ "debug": "2.6.9",
+ "finalhandler": "1.1.2",
+ "parseurl": "~1.3.3",
+ "utils-merge": "1.0.1"
},
- "peerDependenciesMeta": {
- "bare-buffer": {
- "optional": true
- },
- "bare-url": {
- "optional": true
- }
+ "engines": {
+ "node": ">= 0.10.0"
}
},
- "node_modules/bare-path": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-3.0.0.tgz",
- "integrity": "sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==",
- "license": "Apache-2.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==",
+ "license": "MIT",
"dependencies": {
- "bare-os": "^3.0.1"
+ "ms": "2.0.0"
}
},
- "node_modules/bare-performance": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/bare-performance/-/bare-performance-1.3.0.tgz",
- "integrity": "sha512-ITlHSQwsnJSPjpagTtPo043LRkFgcrl9SgPsVUBXZvTeGWuNLUfMRwmwAS+35i8qnIEinySoLxwhVoJNZAIF2g==",
- "license": "Apache-2.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==",
+ "license": "MIT"
},
- "node_modules/bare-pipe": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/bare-pipe/-/bare-pipe-4.1.2.tgz",
- "integrity": "sha512-btXtZLlABEDRp50cfLj9iweISqAJSNMCjeq5v0v9tBY2a7zSSqmfa2ZoE1ki2qxAvubagLUqw6VDifpsuI/qmg==",
- "license": "Apache-2.0",
- "dependencies": {
- "bare-events": "^2.0.0",
- "bare-stream": "^2.0.0"
- },
- "engines": {
- "bare": ">=1.16.0"
- }
+ "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==",
+ "license": "MIT"
},
- "node_modules/bare-process": {
- "version": "4.2.2",
- "resolved": "https://registry.npmjs.org/bare-process/-/bare-process-4.2.2.tgz",
- "integrity": "sha512-ikzEw+HGLB+2lS/WLVEsqi8BXBwzleG3n7DYI0v6/YNklvNabOIGlLd1dof+7Jw5ob4jsBRPtyflweVahY7rFA==",
- "license": "Apache-2.0",
+ "node_modules/core-js-compat": {
+ "version": "3.48.0",
+ "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.48.0.tgz",
+ "integrity": "sha512-OM4cAF3D6VtH/WkLtWvyNC56EZVXsZdU3iqaMG2B4WvYrlqU831pc4UtG5yp0sE9z8Y02wVN7PjW5Zf9Gt0f1Q==",
+ "license": "MIT",
+ "peer": true,
"dependencies": {
- "bare-env": "^3.0.0",
- "bare-events": "^2.3.1",
- "bare-hrtime": "^2.0.0",
- "bare-os": "^3.5.0",
- "bare-pipe": "^4.0.0",
- "bare-signals": "^4.0.0",
- "bare-tty": "^5.0.0"
+ "browserslist": "^4.28.1"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/core-js"
}
},
- "node_modules/bare-punycode": {
- "version": "0.0.0",
- "resolved": "https://registry.npmjs.org/bare-punycode/-/bare-punycode-0.0.0.tgz",
- "integrity": "sha512-PC2Y6mGLytZPJCB9M7CvO5Zb6uWYVUZ+5t3L6vePFuFM6tdC6SsQ+sIsuf0Sa6LHBoWURX7I9yMMbPXMv7TIdQ==",
- "license": "Apache-2.0",
+ "node_modules/create-jest": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz",
+ "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "punycode": "^2.3.1"
+ "@jest/types": "^29.6.3",
+ "chalk": "^4.0.0",
+ "exit": "^0.1.2",
+ "graceful-fs": "^4.2.9",
+ "jest-config": "^29.7.0",
+ "jest-util": "^29.7.0",
+ "prompts": "^2.0.1"
+ },
+ "bin": {
+ "create-jest": "bin/create-jest.js"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
- "node_modules/bare-querystring": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/bare-querystring/-/bare-querystring-1.0.0.tgz",
- "integrity": "sha512-Kbqdjd4f1MxMtutXzraEKIXqXRfq9uWLwzUT5bLUh9TCiPznY9l6vHc4BUPNIa13DyH1VAlPy3iOxHzhqV2quQ==",
- "license": "Apache-2.0"
- },
- "node_modules/bare-readline": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/bare-readline/-/bare-readline-1.2.1.tgz",
- "integrity": "sha512-znH0bIYuGByDqoEvQ5wLK6651RaeN9tDJpvaV7V+/rGrHbIo0FBp0dvuo+TWs08d1VMvmfaGk6O7w/dyi30O8Q==",
- "license": "Apache-2.0",
+ "node_modules/cross-spawn": {
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
+ "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
+ "license": "MIT",
"dependencies": {
- "bare-ansi-escapes": "^2.0.0",
- "bare-stream": "^2.0.0"
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
}
},
- "node_modules/bare-realm": {
+ "node_modules/crypto-random-string": {
"version": "2.0.0",
- "resolved": "https://registry.npmjs.org/bare-realm/-/bare-realm-2.0.0.tgz",
- "integrity": "sha512-b01iOBrE/PpMsbIrQkqa9dQ3k8R6AKB7lRfbHXiKCzsQ/5vFYEtgLCdx5su+i9xK5yQtWIV3w41gQhksPCOXuQ==",
- "license": "Apache-2.0",
+ "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz",
+ "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==",
+ "license": "MIT",
+ "peer": true,
"engines": {
- "bare": ">=1.5.0"
+ "node": ">=8"
}
},
- "node_modules/bare-repl": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/bare-repl/-/bare-repl-6.0.1.tgz",
- "integrity": "sha512-dVPUM1UJX2nWTDY3omvrgLeC7IJy3hClxblAWf+dkegz8fh/F9tMs+sB5KCpeBSZ4qvAQv92C+XDtlePqE5sdQ==",
- "license": "Apache-2.0",
- "dependencies": {
- "bare-inspect": "^3.0.0",
- "bare-module": "^6.0.1",
- "bare-os": "^3.0.1",
- "bare-path": "^3.0.0",
- "bare-pipe": "^4.0.0",
- "bare-readline": "^1.0.0",
- "bare-stream": "^2.0.0",
- "bare-tty": "^5.0.0"
- }
+ "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,
+ "license": "MIT"
},
- "node_modules/bare-rpc": {
- "version": "0.2.13",
- "resolved": "https://registry.npmjs.org/bare-rpc/-/bare-rpc-0.2.13.tgz",
- "integrity": "sha512-wf0LjeM1juMOFlq7xEgRp2pMWQ/wsOSpW5tg38zC8KHacwnDGVBSgQN6VsI9rY13u2dWsmB9+E3njNUlosb12g==",
- "license": "Apache-2.0",
+ "node_modules/data-view-buffer": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz",
+ "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "b4a": "^1.6.6",
- "bare-stream": "^2.1.3",
- "compact-encoding": "^2.15.0",
- "safety-catch": "^1.0.2"
+ "call-bound": "^1.0.3",
+ "es-errors": "^1.3.0",
+ "is-data-view": "^1.0.2"
},
- "peerDependencies": {
- "bare-buffer": "*"
+ "engines": {
+ "node": ">= 0.4"
},
- "peerDependenciesMeta": {
- "bare-buffer": {
- "optional": true
- }
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/bare-semver": {
+ "node_modules/data-view-byte-length": {
"version": "1.0.2",
- "resolved": "https://registry.npmjs.org/bare-semver/-/bare-semver-1.0.2.tgz",
- "integrity": "sha512-ESVaN2nzWhcI5tf3Zzcq9aqCZ676VWzqw07eEZ0qxAcEOAFYBa0pWq8sK34OQeHLY3JsfKXZS9mDyzyxGjeLzA==",
- "license": "Apache-2.0"
+ "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz",
+ "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "es-errors": "^1.3.0",
+ "is-data-view": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/inspect-js"
+ }
},
- "node_modules/bare-signals": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/bare-signals/-/bare-signals-4.2.0.tgz",
- "integrity": "sha512-fNHMOdQIlYuTvMB3Oh9Apk99hLKn351+Ir8vz+khiPTcOqIyGG4uWWjdLTzxWdYGsA0eT+We3y0K74hjj2nq7A==",
- "license": "Apache-2.0",
+ "node_modules/data-view-byte-offset": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz",
+ "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "bare-events": "^2.5.3",
- "bare-os": "^3.3.1"
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "is-data-view": "^1.0.1"
},
"engines": {
- "bare": ">=1.7.0"
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/bare-stream": {
- "version": "2.7.0",
- "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.7.0.tgz",
- "integrity": "sha512-oyXQNicV1y8nc2aKffH+BUHFRXmx6VrPzlnaEvMhram0nPBrKcEdcyBg5r08D0i8VxngHFAiVyn1QKXpSG0B8A==",
- "license": "Apache-2.0",
+ "node_modules/debug": {
+ "version": "4.4.3",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
+ "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
+ "license": "MIT",
"dependencies": {
- "streamx": "^2.21.0"
+ "ms": "^2.1.3"
},
- "peerDependencies": {
- "bare-buffer": "*",
- "bare-events": "*"
+ "engines": {
+ "node": ">=6.0"
},
"peerDependenciesMeta": {
- "bare-buffer": {
- "optional": true
- },
- "bare-events": {
+ "supports-color": {
"optional": true
}
}
},
- "node_modules/bare-string-decoder": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/bare-string-decoder/-/bare-string-decoder-1.0.0.tgz",
- "integrity": "sha512-FjFvfHo88U7borNQSj9ijP2JTb1asqY6K28OZrix4dF9iZf5D2wi1+99CgLlHT3HtYqdwxRhDAiKu8rVstt5rQ==",
- "license": "Apache-2.0",
- "dependencies": {
- "text-decoder": "^1.2.3"
- },
+ "node_modules/dedent": {
+ "version": "1.7.1",
+ "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.7.1.tgz",
+ "integrity": "sha512-9JmrhGZpOlEgOLdQgSm0zxFaYoQon408V1v49aqTWuXENVlnCuY9JBZcXZiCsZQWDjTm5Qf/nIvAy77mXDAjEg==",
+ "dev": true,
+ "license": "MIT",
"peerDependencies": {
- "bare-buffer": "*"
+ "babel-plugin-macros": "^3.1.0"
},
"peerDependenciesMeta": {
- "bare-buffer": {
+ "babel-plugin-macros": {
"optional": true
}
}
},
- "node_modules/bare-structured-clone": {
- "version": "1.5.2",
- "resolved": "https://registry.npmjs.org/bare-structured-clone/-/bare-structured-clone-1.5.2.tgz",
- "integrity": "sha512-V5yevE00wUcmPGgk/O+bsEmuMRGRkwMW1Fncbl8cjH/Eu0+7g0oZSbN7oVGi19c8df9dn25NYymC0v03VVN70w==",
- "license": "Apache-2.0",
+ "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",
+ "peer": true,
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
+ "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/deepmerge": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz",
+ "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/defaults": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz",
+ "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==",
+ "license": "MIT",
+ "peer": true,
"dependencies": {
- "bare-type": "^1.1.0",
- "compact-encoding": "^2.15.0"
+ "clone": "^1.0.2"
},
- "engines": {
- "bare": ">=1.2.0"
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "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": {
+ "es-define-property": "^1.0.0",
+ "es-errors": "^1.3.0",
+ "gopd": "^1.0.1"
},
- "peerDependencies": {
- "bare-buffer": "*",
- "bare-url": "*"
+ "engines": {
+ "node": ">= 0.4"
},
- "peerDependenciesMeta": {
- "bare-buffer": {
- "optional": true
- },
- "bare-url": {
- "optional": true
- }
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/bare-subprocess": {
- "version": "5.2.2",
- "resolved": "https://registry.npmjs.org/bare-subprocess/-/bare-subprocess-5.2.2.tgz",
- "integrity": "sha512-L6oXgQ1aWs25RtG5Ky0bDD06p3RAcVVrDDMWb1DfXpHtyEWxamcyIWUbSykxMTWrpLlmSj6ytbb6yoKehGFfmw==",
- "license": "Apache-2.0",
+ "node_modules/define-lazy-prop": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz",
+ "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "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",
"dependencies": {
- "bare-env": "^3.0.0",
- "bare-events": "^2.5.4",
- "bare-os": "^3.0.1",
- "bare-pipe": "^4.0.0",
- "bare-url": "^2.2.2"
+ "define-data-property": "^1.0.1",
+ "has-property-descriptors": "^1.0.0",
+ "object-keys": "^1.1.1"
},
"engines": {
- "bare": ">=1.7.0"
- },
- "peerDependencies": {
- "bare-buffer": "*"
+ "node": ">= 0.4"
},
- "peerDependenciesMeta": {
- "bare-buffer": {
- "optional": true
- }
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/bare-system-logger": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/bare-system-logger/-/bare-system-logger-1.0.2.tgz",
- "integrity": "sha512-J9IL6aDQzIMYqaQkS8gSmw8VOJtaOVRZ6s5Jnqe/0c6JbSL0Cao+Dyei+weTV7JZoQS7ObMjwmaKSsNIwmWubQ==",
- "license": "Apache-2.0",
- "dependencies": {
- "bare-logger": "^2.0.0"
+ "node_modules/depd": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
+ "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/destroy": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
+ "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8",
+ "npm": "1.2.8000 || >= 1.4.16"
}
},
- "node_modules/bare-tcp": {
- "version": "2.2.2",
- "resolved": "https://registry.npmjs.org/bare-tcp/-/bare-tcp-2.2.2.tgz",
- "integrity": "sha512-bYnw1AhzGlfLOD4nTceUXkhhgznZKvDuwjX1Au0VWaVitwqG40oaTvvhEQVCcK3FEwjRTiukUzHnAFsYXUI+3Q==",
+ "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",
+ "peer": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/detect-newline": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz",
+ "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/diff-sequences": {
+ "version": "29.6.3",
+ "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz",
+ "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/dir-glob": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
+ "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "bare-dns": "^2.0.4",
- "bare-events": "^2.5.4",
- "bare-stream": "^2.6.4"
+ "path-type": "^4.0.0"
},
"engines": {
- "bare": ">=1.16.0"
+ "node": ">=8"
}
},
- "node_modules/bare-thread": {
- "version": "1.1.5",
- "resolved": "https://registry.npmjs.org/bare-thread/-/bare-thread-1.1.5.tgz",
- "integrity": "sha512-f8ne/1Q5uXGbY17RRc+SwLBIeRh9K5am1sjAoR52/eRVlRkRAN2VBjdZOkxSALThxCKSISE9765UL2E4yWeDXw==",
+ "node_modules/doctrine": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
+ "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
+ "dev": true,
"license": "Apache-2.0",
"dependencies": {
- "bare-bundle": "^1.9.0",
- "bare-module-resolve": "^1.11.2",
- "bare-module-traverse": "^2.0.0"
+ "esutils": "^2.0.2"
+ },
+ "engines": {
+ "node": ">=6.0.0"
}
},
- "node_modules/bare-timers": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/bare-timers/-/bare-timers-3.2.0.tgz",
- "integrity": "sha512-pBeQu+mUJzT5en5kxA6C6lJuu/9pcIcGhlqbVXXn61CETzRs9vepOMS3hXl82vFlsg3/ggtG36Q+7OZ4IP2MPw==",
- "license": "Apache-2.0",
+ "node_modules/dotenv": {
+ "version": "16.4.7",
+ "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.7.tgz",
+ "integrity": "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==",
+ "license": "BSD-2-Clause",
+ "peer": true,
"engines": {
- "bare": ">=1.7.0"
- },
- "peerDependencies": {
- "bare-abort-controller": "*"
+ "node": ">=12"
},
- "peerDependenciesMeta": {
- "bare-abort-controller": {
- "optional": true
- }
+ "funding": {
+ "url": "https://dotenvx.com"
}
},
- "node_modules/bare-tls": {
- "version": "2.1.7",
- "resolved": "https://registry.npmjs.org/bare-tls/-/bare-tls-2.1.7.tgz",
- "integrity": "sha512-h6wcNXQdBeTX7fed9tjPp0/9cA/QfcBTv3ItgjnbUk4rWAU8bEFalZCZnUDdCK/t9zrNfJ+yvcPx4D/1Y6biyA==",
- "license": "Apache-2.0",
+ "node_modules/dotenv-expand": {
+ "version": "11.0.7",
+ "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-11.0.7.tgz",
+ "integrity": "sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA==",
+ "license": "BSD-2-Clause",
+ "peer": true,
"dependencies": {
- "bare-net": "^2.0.1",
- "bare-stream": "^2.6.4"
+ "dotenv": "^16.4.5"
},
"engines": {
- "bare": ">=1.7.0"
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://dotenvx.com"
}
},
- "node_modules/bare-tty": {
- "version": "5.0.3",
- "resolved": "https://registry.npmjs.org/bare-tty/-/bare-tty-5.0.3.tgz",
- "integrity": "sha512-jW24RBWRZOMHuSEWC9mh8wUKO5WUNl0UWUTNPn3yZ8qkOqwa8vaV2dR3a+BvblONPk7V35wuvK9P8508+judAg==",
- "license": "Apache-2.0",
+ "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": {
- "bare-events": "^2.2.0",
- "bare-signals": "^4.0.0",
- "bare-stream": "^2.0.0"
+ "call-bind-apply-helpers": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "gopd": "^1.2.0"
},
"engines": {
- "bare": ">=1.16.0"
+ "node": ">= 0.4"
}
},
- "node_modules/bare-type": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/bare-type/-/bare-type-1.1.0.tgz",
- "integrity": "sha512-LdtnnEEYldOc87Dr4GpsKnStStZk3zfgoEMXy8yvEZkXrcCv9RtYDrUYWFsBQHtaB0s1EUWmcvS6XmEZYIj3Bw==",
- "license": "Apache-2.0",
+ "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==",
+ "license": "MIT"
+ },
+ "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==",
+ "license": "ISC"
+ },
+ "node_modules/emittery": {
+ "version": "0.13.1",
+ "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz",
+ "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==",
+ "dev": true,
+ "license": "MIT",
"engines": {
- "bare": ">=1.2.0"
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sindresorhus/emittery?sponsor=1"
}
},
- "node_modules/bare-url": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/bare-url/-/bare-url-2.3.2.tgz",
- "integrity": "sha512-ZMq4gd9ngV5aTMa5p9+UfY0b3skwhHELaDkhEHetMdX0LRkW9kzaym4oo/Eh+Ghm0CCDuMTsRIGM/ytUc1ZYmw==",
- "license": "Apache-2.0",
- "dependencies": {
- "bare-path": "^3.0.0"
- }
+ "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"
},
- "node_modules/bare-utils": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/bare-utils/-/bare-utils-1.5.1.tgz",
- "integrity": "sha512-mxCkFvmDU3mlD/mb+pT64kKXOsx2KMsWLQbngN1LB+NOXfhfnRnyvpy3VZc6m7gzQxe57Bsi+aTCBqA4/S3elQ==",
- "license": "Apache-2.0",
- "dependencies": {
- "bare-debug-log": "^2.0.0",
- "bare-encoding": "^1.0.0",
- "bare-format": "^1.0.0",
- "bare-inspect": "^3.0.0",
- "bare-type": "^1.0.6"
+ "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",
+ "engines": {
+ "node": ">= 0.8"
}
},
- "node_modules/bare-v8": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/bare-v8/-/bare-v8-1.0.1.tgz",
- "integrity": "sha512-/cR5ZvFWQRdtTZ4tx0j7TKvTWce8UnnLqm88fwHtJmfM7HODIBVjQGDT7KkDLeD2d/eHP2pzB71Y8/QyiMMKrQ==",
- "license": "Apache-2.0"
- },
- "node_modules/bare-v8-to-istanbul": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/bare-v8-to-istanbul/-/bare-v8-to-istanbul-1.0.2.tgz",
- "integrity": "sha512-CM0wPgyQtXTQ7h4q8NjbTZ/FH5he0Jkiwgpq0lFZZA5tkVZzmQ/9ul4R7E+cNlGZJIZlQZ9v4CwbgVaFG3zOAA==",
- "license": "Apache-2.0",
- "dependencies": {
- "bare-assert": "^1.0.2",
- "bare-fs": "^4.1.2",
- "bare-module": "^6.1.2",
- "bare-path": "^3.0.0",
- "bare-process": "^4.2.0",
- "bare-url": "^2.1.5",
- "bare-utils": "^1.2.0",
- "v8-to-istanbul": "^9.3.0",
- "which-runtime": "^1.2.1"
+ "node_modules/env-editor": {
+ "version": "0.4.2",
+ "resolved": "https://registry.npmjs.org/env-editor/-/env-editor-0.4.2.tgz",
+ "integrity": "sha512-ObFo8v4rQJAE59M69QzwloxPZtd33TpYEIjtKD1rrFDcM1Gd7IkDxEBU+HriziN6HSHQnBJi8Dmy+JWkav5HKA==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=8"
}
},
- "node_modules/bare-vm": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/bare-vm/-/bare-vm-1.0.1.tgz",
- "integrity": "sha512-yLnbRvKt3AhRTmtfTIrYfdTHqGEfIJc+Fgb2DcHejE0HJ+p5adGxxPMvd3893Z7iXVYnalxukNARn4oJSZELHQ==",
- "license": "Apache-2.0",
+ "node_modules/error-ex": {
+ "version": "1.3.4",
+ "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz",
+ "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "bare-realm": "^2.0.0"
+ "is-arrayish": "^0.2.1"
}
},
- "node_modules/bare-worker": {
- "version": "4.1.5",
- "resolved": "https://registry.npmjs.org/bare-worker/-/bare-worker-4.1.5.tgz",
- "integrity": "sha512-iJTSCkcASWO5OxlVHWGBTUbMAhhlJDwHByAwjPcSUqEpDbKbubciqm6kHtopEahQX2ED45nfkZDP2dNOcqR+Yg==",
- "license": "Apache-2.0",
+ "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==",
+ "license": "MIT",
"dependencies": {
- "bare-channel": "^5.1.5",
- "bare-events": "^2.2.1",
- "bare-module": "^6.0.1",
- "bare-thread": "^1.1.3"
+ "stackframe": "^1.3.4"
}
},
- "node_modules/bare-ws": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/bare-ws/-/bare-ws-2.0.4.tgz",
- "integrity": "sha512-SQMXzBYna9dRj57Dz1/ag+VWHCRXbfCjMHgyfM2F2lhkVLzMjnVSZP72aVeFWPFqe494Rd70Kzhe2JElGwFlJQ==",
- "license": "Apache-2.0",
+ "node_modules/es-abstract": {
+ "version": "1.24.1",
+ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.1.tgz",
+ "integrity": "sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "bare-crypto": "^1.2.0",
- "bare-events": "^2.3.1",
- "bare-http1": "^4.0.0",
- "bare-https": "^2.0.0",
- "bare-stream": "^2.1.2"
+ "array-buffer-byte-length": "^1.0.2",
+ "arraybuffer.prototype.slice": "^1.0.4",
+ "available-typed-arrays": "^1.0.7",
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.4",
+ "data-view-buffer": "^1.0.2",
+ "data-view-byte-length": "^1.0.2",
+ "data-view-byte-offset": "^1.0.1",
+ "es-define-property": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.1.1",
+ "es-set-tostringtag": "^2.1.0",
+ "es-to-primitive": "^1.3.0",
+ "function.prototype.name": "^1.1.8",
+ "get-intrinsic": "^1.3.0",
+ "get-proto": "^1.0.1",
+ "get-symbol-description": "^1.1.0",
+ "globalthis": "^1.0.4",
+ "gopd": "^1.2.0",
+ "has-property-descriptors": "^1.0.2",
+ "has-proto": "^1.2.0",
+ "has-symbols": "^1.1.0",
+ "hasown": "^2.0.2",
+ "internal-slot": "^1.1.0",
+ "is-array-buffer": "^3.0.5",
+ "is-callable": "^1.2.7",
+ "is-data-view": "^1.0.2",
+ "is-negative-zero": "^2.0.3",
+ "is-regex": "^1.2.1",
+ "is-set": "^2.0.3",
+ "is-shared-array-buffer": "^1.0.4",
+ "is-string": "^1.1.1",
+ "is-typed-array": "^1.1.15",
+ "is-weakref": "^1.1.1",
+ "math-intrinsics": "^1.1.0",
+ "object-inspect": "^1.13.4",
+ "object-keys": "^1.1.1",
+ "object.assign": "^4.1.7",
+ "own-keys": "^1.0.1",
+ "regexp.prototype.flags": "^1.5.4",
+ "safe-array-concat": "^1.1.3",
+ "safe-push-apply": "^1.0.0",
+ "safe-regex-test": "^1.1.0",
+ "set-proto": "^1.0.0",
+ "stop-iteration-iterator": "^1.1.0",
+ "string.prototype.trim": "^1.2.10",
+ "string.prototype.trimend": "^1.0.9",
+ "string.prototype.trimstart": "^1.0.8",
+ "typed-array-buffer": "^1.0.3",
+ "typed-array-byte-length": "^1.0.3",
+ "typed-array-byte-offset": "^1.0.4",
+ "typed-array-length": "^1.0.7",
+ "unbox-primitive": "^1.1.0",
+ "which-typed-array": "^1.1.19"
},
- "peerDependencies": {
- "bare-buffer": "*",
- "bare-url": "*"
+ "engines": {
+ "node": ">= 0.4"
},
- "peerDependenciesMeta": {
- "bare-buffer": {
- "optional": true
- },
- "bare-url": {
- "optional": true
- }
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/bare-zlib": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/bare-zlib/-/bare-zlib-1.3.1.tgz",
- "integrity": "sha512-VP93GFzhrTdWh9mXNocn7XsP/nF5JQluiiSsbTvsQ4yIYlhEHRMF9lQmZZDXwzK9PNYaVGUV1bdQuqp0Mj7MHw==",
- "license": "Apache-2.0",
- "dependencies": {
- "bare-stream": "^2.0.0"
+ "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",
+ "engines": {
+ "node": ">= 0.4"
}
},
- "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/baseline-browser-mapping": {
- "version": "2.9.14",
- "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.14.tgz",
- "integrity": "sha512-B0xUquLkiGLgHhpPBqvl7GWegWBUNuujQ6kXd/r1U38ElPT6Ok8KZ8e+FpUGEc2ZoRQUzq/aUnaKFc/svWUGSg==",
- "license": "Apache-2.0",
- "bin": {
- "baseline-browser-mapping": "dist/cli.js"
+ "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",
+ "engines": {
+ "node": ">= 0.4"
}
},
- "node_modules/better-opn": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/better-opn/-/better-opn-3.0.2.tgz",
- "integrity": "sha512-aVNobHnJqLiUelTaHat9DZ1qM2w0C0Eym4LPI/3JxOnSokGVdsl1T1kN7TFvsEAD8G47A6VKQ0TVHqbBnYMJlQ==",
+ "node_modules/es-iterator-helpers": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.2.tgz",
+ "integrity": "sha512-BrUQ0cPTB/IwXj23HtwHjS9n7O4h9FX94b4xc5zlTHxeLgTAdzYUDyy6KdExAl9lbN5rtfe44xpjpmj9grxs5w==",
+ "dev": true,
"license": "MIT",
- "peer": true,
"dependencies": {
- "open": "^8.0.4"
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.4",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.24.1",
+ "es-errors": "^1.3.0",
+ "es-set-tostringtag": "^2.1.0",
+ "function-bind": "^1.1.2",
+ "get-intrinsic": "^1.3.0",
+ "globalthis": "^1.0.4",
+ "gopd": "^1.2.0",
+ "has-property-descriptors": "^1.0.2",
+ "has-proto": "^1.2.0",
+ "has-symbols": "^1.1.0",
+ "internal-slot": "^1.1.0",
+ "iterator.prototype": "^1.1.5",
+ "safe-array-concat": "^1.1.3"
},
"engines": {
- "node": ">=12.0.0"
+ "node": ">= 0.4"
}
},
- "node_modules/better-opn/node_modules/open": {
- "version": "8.4.2",
- "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz",
- "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==",
+ "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",
- "peer": true,
"dependencies": {
- "define-lazy-prop": "^2.0.0",
- "is-docker": "^2.1.1",
- "is-wsl": "^2.2.0"
- },
- "engines": {
- "node": ">=12"
+ "es-errors": "^1.3.0"
},
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/big-integer": {
- "version": "1.6.52",
- "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz",
- "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==",
- "license": "Unlicense",
- "peer": true,
"engines": {
- "node": ">=0.6"
+ "node": ">= 0.4"
}
},
- "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",
+ "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==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "@noble/hashes": "^1.2.0"
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.6",
+ "has-tostringtag": "^1.0.2",
+ "hasown": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
}
},
- "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/bplist-creator": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/bplist-creator/-/bplist-creator-0.1.0.tgz",
- "integrity": "sha512-sXaHZicyEEmY86WyueLTQesbeoH/mquvarJaQNbjuOQO+7gbFcDEWqKmcWA4cOTLzFlfgvkiVxolk1k5bBIpmg==",
+ "node_modules/es-shim-unscopables": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz",
+ "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==",
+ "dev": true,
"license": "MIT",
- "peer": true,
"dependencies": {
- "stream-buffers": "2.2.x"
+ "hasown": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
}
},
- "node_modules/bplist-parser": {
- "version": "0.3.2",
- "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.2.tgz",
- "integrity": "sha512-apC2+fspHGI3mMKj+dGevkGo/tCqVB8jMb6i+OX+E29p0Iposz07fABkRIfVUPNd5A5VbuOz1bZbnmkKLYF+wQ==",
+ "node_modules/es-to-primitive": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz",
+ "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==",
+ "dev": true,
"license": "MIT",
- "peer": true,
"dependencies": {
- "big-integer": "1.6.x"
+ "is-callable": "^1.2.7",
+ "is-date-object": "^1.0.5",
+ "is-symbol": "^1.0.4"
},
"engines": {
- "node": ">= 5.10.0"
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "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==",
+ "node_modules/escalade": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
+ "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
"license": "MIT",
- "peer": true,
- "dependencies": {
- "balanced-match": "^1.0.0"
+ "engines": {
+ "node": ">=6"
}
},
- "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/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"
+ },
+ "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",
- "dependencies": {
- "fill-range": "^7.1.1"
- },
"engines": {
- "node": ">=8"
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/brittle": {
- "version": "3.19.1",
- "resolved": "https://registry.npmjs.org/brittle/-/brittle-3.19.1.tgz",
- "integrity": "sha512-4Ted1Mt9o9B6oIA6ImJJCtB/Fv++ZO3IDNQgRcHOXWSYGRUidgxchaGrUBaRn+4mlneXrgInPkCPzi0jO8qKbA==",
- "license": "Apache-2.0",
+ "node_modules/eslint": {
+ "version": "8.57.1",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz",
+ "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==",
+ "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "b4a": "^1.6.0",
- "bare-assert": "^1.0.2",
- "bare-cov": "^1.1.0",
- "bare-fs": "^4.1.6",
- "bare-os": "^3.6.1",
- "bare-path": "^3.0.0",
- "bare-process": "^4.2.1",
- "bare-subprocess": "^5.0.0",
- "bare-url": "^2.1.6",
- "error-stack-parser": "^2.1.4",
- "globbie": "^1.0.2",
- "paparam": "^1.6.2",
- "same-object": "^1.0.2",
- "test-tmp": "^1.4.0",
- "tmatch": "^5.0.0"
+ "@eslint-community/eslint-utils": "^4.2.0",
+ "@eslint-community/regexpp": "^4.6.1",
+ "@eslint/eslintrc": "^2.1.4",
+ "@eslint/js": "8.57.1",
+ "@humanwhocodes/config-array": "^0.13.0",
+ "@humanwhocodes/module-importer": "^1.0.1",
+ "@nodelib/fs.walk": "^1.2.8",
+ "@ungap/structured-clone": "^1.2.0",
+ "ajv": "^6.12.4",
+ "chalk": "^4.0.0",
+ "cross-spawn": "^7.0.2",
+ "debug": "^4.3.2",
+ "doctrine": "^3.0.0",
+ "escape-string-regexp": "^4.0.0",
+ "eslint-scope": "^7.2.2",
+ "eslint-visitor-keys": "^3.4.3",
+ "espree": "^9.6.1",
+ "esquery": "^1.4.2",
+ "esutils": "^2.0.2",
+ "fast-deep-equal": "^3.1.3",
+ "file-entry-cache": "^6.0.1",
+ "find-up": "^5.0.0",
+ "glob-parent": "^6.0.2",
+ "globals": "^13.19.0",
+ "graphemer": "^1.4.0",
+ "ignore": "^5.2.0",
+ "imurmurhash": "^0.1.4",
+ "is-glob": "^4.0.0",
+ "is-path-inside": "^3.0.3",
+ "js-yaml": "^4.1.0",
+ "json-stable-stringify-without-jsonify": "^1.0.1",
+ "levn": "^0.4.1",
+ "lodash.merge": "^4.6.2",
+ "minimatch": "^3.1.2",
+ "natural-compare": "^1.4.0",
+ "optionator": "^0.9.3",
+ "strip-ansi": "^6.0.1",
+ "text-table": "^0.2.0"
},
"bin": {
- "brittle": "bin/node.js",
- "brittle-bare": "bin/bare.js",
- "brittle-node": "bin/node.js",
- "brittle-pear": "bin/pear.js"
+ "eslint": "bin/eslint.js"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
}
},
- "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/browserslist": {
- "version": "4.28.1",
- "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz",
- "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==",
+ "node_modules/eslint-config-standard": {
+ "version": "17.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-17.0.0.tgz",
+ "integrity": "sha512-/2ks1GKyqSOkH7JFvXJicu0iMpoojkwB+f5Du/1SC0PtBL+s8v30k9njRZ21pm2drKYm2342jFnGWzttxPmZVg==",
+ "dev": true,
"funding": [
{
- "type": "opencollective",
- "url": "https://opencollective.com/browserslist"
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
},
{
- "type": "tidelift",
- "url": "https://tidelift.com/funding/github/npm/browserslist"
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
},
{
- "type": "github",
- "url": "https://github.com/sponsors/ai"
+ "type": "consulting",
+ "url": "https://feross.org/support"
}
],
"license": "MIT",
- "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"
+ "peerDependencies": {
+ "eslint": "^8.0.1",
+ "eslint-plugin-import": "^2.25.2",
+ "eslint-plugin-n": "^15.0.0",
+ "eslint-plugin-promise": "^6.0.0"
}
},
- "node_modules/bs-logger": {
- "version": "0.2.6",
- "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz",
- "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==",
+ "node_modules/eslint-config-standard-jsx": {
+ "version": "11.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-config-standard-jsx/-/eslint-config-standard-jsx-11.0.0.tgz",
+ "integrity": "sha512-+1EV/R0JxEK1L0NGolAr8Iktm3Rgotx3BKwgaX+eAuSX8D952LULKtjgZD3F+e6SvibONnhLwoTi9DPxN5LvvQ==",
"dev": true,
- "license": "MIT",
- "dependencies": {
- "fast-json-stable-stringify": "2.x"
- },
- "engines": {
- "node": ">= 6"
- }
- },
- "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",
- "dependencies": {
- "node-int64": "^0.4.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",
@@ -5907,1335 +5930,1461 @@
}
],
"license": "MIT",
- "dependencies": {
- "base64-js": "^1.3.1",
- "ieee754": "^1.2.1"
+ "peerDependencies": {
+ "eslint": "^8.8.0",
+ "eslint-plugin-react": "^7.28.0"
}
},
- "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"
- },
- "node_modules/bufferutil": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.1.0.tgz",
- "integrity": "sha512-ZMANVnAixE6AWWnPzlW2KpUrxhm9woycYvPOo67jWHyFowASTEd9s+QN1EIMsSDtwhIxN4sWE1jotpuDUIgyIw==",
- "hasInstallScript": true,
+ "node_modules/eslint-config-standard-with-typescript": {
+ "version": "23.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-config-standard-with-typescript/-/eslint-config-standard-with-typescript-23.0.0.tgz",
+ "integrity": "sha512-iaaWifImn37Z1OXbNW1es7KI+S7D408F9ys0bpaQf2temeBWlvb0Nc5qHkOgYaRb5QxTZT32GGeN1gtswASOXA==",
+ "deprecated": "Please use eslint-config-love, instead.",
+ "dev": true,
"license": "MIT",
"dependencies": {
- "node-gyp-build": "^4.3.0"
+ "@typescript-eslint/parser": "^5.0.0",
+ "eslint-config-standard": "17.0.0"
},
- "engines": {
- "node": ">=6.14.2"
+ "peerDependencies": {
+ "@typescript-eslint/eslint-plugin": "^5.0.0",
+ "eslint": "^8.0.1",
+ "eslint-plugin-import": "^2.25.2",
+ "eslint-plugin-n": "^15.0.0",
+ "eslint-plugin-promise": "^6.0.0",
+ "typescript": "*"
}
},
- "node_modules/bytes": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
- "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
+ "node_modules/eslint-import-resolver-node": {
+ "version": "0.3.9",
+ "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz",
+ "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==",
+ "dev": true,
"license": "MIT",
- "peer": true,
- "engines": {
- "node": ">= 0.8"
+ "dependencies": {
+ "debug": "^3.2.7",
+ "is-core-module": "^2.13.0",
+ "resolve": "^1.22.4"
}
},
- "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==",
+ "node_modules/eslint-import-resolver-node/node_modules/debug": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+ "dev": true,
"license": "MIT",
"dependencies": {
- "es-errors": "^1.3.0",
- "function-bind": "^1.1.2"
- },
- "engines": {
- "node": ">= 0.4"
+ "ms": "^2.1.1"
}
},
- "node_modules/callsites": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
- "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
+ "node_modules/eslint-module-utils": {
+ "version": "2.12.1",
+ "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.1.tgz",
+ "integrity": "sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==",
"dev": true,
"license": "MIT",
+ "dependencies": {
+ "debug": "^3.2.7"
+ },
"engines": {
- "node": ">=6"
+ "node": ">=4"
+ },
+ "peerDependenciesMeta": {
+ "eslint": {
+ "optional": true
+ }
}
},
- "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/eslint-module-utils/node_modules/debug": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+ "dev": true,
"license": "MIT",
- "engines": {
- "node": ">=6"
+ "dependencies": {
+ "ms": "^2.1.1"
}
},
- "node_modules/caniuse-lite": {
- "version": "1.0.30001764",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001764.tgz",
- "integrity": "sha512-9JGuzl2M+vPL+pz70gtMF9sHdMFbY9FJaQBi186cHKH3pSzDvzoUJUPV6fqiKIMyXbud9ZLg4F3Yza1vJ1+93g==",
- "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/case-anything": {
- "version": "2.1.13",
- "resolved": "https://registry.npmjs.org/case-anything/-/case-anything-2.1.13.tgz",
- "integrity": "sha512-zlOQ80VrQ2Ue+ymH5OuM/DlDq64mEm+B9UTdHULv5osUMD6HalNTblf2b1u/m6QecjsnOkBpqVZ+XPwIVsy7Ng==",
+ "node_modules/eslint-plugin-es": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-4.1.0.tgz",
+ "integrity": "sha512-GILhQTnjYE2WorX5Jyi5i4dz5ALWxBIdQECVQavL6s7cI76IZTDWleTHkxz/QT3kvcs2QlGHvKLYsSlPOlPXnQ==",
+ "dev": true,
"license": "MIT",
+ "dependencies": {
+ "eslint-utils": "^2.0.0",
+ "regexpp": "^3.0.0"
+ },
"engines": {
- "node": ">=12.13"
+ "node": ">=8.10.0"
},
"funding": {
- "url": "https://github.com/sponsors/mesqueeb"
+ "url": "https://github.com/sponsors/mysticatea"
+ },
+ "peerDependencies": {
+ "eslint": ">=4.19.1"
}
},
- "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/eslint-plugin-es/node_modules/eslint-utils": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz",
+ "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==",
+ "dev": true,
"license": "MIT",
"dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
+ "eslint-visitor-keys": "^1.1.0"
},
"engines": {
- "node": ">=10"
+ "node": ">=6"
},
"funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
+ "url": "https://github.com/sponsors/mysticatea"
}
},
- "node_modules/char-regex": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz",
- "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==",
+ "node_modules/eslint-plugin-es/node_modules/eslint-visitor-keys": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
+ "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
"dev": true,
- "license": "MIT",
+ "license": "Apache-2.0",
"engines": {
- "node": ">=10"
+ "node": ">=4"
}
},
- "node_modules/chownr": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz",
- "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==",
- "license": "BlueOak-1.0.0",
- "peer": true,
+ "node_modules/eslint-plugin-import": {
+ "version": "2.32.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz",
+ "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@rtsao/scc": "^1.1.0",
+ "array-includes": "^3.1.9",
+ "array.prototype.findlastindex": "^1.2.6",
+ "array.prototype.flat": "^1.3.3",
+ "array.prototype.flatmap": "^1.3.3",
+ "debug": "^3.2.7",
+ "doctrine": "^2.1.0",
+ "eslint-import-resolver-node": "^0.3.9",
+ "eslint-module-utils": "^2.12.1",
+ "hasown": "^2.0.2",
+ "is-core-module": "^2.16.1",
+ "is-glob": "^4.0.3",
+ "minimatch": "^3.1.2",
+ "object.fromentries": "^2.0.8",
+ "object.groupby": "^1.0.3",
+ "object.values": "^1.2.1",
+ "semver": "^6.3.1",
+ "string.prototype.trimend": "^1.0.9",
+ "tsconfig-paths": "^3.15.0"
+ },
"engines": {
- "node": ">=18"
+ "node": ">=4"
+ },
+ "peerDependencies": {
+ "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9"
}
},
- "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",
+ "node_modules/eslint-plugin-import/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": {
- "@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"
- },
- "engines": {
- "node": ">=12.13.0"
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
}
},
- "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==",
+ "node_modules/eslint-plugin-import/node_modules/debug": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.1"
+ }
+ },
+ "node_modules/eslint-plugin-import/node_modules/doctrine": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
+ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+ "dev": true,
"license": "Apache-2.0",
"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"
+ "esutils": "^2.0.2"
+ },
+ "engines": {
+ "node": ">=0.10.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"
- }
- ],
- "license": "MIT",
+ "node_modules/eslint-plugin-import/node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
"engines": {
- "node": ">=8"
+ "node": "*"
}
},
- "node_modules/cjs-module-lexer": {
- "version": "1.4.3",
- "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz",
- "integrity": "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==",
- "license": "MIT"
+ "node_modules/eslint-plugin-import/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
},
- "node_modules/cli-cursor": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz",
- "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==",
+ "node_modules/eslint-plugin-n": {
+ "version": "15.7.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-15.7.0.tgz",
+ "integrity": "sha512-jDex9s7D/Qial8AGVIHq4W7NswpUD5DPDL2RH8Lzd9EloWUuvUkHfv4FRLMipH5q2UtyurorBkPeNi1wVWNh3Q==",
+ "dev": true,
"license": "MIT",
- "peer": true,
"dependencies": {
- "restore-cursor": "^2.0.0"
+ "builtins": "^5.0.1",
+ "eslint-plugin-es": "^4.1.0",
+ "eslint-utils": "^3.0.0",
+ "ignore": "^5.1.1",
+ "is-core-module": "^2.11.0",
+ "minimatch": "^3.1.2",
+ "resolve": "^1.22.1",
+ "semver": "^7.3.8"
},
"engines": {
- "node": ">=4"
+ "node": ">=12.22.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/mysticatea"
+ },
+ "peerDependencies": {
+ "eslint": ">=7.0.0"
}
},
- "node_modules/cli-spinners": {
- "version": "2.9.2",
- "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz",
- "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==",
+ "node_modules/eslint-plugin-n/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",
- "peer": true,
- "engines": {
- "node": ">=6"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
}
},
- "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==",
+ "node_modules/eslint-plugin-n/node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
"license": "ISC",
"dependencies": {
- "string-width": "^4.2.0",
- "strip-ansi": "^6.0.1",
- "wrap-ansi": "^7.0.0"
+ "brace-expansion": "^1.1.7"
},
"engines": {
- "node": ">=12"
+ "node": "*"
}
},
- "node_modules/clone": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
- "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==",
- "license": "MIT",
- "peer": true,
+ "node_modules/eslint-plugin-promise": {
+ "version": "6.6.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.6.0.tgz",
+ "integrity": "sha512-57Zzfw8G6+Gq7axm2Pdo3gW/Rx3h9Yywgn61uE/3elTCOePEHVrn2i5CdfBwA1BLK0Q0WqctICIUSqXZW/VprQ==",
+ "dev": true,
+ "license": "ISC",
"engines": {
- "node": ">=0.8"
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0"
}
},
- "node_modules/co": {
- "version": "4.6.0",
- "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
- "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==",
+ "node_modules/eslint-plugin-react": {
+ "version": "7.37.5",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz",
+ "integrity": "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==",
"dev": true,
"license": "MIT",
+ "dependencies": {
+ "array-includes": "^3.1.8",
+ "array.prototype.findlast": "^1.2.5",
+ "array.prototype.flatmap": "^1.3.3",
+ "array.prototype.tosorted": "^1.1.4",
+ "doctrine": "^2.1.0",
+ "es-iterator-helpers": "^1.2.1",
+ "estraverse": "^5.3.0",
+ "hasown": "^2.0.2",
+ "jsx-ast-utils": "^2.4.1 || ^3.0.0",
+ "minimatch": "^3.1.2",
+ "object.entries": "^1.1.9",
+ "object.fromentries": "^2.0.8",
+ "object.values": "^1.2.1",
+ "prop-types": "^15.8.1",
+ "resolve": "^2.0.0-next.5",
+ "semver": "^6.3.1",
+ "string.prototype.matchall": "^4.0.12",
+ "string.prototype.repeat": "^1.0.0"
+ },
"engines": {
- "iojs": ">= 1.0.0",
- "node": ">= 0.12.0"
+ "node": ">=4"
+ },
+ "peerDependencies": {
+ "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7"
}
},
- "node_modules/collect-v8-coverage": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.3.tgz",
- "integrity": "sha512-1L5aqIkwPfiodaMgQunkF1zRhNqifHBmtbbbxcr6yVxxBnliw4TDOW6NxpO8DJLgJ16OT+Y4ztZqP6p/FtXnAw==",
+ "node_modules/eslint-plugin-react/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"
- },
- "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==",
"license": "MIT",
"dependencies": {
- "color-name": "~1.1.4"
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/eslint-plugin-react/node_modules/doctrine": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
+ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "esutils": "^2.0.2"
},
"engines": {
- "node": ">=7.0.0"
+ "node": ">=0.10.0"
}
},
- "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==",
- "license": "MIT"
- },
- "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==",
- "license": "MIT",
+ "node_modules/eslint-plugin-react/node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "license": "ISC",
"dependencies": {
- "delayed-stream": "~1.0.0"
+ "brace-expansion": "^1.1.7"
},
"engines": {
- "node": ">= 0.8"
+ "node": "*"
}
},
- "node_modules/commander": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz",
- "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==",
+ "node_modules/eslint-plugin-react/node_modules/resolve": {
+ "version": "2.0.0-next.5",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz",
+ "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==",
+ "dev": true,
"license": "MIT",
- "peer": true,
- "engines": {
- "node": ">= 10"
+ "dependencies": {
+ "is-core-module": "^2.13.0",
+ "path-parse": "^1.0.7",
+ "supports-preserve-symlinks-flag": "^1.0.0"
+ },
+ "bin": {
+ "resolve": "bin/resolve"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/compact-encoding": {
- "version": "2.18.0",
- "resolved": "https://registry.npmjs.org/compact-encoding/-/compact-encoding-2.18.0.tgz",
- "integrity": "sha512-goACAOlhMI2xo5jGOMUDfOLnGdRE1jGfyZ+zie8N5114nHrbPIqf6GLUtzbLof6DSyrERlYRm3EcBplte5LcQw==",
- "license": "Apache-2.0",
- "dependencies": {
- "b4a": "^1.3.0"
+ "node_modules/eslint-plugin-react/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
}
},
- "node_modules/compressible": {
- "version": "2.0.18",
- "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz",
- "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==",
- "license": "MIT",
- "peer": true,
+ "node_modules/eslint-scope": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
+ "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
+ "dev": true,
+ "license": "BSD-2-Clause",
"dependencies": {
- "mime-db": ">= 1.43.0 < 2"
+ "esrecurse": "^4.3.0",
+ "estraverse": "^4.1.1"
},
"engines": {
- "node": ">= 0.6"
+ "node": ">=8.0.0"
}
},
- "node_modules/compression": {
- "version": "1.8.1",
- "resolved": "https://registry.npmjs.org/compression/-/compression-1.8.1.tgz",
- "integrity": "sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w==",
+ "node_modules/eslint-scope/node_modules/estraverse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
+ "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/eslint-utils": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz",
+ "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==",
+ "dev": true,
"license": "MIT",
- "peer": true,
"dependencies": {
- "bytes": "3.1.2",
- "compressible": "~2.0.18",
- "debug": "2.6.9",
- "negotiator": "~0.6.4",
- "on-headers": "~1.1.0",
- "safe-buffer": "5.2.1",
- "vary": "~1.1.2"
+ "eslint-visitor-keys": "^2.0.0"
},
"engines": {
- "node": ">= 0.8.0"
+ "node": "^10.0.0 || ^12.0.0 || >= 14.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/mysticatea"
+ },
+ "peerDependencies": {
+ "eslint": ">=5"
}
},
- "node_modules/compression/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",
- "peer": true,
- "dependencies": {
- "ms": "2.0.0"
+ "node_modules/eslint-utils/node_modules/eslint-visitor-keys": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz",
+ "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=10"
}
},
- "node_modules/compression/node_modules/ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
- "license": "MIT",
- "peer": true
+ "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/compression/node_modules/negotiator": {
- "version": "0.6.4",
- "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz",
- "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==",
+ "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",
- "peer": true,
- "engines": {
- "node": ">= 0.6"
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
}
},
- "node_modules/concat-map": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
- "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
- "license": "MIT"
+ "node_modules/eslint/node_modules/eslint-scope": {
+ "version": "7.2.2",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz",
+ "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
},
- "node_modules/connect": {
- "version": "3.7.0",
- "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz",
- "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==",
+ "node_modules/eslint/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==",
+ "dev": true,
"license": "MIT",
"dependencies": {
- "debug": "2.6.9",
- "finalhandler": "1.1.2",
- "parseurl": "~1.3.3",
- "utils-merge": "1.0.1"
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
},
"engines": {
- "node": ">= 0.10.0"
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "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/eslint/node_modules/locate-path": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
+ "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+ "dev": true,
"license": "MIT",
"dependencies": {
- "ms": "2.0.0"
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "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==",
- "license": "MIT"
- },
- "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==",
- "license": "MIT"
+ "node_modules/eslint/node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
},
- "node_modules/core-js-compat": {
- "version": "3.47.0",
- "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.47.0.tgz",
- "integrity": "sha512-IGfuznZ/n7Kp9+nypamBhvwdwLsW6KC8IOaURw2doAK5e98AG3acVLdh0woOnEqCfUtS+Vu882JE4k/DAm3ItQ==",
+ "node_modules/eslint/node_modules/p-locate": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
+ "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
+ "dev": true,
"license": "MIT",
- "peer": true,
"dependencies": {
- "browserslist": "^4.28.0"
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
},
"funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/core-js"
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/create-jest": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz",
- "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==",
+ "node_modules/espree": {
+ "version": "9.6.1",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz",
+ "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==",
"dev": true,
- "license": "MIT",
+ "license": "BSD-2-Clause",
"dependencies": {
- "@jest/types": "^29.6.3",
- "chalk": "^4.0.0",
- "exit": "^0.1.2",
- "graceful-fs": "^4.2.9",
- "jest-config": "^29.7.0",
- "jest-util": "^29.7.0",
- "prompts": "^2.0.1"
+ "acorn": "^8.9.0",
+ "acorn-jsx": "^5.3.2",
+ "eslint-visitor-keys": "^3.4.1"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
},
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "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",
"bin": {
- "create-jest": "bin/create-jest.js"
+ "esparse": "bin/esparse.js",
+ "esvalidate": "bin/esvalidate.js"
},
"engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "node": ">=4"
}
},
- "node_modules/cross-spawn": {
- "version": "7.0.6",
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
- "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
- "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": {
- "path-key": "^3.1.0",
- "shebang-command": "^2.0.0",
- "which": "^2.0.1"
+ "estraverse": "^5.1.0"
},
"engines": {
- "node": ">= 8"
+ "node": ">=0.10"
}
},
- "node_modules/crypto-random-string": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz",
- "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==",
+ "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": {
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "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": ">=4.0"
+ }
+ },
+ "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": ">=0.10.0"
+ }
+ },
+ "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",
- "peer": true,
"engines": {
- "node": ">=8"
+ "node": ">= 0.6"
}
},
- "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,
- "license": "MIT"
+ "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==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
},
- "node_modules/dayjs": {
- "version": "1.11.19",
- "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.19.tgz",
- "integrity": "sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw==",
- "license": "MIT"
+ "node_modules/events-universal": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/events-universal/-/events-universal-1.0.1.tgz",
+ "integrity": "sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "bare-events": "^2.7.0"
+ }
},
- "node_modules/debug": {
- "version": "4.4.3",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
- "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
+ "node_modules/exec-async": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/exec-async/-/exec-async-2.2.0.tgz",
+ "integrity": "sha512-87OpwcEiMia/DeiKFzaQNBNFeN3XkkpYIh9FyOqq5mS2oKv3CBE67PXoEKcr6nodWdXNogTiQ0jE2NGuoffXPw==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/execa": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
+ "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
+ "dev": true,
"license": "MIT",
"dependencies": {
- "ms": "^2.1.3"
+ "cross-spawn": "^7.0.3",
+ "get-stream": "^6.0.0",
+ "human-signals": "^2.1.0",
+ "is-stream": "^2.0.0",
+ "merge-stream": "^2.0.0",
+ "npm-run-path": "^4.0.1",
+ "onetime": "^5.1.2",
+ "signal-exit": "^3.0.3",
+ "strip-final-newline": "^2.0.0"
},
"engines": {
- "node": ">=6.0"
+ "node": ">=10"
},
- "peerDependenciesMeta": {
- "supports-color": {
- "optional": true
- }
+ "funding": {
+ "url": "https://github.com/sindresorhus/execa?sponsor=1"
}
},
- "node_modules/dedent": {
- "version": "1.7.1",
- "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.7.1.tgz",
- "integrity": "sha512-9JmrhGZpOlEgOLdQgSm0zxFaYoQon408V1v49aqTWuXENVlnCuY9JBZcXZiCsZQWDjTm5Qf/nIvAy77mXDAjEg==",
+ "node_modules/exit": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz",
+ "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==",
"dev": true,
- "license": "MIT",
- "peerDependencies": {
- "babel-plugin-macros": "^3.1.0"
- },
- "peerDependenciesMeta": {
- "babel-plugin-macros": {
- "optional": true
- }
+ "engines": {
+ "node": ">= 0.8.0"
}
},
- "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==",
+ "node_modules/expect": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz",
+ "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==",
+ "dev": true,
"license": "MIT",
- "peer": true,
+ "dependencies": {
+ "@jest/expect-utils": "^29.7.0",
+ "jest-get-type": "^29.6.3",
+ "jest-matcher-utils": "^29.7.0",
+ "jest-message-util": "^29.7.0",
+ "jest-util": "^29.7.0"
+ },
"engines": {
- "node": ">=4.0.0"
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
- "node_modules/deepmerge": {
- "version": "4.3.1",
- "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz",
- "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==",
+ "node_modules/expo": {
+ "version": "54.0.33",
+ "resolved": "https://registry.npmjs.org/expo/-/expo-54.0.33.tgz",
+ "integrity": "sha512-3yOEfAKqo+gqHcV8vKcnq0uA5zxlohnhA3fu4G43likN8ct5ZZ3LjAh9wDdKteEkoad3tFPvwxmXW711S5OHUw==",
"license": "MIT",
- "engines": {
- "node": ">=0.10.0"
+ "peer": true,
+ "dependencies": {
+ "@babel/runtime": "^7.20.0",
+ "@expo/cli": "54.0.23",
+ "@expo/config": "~12.0.13",
+ "@expo/config-plugins": "~54.0.4",
+ "@expo/devtools": "0.1.8",
+ "@expo/fingerprint": "0.15.4",
+ "@expo/metro": "~54.2.0",
+ "@expo/metro-config": "54.0.14",
+ "@expo/vector-icons": "^15.0.3",
+ "@ungap/structured-clone": "^1.3.0",
+ "babel-preset-expo": "~54.0.10",
+ "expo-asset": "~12.0.12",
+ "expo-constants": "~18.0.13",
+ "expo-file-system": "~19.0.21",
+ "expo-font": "~14.0.11",
+ "expo-keep-awake": "~15.0.8",
+ "expo-modules-autolinking": "3.0.24",
+ "expo-modules-core": "3.0.29",
+ "pretty-format": "^29.7.0",
+ "react-refresh": "^0.14.2",
+ "whatwg-url-without-unicode": "8.0.0-3"
+ },
+ "bin": {
+ "expo": "bin/cli",
+ "expo-modules-autolinking": "bin/autolinking",
+ "fingerprint": "bin/fingerprint"
+ },
+ "peerDependencies": {
+ "@expo/dom-webview": "*",
+ "@expo/metro-runtime": "*",
+ "react": "*",
+ "react-native": "*",
+ "react-native-webview": "*"
+ },
+ "peerDependenciesMeta": {
+ "@expo/dom-webview": {
+ "optional": true
+ },
+ "@expo/metro-runtime": {
+ "optional": true
+ },
+ "react-native-webview": {
+ "optional": true
+ }
}
},
- "node_modules/defaults": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz",
- "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==",
+ "node_modules/expo-asset": {
+ "version": "12.0.12",
+ "resolved": "https://registry.npmjs.org/expo-asset/-/expo-asset-12.0.12.tgz",
+ "integrity": "sha512-CsXFCQbx2fElSMn0lyTdRIyKlSXOal6ilLJd+yeZ6xaC7I9AICQgscY5nj0QcwgA+KYYCCEQEBndMsmj7drOWQ==",
"license": "MIT",
"peer": true,
"dependencies": {
- "clone": "^1.0.2"
+ "@expo/image-utils": "^0.8.8",
+ "expo-constants": "~18.0.12"
},
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "peerDependencies": {
+ "expo": "*",
+ "react": "*",
+ "react-native": "*"
}
},
- "node_modules/define-lazy-prop": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz",
- "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==",
+ "node_modules/expo-constants": {
+ "version": "18.0.13",
+ "resolved": "https://registry.npmjs.org/expo-constants/-/expo-constants-18.0.13.tgz",
+ "integrity": "sha512-FnZn12E1dRYKDHlAdIyNFhBurKTS3F9CrfrBDJI5m3D7U17KBHMQ6JEfYlSj7LG7t+Ulr+IKaj58L1k5gBwTcQ==",
"license": "MIT",
"peer": true,
- "engines": {
- "node": ">=8"
+ "dependencies": {
+ "@expo/config": "~12.0.13",
+ "@expo/env": "~2.0.8"
+ },
+ "peerDependencies": {
+ "expo": "*",
+ "react-native": "*"
}
},
- "node_modules/delayed-stream": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
- "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
+ "node_modules/expo-crypto": {
+ "version": "15.0.8",
+ "resolved": "https://registry.npmjs.org/expo-crypto/-/expo-crypto-15.0.8.tgz",
+ "integrity": "sha512-aF7A914TB66WIlTJvl5J6/itejfY78O7dq3ibvFltL9vnTALJ/7LYHvLT4fwmx9yUNS6ekLBtDGWivFWnj2Fcw==",
"license": "MIT",
- "engines": {
- "node": ">=0.4.0"
+ "dependencies": {
+ "base64-js": "^1.3.0"
+ },
+ "peerDependencies": {
+ "expo": "*"
}
},
- "node_modules/depd": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
- "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
+ "node_modules/expo-file-system": {
+ "version": "19.0.21",
+ "resolved": "https://registry.npmjs.org/expo-file-system/-/expo-file-system-19.0.21.tgz",
+ "integrity": "sha512-s3DlrDdiscBHtab/6W1osrjGL+C2bvoInPJD7sOwmxfJ5Woynv2oc+Fz1/xVXaE/V7HE/+xrHC/H45tu6lZzzg==",
"license": "MIT",
- "engines": {
- "node": ">= 0.8"
+ "peer": true,
+ "peerDependencies": {
+ "expo": "*",
+ "react-native": "*"
}
},
- "node_modules/destroy": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
- "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==",
+ "node_modules/expo-font": {
+ "version": "14.0.11",
+ "resolved": "https://registry.npmjs.org/expo-font/-/expo-font-14.0.11.tgz",
+ "integrity": "sha512-ga0q61ny4s/kr4k8JX9hVH69exVSIfcIc19+qZ7gt71Mqtm7xy2c6kwsPTCyhBW2Ro5yXTT8EaZOpuRi35rHbg==",
"license": "MIT",
- "engines": {
- "node": ">= 0.8",
- "npm": "1.2.8000 || >= 1.4.16"
- }
- },
- "node_modules/detect-europe-js": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/detect-europe-js/-/detect-europe-js-0.1.2.tgz",
- "integrity": "sha512-lgdERlL3u0aUdHocoouzT10d9I89VVhk0qNRmll7mXdGfJT1/wqZ2ZLA4oJAjeACPY5fT1wsbq2AT+GkuInsow==",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/faisalman"
- },
- {
- "type": "opencollective",
- "url": "https://opencollective.com/ua-parser-js"
- },
- {
- "type": "paypal",
- "url": "https://paypal.me/faisalman"
- }
- ],
- "license": "MIT"
- },
- "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",
"peer": true,
- "engines": {
- "node": ">=8"
+ "dependencies": {
+ "fontfaceobserver": "^2.1.0"
+ },
+ "peerDependencies": {
+ "expo": "*",
+ "react": "*",
+ "react-native": "*"
}
},
- "node_modules/detect-newline": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz",
- "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==",
- "dev": true,
+ "node_modules/expo-keep-awake": {
+ "version": "15.0.8",
+ "resolved": "https://registry.npmjs.org/expo-keep-awake/-/expo-keep-awake-15.0.8.tgz",
+ "integrity": "sha512-YK9M1VrnoH1vLJiQzChZgzDvVimVoriibiDIFLbQMpjYBnvyfUeHJcin/Gx1a+XgupNXy92EQJLgI/9ZuXajYQ==",
"license": "MIT",
- "engines": {
- "node": ">=8"
+ "peer": true,
+ "peerDependencies": {
+ "expo": "*",
+ "react": "*"
}
},
- "node_modules/diff-sequences": {
- "version": "29.6.3",
- "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz",
- "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==",
- "dev": true,
+ "node_modules/expo-local-authentication": {
+ "version": "17.0.8",
+ "resolved": "https://registry.npmjs.org/expo-local-authentication/-/expo-local-authentication-17.0.8.tgz",
+ "integrity": "sha512-Q5fXHhu6w3pVPlFCibU72SYIAN+9wX7QpFn9h49IUqs0Equ44QgswtGrxeh7fdnDqJrrYGPet5iBzjnE70uolA==",
"license": "MIT",
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- }
- },
- "node_modules/dotenv": {
- "version": "16.4.7",
- "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.7.tgz",
- "integrity": "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==",
- "license": "BSD-2-Clause",
- "peer": true,
- "engines": {
- "node": ">=12"
+ "dependencies": {
+ "invariant": "^2.2.4"
},
- "funding": {
- "url": "https://dotenvx.com"
+ "peerDependencies": {
+ "expo": "*"
}
},
- "node_modules/dotenv-expand": {
- "version": "11.0.7",
- "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-11.0.7.tgz",
- "integrity": "sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA==",
- "license": "BSD-2-Clause",
+ "node_modules/expo-modules-autolinking": {
+ "version": "3.0.24",
+ "resolved": "https://registry.npmjs.org/expo-modules-autolinking/-/expo-modules-autolinking-3.0.24.tgz",
+ "integrity": "sha512-TP+6HTwhL7orDvsz2VzauyQlXJcAWyU3ANsZ7JGL4DQu8XaZv/A41ZchbtAYLfozNA2Ya1Hzmhx65hXryBMjaQ==",
+ "license": "MIT",
"peer": true,
"dependencies": {
- "dotenv": "^16.4.5"
- },
- "engines": {
- "node": ">=12"
+ "@expo/spawn-async": "^1.7.2",
+ "chalk": "^4.1.0",
+ "commander": "^7.2.0",
+ "require-from-string": "^2.0.2",
+ "resolve-from": "^5.0.0"
},
- "funding": {
- "url": "https://dotenvx.com"
+ "bin": {
+ "expo-modules-autolinking": "bin/expo-modules-autolinking.js"
}
},
- "node_modules/dprint-node": {
- "version": "1.0.8",
- "resolved": "https://registry.npmjs.org/dprint-node/-/dprint-node-1.0.8.tgz",
- "integrity": "sha512-iVKnUtYfGrYcW1ZAlfR/F59cUVL8QIhWoBJoSjkkdua/dkWIgjZfiLMeTjiB06X0ZLkQ0M2C1VbUj/CxkIf1zg==",
+ "node_modules/expo-modules-core": {
+ "version": "3.0.29",
+ "resolved": "https://registry.npmjs.org/expo-modules-core/-/expo-modules-core-3.0.29.tgz",
+ "integrity": "sha512-LzipcjGqk8gvkrOUf7O2mejNWugPkf3lmd9GkqL9WuNyeN2fRwU0Dn77e3ZUKI3k6sI+DNwjkq4Nu9fNN9WS7Q==",
"license": "MIT",
+ "peer": true,
"dependencies": {
- "detect-libc": "^1.0.3"
- }
- },
- "node_modules/dprint-node/node_modules/detect-libc": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz",
- "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==",
- "license": "Apache-2.0",
- "bin": {
- "detect-libc": "bin/detect-libc.js"
+ "invariant": "^2.2.4"
},
- "engines": {
- "node": ">=0.10"
+ "peerDependencies": {
+ "react": "*",
+ "react-native": "*"
}
},
- "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==",
+ "node_modules/expo-server": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/expo-server/-/expo-server-1.0.5.tgz",
+ "integrity": "sha512-IGR++flYH70rhLyeXF0Phle56/k4cee87WeQ4mamS+MkVAVP+dDlOHf2nN06Z9Y2KhU0Gp1k+y61KkghF7HdhA==",
"license": "MIT",
- "dependencies": {
- "call-bind-apply-helpers": "^1.0.1",
- "es-errors": "^1.3.0",
- "gopd": "^1.2.0"
- },
+ "peer": true,
"engines": {
- "node": ">= 0.4"
+ "node": ">=20.16.0"
}
},
- "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==",
- "license": "MIT"
- },
- "node_modules/electron-to-chromium": {
- "version": "1.5.267",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.267.tgz",
- "integrity": "sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==",
- "license": "ISC"
- },
- "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": {
- "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/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"
},
- "node_modules/emittery": {
- "version": "0.13.1",
- "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz",
- "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==",
+ "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",
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/sindresorhus/emittery?sponsor=1"
- }
+ "license": "MIT"
},
- "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==",
+ "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==",
"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==",
+ "node_modules/fast-glob": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz",
+ "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==",
+ "dev": true,
"license": "MIT",
+ "dependencies": {
+ "@nodelib/fs.stat": "^2.0.2",
+ "@nodelib/fs.walk": "^1.2.3",
+ "glob-parent": "^5.1.2",
+ "merge2": "^1.3.0",
+ "micromatch": "^4.0.8"
+ },
"engines": {
- "node": ">= 0.8"
+ "node": ">=8.6.0"
}
},
- "node_modules/env-editor": {
- "version": "0.4.2",
- "resolved": "https://registry.npmjs.org/env-editor/-/env-editor-0.4.2.tgz",
- "integrity": "sha512-ObFo8v4rQJAE59M69QzwloxPZtd33TpYEIjtKD1rrFDcM1Gd7IkDxEBU+HriziN6HSHQnBJi8Dmy+JWkav5HKA==",
- "license": "MIT",
- "peer": true,
+ "node_modules/fast-glob/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
"engines": {
- "node": ">=8"
+ "node": ">= 6"
}
},
- "node_modules/error-ex": {
- "version": "1.3.4",
- "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz",
- "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==",
+ "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"
+ },
+ "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",
+ "license": "MIT"
+ },
+ "node_modules/fastq": {
+ "version": "1.20.1",
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz",
+ "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==",
+ "dev": true,
+ "license": "ISC",
"dependencies": {
- "is-arrayish": "^0.2.1"
+ "reusify": "^1.0.4"
}
},
- "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==",
- "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)",
+ "bin": {
+ "dotslash": "bin/dotslash"
+ },
+ "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",
"dependencies": {
- "stackframe": "^1.3.4"
+ "bser": "2.1.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==",
+ "node_modules/fdir": {
+ "version": "6.5.0",
+ "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
+ "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==",
"license": "MIT",
+ "peer": true,
"engines": {
- "node": ">= 0.4"
+ "node": ">=12.0.0"
+ },
+ "peerDependencies": {
+ "picomatch": "^3 || ^4"
+ },
+ "peerDependenciesMeta": {
+ "picomatch": {
+ "optional": 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==",
+ "node_modules/file-entry-cache": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
+ "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
+ "dev": true,
"license": "MIT",
+ "dependencies": {
+ "flat-cache": "^3.0.4"
+ },
"engines": {
- "node": ">= 0.4"
+ "node": "^10.12.0 || >=12.0.0"
}
},
- "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==",
+ "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==",
"license": "MIT",
"dependencies": {
- "es-errors": "^1.3.0"
+ "to-regex-range": "^5.0.1"
},
"engines": {
- "node": ">= 0.4"
+ "node": ">=8"
}
},
- "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/finalhandler": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz",
+ "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==",
"license": "MIT",
"dependencies": {
- "es-errors": "^1.3.0",
- "get-intrinsic": "^1.2.6",
- "has-tostringtag": "^1.0.2",
- "hasown": "^2.0.2"
+ "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.4"
+ "node": ">= 0.8"
}
},
- "node_modules/escalade": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
- "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
+ "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==",
"license": "MIT",
- "engines": {
- "node": ">=6"
+ "dependencies": {
+ "ms": "2.0.0"
}
},
- "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==",
+ "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==",
"license": "MIT"
},
- "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==",
+ "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==",
"license": "MIT",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "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",
- "bin": {
- "esparse": "bin/esparse.js",
- "esvalidate": "bin/esvalidate.js"
+ "dependencies": {
+ "locate-path": "^5.0.0",
+ "path-exists": "^4.0.0"
},
"engines": {
- "node": ">=4"
- }
- },
- "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",
- "engines": {
- "node": ">= 0.6"
+ "node": ">=8"
}
},
- "node_modules/ethers": {
- "version": "6.14.4",
- "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.14.4.tgz",
- "integrity": "sha512-Jm/dzRs2Z9iBrT6e9TvGxyb5YVKAPLlpna7hjxH7KH/++DSh2T/JVmQUv7iHI5E55hDbp/gEVvstWYXVxXFzsA==",
- "funding": [
- {
- "type": "individual",
- "url": "https://github.com/sponsors/ethers-io/"
- },
- {
- "type": "individual",
- "url": "https://www.buymeacoffee.com/ricmoo"
- }
- ],
+ "node_modules/flat-cache": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz",
+ "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==",
+ "dev": true,
"license": "MIT",
"dependencies": {
- "@adraffy/ens-normalize": "1.10.1",
- "@noble/curves": "1.2.0",
- "@noble/hashes": "1.3.2",
- "@types/node": "22.7.5",
- "aes-js": "4.0.0-beta.5",
- "tslib": "2.7.0",
- "ws": "8.17.1"
+ "flatted": "^3.2.9",
+ "keyv": "^4.5.3",
+ "rimraf": "^3.0.2"
},
"engines": {
- "node": ">=14.0.0"
+ "node": "^10.12.0 || >=12.0.0"
}
},
- "node_modules/ethers/node_modules/@noble/curves": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.2.0.tgz",
- "integrity": "sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==",
+ "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/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"
+ },
+ "node_modules/fontfaceobserver": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/fontfaceobserver/-/fontfaceobserver-2.3.0.tgz",
+ "integrity": "sha512-6FPvD/IVyT4ZlNe7Wcn5Fb/4ChigpucKYSvD6a+0iMoLn2inpo711eyIcKjmDtE5XNcgAkSH9uN/nfAeZzHEfg==",
+ "license": "BSD-2-Clause",
+ "peer": 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==",
+ "dev": true,
"license": "MIT",
"dependencies": {
- "@noble/hashes": "1.3.2"
+ "is-callable": "^1.2.7"
+ },
+ "engines": {
+ "node": ">= 0.4"
},
"funding": {
- "url": "https://paulmillr.com/funding/"
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/ethers/node_modules/@noble/hashes": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz",
- "integrity": "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==",
+ "node_modules/freeport-async": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/freeport-async/-/freeport-async-2.0.0.tgz",
+ "integrity": "sha512-K7od3Uw45AJg00XUmy15+Hae2hOcgKcmN3/EF6Y7i01O0gaqiRx8sUSpsb9+BRNL8RPBrhzPsVfy8q9ADlJuWQ==",
"license": "MIT",
+ "peer": true,
"engines": {
- "node": ">= 16"
- },
- "funding": {
- "url": "https://paulmillr.com/funding/"
+ "node": ">=8"
}
},
- "node_modules/ethers/node_modules/tslib": {
- "version": "2.7.0",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz",
- "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==",
- "license": "0BSD"
- },
- "node_modules/ethers/node_modules/ws": {
- "version": "8.17.1",
- "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz",
- "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==",
+ "node_modules/fresh": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
+ "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
"license": "MIT",
"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": ">= 0.6"
}
},
- "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==",
+ "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"
+ },
+ "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"
+ ],
"engines": {
- "node": ">=6"
- }
- },
- "node_modules/eventemitter3": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz",
- "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==",
- "license": "MIT"
- },
- "node_modules/events-universal": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/events-universal/-/events-universal-1.0.1.tgz",
- "integrity": "sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==",
- "license": "Apache-2.0",
- "dependencies": {
- "bare-events": "^2.7.0"
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
}
},
- "node_modules/exec-async": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/exec-async/-/exec-async-2.2.0.tgz",
- "integrity": "sha512-87OpwcEiMia/DeiKFzaQNBNFeN3XkkpYIh9FyOqq5mS2oKv3CBE67PXoEKcr6nodWdXNogTiQ0jE2NGuoffXPw==",
+ "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==",
"license": "MIT",
- "peer": true
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
},
- "node_modules/execa": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
- "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
+ "node_modules/function.prototype.name": {
+ "version": "1.1.8",
+ "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz",
+ "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==",
"dev": true,
"license": "MIT",
"dependencies": {
- "cross-spawn": "^7.0.3",
- "get-stream": "^6.0.0",
- "human-signals": "^2.1.0",
- "is-stream": "^2.0.0",
- "merge-stream": "^2.0.0",
- "npm-run-path": "^4.0.1",
- "onetime": "^5.1.2",
- "signal-exit": "^3.0.3",
- "strip-final-newline": "^2.0.0"
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.3",
+ "define-properties": "^1.2.1",
+ "functions-have-names": "^1.2.3",
+ "hasown": "^2.0.2",
+ "is-callable": "^1.2.7"
},
"engines": {
- "node": ">=10"
+ "node": ">= 0.4"
},
"funding": {
- "url": "https://github.com/sindresorhus/execa?sponsor=1"
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/exit": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz",
- "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==",
+ "node_modules/functions-have-names": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz",
+ "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==",
"dev": true,
- "engines": {
- "node": ">= 0.8.0"
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/expect": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz",
- "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==",
- "dev": true,
+ "node_modules/generate-object-property": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-2.0.0.tgz",
+ "integrity": "sha512-KwuURPyqn2Mz8DdV29pJwQu0Y7tcsbkULr82eeOcY/ZllFK6I9Wm8dsRByIu7CKWlFi9BdW1b3mcXMp/kQBQsw==",
"license": "MIT",
"dependencies": {
- "@jest/expect-utils": "^29.7.0",
- "jest-get-type": "^29.6.3",
- "jest-matcher-utils": "^29.7.0",
- "jest-message-util": "^29.7.0",
- "jest-util": "^29.7.0"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "is-property": "^1.0.0"
}
},
- "node_modules/expo": {
- "version": "54.0.31",
- "resolved": "https://registry.npmjs.org/expo/-/expo-54.0.31.tgz",
- "integrity": "sha512-kQ3RDqA/a59I7y+oqQGyrPbbYlgPMUdKBOgvFLpoHbD2bCM+F75i4N0mUijy7dG5F/CUCu2qHmGGUCXBbMDkCg==",
+ "node_modules/generate-string": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/generate-string/-/generate-string-1.0.1.tgz",
+ "integrity": "sha512-IfTY0dKZM43ACyGvXkbG7De7WY7MxTS5VO6Juhe8oJKpCmrYYXoqp/cJMskkpi0k9H8wuXq0H+eI898/BCqvXg==",
+ "license": "MIT"
+ },
+ "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",
- "peer": true,
- "dependencies": {
- "@babel/runtime": "^7.20.0",
- "@expo/cli": "54.0.21",
- "@expo/config": "~12.0.13",
- "@expo/config-plugins": "~54.0.4",
- "@expo/devtools": "0.1.8",
- "@expo/fingerprint": "0.15.4",
- "@expo/metro": "~54.2.0",
- "@expo/metro-config": "54.0.13",
- "@expo/vector-icons": "^15.0.3",
- "@ungap/structured-clone": "^1.3.0",
- "babel-preset-expo": "~54.0.9",
- "expo-asset": "~12.0.12",
- "expo-constants": "~18.0.13",
- "expo-file-system": "~19.0.21",
- "expo-font": "~14.0.10",
- "expo-keep-awake": "~15.0.8",
- "expo-modules-autolinking": "3.0.24",
- "expo-modules-core": "3.0.29",
- "pretty-format": "^29.7.0",
- "react-refresh": "^0.14.2",
- "whatwg-url-without-unicode": "8.0.0-3"
- },
- "bin": {
- "expo": "bin/cli",
- "expo-modules-autolinking": "bin/autolinking",
- "fingerprint": "bin/fingerprint"
- },
- "peerDependencies": {
- "@expo/dom-webview": "*",
- "@expo/metro-runtime": "*",
- "react": "*",
- "react-native": "*",
- "react-native-webview": "*"
- },
- "peerDependenciesMeta": {
- "@expo/dom-webview": {
- "optional": true
- },
- "@expo/metro-runtime": {
- "optional": true
- },
- "react-native-webview": {
- "optional": true
- }
+ "engines": {
+ "node": ">= 0.4"
}
},
- "node_modules/expo-asset": {
- "version": "12.0.12",
- "resolved": "https://registry.npmjs.org/expo-asset/-/expo-asset-12.0.12.tgz",
- "integrity": "sha512-CsXFCQbx2fElSMn0lyTdRIyKlSXOal6ilLJd+yeZ6xaC7I9AICQgscY5nj0QcwgA+KYYCCEQEBndMsmj7drOWQ==",
+ "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==",
"license": "MIT",
- "peer": true,
- "dependencies": {
- "@expo/image-utils": "^0.8.8",
- "expo-constants": "~18.0.12"
- },
- "peerDependencies": {
- "expo": "*",
- "react": "*",
- "react-native": "*"
+ "engines": {
+ "node": ">=6.9.0"
}
},
- "node_modules/expo-constants": {
- "version": "18.0.13",
- "resolved": "https://registry.npmjs.org/expo-constants/-/expo-constants-18.0.13.tgz",
- "integrity": "sha512-FnZn12E1dRYKDHlAdIyNFhBurKTS3F9CrfrBDJI5m3D7U17KBHMQ6JEfYlSj7LG7t+Ulr+IKaj58L1k5gBwTcQ==",
- "license": "MIT",
- "peer": true,
- "dependencies": {
- "@expo/config": "~12.0.13",
- "@expo/env": "~2.0.8"
- },
- "peerDependencies": {
- "expo": "*",
- "react-native": "*"
+ "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",
+ "engines": {
+ "node": "6.* || 8.* || >= 10.*"
}
},
- "node_modules/expo-crypto": {
- "version": "15.0.8",
- "resolved": "https://registry.npmjs.org/expo-crypto/-/expo-crypto-15.0.8.tgz",
- "integrity": "sha512-aF7A914TB66WIlTJvl5J6/itejfY78O7dq3ibvFltL9vnTALJ/7LYHvLT4fwmx9yUNS6ekLBtDGWivFWnj2Fcw==",
+ "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": {
- "base64-js": "^1.3.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",
+ "gopd": "^1.2.0",
+ "has-symbols": "^1.1.0",
+ "hasown": "^2.0.2",
+ "math-intrinsics": "^1.1.0"
},
- "peerDependencies": {
- "expo": "*"
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/expo-file-system": {
- "version": "19.0.21",
- "resolved": "https://registry.npmjs.org/expo-file-system/-/expo-file-system-19.0.21.tgz",
- "integrity": "sha512-s3DlrDdiscBHtab/6W1osrjGL+C2bvoInPJD7sOwmxfJ5Woynv2oc+Fz1/xVXaE/V7HE/+xrHC/H45tu6lZzzg==",
+ "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==",
"license": "MIT",
- "peer": true,
- "peerDependencies": {
- "expo": "*",
- "react-native": "*"
+ "engines": {
+ "node": ">=8.0.0"
}
},
- "node_modules/expo-font": {
- "version": "14.0.10",
- "resolved": "https://registry.npmjs.org/expo-font/-/expo-font-14.0.10.tgz",
- "integrity": "sha512-UqyNaaLKRpj4pKAP4HZSLnuDQqueaO5tB1c/NWu5vh1/LF9ulItyyg2kF/IpeOp0DeOLk0GY0HrIXaKUMrwB+Q==",
+ "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",
- "peer": true,
"dependencies": {
- "fontfaceobserver": "^2.1.0"
+ "dunder-proto": "^1.0.1",
+ "es-object-atoms": "^1.0.0"
},
- "peerDependencies": {
- "expo": "*",
- "react": "*",
- "react-native": "*"
- }
- },
- "node_modules/expo-keep-awake": {
- "version": "15.0.8",
- "resolved": "https://registry.npmjs.org/expo-keep-awake/-/expo-keep-awake-15.0.8.tgz",
- "integrity": "sha512-YK9M1VrnoH1vLJiQzChZgzDvVimVoriibiDIFLbQMpjYBnvyfUeHJcin/Gx1a+XgupNXy92EQJLgI/9ZuXajYQ==",
- "license": "MIT",
- "peer": true,
- "peerDependencies": {
- "expo": "*",
- "react": "*"
+ "engines": {
+ "node": ">= 0.4"
}
},
- "node_modules/expo-local-authentication": {
- "version": "17.0.8",
- "resolved": "https://registry.npmjs.org/expo-local-authentication/-/expo-local-authentication-17.0.8.tgz",
- "integrity": "sha512-Q5fXHhu6w3pVPlFCibU72SYIAN+9wX7QpFn9h49IUqs0Equ44QgswtGrxeh7fdnDqJrrYGPet5iBzjnE70uolA==",
+ "node_modules/get-stdin": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz",
+ "integrity": "sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==",
+ "dev": true,
"license": "MIT",
- "dependencies": {
- "invariant": "^2.2.4"
+ "engines": {
+ "node": ">=10"
},
- "peerDependencies": {
- "expo": "*"
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/expo-modules-autolinking": {
- "version": "3.0.24",
- "resolved": "https://registry.npmjs.org/expo-modules-autolinking/-/expo-modules-autolinking-3.0.24.tgz",
- "integrity": "sha512-TP+6HTwhL7orDvsz2VzauyQlXJcAWyU3ANsZ7JGL4DQu8XaZv/A41ZchbtAYLfozNA2Ya1Hzmhx65hXryBMjaQ==",
+ "node_modules/get-stream": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
+ "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
+ "dev": true,
"license": "MIT",
- "peer": true,
- "dependencies": {
- "@expo/spawn-async": "^1.7.2",
- "chalk": "^4.1.0",
- "commander": "^7.2.0",
- "require-from-string": "^2.0.2",
- "resolve-from": "^5.0.0"
+ "engines": {
+ "node": ">=10"
},
- "bin": {
- "expo-modules-autolinking": "bin/expo-modules-autolinking.js"
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/expo-modules-core": {
- "version": "3.0.29",
- "resolved": "https://registry.npmjs.org/expo-modules-core/-/expo-modules-core-3.0.29.tgz",
- "integrity": "sha512-LzipcjGqk8gvkrOUf7O2mejNWugPkf3lmd9GkqL9WuNyeN2fRwU0Dn77e3ZUKI3k6sI+DNwjkq4Nu9fNN9WS7Q==",
+ "node_modules/get-symbol-description": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz",
+ "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==",
+ "dev": true,
"license": "MIT",
- "peer": true,
"dependencies": {
- "invariant": "^2.2.4"
+ "call-bound": "^1.0.3",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.6"
},
- "peerDependencies": {
- "react": "*",
- "react-native": "*"
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/expo-server": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/expo-server/-/expo-server-1.0.5.tgz",
- "integrity": "sha512-IGR++flYH70rhLyeXF0Phle56/k4cee87WeQ4mamS+MkVAVP+dDlOHf2nN06Z9Y2KhU0Gp1k+y61KkghF7HdhA==",
+ "node_modules/getenv": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/getenv/-/getenv-2.0.0.tgz",
+ "integrity": "sha512-VilgtJj/ALgGY77fiLam5iD336eSWi96Q15JSAG1zi8NRBysm3LXKdGnHb4m5cuyxvOLQQKWpBZAT6ni4FI2iQ==",
"license": "MIT",
"peer": true,
"engines": {
- "node": ">=20.16.0"
+ "node": ">=6"
}
},
- "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"
- },
- "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==",
- "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"
- },
- "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)",
- "bin": {
- "dotslash": "bin/dotslash"
+ "node_modules/glob": {
+ "version": "13.0.1",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.1.tgz",
+ "integrity": "sha512-B7U/vJpE3DkJ5WXTgTpTRN63uV42DseiXXKMwG14LQBXmsdeIoHAPbU/MEo6II0k5ED74uc2ZGTC6MwHFQhF6w==",
+ "license": "BlueOak-1.0.0",
+ "peer": true,
+ "dependencies": {
+ "minimatch": "^10.1.2",
+ "minipass": "^7.1.2",
+ "path-scurry": "^2.0.0"
},
"engines": {
- "node": ">=20"
+ "node": "20 || >=22"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
}
},
- "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",
+ "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": "ISC",
"dependencies": {
- "bser": "2.1.1"
+ "is-glob": "^4.0.3"
+ },
+ "engines": {
+ "node": ">=10.13.0"
}
},
- "node_modules/fdir": {
- "version": "6.5.0",
- "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
- "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==",
- "license": "MIT",
+ "node_modules/glob/node_modules/minimatch": {
+ "version": "10.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.2.tgz",
+ "integrity": "sha512-fu656aJ0n2kcXwsnwnv9g24tkU5uSmOlTjd6WyyaKm2Z+h1qmY6bAjrcaIxF/BslFqbZ8UBtbJi7KgQOZD2PTw==",
+ "license": "BlueOak-1.0.0",
"peer": true,
- "engines": {
- "node": ">=12.0.0"
+ "dependencies": {
+ "@isaacs/brace-expansion": "^5.0.1"
},
- "peerDependencies": {
- "picomatch": "^3 || ^4"
+ "engines": {
+ "node": "20 || >=22"
},
- "peerDependenciesMeta": {
- "picomatch": {
- "optional": true
- }
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
}
},
- "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/global-dirs": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz",
+ "integrity": "sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==",
"license": "MIT",
+ "peer": true,
"dependencies": {
- "to-regex-range": "^5.0.1"
+ "ini": "^1.3.4"
},
"engines": {
- "node": ">=8"
+ "node": ">=4"
}
},
- "node_modules/finalhandler": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz",
- "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==",
+ "node_modules/globals": {
+ "version": "13.24.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz",
+ "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==",
+ "dev": true,
"license": "MIT",
"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"
+ "type-fest": "^0.20.2"
},
"engines": {
- "node": ">= 0.8"
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "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/globals/node_modules/type-fest": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
+ "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
+ "dev": true,
+ "license": "(MIT OR CC0-1.0)",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/globalthis": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz",
+ "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==",
+ "dev": true,
"license": "MIT",
"dependencies": {
- "ms": "2.0.0"
+ "define-properties": "^1.2.1",
+ "gopd": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "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==",
- "license": "MIT"
- },
- "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/globby": {
+ "version": "11.1.0",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
+ "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
+ "dev": true,
"license": "MIT",
- "peer": true,
"dependencies": {
- "locate-path": "^6.0.0",
- "path-exists": "^4.0.0"
+ "array-union": "^2.1.0",
+ "dir-glob": "^3.0.1",
+ "fast-glob": "^3.2.9",
+ "ignore": "^5.2.0",
+ "merge2": "^1.4.1",
+ "slash": "^3.0.0"
},
"engines": {
"node": ">=10"
@@ -7244,351 +7393,452 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "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"
- },
- "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/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",
"engines": {
- "node": ">=4.0"
+ "node": ">= 0.4"
},
- "peerDependenciesMeta": {
- "debug": {
- "optional": true
- }
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/fontfaceobserver": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/fontfaceobserver/-/fontfaceobserver-2.3.0.tgz",
- "integrity": "sha512-6FPvD/IVyT4ZlNe7Wcn5Fb/4ChigpucKYSvD6a+0iMoLn2inpo711eyIcKjmDtE5XNcgAkSH9uN/nfAeZzHEfg==",
- "license": "BSD-2-Clause",
- "peer": true
+ "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/graphemer": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz",
+ "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==",
+ "dev": true,
+ "license": "MIT"
},
- "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/handlebars": {
+ "version": "4.7.8",
+ "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz",
+ "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==",
+ "dev": true,
"license": "MIT",
"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"
+ "minimist": "^1.2.5",
+ "neo-async": "^2.6.2",
+ "source-map": "^0.6.1",
+ "wordwrap": "^1.0.0"
+ },
+ "bin": {
+ "handlebars": "bin/handlebars"
},
"engines": {
- "node": ">= 6"
+ "node": ">=0.4.7"
+ },
+ "optionalDependencies": {
+ "uglify-js": "^3.1.4"
}
},
- "node_modules/freeport-async": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/freeport-async/-/freeport-async-2.0.0.tgz",
- "integrity": "sha512-K7od3Uw45AJg00XUmy15+Hae2hOcgKcmN3/EF6Y7i01O0gaqiRx8sUSpsb9+BRNL8RPBrhzPsVfy8q9ADlJuWQ==",
+ "node_modules/has-bigints": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz",
+ "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "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==",
"license": "MIT",
- "peer": true,
"engines": {
"node": ">=8"
}
},
- "node_modules/fresh": {
- "version": "0.5.2",
- "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
- "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
+ "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": {
+ "es-define-property": "^1.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-proto": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz",
+ "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==",
+ "dev": true,
"license": "MIT",
+ "dependencies": {
+ "dunder-proto": "^1.0.0"
+ },
"engines": {
- "node": ">= 0.6"
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "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"
- },
- "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,
+ "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",
- "optional": true,
- "os": [
- "darwin"
- ],
"engines": {
- "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "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==",
+ "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": {
+ "has-symbols": "^1.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/generate-object-property": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-2.0.0.tgz",
- "integrity": "sha512-KwuURPyqn2Mz8DdV29pJwQu0Y7tcsbkULr82eeOcY/ZllFK6I9Wm8dsRByIu7CKWlFi9BdW1b3mcXMp/kQBQsw==",
+ "node_modules/hasown": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
+ "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
"license": "MIT",
"dependencies": {
- "is-property": "^1.0.0"
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
}
},
- "node_modules/generate-string": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/generate-string/-/generate-string-1.0.1.tgz",
- "integrity": "sha512-IfTY0dKZM43ACyGvXkbG7De7WY7MxTS5VO6Juhe8oJKpCmrYYXoqp/cJMskkpi0k9H8wuXq0H+eI898/BCqvXg==",
+ "node_modules/hermes-compiler": {
+ "version": "0.14.0",
+ "resolved": "https://registry.npmjs.org/hermes-compiler/-/hermes-compiler-0.14.0.tgz",
+ "integrity": "sha512-clxa193o+GYYwykWVFfpHduCATz8fR5jvU7ngXpfKHj+E9hr9vjLNtdLSEe8MUbObvVexV3wcyxQ00xTPIrB1Q==",
"license": "MIT"
},
- "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==",
+ "node_modules/hermes-estree": {
+ "version": "0.29.1",
+ "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.29.1.tgz",
+ "integrity": "sha512-jl+x31n4/w+wEqm0I2r4CMimukLbLQEYpisys5oCre611CI5fc9TxhqkBBCJ1edDG4Kza0f7CgNz8xVMLZQOmQ==",
"license": "MIT",
- "engines": {
- "node": ">=6.9.0"
+ "peer": true
+ },
+ "node_modules/hermes-parser": {
+ "version": "0.29.1",
+ "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.29.1.tgz",
+ "integrity": "sha512-xBHWmUtRC5e/UL0tI7Ivt2riA/YBq9+SiYFU7C1oBa/j2jYGlIF9043oak1F47ihuDIxQ5nbsKueYJDRY02UgA==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "hermes-estree": "0.29.1"
}
},
- "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==",
+ "node_modules/hosted-git-info": {
+ "version": "7.0.2",
+ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz",
+ "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==",
"license": "ISC",
+ "peer": true,
+ "dependencies": {
+ "lru-cache": "^10.0.1"
+ },
"engines": {
- "node": "6.* || 8.* || >= 10.*"
+ "node": "^16.14.0 || >=18.0.0"
}
},
- "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==",
+ "node_modules/hosted-git-info/node_modules/lru-cache": {
+ "version": "10.4.3",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz",
+ "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==",
+ "license": "ISC",
+ "peer": true
+ },
+ "node_modules/hrpc": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/hrpc/-/hrpc-4.3.0.tgz",
+ "integrity": "sha512-CdZSI8jx7x7Kzrb46Vx/IixFT/dZ4rYPRuT1Z7W6ZuJUSJxlcRFTirjUPmTt9HaFhUM3dxDzvTkqp6LY01jViA==",
+ "license": "ISC",
+ "dependencies": {
+ "b4a": "^1.6.7",
+ "bare-rpc": "^1.1.0",
+ "hyperschema": "^1.10.4",
+ "streamx": "^2.22.0"
+ }
+ },
+ "node_modules/html-escaper": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz",
+ "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "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",
"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"
+ "depd": "~2.0.0",
+ "inherits": "~2.0.4",
+ "setprototypeof": "~1.2.0",
+ "statuses": "~2.0.2",
+ "toidentifier": "~1.0.1"
},
"engines": {
- "node": ">= 0.4"
+ "node": ">= 0.8"
},
"funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
}
},
- "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/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",
"engines": {
- "node": ">=8.0.0"
+ "node": ">= 0.8"
}
},
- "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==",
+ "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",
"dependencies": {
- "dunder-proto": "^1.0.1",
- "es-object-atoms": "^1.0.0"
+ "agent-base": "^7.1.2",
+ "debug": "4"
},
"engines": {
- "node": ">= 0.4"
+ "node": ">= 14"
}
},
- "node_modules/get-stream": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
- "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
+ "node_modules/human-signals": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
+ "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==",
"dev": true,
- "license": "MIT",
+ "license": "Apache-2.0",
"engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "node": ">=10.17.0"
}
},
- "node_modules/getenv": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/getenv/-/getenv-2.0.0.tgz",
- "integrity": "sha512-VilgtJj/ALgGY77fiLam5iD336eSWi96Q15JSAG1zi8NRBysm3LXKdGnHb4m5cuyxvOLQQKWpBZAT6ni4FI2iQ==",
+ "node_modules/hyperschema": {
+ "version": "1.19.0",
+ "resolved": "https://registry.npmjs.org/hyperschema/-/hyperschema-1.19.0.tgz",
+ "integrity": "sha512-gHbLxLygsDUmX9MVs8G1W4xC9NglSyrw+t28sfFFzdU40gCUUmIo3n2MkIRHpUOT7Jj+8iuvq2wSkpaG+3k/Xg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "bare-fs": "^4.0.1",
+ "compact-encoding": "^2.15.0",
+ "generate-object-property": "^2.0.0",
+ "generate-string": "^1.0.1"
+ }
+ },
+ "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",
+ "peer": true
+ },
+ "node_modules/ignore": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
+ "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
"license": "MIT",
- "peer": true,
"engines": {
- "node": ">=6"
+ "node": ">= 4"
}
},
- "node_modules/glob": {
- "version": "13.0.0",
- "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.0.tgz",
- "integrity": "sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==",
- "license": "BlueOak-1.0.0",
- "peer": true,
- "dependencies": {
- "minimatch": "^10.1.1",
- "minipass": "^7.1.2",
- "path-scurry": "^2.0.0"
+ "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==",
+ "license": "MIT",
+ "dependencies": {
+ "queue": "6.0.2"
},
- "engines": {
- "node": "20 || >=22"
+ "bin": {
+ "image-size": "bin/image-size.js"
},
+ "engines": {
+ "node": ">=16.x"
+ }
+ },
+ "node_modules/immer": {
+ "version": "11.1.3",
+ "resolved": "https://registry.npmjs.org/immer/-/immer-11.1.3.tgz",
+ "integrity": "sha512-6jQTc5z0KJFtr1UgFpIL3N9XSC3saRaI9PwWtzM2pSqkNGtiNkYY2OSwkOGDK2XcTRcLb1pi/aNkKZz0nxVH4Q==",
+ "license": "MIT",
"funding": {
- "url": "https://github.com/sponsors/isaacs"
+ "type": "opencollective",
+ "url": "https://opencollective.com/immer"
}
},
- "node_modules/glob/node_modules/minimatch": {
- "version": "10.1.1",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz",
- "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==",
- "license": "BlueOak-1.0.0",
- "peer": 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": {
- "@isaacs/brace-expansion": "^5.0.0"
+ "parent-module": "^1.0.0",
+ "resolve-from": "^4.0.0"
},
"engines": {
- "node": "20 || >=22"
+ "node": ">=6"
},
"funding": {
- "url": "https://github.com/sponsors/isaacs"
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/global-dirs": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz",
- "integrity": "sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==",
+ "node_modules/import-fresh/node_modules/resolve-from": {
+ "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",
- "peer": true,
- "dependencies": {
- "ini": "^1.3.4"
- },
"engines": {
"node": ">=4"
}
},
- "node_modules/globbie": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/globbie/-/globbie-1.0.3.tgz",
- "integrity": "sha512-hcryJmKcftf82xfBWTWxuUITWIIoYO3ec104V17SMHGFl6VLbm1d1Ju9LX9L+jyJTwICpemX/dmPI/HGYoKr1A==",
- "license": "Apache-2.0",
- "dependencies": {
- "bare-fs": "^4.1.2",
- "bare-path": "^3.0.0",
- "bare-process": "^4.2.1",
- "picomatch": "^4.0.2"
- }
- },
- "node_modules/globbie/node_modules/picomatch": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz",
- "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
+ "node_modules/import-local": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz",
+ "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==",
+ "dev": true,
"license": "MIT",
+ "dependencies": {
+ "pkg-dir": "^4.2.0",
+ "resolve-cwd": "^3.0.0"
+ },
+ "bin": {
+ "import-local-fixture": "fixtures/cli.js"
+ },
"engines": {
- "node": ">=12"
+ "node": ">=8"
},
"funding": {
- "url": "https://github.com/sponsors/jonschlinkert"
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/gopd": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
- "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
+ "node_modules/imurmurhash": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
"license": "MIT",
"engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "node": ">=0.8.19"
}
},
- "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/graphql": {
- "version": "16.12.0",
- "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.12.0.tgz",
- "integrity": "sha512-DKKrynuQRne0PNpEbzuEdHlYOMksHSUI8Zc9Unei5gTsMNA2/vMpoMz/yKba50pejK56qj98qM0SjYxAKi13gQ==",
+ "node_modules/indent-string": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
+ "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
+ "dev": true,
"license": "MIT",
"engines": {
- "node": "^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0"
+ "node": ">=8"
}
},
- "node_modules/graphql-ws": {
- "version": "5.16.2",
- "resolved": "https://registry.npmjs.org/graphql-ws/-/graphql-ws-5.16.2.tgz",
- "integrity": "sha512-E1uccsZxt/96jH/OwmLPuXMACILs76pKF2i3W861LpKBCYtGIyPQGtWLuBLkND4ox1KHns70e83PS4te50nvPQ==",
- "license": "MIT",
- "engines": {
- "node": ">=10"
- },
- "peerDependencies": {
- "graphql": ">=0.11 <=16"
+ "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",
+ "dependencies": {
+ "once": "^1.3.0",
+ "wrappy": "1"
}
},
- "node_modules/handlebars": {
- "version": "4.7.8",
- "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz",
- "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==",
+ "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/ini": {
+ "version": "1.3.8",
+ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
+ "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
+ "license": "ISC",
+ "peer": true
+ },
+ "node_modules/internal-slot": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz",
+ "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "minimist": "^1.2.5",
- "neo-async": "^2.6.2",
- "source-map": "^0.6.1",
- "wordwrap": "^1.0.0"
- },
- "bin": {
- "handlebars": "bin/handlebars"
+ "es-errors": "^1.3.0",
+ "hasown": "^2.0.2",
+ "side-channel": "^1.1.0"
},
"engines": {
- "node": ">=0.4.7"
- },
- "optionalDependencies": {
- "uglify-js": "^3.1.4"
+ "node": ">= 0.4"
}
},
- "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==",
+ "node_modules/invariant": {
+ "version": "2.2.4",
+ "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
+ "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==",
"license": "MIT",
- "engines": {
- "node": ">=8"
+ "dependencies": {
+ "loose-envify": "^1.0.0"
}
},
- "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==",
+ "node_modules/is-array-buffer": {
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz",
+ "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==",
+ "dev": true,
"license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.3",
+ "get-intrinsic": "^1.2.6"
+ },
"engines": {
"node": ">= 0.4"
},
@@ -7596,13 +7846,25 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "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==",
+ "node_modules/is-arrayish": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
+ "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/is-async-function": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz",
+ "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==",
+ "dev": true,
"license": "MIT",
"dependencies": {
- "has-symbols": "^1.0.3"
+ "async-function": "^1.0.0",
+ "call-bound": "^1.0.3",
+ "get-proto": "^1.0.1",
+ "has-tostringtag": "^1.0.2",
+ "safe-regex-test": "^1.1.0"
},
"engines": {
"node": ">= 0.4"
@@ -7611,328 +7873,333 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "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/is-bigint": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz",
+ "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==",
+ "dev": true,
"license": "MIT",
"dependencies": {
- "inherits": "^2.0.3",
- "minimalistic-assert": "^1.0.1"
+ "has-bigints": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/hasown": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
- "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
+ "node_modules/is-boolean-object": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz",
+ "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==",
+ "dev": true,
"license": "MIT",
"dependencies": {
- "function-bind": "^1.1.2"
+ "call-bound": "^1.0.3",
+ "has-tostringtag": "^1.0.2"
},
"engines": {
"node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/hermes-compiler": {
- "version": "0.14.0",
- "resolved": "https://registry.npmjs.org/hermes-compiler/-/hermes-compiler-0.14.0.tgz",
- "integrity": "sha512-clxa193o+GYYwykWVFfpHduCATz8fR5jvU7ngXpfKHj+E9hr9vjLNtdLSEe8MUbObvVexV3wcyxQ00xTPIrB1Q==",
- "license": "MIT"
- },
- "node_modules/hermes-estree": {
- "version": "0.29.1",
- "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.29.1.tgz",
- "integrity": "sha512-jl+x31n4/w+wEqm0I2r4CMimukLbLQEYpisys5oCre611CI5fc9TxhqkBBCJ1edDG4Kza0f7CgNz8xVMLZQOmQ==",
- "license": "MIT",
- "peer": true
- },
- "node_modules/hermes-parser": {
- "version": "0.29.1",
- "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.29.1.tgz",
- "integrity": "sha512-xBHWmUtRC5e/UL0tI7Ivt2riA/YBq9+SiYFU7C1oBa/j2jYGlIF9043oak1F47ihuDIxQ5nbsKueYJDRY02UgA==",
+ "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",
- "peer": true,
- "dependencies": {
- "hermes-estree": "0.29.1"
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "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==",
+ "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==",
"license": "MIT",
"dependencies": {
- "hash.js": "^1.0.3",
- "minimalistic-assert": "^1.0.0",
- "minimalistic-crypto-utils": "^1.0.1"
- }
- },
- "node_modules/hosted-git-info": {
- "version": "7.0.2",
- "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz",
- "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==",
- "license": "ISC",
- "peer": true,
- "dependencies": {
- "lru-cache": "^10.0.1"
+ "hasown": "^2.0.2"
},
"engines": {
- "node": "^16.14.0 || >=18.0.0"
- }
- },
- "node_modules/hosted-git-info/node_modules/lru-cache": {
- "version": "10.4.3",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz",
- "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==",
- "license": "ISC",
- "peer": true
- },
- "node_modules/hrpc": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/hrpc/-/hrpc-4.0.1.tgz",
- "integrity": "sha512-bT/Ean7UbVQENVKzrAhsNq3iaGAXV/dcGX6jrC9oc4BM6PIVar9DImjwazzZn1noUNJFGz5uaGtxT6nBAT8hGg==",
- "license": "ISC",
- "dependencies": {
- "b4a": "^1.6.7",
- "bare-rpc": "^0.2.0",
- "brittle": "^3.13.1",
- "hyperschema": "^1.10.4",
- "streamx": "^2.22.0"
- }
- },
- "node_modules/html-escaper": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz",
- "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==",
- "dev": true,
- "license": "MIT"
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
},
- "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==",
+ "node_modules/is-data-view": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz",
+ "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==",
+ "dev": true,
"license": "MIT",
"dependencies": {
- "depd": "~2.0.0",
- "inherits": "~2.0.4",
- "setprototypeof": "~1.2.0",
- "statuses": "~2.0.2",
- "toidentifier": "~1.0.1"
+ "call-bound": "^1.0.2",
+ "get-intrinsic": "^1.2.6",
+ "is-typed-array": "^1.1.13"
},
"engines": {
- "node": ">= 0.8"
+ "node": ">= 0.4"
},
"funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/express"
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "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==",
+ "node_modules/is-date-object": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz",
+ "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==",
+ "dev": true,
"license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "has-tostringtag": "^1.0.2"
+ },
"engines": {
- "node": ">= 0.8"
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "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==",
+ "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==",
"license": "MIT",
- "dependencies": {
- "agent-base": "^7.1.2",
- "debug": "4"
+ "bin": {
+ "is-docker": "cli.js"
},
"engines": {
- "node": ">= 14"
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/human-signals": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
- "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==",
+ "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": "Apache-2.0",
+ "license": "MIT",
"engines": {
- "node": ">=10.17.0"
+ "node": ">=0.10.0"
}
},
- "node_modules/hyperschema": {
- "version": "1.12.4",
- "resolved": "https://registry.npmjs.org/hyperschema/-/hyperschema-1.12.4.tgz",
- "integrity": "sha512-eidMsOeHJoSwrDeBCVhL6iZO9x+9cTZk7J4LCAgfT4mf2BKDXnkPNCfYNK+f8OTFKjwEM1AsU+jdKY86EWzABg==",
- "license": "Apache-2.0",
+ "node_modules/is-finalizationregistry": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz",
+ "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "bare-fs": "^4.0.1",
- "compact-encoding": "^2.15.0",
- "generate-object-property": "^2.0.0",
- "generate-string": "^1.0.1"
+ "call-bound": "^1.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "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/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==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
},
- "node_modules/ignore": {
- "version": "5.3.2",
- "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
- "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
+ "node_modules/is-generator-fn": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz",
+ "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==",
+ "dev": true,
"license": "MIT",
- "peer": true,
"engines": {
- "node": ">= 4"
+ "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/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",
"dependencies": {
- "queue": "6.0.2"
+ "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"
},
- "bin": {
- "image-size": "bin/image-size.js"
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "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",
+ "dependencies": {
+ "is-extglob": "^2.1.1"
},
"engines": {
- "node": ">=16.x"
+ "node": ">=0.10.0"
}
},
- "node_modules/immer": {
- "version": "11.1.3",
- "resolved": "https://registry.npmjs.org/immer/-/immer-11.1.3.tgz",
- "integrity": "sha512-6jQTc5z0KJFtr1UgFpIL3N9XSC3saRaI9PwWtzM2pSqkNGtiNkYY2OSwkOGDK2XcTRcLb1pi/aNkKZz0nxVH4Q==",
+ "node_modules/is-map": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz",
+ "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==",
+ "dev": true,
"license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
"funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/immer"
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/import-in-the-middle": {
- "version": "1.15.0",
- "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.15.0.tgz",
- "integrity": "sha512-bpQy+CrsRmYmoPMAE/0G33iwRqwW4ouqdRg8jgbH3aKuCtOc8lxgmYXg2dMM92CRiGP660EtBcymH/eVUpCSaA==",
- "license": "Apache-2.0",
- "dependencies": {
- "acorn": "^8.14.0",
- "acorn-import-attributes": "^1.9.5",
- "cjs-module-lexer": "^1.2.2",
- "module-details-from-path": "^1.0.3"
+ "node_modules/is-negative-zero": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz",
+ "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/import-local": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz",
- "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==",
+ "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==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/is-number-object": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz",
+ "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "pkg-dir": "^4.2.0",
- "resolve-cwd": "^3.0.0"
- },
- "bin": {
- "import-local-fixture": "fixtures/cli.js"
+ "call-bound": "^1.0.3",
+ "has-tostringtag": "^1.0.2"
},
"engines": {
- "node": ">=8"
+ "node": ">= 0.4"
},
"funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/imurmurhash": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
- "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
+ "node_modules/is-path-inside": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz",
+ "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
+ "dev": true,
"license": "MIT",
"engines": {
- "node": ">=0.8.19"
+ "node": ">=8"
}
},
- "node_modules/indent-string": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
- "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
+ "node_modules/is-property": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz",
+ "integrity": "sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==",
+ "license": "MIT"
+ },
+ "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",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "gopd": "^1.2.0",
+ "has-tostringtag": "^1.0.2",
+ "hasown": "^2.0.2"
+ },
"engines": {
- "node": ">=8"
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "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",
- "dependencies": {
- "once": "^1.3.0",
- "wrappy": "1"
+ "node_modules/is-set": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz",
+ "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "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/ini": {
- "version": "1.3.8",
- "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
- "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
- "license": "ISC",
- "peer": 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/is-shared-array-buffer": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz",
+ "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==",
+ "dev": true,
"license": "MIT",
"dependencies": {
- "loose-envify": "^1.0.0"
+ "call-bound": "^1.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/ipaddr.js": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.3.0.tgz",
- "integrity": "sha512-Zv/pA+ciVFbCSBBjGfaKUya/CcGmUHzTydLMaTwrUUEM2DIEO3iZvueGxmacvmN50fGpGVKeTXpb2LcYQxeVdg==",
+ "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",
"engines": {
- "node": ">= 10"
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/is-arrayish": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
- "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==",
+ "node_modules/is-string": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz",
+ "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==",
"dev": true,
- "license": "MIT"
- },
- "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==",
"license": "MIT",
"dependencies": {
- "hasown": "^2.0.2"
+ "call-bound": "^1.0.3",
+ "has-tostringtag": "^1.0.2"
},
"engines": {
"node": ">= 0.4"
@@ -7941,86 +8208,84 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "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/is-symbol": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz",
+ "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==",
+ "dev": true,
"license": "MIT",
- "bin": {
- "is-docker": "cli.js"
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "has-symbols": "^1.1.0",
+ "safe-regex-test": "^1.1.0"
},
"engines": {
- "node": ">=8"
+ "node": ">= 0.4"
},
"funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "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==",
+ "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",
+ "dependencies": {
+ "which-typed-array": "^1.1.16"
+ },
"engines": {
- "node": ">=8"
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/is-generator-fn": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz",
- "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==",
+ "node_modules/is-weakmap": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz",
+ "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==",
"dev": true,
"license": "MIT",
"engines": {
- "node": ">=6"
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "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/is-weakref": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz",
+ "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==",
+ "dev": true,
"license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3"
+ },
"engines": {
- "node": ">=0.12.0"
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/is-property": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz",
- "integrity": "sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==",
- "license": "MIT"
- },
- "node_modules/is-standalone-pwa": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/is-standalone-pwa/-/is-standalone-pwa-0.1.1.tgz",
- "integrity": "sha512-9Cbovsa52vNQCjdXOzeQq5CnCbAcRk05aU62K20WO372NrTv0NxibLFCK6lQ4/iZEFdEA3p3t2VNOn8AJ53F5g==",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/faisalman"
- },
- {
- "type": "opencollective",
- "url": "https://opencollective.com/ua-parser-js"
- },
- {
- "type": "paypal",
- "url": "https://paypal.me/faisalman"
- }
- ],
- "license": "MIT"
- },
- "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/is-weakset": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz",
+ "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==",
"dev": true,
"license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "get-intrinsic": "^1.2.6"
+ },
"engines": {
- "node": ">=8"
+ "node": ">= 0.4"
},
"funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/is-wsl": {
@@ -8035,36 +8300,19 @@
"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==",
"license": "ISC"
},
- "node_modules/isomorphic-ws": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-5.0.0.tgz",
- "integrity": "sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw==",
- "license": "MIT",
- "peerDependencies": {
- "ws": "*"
- }
- },
- "node_modules/isows": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/isows/-/isows-1.0.7.tgz",
- "integrity": "sha512-I1fSfDCZL5P0v33sVqeTDSpcstAg/N+wF5HS033mogOVIp4B+oHC7oOCsA3axAbBSGTJ8QubbNmnIRN/h8U7hg==",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/wevm"
- }
- ],
- "license": "MIT",
- "peerDependencies": {
- "ws": "*"
- }
- },
"node_modules/istanbul-lib-coverage": {
"version": "3.2.2",
"resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz",
@@ -8135,6 +8383,24 @@
"node": ">=8"
}
},
+ "node_modules/iterator.prototype": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz",
+ "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "define-data-property": "^1.1.4",
+ "es-object-atoms": "^1.0.0",
+ "get-intrinsic": "^1.2.6",
+ "get-proto": "^1.0.0",
+ "has-symbols": "^1.1.0",
+ "set-function-name": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
"node_modules/jest": {
"version": "29.7.0",
"resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz",
@@ -8304,7 +8570,7 @@
"version": "7.2.3",
"resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
"integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
- "deprecated": "Glob versions prior to v9 are no longer supported",
+ "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": {
@@ -8483,9 +8749,9 @@
}
},
"node_modules/jest-message-util/node_modules/@babel/code-frame": {
- "version": "7.28.6",
- "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.28.6.tgz",
- "integrity": "sha512-JYgintcMjRiCvS8mMECzaEn+m3PfoQiyqukOMCCVQtoJGYJw8j/8LBJEiqkHLkfwCcs74E3pbAUFNg7d9VNJ+Q==",
+ "version": "7.29.0",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz",
+ "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==",
"license": "MIT",
"dependencies": {
"@babel/helper-validator-identifier": "^7.28.5",
@@ -8665,7 +8931,7 @@
"version": "7.2.3",
"resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
"integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
- "deprecated": "Glob versions prior to v9 are no longer supported",
+ "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": {
@@ -8843,12 +9109,6 @@
"license": "MIT",
"peer": true
},
- "node_modules/js-base64": {
- "version": "3.7.8",
- "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-3.7.8.tgz",
- "integrity": "sha512-hNngCeKxIUQiEUN3GPJOkz4wF/YvdUdbNL9hsBcMQTkKzboD7T/q3OYOuuPZLUE6dBxSGpwhk5mwuDud7JVAow==",
- "license": "BSD-3-Clause"
- },
"node_modules/js-tokens": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
@@ -8860,7 +9120,6 @@
"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz",
"integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==",
"license": "MIT",
- "peer": true,
"dependencies": {
"argparse": "^2.0.1"
},
@@ -8886,6 +9145,20 @@
"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-parse-better-errors": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz",
+ "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/json-parse-even-better-errors": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
@@ -8893,6 +9166,20 @@
"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",
@@ -8905,6 +9192,32 @@
"node": ">=6"
}
},
+ "node_modules/jsx-ast-utils": {
+ "version": "3.3.5",
+ "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz",
+ "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "array-includes": "^3.1.6",
+ "array.prototype.flat": "^1.3.1",
+ "object.assign": "^4.1.4",
+ "object.values": "^1.1.6"
+ },
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "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/kleur": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz",
@@ -8933,27 +9246,20 @@
"node": ">=6"
}
},
- "node_modules/light-bolt11-decoder": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/light-bolt11-decoder/-/light-bolt11-decoder-3.2.0.tgz",
- "integrity": "sha512-3QEofgiBOP4Ehs9BI+RkZdXZNtSys0nsJ6fyGeSiAGCBsMwHGUDS/JQlY/sTnWs91A2Nh0S9XXfA8Sy9g6QpuQ==",
+ "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": {
- "@scure/base": "1.1.1"
+ "prelude-ls": "^1.2.1",
+ "type-check": "~0.4.0"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
}
},
- "node_modules/light-bolt11-decoder/node_modules/@scure/base": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.1.tgz",
- "integrity": "sha512-ZxOhsSyxYwLJj3pLZCefNitxsj093tb2vq90mp2txoYeBqbcjDjqFhyM8eUjq/uFm6zJ+mUuqxlS2FkuSY1MTA==",
- "funding": [
- {
- "type": "individual",
- "url": "https://paulmillr.com/funding/"
- }
- ],
- "license": "MIT"
- },
"node_modules/lighthouse-logger": {
"version": "1.4.2",
"resolved": "https://registry.npmjs.org/lighthouse-logger/-/lighthouse-logger-1.4.2.tgz",
@@ -8980,9 +9286,9 @@
"license": "MIT"
},
"node_modules/lightningcss": {
- "version": "1.30.2",
- "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.2.tgz",
- "integrity": "sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==",
+ "version": "1.31.1",
+ "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.31.1.tgz",
+ "integrity": "sha512-l51N2r93WmGUye3WuFoN5k10zyvrVs0qfKBhyC5ogUQ6Ew6JUSswh78mbSO+IU3nTWsyOArqPCcShdQSadghBQ==",
"license": "MPL-2.0",
"peer": true,
"dependencies": {
@@ -8996,23 +9302,23 @@
"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"
+ "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/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==",
+ "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"
],
@@ -9031,9 +9337,9 @@
}
},
"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==",
+ "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"
],
@@ -9052,9 +9358,9 @@
}
},
"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==",
+ "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"
],
@@ -9073,9 +9379,9 @@
}
},
"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==",
+ "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"
],
@@ -9094,9 +9400,9 @@
}
},
"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==",
+ "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"
],
@@ -9115,9 +9421,9 @@
}
},
"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==",
+ "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"
],
@@ -9136,9 +9442,9 @@
}
},
"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==",
+ "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"
],
@@ -9157,9 +9463,9 @@
}
},
"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==",
+ "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"
],
@@ -9178,9 +9484,9 @@
}
},
"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==",
+ "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"
],
@@ -9199,9 +9505,9 @@
}
},
"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==",
+ "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"
],
@@ -9220,9 +9526,9 @@
}
},
"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==",
+ "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"
],
@@ -9246,27 +9552,30 @@
"integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
"license": "MIT"
},
- "node_modules/locate-path": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
- "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+ "node_modules/load-json-file": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-7.0.1.tgz",
+ "integrity": "sha512-Gnxj3ev3mB5TkVBGad0JM6dmLiQL+o0t23JPBZ9sd+yvSLk05mFoqKBw5N8gbbkU4TNXyqCgIrl/VM17OgUIgQ==",
+ "dev": true,
"license": "MIT",
- "peer": true,
- "dependencies": {
- "p-locate": "^5.0.0"
- },
"engines": {
- "node": ">=10"
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/lodash.camelcase": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
- "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==",
- "license": "MIT"
+ "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",
+ "dependencies": {
+ "p-locate": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
},
"node_modules/lodash.debounce": {
"version": "4.0.8",
@@ -9282,6 +9591,13 @@
"dev": true,
"license": "MIT"
},
+ "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/lodash.throttle": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz",
@@ -9379,12 +9695,6 @@
"node": ">=4"
}
},
- "node_modules/long": {
- "version": "5.3.2",
- "resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz",
- "integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==",
- "license": "Apache-2.0"
- },
"node_modules/loose-envify": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
@@ -9448,6 +9758,7 @@
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
"integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.4"
@@ -9465,6 +9776,16 @@
"integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
"license": "MIT"
},
+ "node_modules/merge2": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 8"
+ }
+ },
"node_modules/metro": {
"version": "0.83.3",
"resolved": "https://registry.npmjs.org/metro/-/metro-0.83.3.tgz",
@@ -9768,9 +10089,9 @@
}
},
"node_modules/metro/node_modules/@babel/code-frame": {
- "version": "7.28.6",
- "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.28.6.tgz",
- "integrity": "sha512-JYgintcMjRiCvS8mMECzaEn+m3PfoQiyqukOMCCVQtoJGYJw8j/8LBJEiqkHLkfwCcs74E3pbAUFNg7d9VNJ+Q==",
+ "version": "7.29.0",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz",
+ "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==",
"license": "MIT",
"dependencies": {
"@babel/helper-validator-identifier": "^7.28.5",
@@ -9832,18 +10153,6 @@
}
}
},
- "node_modules/micro-packed": {
- "version": "0.7.3",
- "resolved": "https://registry.npmjs.org/micro-packed/-/micro-packed-0.7.3.tgz",
- "integrity": "sha512-2Milxs+WNC00TRlem41oRswvw31146GiSaoCT7s3Xi2gMUglW5QBeqlQaZeHr5tJx9nm3i57LNXPqxOOaWtTYg==",
- "license": "MIT",
- "dependencies": {
- "@scure/base": "~1.2.5"
- },
- "funding": {
- "url": "https://paulmillr.com/funding/"
- }
- },
"node_modules/micromatch": {
"version": "4.0.8",
"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
@@ -9932,18 +10241,6 @@
"node": ">=4"
}
},
- "node_modules/minimalistic-assert": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
- "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==",
- "license": "ISC"
- },
- "node_modules/minimalistic-crypto-utils": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz",
- "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==",
- "license": "MIT"
- },
"node_modules/minimatch": {
"version": "9.0.5",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
@@ -10004,12 +10301,6 @@
"node": ">=10"
}
},
- "node_modules/module-details-from-path": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/module-details-from-path/-/module-details-from-path-1.0.4.tgz",
- "integrity": "sha512-EGWKgxALGMgzvxYF1UyGTy0HXX/2vHLkw6+NvDKW2jypWbHpjQuj4UMcqQWXHERJhVGKikolT06G3bcKe4fi7w==",
- "license": "MIT"
- },
"node_modules/ms": {
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
@@ -10054,6 +10345,13 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/natural-compare-lite": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz",
+ "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/negotiator": {
"version": "0.6.3",
"resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
@@ -10075,68 +10373,7 @@
"resolved": "https://registry.npmjs.org/nested-error-stacks/-/nested-error-stacks-2.0.1.tgz",
"integrity": "sha512-SrQrok4CATudVzBS7coSz26QRSmlK9TzzoFbeKfcPBUFPjcQM9Rqvr/DlJkOrwI/0KcgvMub1n1g5Jt9EgRn4A==",
"license": "MIT",
- "peer": true
- },
- "node_modules/nice-grpc": {
- "version": "2.1.14",
- "resolved": "https://registry.npmjs.org/nice-grpc/-/nice-grpc-2.1.14.tgz",
- "integrity": "sha512-GK9pKNxlvnU5FAdaw7i2FFuR9CqBspcE+if2tqnKXBcE0R8525wj4BZvfcwj7FjvqbssqKxRHt2nwedalbJlww==",
- "license": "MIT",
- "dependencies": {
- "@grpc/grpc-js": "^1.14.0",
- "abort-controller-x": "^0.4.0",
- "nice-grpc-common": "^2.0.2"
- }
- },
- "node_modules/nice-grpc-client-middleware-retry": {
- "version": "3.1.13",
- "resolved": "https://registry.npmjs.org/nice-grpc-client-middleware-retry/-/nice-grpc-client-middleware-retry-3.1.13.tgz",
- "integrity": "sha512-Q9I/wm5lYkDTveKFirrTHBkBY137yavXZ4xQDXTPIycUp7aLXD8xPTHFhqtAFWUw05aS91uffZZRgdv3HS0y/g==",
- "license": "MIT",
- "dependencies": {
- "abort-controller-x": "^0.4.0",
- "nice-grpc-common": "^2.0.2"
- }
- },
- "node_modules/nice-grpc-common": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/nice-grpc-common/-/nice-grpc-common-2.0.2.tgz",
- "integrity": "sha512-7RNWbls5kAL1QVUOXvBsv1uO0wPQK3lHv+cY1gwkTzirnG1Nop4cBJZubpgziNbaVc/bl9QJcyvsf/NQxa3rjQ==",
- "license": "MIT",
- "dependencies": {
- "ts-error": "^1.0.6"
- }
- },
- "node_modules/nice-grpc-opentelemetry": {
- "version": "0.1.20",
- "resolved": "https://registry.npmjs.org/nice-grpc-opentelemetry/-/nice-grpc-opentelemetry-0.1.20.tgz",
- "integrity": "sha512-dRH6lmm8OgqY21WRo9BP6cHHqIhbG5UT/INFne0qIDSlSseYc6s1+qNTE3Up0z/4zY50V8tVTOH30yyhkwNXTw==",
- "license": "MIT",
- "dependencies": {
- "@opentelemetry/api": "^1.8.0",
- "@opentelemetry/semantic-conventions": "^1.22.0",
- "abort-controller-x": "^0.4.0",
- "ipaddr.js": "^2.0.1",
- "nice-grpc-common": "^2.0.2"
- }
- },
- "node_modules/nice-grpc-web": {
- "version": "3.3.9",
- "resolved": "https://registry.npmjs.org/nice-grpc-web/-/nice-grpc-web-3.3.9.tgz",
- "integrity": "sha512-CiCQLdLTux9D4try8XlHW9tHIP/uLB+aciNKErDNLUM6kzhPFaVh8q+oTkoVGOjxOacEzlOwQRRjwQETAx5lVw==",
- "license": "MIT",
- "dependencies": {
- "abort-controller-x": "^0.4.0",
- "isomorphic-ws": "^5.0.0",
- "js-base64": "^3.7.2",
- "nice-grpc-common": "^2.0.2"
- }
- },
- "node_modules/node-addon-api": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.1.0.tgz",
- "integrity": "sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==",
- "license": "MIT"
+ "peer": true
},
"node_modules/node-forge": {
"version": "1.3.3",
@@ -10148,17 +10385,6 @@
"node": ">= 6.13.0"
}
},
- "node_modules/node-gyp-build": {
- "version": "4.8.4",
- "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz",
- "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==",
- "license": "MIT",
- "bin": {
- "node-gyp-build": "bin.js",
- "node-gyp-build-optional": "optional.js",
- "node-gyp-build-test": "build-test.js"
- }
- },
"node_modules/node-int64": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz",
@@ -10232,11 +10458,123 @@
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
"integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
"license": "MIT",
- "peer": true,
"engines": {
"node": ">=0.10.0"
}
},
+ "node_modules/object-inspect": {
+ "version": "1.13.4",
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz",
+ "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object-keys": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
+ "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/object.assign": {
+ "version": "4.1.7",
+ "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz",
+ "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.3",
+ "define-properties": "^1.2.1",
+ "es-object-atoms": "^1.0.0",
+ "has-symbols": "^1.1.0",
+ "object-keys": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object.entries": {
+ "version": "1.1.9",
+ "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz",
+ "integrity": "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.4",
+ "define-properties": "^1.2.1",
+ "es-object-atoms": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/object.fromentries": {
+ "version": "2.0.8",
+ "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz",
+ "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.2",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object.groupby": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz",
+ "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/object.values": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz",
+ "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.3",
+ "define-properties": "^1.2.1",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "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",
@@ -10300,6 +10638,24 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "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",
+ "dependencies": {
+ "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": ">= 0.8.0"
+ }
+ },
"node_modules/ora": {
"version": "3.4.0",
"resolved": "https://registry.npmjs.org/ora/-/ora-3.4.0.tgz",
@@ -10419,55 +10775,22 @@
"node": ">=4"
}
},
- "node_modules/ox": {
- "version": "0.11.3",
- "resolved": "https://registry.npmjs.org/ox/-/ox-0.11.3.tgz",
- "integrity": "sha512-1bWYGk/xZel3xro3l8WGg6eq4YEKlaqvyMtVhfMFpbJzK2F6rj4EDRtqDCWVEJMkzcmEi9uW2QxsqELokOlarw==",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/wevm"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "@adraffy/ens-normalize": "^1.11.0",
- "@noble/ciphers": "^1.3.0",
- "@noble/curves": "1.9.1",
- "@noble/hashes": "^1.8.0",
- "@scure/bip32": "^1.7.0",
- "@scure/bip39": "^1.6.0",
- "abitype": "^1.2.3",
- "eventemitter3": "5.0.1"
- },
- "peerDependencies": {
- "typescript": ">=5.4.0"
- },
- "peerDependenciesMeta": {
- "typescript": {
- "optional": true
- }
- }
- },
- "node_modules/ox/node_modules/@adraffy/ens-normalize": {
- "version": "1.11.1",
- "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.11.1.tgz",
- "integrity": "sha512-nhCBV3quEgesuf7c7KYfperqSS14T8bYuvJ8PcLJp6znkZpFc0AuW4qBtr8eKVyPPe/8RSr7sglCWPU5eaxwKQ==",
- "license": "MIT"
- },
- "node_modules/ox/node_modules/@noble/curves": {
- "version": "1.9.1",
- "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.1.tgz",
- "integrity": "sha512-k11yZxZg+t+gWvBbIswW0yoJlu8cHOC7dhunwOzoWH/mXGBiYyR4YY6hAEK/3EUs4UpB8la1RfdRpeGsFHkWsA==",
+ "node_modules/own-keys": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz",
+ "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==",
+ "dev": true,
"license": "MIT",
"dependencies": {
- "@noble/hashes": "1.8.0"
+ "get-intrinsic": "^1.2.6",
+ "object-keys": "^1.1.1",
+ "safe-push-apply": "^1.0.0"
},
"engines": {
- "node": "^14.21.3 || >=16"
+ "node": ">= 0.4"
},
"funding": {
- "url": "https://paulmillr.com/funding/"
+ "url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/p-limit": {
@@ -10486,16 +10809,27 @@
}
},
"node_modules/p-locate": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
- "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
+ "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",
- "peer": true,
"dependencies": {
- "p-limit": "^3.0.2"
+ "p-limit": "^2.2.0"
},
"engines": {
- "node": ">=10"
+ "node": ">=8"
+ }
+ },
+ "node_modules/p-locate/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",
+ "dependencies": {
+ "p-try": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
@@ -10516,6 +10850,19 @@
"integrity": "sha512-p36QQrwU3X6fj5d2JN20B4lcZI/O3fxMVUHc1xD7MNe5bcOf3jIgE0CIK5Zv/s5YAUGlobTJ/kKXrh1FJVrs3w==",
"license": "Apache-2.0"
},
+ "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-json": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
@@ -10608,15 +10955,25 @@
}
},
"node_modules/path-scurry/node_modules/lru-cache": {
- "version": "11.2.4",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.4.tgz",
- "integrity": "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==",
+ "version": "11.2.5",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.5.tgz",
+ "integrity": "sha512-vFrFJkWtJvJnD5hg+hJvVE8Lh/TcMzKnTgCWmtBipwI5yLX/iX+5UB2tfuyODF5E7k9xEzMdYgGqaSb1c0c5Yw==",
"license": "BlueOak-1.0.0",
"peer": true,
"engines": {
"node": "20 || >=22"
}
},
+ "node_modules/path-type": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
+ "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/picocolors": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
@@ -10636,6 +10993,16 @@
"url": "https://github.com/sponsors/jonschlinkert"
}
},
+ "node_modules/pify": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
+ "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
"node_modules/pirates": {
"version": "4.0.7",
"resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz",
@@ -10645,70 +11012,119 @@
"node": ">= 6"
}
},
- "node_modules/pkg-dir": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
- "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
+ "node_modules/pkg-conf": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-4.0.0.tgz",
+ "integrity": "sha512-7dmgi4UY4qk+4mj5Cd8v/GExPo0K+SlY+hulOSdfZ/T6jVH6//y7NtzZo5WrfhDBxuQ0jCa7fLZmNaNh7EWL/w==",
"dev": true,
"license": "MIT",
"dependencies": {
- "find-up": "^4.0.0"
+ "find-up": "^6.0.0",
+ "load-json-file": "^7.0.0"
},
"engines": {
- "node": ">=8"
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/pkg-dir/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/pkg-conf/node_modules/find-up": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz",
+ "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "locate-path": "^5.0.0",
- "path-exists": "^4.0.0"
+ "locate-path": "^7.1.0",
+ "path-exists": "^5.0.0"
},
"engines": {
- "node": ">=8"
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/pkg-dir/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==",
+ "node_modules/pkg-conf/node_modules/locate-path": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz",
+ "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "p-locate": "^4.1.0"
+ "p-locate": "^6.0.0"
},
"engines": {
- "node": ">=8"
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/pkg-dir/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==",
+ "node_modules/pkg-conf/node_modules/p-limit": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz",
+ "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "p-try": "^2.0.0"
+ "yocto-queue": "^1.0.0"
},
"engines": {
- "node": ">=6"
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/pkg-dir/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==",
+ "node_modules/pkg-conf/node_modules/p-locate": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz",
+ "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "p-limit": "^2.2.0"
+ "p-limit": "^4.0.0"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/pkg-conf/node_modules/path-exists": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz",
+ "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ }
+ },
+ "node_modules/pkg-conf/node_modules/yocto-queue": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.2.tgz",
+ "integrity": "sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.20"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/pkg-dir": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
+ "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "find-up": "^4.0.0"
},
"engines": {
"node": ">=8"
@@ -10739,6 +11155,16 @@
"node": ">=4.0.0"
}
},
+ "node_modules/possible-typed-array-names": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz",
+ "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
"node_modules/postcss": {
"version": "8.4.49",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz",
@@ -10768,6 +11194,16 @@
"node": "^10 || ^12 || >=14"
}
},
+ "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",
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
"node_modules/pretty-bytes": {
"version": "5.6.0",
"resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz",
@@ -10827,12 +11263,6 @@
"node": ">=0.4.0"
}
},
- "node_modules/promaphore": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/promaphore/-/promaphore-1.0.0.tgz",
- "integrity": "sha512-Eg8401+KJddVvDULkpy8bR964GMX8xMPegL6NdxTeBH2Wa3L86cZlEHizbkFJikr5u+E3wFoR5dLWJ+1OPyEfw==",
- "license": "MIT"
- },
"node_modules/promise": {
"version": "8.3.0",
"resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz",
@@ -10855,34 +11285,23 @@
"node": ">= 6"
}
},
- "node_modules/protobufjs": {
- "version": "7.5.4",
- "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.5.4.tgz",
- "integrity": "sha512-CvexbZtbov6jW2eXAvLukXjXUW1TzFaivC46BpWc/3BpcCysb5Vffu+B3XHMm8lVEuy2Mm4XGex8hBSg1yapPg==",
- "hasInstallScript": true,
- "license": "BSD-3-Clause",
+ "node_modules/prop-types": {
+ "version": "15.8.1",
+ "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz",
+ "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "@protobufjs/aspromise": "^1.1.2",
- "@protobufjs/base64": "^1.1.2",
- "@protobufjs/codegen": "^2.0.4",
- "@protobufjs/eventemitter": "^1.1.0",
- "@protobufjs/fetch": "^1.1.0",
- "@protobufjs/float": "^1.0.2",
- "@protobufjs/inquire": "^1.1.0",
- "@protobufjs/path": "^1.1.2",
- "@protobufjs/pool": "^1.1.0",
- "@protobufjs/utf8": "^1.1.0",
- "@types/node": ">=13.7.0",
- "long": "^5.0.0"
- },
- "engines": {
- "node": ">=12.0.0"
+ "loose-envify": "^1.4.0",
+ "object-assign": "^4.1.1",
+ "react-is": "^16.13.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==",
+ "node_modules/prop-types/node_modules/react-is": {
+ "version": "16.13.1",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
+ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==",
+ "dev": true,
"license": "MIT"
},
"node_modules/punycode": {
@@ -10911,26 +11330,6 @@
],
"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/qrcode-terminal": {
"version": "0.11.0",
"resolved": "https://registry.npmjs.org/qrcode-terminal/-/qrcode-terminal-0.11.0.tgz",
@@ -10949,6 +11348,27 @@
"inherits": "~2.0.3"
}
},
+ "node_modules/queue-microtask": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
+ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
+ "dev": true,
+ "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/range-parser": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
@@ -10985,9 +11405,9 @@
}
},
"node_modules/react": {
- "version": "19.2.3",
- "resolved": "https://registry.npmjs.org/react/-/react-19.2.3.tgz",
- "integrity": "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA==",
+ "version": "19.2.4",
+ "resolved": "https://registry.npmjs.org/react/-/react-19.2.4.tgz",
+ "integrity": "sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==",
"license": "MIT",
"peer": true,
"engines": {
@@ -11090,9 +11510,9 @@
}
},
"node_modules/react-native-bare-kit": {
- "version": "0.11.5",
- "resolved": "https://registry.npmjs.org/react-native-bare-kit/-/react-native-bare-kit-0.11.5.tgz",
- "integrity": "sha512-VTM1mRip9g3NqUUG2MsRg1HWFAXjVotq4ZlzHnzAHrHwEnlrnDa5Ex5Yqsq3HYh78Q3rvdFbNcxpKVv+CuLW1Q==",
+ "version": "0.12.0",
+ "resolved": "https://registry.npmjs.org/react-native-bare-kit/-/react-native-bare-kit-0.12.0.tgz",
+ "integrity": "sha512-3r8NpPLMcsK0nwHHif8vWTjlAZ5WAwsgZRTedl0UKbVmXuR7SsfJCMapzo9JvVZUcwuFztOMlF0pL2QY2gO5IQ==",
"license": "Apache-2.0",
"dependencies": {
"bare-events": "^2.6.1",
@@ -11118,9 +11538,9 @@
}
},
"node_modules/react-native-mmkv": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/react-native-mmkv/-/react-native-mmkv-4.1.1.tgz",
- "integrity": "sha512-nYFjM27l7zVhIiyAqWEFRagGASecb13JMIlzAuOeakRRz9GMJ49hCQntUBE2aeuZRE4u4ehSqTOomB0mTF56Ew==",
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/react-native-mmkv/-/react-native-mmkv-4.1.2.tgz",
+ "integrity": "sha512-6LHb2DQBXuo96Aues13EugmlWw/HAYuh3KoJoQNrC4JsBwn3J3KiRYAg2mCm5Je0VYq2YsmbgZG7XJwX/WFYZA==",
"license": "MIT",
"peerDependencies": {
"react": "*",
@@ -11129,9 +11549,9 @@
}
},
"node_modules/react-native-nitro-modules": {
- "version": "0.33.1",
- "resolved": "https://registry.npmjs.org/react-native-nitro-modules/-/react-native-nitro-modules-0.33.1.tgz",
- "integrity": "sha512-Kdo8qiqlkGAEs7fq29i0yiZs0Gf7ucmMiFsH8PH4uzsnSGEt2CQRBJGnQKKMl9vJYL8e7rzA0TZKRwO/L8G/Sg==",
+ "version": "0.33.7",
+ "resolved": "https://registry.npmjs.org/react-native-nitro-modules/-/react-native-nitro-modules-0.33.7.tgz",
+ "integrity": "sha512-WepMobWe4j1Ae5GQ5RxYGBdBpJBwzP6zaOxJ7r6nhbY5iyl01DL3Gsh4gk8edzNFRuAh1rvXDAHIipq8SahxeQ==",
"license": "MIT",
"peer": true,
"peerDependencies": {
@@ -11198,7 +11618,7 @@
"version": "7.2.3",
"resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
"integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
- "deprecated": "Glob versions prior to v9 are no longer supported",
+ "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",
"dependencies": {
"fs.realpath": "^1.0.0",
@@ -11273,24 +11693,24 @@
}
},
"node_modules/react-test-renderer": {
- "version": "19.2.3",
- "resolved": "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-19.2.3.tgz",
- "integrity": "sha512-TMR1LnSFiWZMJkCgNf5ATSvAheTT2NvKIwiVwdBPHxjBI7n/JbWd4gaZ16DVd9foAXdvDz+sB5yxZTwMjPRxpw==",
+ "version": "19.2.4",
+ "resolved": "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-19.2.4.tgz",
+ "integrity": "sha512-Ttl5D7Rnmi6JGMUpri4UjB4BAN0FPs4yRDnu2XSsigCWOLm11o8GwRlVsh27ER+4WFqsGtrBuuv5zumUaRCmKw==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
- "react-is": "^19.2.3",
+ "react-is": "^19.2.4",
"scheduler": "^0.27.0"
},
"peerDependencies": {
- "react": "^19.2.3"
+ "react": "^19.2.4"
}
},
"node_modules/react-test-renderer/node_modules/react-is": {
- "version": "19.2.3",
- "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.2.3.tgz",
- "integrity": "sha512-qJNJfu81ByyabuG7hPFEbXqNcWSU3+eVus+KJs+0ncpGfMyYdvSmxiJxbWR65lYi1I+/0HBcliO029gc4F+PnA==",
+ "version": "19.2.4",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.2.4.tgz",
+ "integrity": "sha512-W+EWGn2v0ApPKgKKCy/7s7WHXkboGcsrXE+2joLyVxkbyVQfO3MUEaUQDHoSmb8TFFrSKYa9mw64WZHNHSDzYA==",
"dev": true,
"license": "MIT",
"peer": true
@@ -11309,6 +11729,29 @@
"node": ">=8"
}
},
+ "node_modules/reflect.getprototypeof": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz",
+ "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.9",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.0.0",
+ "get-intrinsic": "^1.2.7",
+ "get-proto": "^1.0.1",
+ "which-builtin-type": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/regenerate": {
"version": "1.4.2",
"resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz",
@@ -11335,6 +11778,40 @@
"integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==",
"license": "MIT"
},
+ "node_modules/regexp.prototype.flags": {
+ "version": "1.5.4",
+ "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz",
+ "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "define-properties": "^1.2.1",
+ "es-errors": "^1.3.0",
+ "get-proto": "^1.0.1",
+ "gopd": "^1.2.0",
+ "set-function-name": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/regexpp": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz",
+ "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/mysticatea"
+ }
+ },
"node_modules/regexpu-core": {
"version": "6.4.0",
"resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.4.0.tgz",
@@ -11404,20 +11881,6 @@
"node": ">=0.10.0"
}
},
- "node_modules/require-in-the-middle": {
- "version": "7.5.2",
- "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-7.5.2.tgz",
- "integrity": "sha512-gAZ+kLqBdHarXB64XpAe2VCjB7rIRv+mU8tfRWziHRJ5umKsIHN2tLLv6EtMw7WCdP19S0ERVMldNvxYCHnhSQ==",
- "license": "MIT",
- "dependencies": {
- "debug": "^4.3.5",
- "module-details-from-path": "^1.0.3",
- "resolve": "^1.22.8"
- },
- "engines": {
- "node": ">=8.6.0"
- }
- },
"node_modules/requireg": {
"version": "0.2.2",
"resolved": "https://registry.npmjs.org/requireg/-/requireg-0.2.2.tgz",
@@ -11550,6 +12013,17 @@
"node": ">=4"
}
},
+ "node_modules/reusify": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz",
+ "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "iojs": ">=1.0.0",
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/rimraf": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
@@ -11580,7 +12054,7 @@
"version": "7.2.3",
"resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
"integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
- "deprecated": "Glob versions prior to v9 are no longer supported",
+ "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",
"dependencies": {
"fs.realpath": "^1.0.0",
@@ -11609,6 +12083,50 @@
"node": "*"
}
},
+ "node_modules/run-parallel": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
+ "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
+ "dev": true,
+ "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",
+ "dependencies": {
+ "queue-microtask": "^1.2.2"
+ }
+ },
+ "node_modules/safe-array-concat": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz",
+ "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.2",
+ "get-intrinsic": "^1.2.6",
+ "has-symbols": "^1.1.0",
+ "isarray": "^2.0.5"
+ },
+ "engines": {
+ "node": ">=0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/safe-buffer": {
"version": "5.2.1",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
@@ -11630,18 +12148,47 @@
"license": "MIT",
"peer": true
},
+ "node_modules/safe-push-apply": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz",
+ "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "isarray": "^2.0.5"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/safe-regex-test": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz",
+ "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "is-regex": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/safety-catch": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/safety-catch/-/safety-catch-1.0.2.tgz",
"integrity": "sha512-C1UYVZ4dtbBxEtvOcpjBaaD27nP8MlvyAQEp2fOTOEe6pfUpk1cDUxij6BR1jZup6rSyUTaBBplK7LanskrULA==",
"license": "MIT"
},
- "node_modules/same-object": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/same-object/-/same-object-1.0.2.tgz",
- "integrity": "sha512-csHWhvUsLbIOHDM/nP+KHWM+BLPsIzWkFa8HbzaI0G7BqKXgx+7FJpKTGgLXyz5amfdY2OVBcmXTqYOMEk04og==",
- "license": "MIT"
- },
"node_modules/sax": {
"version": "1.4.4",
"resolved": "https://registry.npmjs.org/sax/-/sax-1.4.4.tgz",
@@ -11658,25 +12205,10 @@
"integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==",
"license": "MIT"
},
- "node_modules/secp256k1": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-5.0.1.tgz",
- "integrity": "sha512-lDFs9AAIaWP9UCdtWrotXWWF9t8PWgQDcxqgAnpM9rMqxb3Oaq2J0thzPVSxBwdJgyQtkU/sYtFtbM1RSt/iYA==",
- "hasInstallScript": true,
- "license": "MIT",
- "dependencies": {
- "elliptic": "^6.5.7",
- "node-addon-api": "^5.0.0",
- "node-gyp-build": "^4.2.0"
- },
- "engines": {
- "node": ">=18.0.0"
- }
- },
"node_modules/semver": {
- "version": "7.7.3",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz",
- "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==",
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz",
+ "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==",
"license": "ISC",
"bin": {
"semver": "bin/semver.js"
@@ -11787,6 +12319,55 @@
"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",
+ "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "define-data-property": "^1.1.4",
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2",
+ "get-intrinsic": "^1.2.4",
+ "gopd": "^1.0.1",
+ "has-property-descriptors": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/set-function-name": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz",
+ "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "define-data-property": "^1.1.4",
+ "es-errors": "^1.3.0",
+ "functions-have-names": "^1.2.3",
+ "has-property-descriptors": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/set-proto": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz",
+ "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "dunder-proto": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
"node_modules/setprototypeof": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
@@ -11826,6 +12407,82 @@
"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",
+ "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "object-inspect": "^1.13.3",
+ "side-channel-list": "^1.0.0",
+ "side-channel-map": "^1.0.1",
+ "side-channel-weakmap": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel-list": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz",
+ "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "object-inspect": "^1.13.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel-map": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz",
+ "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.5",
+ "object-inspect": "^1.13.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel-weakmap": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz",
+ "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.5",
+ "object-inspect": "^1.13.3",
+ "side-channel-map": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/signal-exit": {
"version": "3.0.7",
"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
@@ -11869,47 +12526,17 @@
"integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
"license": "MIT",
"engines": {
- "node": ">=8"
- }
- },
- "node_modules/slugify": {
- "version": "1.6.6",
- "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.6.6.tgz",
- "integrity": "sha512-h+z7HKHYXj6wJU+AnS/+IH8Uh9fdcX1Lrhg1/VMdf9PwoBQXFcXiAdsy2tSK0P6gKwJLXp02r90ahUCqHk9rrw==",
- "license": "MIT",
- "peer": true,
- "engines": {
- "node": ">=8.0.0"
- }
- },
- "node_modules/sodium-native": {
- "version": "5.0.10",
- "resolved": "https://registry.npmjs.org/sodium-native/-/sodium-native-5.0.10.tgz",
- "integrity": "sha512-UIw+0AbpCQRuTJF88JWrZomP4O+PXhlWvdopiAJOsUivTyHTf3korMyStxkZuPngSbBEtEfDdc4ewEd8/T4/lA==",
- "license": "MIT",
- "dependencies": {
- "require-addon": "^1.1.0",
- "which-runtime": "^1.2.1"
- },
- "engines": {
- "bare": ">=1.16.0"
+ "node": ">=8"
}
},
- "node_modules/sodium-universal": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/sodium-universal/-/sodium-universal-5.0.1.tgz",
- "integrity": "sha512-rv+aH+tnKB5H0MAc2UadHShLMslpJsc4wjdnHRtiSIEYpOetCgu8MS4ExQRia+GL/MK3uuCyZPeEsi+J3h+Q+Q==",
+ "node_modules/slugify": {
+ "version": "1.6.6",
+ "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.6.6.tgz",
+ "integrity": "sha512-h+z7HKHYXj6wJU+AnS/+IH8Uh9fdcX1Lrhg1/VMdf9PwoBQXFcXiAdsy2tSK0P6gKwJLXp02r90ahUCqHk9rrw==",
"license": "MIT",
- "dependencies": {
- "sodium-native": "^5.0.1"
- },
- "peerDependencies": {
- "sodium-javascript": "~0.8.0"
- },
- "peerDependenciesMeta": {
- "sodium-javascript": {
- "optional": true
- }
+ "peer": true,
+ "engines": {
+ "node": ">=8.0.0"
}
},
"node_modules/source-map": {
@@ -11995,6 +12622,167 @@
"node": ">=8"
}
},
+ "node_modules/standard-engine": {
+ "version": "15.1.0",
+ "resolved": "https://registry.npmjs.org/standard-engine/-/standard-engine-15.1.0.tgz",
+ "integrity": "sha512-VHysfoyxFu/ukT+9v49d4BRXIokFRZuH3z1VRxzFArZdjSCFpro6rEIU3ji7e4AoAtuSfKBkiOmsrDqKW5ZSRw==",
+ "dev": true,
+ "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",
+ "dependencies": {
+ "get-stdin": "^8.0.0",
+ "minimist": "^1.2.6",
+ "pkg-conf": "^3.1.0",
+ "xdg-basedir": "^4.0.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ }
+ },
+ "node_modules/standard-engine/node_modules/find-up": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
+ "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/standard-engine/node_modules/load-json-file": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-5.3.0.tgz",
+ "integrity": "sha512-cJGP40Jc/VXUsp8/OrnyKyTZ1y6v/dphm3bioS+RrKXjK2BB6wHUd6JptZEFDGgGahMT+InnZO5i1Ei9mpC8Bw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "graceful-fs": "^4.1.15",
+ "parse-json": "^4.0.0",
+ "pify": "^4.0.1",
+ "strip-bom": "^3.0.0",
+ "type-fest": "^0.3.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/standard-engine/node_modules/locate-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
+ "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^3.0.0",
+ "path-exists": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/standard-engine/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==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-try": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/standard-engine/node_modules/p-locate": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
+ "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/standard-engine/node_modules/parse-json": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz",
+ "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "error-ex": "^1.3.1",
+ "json-parse-better-errors": "^1.0.1"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/standard-engine/node_modules/path-exists": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
+ "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/standard-engine/node_modules/pkg-conf": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-3.1.0.tgz",
+ "integrity": "sha512-m0OTbR/5VPNPqO1ph6Fqbj7Hv6QU7gR/tQW40ZqrL1rjgCU85W6C1bJn0BItuJqnR98PWzw7Z8hHeChD1WrgdQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "find-up": "^3.0.0",
+ "load-json-file": "^5.2.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/standard-engine/node_modules/strip-bom": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
+ "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/standard-engine/node_modules/type-fest": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz",
+ "integrity": "sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==",
+ "dev": true,
+ "license": "(MIT OR CC0-1.0)",
+ "engines": {
+ "node": ">=6"
+ }
+ },
"node_modules/statuses": {
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
@@ -12004,6 +12792,20 @@
"node": ">= 0.6"
}
},
+ "node_modules/stop-iteration-iterator": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz",
+ "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "internal-slot": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
"node_modules/stream-buffers": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-2.2.0.tgz",
@@ -12053,6 +12855,104 @@
"node": ">=8"
}
},
+ "node_modules/string.prototype.matchall": {
+ "version": "4.0.12",
+ "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz",
+ "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.3",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.6",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.0.0",
+ "get-intrinsic": "^1.2.6",
+ "gopd": "^1.2.0",
+ "has-symbols": "^1.1.0",
+ "internal-slot": "^1.1.0",
+ "regexp.prototype.flags": "^1.5.3",
+ "set-function-name": "^2.0.2",
+ "side-channel": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/string.prototype.repeat": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz",
+ "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.17.5"
+ }
+ },
+ "node_modules/string.prototype.trim": {
+ "version": "1.2.10",
+ "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz",
+ "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.2",
+ "define-data-property": "^1.1.4",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.5",
+ "es-object-atoms": "^1.0.0",
+ "has-property-descriptors": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/string.prototype.trimend": {
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz",
+ "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.2",
+ "define-properties": "^1.2.1",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/string.prototype.trimstart": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz",
+ "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/strip-ansi": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
@@ -12190,9 +13090,9 @@
}
},
"node_modules/tar": {
- "version": "7.5.2",
- "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.2.tgz",
- "integrity": "sha512-7NyxrTE4Anh8km8iEy7o0QYPs+0JKBTj5ZaqHg6B39erLg0qYXN3BijtShwbsNSvQ+LN75+KV+C4QR/f6Gwnpg==",
+ "version": "7.5.7",
+ "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.7.tgz",
+ "integrity": "sha512-fov56fJiRuThVFXD6o6/Q354S7pnWMJIVlDBYijsTNx6jKSE4pvrDTs6lUnmGvNyfJwFQQwWy3owKz1ucIhveQ==",
"license": "BlueOak-1.0.0",
"peer": true,
"dependencies": {
@@ -12244,9 +13144,9 @@
}
},
"node_modules/terser": {
- "version": "5.44.1",
- "resolved": "https://registry.npmjs.org/terser/-/terser-5.44.1.tgz",
- "integrity": "sha512-t/R3R/n0MSwnnazuPpPNVO60LX0SKL45pyl9YlvxIdkH0Of7D5qM2EVe+yASRIlY5pZ73nclYJfNANGWPwFDZw==",
+ "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",
"dependencies": {
"@jridgewell/source-map": "^0.3.3",
@@ -12295,7 +13195,7 @@
"version": "7.2.3",
"resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
"integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
- "deprecated": "Glob versions prior to v9 are no longer supported",
+ "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",
"dependencies": {
"fs.realpath": "^1.0.0",
@@ -12324,17 +13224,6 @@
"node": "*"
}
},
- "node_modules/test-tmp": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/test-tmp/-/test-tmp-1.4.0.tgz",
- "integrity": "sha512-GVggxGg+jXqP2Wbju50JVLo+9E+nIOPPyWqgr63EbOnNItIKu1cEbJpTWAJeflnyGqXOtcMI7ijHRp88GUkfDA==",
- "license": "MIT",
- "dependencies": {
- "bare-fs": "^4.0.1",
- "bare-os": "^3.3.0",
- "bare-path": "^3.0.0"
- }
- },
"node_modules/text-decoder": {
"version": "1.2.3",
"resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.3.tgz",
@@ -12344,12 +13233,12 @@
"b4a": "^1.6.4"
}
},
- "node_modules/text-encoding": {
- "version": "0.7.0",
- "resolved": "https://registry.npmjs.org/text-encoding/-/text-encoding-0.7.0.tgz",
- "integrity": "sha512-oJQ3f1hrOnbRLOcwKz0Liq2IcrvDeZRHXhd9RgLrsT+DjWY/nty1Hi7v3dtkaEYbPYe0mUoOfzRrMwfXXwgPUA==",
- "deprecated": "no longer maintained",
- "license": "(Unlicense OR Apache-2.0)"
+ "node_modules/text-table": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
+ "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==",
+ "dev": true,
+ "license": "MIT"
},
"node_modules/thenify": {
"version": "3.3.1",
@@ -12410,15 +13299,6 @@
"url": "https://github.com/sponsors/jonschlinkert"
}
},
- "node_modules/tmatch": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/tmatch/-/tmatch-5.0.0.tgz",
- "integrity": "sha512-Ib9OtBkpHn07tXP04SlN1SYRxFgTk6wSM2EBmjjxug4u5RXPRVLkdFJSS1PmrQidaSB8Lru9nRtViQBsbxzE5Q==",
- "license": "ISC",
- "engines": {
- "node": ">=8"
- }
- },
"node_modules/tmpl": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz",
@@ -12446,12 +13326,6 @@
"node": ">=0.6"
}
},
- "node_modules/ts-error": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/ts-error/-/ts-error-1.0.6.tgz",
- "integrity": "sha512-tLJxacIQUM82IR7JO1UUkKlYuUTmoY9HBJAmNWFzheSlDS5SPMcNIepejHJa4BpPQLAcbRhRf3GDJzyj6rbKvA==",
- "license": "MIT"
- },
"node_modules/ts-interface-checker": {
"version": "0.1.13",
"resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz",
@@ -12525,45 +13399,108 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/ts-poet": {
- "version": "6.12.0",
- "resolved": "https://registry.npmjs.org/ts-poet/-/ts-poet-6.12.0.tgz",
- "integrity": "sha512-xo+iRNMWqyvXpFTaOAvLPA5QAWO6TZrSUs5s4Odaya3epqofBu/fMLHEWl8jPmjhA0s9sgj9sNvF1BmaQlmQkA==",
- "license": "Apache-2.0",
+ "node_modules/ts-standard": {
+ "version": "12.0.2",
+ "resolved": "https://registry.npmjs.org/ts-standard/-/ts-standard-12.0.2.tgz",
+ "integrity": "sha512-XX2wrB9fKKTfBj4yD3ABm9iShzZcS2iWcPK8XzlBvuL20+wMiLgiz/k5tXgZwTaYq5wRhbks1Y9PelhujF/9ag==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "dprint-node": "^1.0.8"
+ "@typescript-eslint/eslint-plugin": "^5.0.0",
+ "@typescript-eslint/parser": "^5.0.0",
+ "eslint": "^8.0.1",
+ "eslint-config-standard-jsx": "^11.0.0",
+ "eslint-config-standard-with-typescript": "^23.0.0",
+ "eslint-plugin-import": "^2.25.2",
+ "eslint-plugin-n": "^15.0.0",
+ "eslint-plugin-promise": "^6.0.0",
+ "eslint-plugin-react": "^7.28.0",
+ "minimist": "^1.2.6",
+ "pkg-conf": "^4.0.0",
+ "standard-engine": "^15.0.0"
+ },
+ "bin": {
+ "ts-standard": "cli.js"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "peerDependencies": {
+ "typescript": "*"
}
},
- "node_modules/ts-proto": {
- "version": "2.8.3",
- "resolved": "https://registry.npmjs.org/ts-proto/-/ts-proto-2.8.3.tgz",
- "integrity": "sha512-TdXInqG+61pj/TvORqITWjvjTTsL1EZxwX49iEj89+xFAcqPT8tjChpAGQXzfcF4MJwvNiuoCEbBOKqVf3ds3g==",
- "license": "ISC",
+ "node_modules/tsconfig-paths": {
+ "version": "3.15.0",
+ "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz",
+ "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/json5": "^0.0.29",
+ "json5": "^1.0.2",
+ "minimist": "^1.2.6",
+ "strip-bom": "^3.0.0"
+ }
+ },
+ "node_modules/tsconfig-paths/node_modules/json5": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
+ "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "@bufbuild/protobuf": "^2.0.0",
- "case-anything": "^2.1.13",
- "ts-poet": "^6.12.0",
- "ts-proto-descriptors": "2.0.0"
+ "minimist": "^1.2.0"
},
"bin": {
- "protoc-gen-ts_proto": "protoc-gen-ts_proto"
+ "json5": "lib/cli.js"
}
},
- "node_modules/ts-proto-descriptors": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ts-proto-descriptors/-/ts-proto-descriptors-2.0.0.tgz",
- "integrity": "sha512-wHcTH3xIv11jxgkX5OyCSFfw27agpInAd6yh89hKG6zqIXnjW9SYqSER2CVQxdPj4czeOhGagNvZBEbJPy7qkw==",
- "license": "ISC",
+ "node_modules/tsconfig-paths/node_modules/strip-bom": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
+ "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/tslib": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
+ "dev": true,
+ "license": "0BSD"
+ },
+ "node_modules/tsutils": {
+ "version": "3.21.0",
+ "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz",
+ "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "tslib": "^1.8.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ },
+ "peerDependencies": {
+ "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta"
+ }
+ },
+ "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": {
- "@bufbuild/protobuf": "^2.0.0"
+ "prelude-ls": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
}
},
- "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"
- },
"node_modules/type-detect": {
"version": "4.0.8",
"resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz",
@@ -12585,84 +13522,96 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/typescript": {
- "version": "5.9.3",
- "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz",
- "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
- "devOptional": true,
- "license": "Apache-2.0",
- "bin": {
- "tsc": "bin/tsc",
- "tsserver": "bin/tsserver"
+ "node_modules/typed-array-buffer": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz",
+ "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "es-errors": "^1.3.0",
+ "is-typed-array": "^1.1.14"
},
"engines": {
- "node": ">=14.17"
+ "node": ">= 0.4"
}
},
- "node_modules/ua-is-frozen": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/ua-is-frozen/-/ua-is-frozen-0.1.2.tgz",
- "integrity": "sha512-RwKDW2p3iyWn4UbaxpP2+VxwqXh0jpvdxsYpZ5j/MLLiQOfbsV5shpgQiw93+KMYQPcteeMQ289MaAFzs3G9pw==",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/faisalman"
- },
- {
- "type": "opencollective",
- "url": "https://opencollective.com/ua-parser-js"
- },
- {
- "type": "paypal",
- "url": "https://paypal.me/faisalman"
- }
- ],
- "license": "MIT"
+ "node_modules/typed-array-byte-length": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz",
+ "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "for-each": "^0.3.3",
+ "gopd": "^1.2.0",
+ "has-proto": "^1.2.0",
+ "is-typed-array": "^1.1.14"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
},
- "node_modules/ua-parser-js": {
- "version": "2.0.8",
- "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-2.0.8.tgz",
- "integrity": "sha512-BdnBM5waFormdrOFBU+cA90R689V0tWUWlIG2i30UXxElHjuCu5+dOV2Etw3547jcQ/yaLtPm9wrqIuOY2bSJg==",
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/ua-parser-js"
- },
- {
- "type": "paypal",
- "url": "https://paypal.me/faisalman"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/faisalman"
- }
- ],
- "license": "AGPL-3.0-or-later",
+ "node_modules/typed-array-byte-offset": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz",
+ "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "detect-europe-js": "^0.1.2",
- "is-standalone-pwa": "^0.1.1",
- "ua-is-frozen": "^0.1.2"
+ "available-typed-arrays": "^1.0.7",
+ "call-bind": "^1.0.8",
+ "for-each": "^0.3.3",
+ "gopd": "^1.2.0",
+ "has-proto": "^1.2.0",
+ "is-typed-array": "^1.1.15",
+ "reflect.getprototypeof": "^1.0.9"
},
- "bin": {
- "ua-parser-js": "script/cli.js"
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/typed-array-length": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz",
+ "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "for-each": "^0.3.3",
+ "gopd": "^1.0.1",
+ "is-typed-array": "^1.1.13",
+ "possible-typed-array-names": "^1.0.0",
+ "reflect.getprototypeof": "^1.0.6"
},
"engines": {
- "node": "*"
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/udx-native": {
- "version": "1.19.2",
- "resolved": "https://registry.npmjs.org/udx-native/-/udx-native-1.19.2.tgz",
- "integrity": "sha512-RNYh+UhfryCsF5hE2ZOuIqcZ+qdipXK3UsarwxWJwsUQZFE3ybwz0mPjwb5ev1PMBcjFahWiepS/q0wwL51c2g==",
+ "node_modules/typescript": {
+ "version": "5.9.3",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz",
+ "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
+ "dev": true,
"license": "Apache-2.0",
- "dependencies": {
- "b4a": "^1.5.0",
- "bare-events": "^2.2.0",
- "require-addon": "^1.1.0",
- "streamx": "^2.22.0"
+ "bin": {
+ "tsc": "bin/tsc",
+ "tsserver": "bin/tsserver"
},
"engines": {
- "bare": ">=1.17.4"
+ "node": ">=14.17"
}
},
"node_modules/uglify-js": {
@@ -12679,6 +13628,25 @@
"node": ">=0.8.0"
}
},
+ "node_modules/unbox-primitive": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz",
+ "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "has-bigints": "^1.0.2",
+ "has-symbols": "^1.1.0",
+ "which-boxed-primitive": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/undici": {
"version": "6.23.0",
"resolved": "https://registry.npmjs.org/undici/-/undici-6.23.0.tgz",
@@ -12690,9 +13658,9 @@
}
},
"node_modules/undici-types": {
- "version": "6.19.8",
- "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz",
- "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==",
+ "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"
},
"node_modules/unicode-canonical-property-names-ecmascript": {
@@ -12791,17 +13759,14 @@
"browserslist": ">= 4.21.0"
}
},
- "node_modules/utf-8-validate": {
- "version": "5.0.10",
- "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.10.tgz",
- "integrity": "sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==",
- "hasInstallScript": true,
- "license": "MIT",
+ "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": {
- "node-gyp-build": "^4.3.0"
- },
- "engines": {
- "node": ">=6.14.2"
+ "punycode": "^2.1.0"
}
},
"node_modules/utils-merge": {
@@ -12823,19 +13788,11 @@
"uuid": "dist/bin/uuid"
}
},
- "node_modules/uuidv7": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/uuidv7/-/uuidv7-1.1.0.tgz",
- "integrity": "sha512-2VNnOC0+XQlwogChUDzy6pe8GQEys9QFZBGOh54l6qVfwoCUwwRvk7rDTgaIsRgsF5GFa5oiNg8LqXE3jofBBg==",
- "license": "Apache-2.0",
- "bin": {
- "uuidv7": "cli.js"
- }
- },
"node_modules/v8-to-istanbul": {
"version": "9.3.0",
"resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz",
"integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==",
+ "dev": true,
"license": "ISC",
"dependencies": {
"@jridgewell/trace-mapping": "^0.3.12",
@@ -12866,72 +13823,6 @@
"node": ">= 0.8"
}
},
- "node_modules/viem": {
- "version": "2.44.2",
- "resolved": "https://registry.npmjs.org/viem/-/viem-2.44.2.tgz",
- "integrity": "sha512-nHY872t/T3flLpVsnvQT/89bwbrJwxaL917FDv7Oxy4E5FWIFkokRQOKXG3P+hgl30QYVZxi9o2SUHLnebycxw==",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/wevm"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "@noble/curves": "1.9.1",
- "@noble/hashes": "1.8.0",
- "@scure/bip32": "1.7.0",
- "@scure/bip39": "1.6.0",
- "abitype": "1.2.3",
- "isows": "1.0.7",
- "ox": "0.11.3",
- "ws": "8.18.3"
- },
- "peerDependencies": {
- "typescript": ">=5.0.4"
- },
- "peerDependenciesMeta": {
- "typescript": {
- "optional": true
- }
- }
- },
- "node_modules/viem/node_modules/@noble/curves": {
- "version": "1.9.1",
- "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.1.tgz",
- "integrity": "sha512-k11yZxZg+t+gWvBbIswW0yoJlu8cHOC7dhunwOzoWH/mXGBiYyR4YY6hAEK/3EUs4UpB8la1RfdRpeGsFHkWsA==",
- "license": "MIT",
- "dependencies": {
- "@noble/hashes": "1.8.0"
- },
- "engines": {
- "node": "^14.21.3 || >=16"
- },
- "funding": {
- "url": "https://paulmillr.com/funding/"
- }
- },
- "node_modules/viem/node_modules/ws": {
- "version": "8.18.3",
- "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz",
- "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==",
- "license": "MIT",
- "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/vlq": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/vlq/-/vlq-1.0.1.tgz",
@@ -12988,31 +13879,6 @@
"node": ">=10"
}
},
- "node_modules/whatwg-url-without-unicode/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"
- }
- ],
- "license": "MIT",
- "peer": true,
- "dependencies": {
- "base64-js": "^1.3.1",
- "ieee754": "^1.1.13"
- }
- },
"node_modules/which": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
@@ -13028,11 +13894,94 @@
"node": ">= 8"
}
},
- "node_modules/which-runtime": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/which-runtime/-/which-runtime-1.3.2.tgz",
- "integrity": "sha512-5kwCfWml7+b2NO7KrLMhYihjRx0teKkd3yGp1Xk5Vaf2JGdSh+rgVhEALAD9c/59dP+YwJHXoEO7e8QPy7gOkw==",
- "license": "Apache-2.0"
+ "node_modules/which-boxed-primitive": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz",
+ "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-bigint": "^1.1.0",
+ "is-boolean-object": "^1.2.1",
+ "is-number-object": "^1.1.1",
+ "is-string": "^1.1.1",
+ "is-symbol": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/which-builtin-type": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz",
+ "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "function.prototype.name": "^1.1.6",
+ "has-tostringtag": "^1.0.2",
+ "is-async-function": "^2.0.0",
+ "is-date-object": "^1.1.0",
+ "is-finalizationregistry": "^1.1.0",
+ "is-generator-function": "^1.0.10",
+ "is-regex": "^1.2.1",
+ "is-weakref": "^1.0.2",
+ "isarray": "^2.0.5",
+ "which-boxed-primitive": "^1.1.0",
+ "which-collection": "^1.0.2",
+ "which-typed-array": "^1.1.16"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/which-collection": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz",
+ "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-map": "^2.0.3",
+ "is-set": "^2.0.3",
+ "is-weakmap": "^2.0.2",
+ "is-weakset": "^2.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/which-typed-array": {
+ "version": "1.1.20",
+ "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.20.tgz",
+ "integrity": "sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "available-typed-arrays": "^1.0.7",
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.4",
+ "for-each": "^0.3.5",
+ "get-proto": "^1.0.1",
+ "gopd": "^1.2.0",
+ "has-tostringtag": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
},
"node_modules/wonka": {
"version": "6.3.5",
@@ -13041,6 +13990,16 @@
"license": "MIT",
"peer": true
},
+ "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/wordwrap": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
@@ -13089,6 +14048,7 @@
"resolved": "https://registry.npmjs.org/ws/-/ws-8.19.0.tgz",
"integrity": "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==",
"license": "MIT",
+ "peer": true,
"engines": {
"node": ">=10.0.0"
},
@@ -13119,6 +14079,16 @@
"node": ">=10.0.0"
}
},
+ "node_modules/xdg-basedir": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz",
+ "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/xml2js": {
"version": "0.6.0",
"resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.6.0.tgz",
@@ -13222,22 +14192,6 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/zen-observable": {
- "version": "0.8.15",
- "resolved": "https://registry.npmjs.org/zen-observable/-/zen-observable-0.8.15.tgz",
- "integrity": "sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ==",
- "license": "MIT"
- },
- "node_modules/zen-observable-ts": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/zen-observable-ts/-/zen-observable-ts-1.1.0.tgz",
- "integrity": "sha512-1h4zlLSqI2cRLPJUHJFL8bCWHhkpuXkF+dbGkRaWjgDIG26DmzyshUMrdV/rL3UnR+mhaX4fRq8LPouq0MYYIA==",
- "license": "MIT",
- "dependencies": {
- "@types/zen-observable": "0.8.3",
- "zen-observable": "0.8.15"
- }
- },
"node_modules/zod": {
"version": "3.25.76",
"resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz",
@@ -13248,9 +14202,9 @@
}
},
"node_modules/zustand": {
- "version": "5.0.10",
- "resolved": "https://registry.npmjs.org/zustand/-/zustand-5.0.10.tgz",
- "integrity": "sha512-U1AiltS1O9hSy3rul+Ub82ut2fqIAefiSuwECWt6jlMVUGejvf+5omLcRBSzqbRagSM3hQZbtzdeRc6QVScXTg==",
+ "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"
diff --git a/package.json b/package.json
index 57e18ec..f2d9673 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "@tetherto/wdk-react-native-core",
- "version": "1.0.0",
+ "version": "1.0.0-beta.1",
"description": "Core functionality for React Native wallets - wallet management, balance fetching, and worklet operations",
"type": "module",
"main": "./dist/index.js",
@@ -12,6 +12,10 @@
"README.md",
"LICENSE"
],
+ "publishConfig": {
+ "access": "public",
+ "registry": "https://registry.npmjs.org/"
+ },
"exports": {
".": {
"types": "./dist/index.d.ts",
@@ -30,6 +34,8 @@
"scripts": {
"build": "tsc || true",
"build:strict": "tsc",
+ "lint": "ts-standard",
+ "lint:fix": "ts-standard --fix",
"typecheck": "tsc --noEmit",
"test": "jest",
"test:watch": "jest --watch",
@@ -48,17 +54,18 @@
"author": "Tetherto",
"license": "Apache-2.0",
"dependencies": {
- "@tanstack/react-query": "^5.0.0",
- "@tetherto/pear-wrk-wdk": "github:tetherto/pear-wrk-wdk#v2",
"@tetherto/wdk-react-native-secure-storage": "github:tetherto/wdk-react-native-secure-storage",
+ "@tetherto/pear-wrk-wdk": "github:nampc1/pear-wrk-wdk-v2-fork#2.0.0-beta.1",
+ "@tanstack/react-query": "^5.0.0",
"expo-crypto": "^15.0.8",
"immer": "^11.1.3",
- "react-native-bare-kit": "^0.11.0",
+ "react-native-bare-kit": "^0.12.0",
"react-native-mmkv": "^4.1.0",
"zod": "^3.22.0",
"zustand": "^5.0.9"
},
"devDependencies": {
+ "ts-standard": "12.0.2",
"@testing-library/jest-native": "^5.4.3",
"@testing-library/react-native": "^12.4.0",
"@types/jest": "^29.5.0",
diff --git a/src/__mocks__/react.ts b/src/__mocks__/react.ts
index 533e350..a035945 100644
--- a/src/__mocks__/react.ts
+++ b/src/__mocks__/react.ts
@@ -10,7 +10,7 @@ export const useMemo = jest.fn((fn: any) => fn())
export const useRef = jest.fn((initial: any) => ({ current: initial }))
export const createContext = jest.fn(() => ({
Provider: ({ children }: any) => children,
- Consumer: ({ children }: any) => children,
+ Consumer: ({ children }: any) => children
}))
export const useContext = jest.fn()
export const useReducer = jest.fn((reducer: any, initial: any) => [initial, jest.fn()])
@@ -29,6 +29,5 @@ export default {
useReducer,
Component,
Fragment,
- version,
+ version
}
-
diff --git a/src/__mocks__/secureStorage.ts b/src/__mocks__/secureStorage.ts
index 9d70d29..d9d1e85 100644
--- a/src/__mocks__/secureStorage.ts
+++ b/src/__mocks__/secureStorage.ts
@@ -1,6 +1,6 @@
/**
* Mock SecureStorage for testing
- *
+ *
* Supports identifier parameter for multi-wallet testing
*/
@@ -16,72 +16,72 @@ const getStorageKey = (identifier?: string): string => {
}
export const mockSecureStorage = {
- authenticate: jest.fn(() => Promise.resolve(true)),
- hasWallet: jest.fn((identifier?: string) => {
+ authenticate: jest.fn(async () => await Promise.resolve(true)),
+ hasWallet: jest.fn(async (identifier?: string) => {
const key = getStorageKey(identifier)
const wallet = storage[key]
- return Promise.resolve(wallet !== undefined && wallet.encryptionKey !== null)
+ return await Promise.resolve(wallet !== undefined && wallet.encryptionKey !== null)
}),
- setEncryptionKey: jest.fn((key: string, identifier?: string) => {
+ setEncryptionKey: jest.fn(async (key: string, identifier?: string) => {
const storageKey = getStorageKey(identifier)
- if (!storage[storageKey]) {
+ if (storage[storageKey] == null) {
storage[storageKey] = { encryptionKey: null, encryptedSeed: null, encryptedEntropy: null }
}
storage[storageKey].encryptionKey = key
- return Promise.resolve()
+ return await Promise.resolve()
}),
- getEncryptionKey: jest.fn((identifier?: string) => {
+ getEncryptionKey: jest.fn(async (identifier?: string) => {
const storageKey = getStorageKey(identifier)
- return Promise.resolve(storage[storageKey]?.encryptionKey || null)
+ return await Promise.resolve(storage[storageKey]?.encryptionKey || null)
}),
- setEncryptedSeed: jest.fn((seed: string, identifier?: string) => {
+ setEncryptedSeed: jest.fn(async (seed: string, identifier?: string) => {
const storageKey = getStorageKey(identifier)
- if (!storage[storageKey]) {
+ if (storage[storageKey] == null) {
storage[storageKey] = { encryptionKey: null, encryptedSeed: null, encryptedEntropy: null }
}
storage[storageKey].encryptedSeed = seed
- return Promise.resolve()
+ return await Promise.resolve()
}),
- getEncryptedSeed: jest.fn((identifier?: string) => {
+ getEncryptedSeed: jest.fn(async (identifier?: string) => {
const storageKey = getStorageKey(identifier)
- return Promise.resolve(storage[storageKey]?.encryptedSeed || null)
+ return await Promise.resolve(storage[storageKey]?.encryptedSeed || null)
}),
- setEncryptedEntropy: jest.fn((entropy: string, identifier?: string) => {
+ setEncryptedEntropy: jest.fn(async (entropy: string, identifier?: string) => {
const storageKey = getStorageKey(identifier)
- if (!storage[storageKey]) {
+ if (storage[storageKey] == null) {
storage[storageKey] = { encryptionKey: null, encryptedSeed: null, encryptedEntropy: null }
}
storage[storageKey].encryptedEntropy = entropy
- return Promise.resolve()
+ return await Promise.resolve()
}),
- getEncryptedEntropy: jest.fn((identifier?: string) => {
+ getEncryptedEntropy: jest.fn(async (identifier?: string) => {
const storageKey = getStorageKey(identifier)
- return Promise.resolve(storage[storageKey]?.encryptedEntropy || null)
+ return await Promise.resolve(storage[storageKey]?.encryptedEntropy || null)
}),
- getAllEncrypted: jest.fn((identifier?: string) => {
+ getAllEncrypted: jest.fn(async (identifier?: string) => {
const storageKey = getStorageKey(identifier)
const wallet = storage[storageKey]
- return Promise.resolve({
+ return await Promise.resolve({
encryptedSeed: wallet?.encryptedSeed || null,
encryptedEntropy: wallet?.encryptedEntropy || null,
- encryptionKey: wallet?.encryptionKey || null,
+ encryptionKey: wallet?.encryptionKey || null
})
}),
- clearAll: jest.fn(() => {
+ clearAll: jest.fn(async () => {
Object.keys(storage).forEach(key => delete storage[key])
- return Promise.resolve()
+ return await Promise.resolve()
}),
- isBiometricAvailable: jest.fn(() => Promise.resolve(true)),
- deleteWallet: jest.fn((identifier?: string) => {
+ isBiometricAvailable: jest.fn(async () => await Promise.resolve(true)),
+ deleteWallet: jest.fn(async (identifier?: string) => {
const storageKey = getStorageKey(identifier)
delete storage[storageKey]
- return Promise.resolve()
+ return await Promise.resolve()
}),
cleanup: jest.fn(),
// Helper method to clear storage between tests
_clearStorage: () => {
Object.keys(storage).forEach(key => delete storage[key])
- },
+ }
}
export default mockSecureStorage
diff --git a/src/__tests__/hooks/useBalance.test.ts b/src/__tests__/hooks/useBalance.test.ts
index 113c882..a534174 100644
--- a/src/__tests__/hooks/useBalance.test.ts
+++ b/src/__tests__/hooks/useBalance.test.ts
@@ -10,55 +10,59 @@ import { BalanceService } from '../../services/balanceService'
import { getWorkletStore } from '../../store/workletStore'
import { getWalletStore } from '../../store/walletStore'
import { convertBalanceToString } from '../../utils/balanceUtils'
-import { NATIVE_TOKEN_KEY } from '../../utils/constants'
+import { QUERY_KEY_TAGS } from '../../utils/constants'
+import type { IAsset } from '../../types'
// Mock TanStack Query
jest.mock('@tanstack/react-query', () => ({
useQuery: jest.fn(),
useMutation: jest.fn(),
- useQueryClient: jest.fn(),
+ useQueries: jest.fn(),
+ useQueryClient: jest.fn()
}))
// Mock stores and services
jest.mock('../../store/workletStore', () => ({
- getWorkletStore: jest.fn(),
+ getWorkletStore: jest.fn()
}))
jest.mock('../../store/walletStore', () => ({
- getWalletStore: jest.fn(),
+ getWalletStore: jest.fn()
}))
jest.mock('../../services/accountService', () => ({
AccountService: {
- callAccountMethod: jest.fn(),
- },
+ callAccountMethod: jest.fn()
+ }
}))
jest.mock('../../services/balanceService', () => ({
BalanceService: {
updateBalance: jest.fn(),
updateLastBalanceUpdate: jest.fn(),
- getBalance: jest.fn(),
- },
+ getBalance: jest.fn()
+ }
}))
jest.mock('../../utils/balanceUtils', () => ({
- convertBalanceToString: jest.fn((val) => String(val)),
+ convertBalanceToString: jest.fn((val) => String(val))
}))
jest.mock('../../utils/storeHelpers', () => ({
- resolveWalletId: jest.fn((id) => id || 'default-wallet'),
+ resolveWalletId: jest.fn((id) => id || 'default-wallet')
}))
jest.mock('../../utils/validation', () => ({
- validateWalletParams: jest.fn(),
+ validateWalletParams: jest.fn()
}))
jest.mock('../../utils/logger', () => ({
log: jest.fn(),
- logError: jest.fn(),
+ logError: jest.fn()
}))
+const MOCK_NATIVE_TOKEN_ID = 'eth-native'
+
describe('useBalance', () => {
let mockWorkletStore: any
let mockWalletStore: any
@@ -68,14 +72,14 @@ describe('useBalance', () => {
mockWorkletStore = {
getState: jest.fn(() => ({
- isInitialized: true,
- })),
+ isInitialized: true
+ }))
}
mockWalletStore = {
getState: jest.fn(() => ({
- activeWalletId: 'test-wallet-1',
- })),
+ activeWalletId: 'test-wallet-1'
+ }))
}
;(getWorkletStore as jest.Mock).mockReturnValue(mockWorkletStore)
;(getWalletStore as jest.Mock).mockReturnValue(mockWalletStore)
@@ -83,60 +87,60 @@ describe('useBalance', () => {
describe('balanceQueryKeys', () => {
it('should create correct query keys', () => {
- expect(balanceQueryKeys.all).toEqual(['balances'])
+ expect(balanceQueryKeys.all).toEqual([QUERY_KEY_TAGS.BALANCES])
const walletKey = balanceQueryKeys.byWallet('wallet-1', 0)
- expect(walletKey).toEqual(['balances', 'wallet', 'wallet-1', 0])
+ expect(walletKey).toEqual([QUERY_KEY_TAGS.BALANCES, QUERY_KEY_TAGS.WALLET, 'wallet-1', 0])
const networkKey = balanceQueryKeys.byNetwork('ethereum')
- expect(networkKey).toEqual(['balances', 'network', 'ethereum'])
+ expect(networkKey).toEqual([QUERY_KEY_TAGS.BALANCES, QUERY_KEY_TAGS.NETWORK, 'ethereum'])
const walletNetworkKey = balanceQueryKeys.byWalletAndNetwork(
'wallet-1',
0,
- 'ethereum',
+ 'ethereum'
)
expect(walletNetworkKey).toEqual([
- 'balances',
- 'wallet',
+ QUERY_KEY_TAGS.BALANCES,
+ QUERY_KEY_TAGS.WALLET,
'wallet-1',
0,
- 'network',
- 'ethereum',
+ QUERY_KEY_TAGS.NETWORK,
+ 'ethereum'
])
const nativeTokenKey = balanceQueryKeys.byToken(
'wallet-1',
0,
'ethereum',
- null,
+ MOCK_NATIVE_TOKEN_ID
)
expect(nativeTokenKey).toEqual([
- 'balances',
- 'wallet',
+ QUERY_KEY_TAGS.BALANCES,
+ QUERY_KEY_TAGS.WALLET,
'wallet-1',
0,
- 'network',
+ QUERY_KEY_TAGS.NETWORK,
'ethereum',
- 'token',
- NATIVE_TOKEN_KEY,
+ QUERY_KEY_TAGS.TOKEN,
+ MOCK_NATIVE_TOKEN_ID
])
const tokenKey = balanceQueryKeys.byToken(
'wallet-1',
0,
'ethereum',
- '0x123',
+ '0x123'
)
expect(tokenKey).toEqual([
- 'balances',
- 'wallet',
+ QUERY_KEY_TAGS.BALANCES,
+ QUERY_KEY_TAGS.WALLET,
'wallet-1',
0,
- 'network',
+ QUERY_KEY_TAGS.NETWORK,
'ethereum',
- 'token',
- '0x123',
+ QUERY_KEY_TAGS.TOKEN,
+ '0x123'
])
})
})
@@ -155,12 +159,12 @@ describe('useBalance', () => {
success: false,
network: 'ethereum',
accountIndex: 0,
- tokenAddress: null,
+ assetId: MOCK_NATIVE_TOKEN_ID,
balance: null,
- error: 'Wallet not initialized',
+ error: 'Wallet not initialized'
},
isLoading: false,
- error: null,
+ error: null
})
// The hook would be called in a React component, but we can test the query function
@@ -170,7 +174,7 @@ describe('useBalance', () => {
it('should fetch native balance successfully', async () => {
const mockBalance = '1000000000000000000'
;(AccountService.callAccountMethod as jest.Mock).mockResolvedValue(
- mockBalance,
+ mockBalance
)
;(convertBalanceToString as jest.Mock).mockReturnValue(mockBalance)
@@ -192,7 +196,7 @@ describe('useBalance', () => {
const mockBalance = '2000000000000000000'
const tokenAddress = '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb0'
;(AccountService.callAccountMethod as jest.Mock).mockResolvedValue(
- mockBalance,
+ mockBalance
)
;(convertBalanceToString as jest.Mock).mockReturnValue(mockBalance)
@@ -209,7 +213,7 @@ describe('useBalance', () => {
'ethereum',
0,
'getTokenBalance',
- tokenAddress,
+ tokenAddress
)
}
})
@@ -234,23 +238,32 @@ describe('useBalance', () => {
describe('useBalancesForWallet', () => {
it('should build query keys for all tokens', async () => {
- const tokenConfigs = {
- ethereum: {
- native: { address: null, symbol: 'ETH', decimals: 18 },
- tokens: [{ address: '0x123', symbol: 'USDC', decimals: 6 }],
- },
- }
+ // Create mock assets
+ const mockAssets: IAsset[] = [
+ {
+ getId: () => MOCK_NATIVE_TOKEN_ID,
+ getNetwork: () => 'ethereum',
+ isNative: () => true,
+ getContractAddress: () => null
+ } as IAsset,
+ {
+ getId: () => '0x123',
+ getNetwork: () => 'ethereum',
+ isNative: () => false,
+ getContractAddress: () => '0x123'
+ } as IAsset
+ ]
const { useQuery } = await import('@tanstack/react-query')
const mockUseQuery = useQuery as jest.Mock
mockUseQuery.mockReturnValue({
data: [],
isLoading: false,
- error: null,
+ error: null
})
- // Test that query keys are built correctly
- // This would be tested in a React component, but we verify the structure
+ // We just check the hook can be imported and mocking works
+ // Logic testing for IAsset iteration happens in the hook implementation
expect(mockUseQuery).toBeDefined()
})
})
@@ -274,13 +287,13 @@ describe('useBalance', () => {
'wallet-1',
0,
'ethereum',
- null,
+ MOCK_NATIVE_TOKEN_ID
)
- expect(allKeys).toEqual(['balances'])
- expect(walletKeys).toEqual(['balances', 'wallet', 'wallet-1', 0])
- expect(networkKeys).toEqual(['balances', 'network', 'ethereum'])
- expect(tokenKeys).toContain('balances')
+ expect(allKeys).toEqual([QUERY_KEY_TAGS.BALANCES])
+ expect(walletKeys).toEqual([QUERY_KEY_TAGS.BALANCES, QUERY_KEY_TAGS.WALLET, 'wallet-1', 0])
+ expect(networkKeys).toEqual([QUERY_KEY_TAGS.BALANCES, QUERY_KEY_TAGS.NETWORK, 'ethereum'])
+ expect(tokenKeys).toContain(QUERY_KEY_TAGS.BALANCES)
})
})
})
diff --git a/src/__tests__/hooks/useWallet.test.ts b/src/__tests__/hooks/useWallet.test.ts
index de70db8..47bc0f6 100644
--- a/src/__tests__/hooks/useWallet.test.ts
+++ b/src/__tests__/hooks/useWallet.test.ts
@@ -1,6 +1,6 @@
/**
* Tests for useWallet hook
- *
+ *
* Tests wallet hook logic without React rendering
*/
@@ -12,23 +12,23 @@ import { BalanceService } from '../../services/balanceService'
// Mock stores and services
jest.mock('../../store/workletStore', () => ({
- getWorkletStore: jest.fn(),
+ getWorkletStore: jest.fn()
}))
jest.mock('../../store/walletStore', () => ({
- getWalletStore: jest.fn(),
+ getWalletStore: jest.fn()
}))
jest.mock('../../services/addressService', () => ({
AddressService: {
- getAddress: jest.fn(),
- },
+ getAddress: jest.fn()
+ }
}))
jest.mock('../../services/accountService', () => ({
AccountService: {
- callAccountMethod: jest.fn(),
- },
+ callAccountMethod: jest.fn()
+ }
}))
jest.mock('../../services/balanceService', () => ({
@@ -40,8 +40,8 @@ jest.mock('../../services/balanceService', () => ({
isBalanceLoading: jest.fn(),
updateLastBalanceUpdate: jest.fn(),
getLastBalanceUpdate: jest.fn(),
- clearBalances: jest.fn(),
- },
+ clearBalances: jest.fn()
+ }
}))
describe('useWallet', () => {
@@ -53,7 +53,7 @@ describe('useWallet', () => {
mockWorkletStore = jest.fn((selector: any) => {
const state = {
- isInitialized: true,
+ isInitialized: true
}
return selector ? selector(state) : state
})
@@ -62,23 +62,23 @@ describe('useWallet', () => {
const state = {
addresses: {
ethereum: {
- 0: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb0',
- },
+ 0: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb0'
+ }
},
walletLoading: {},
balances: {
ethereum: {
0: {
- native: '1000000000000000000',
- },
- },
+ native: '1000000000000000000'
+ }
+ }
},
balanceLoading: {},
lastBalanceUpdate: {
ethereum: {
- 0: 1234567890,
- },
- },
+ 0: 1234567890
+ }
+ }
}
return selector ? selector(state) : state
})
@@ -90,7 +90,7 @@ describe('useWallet', () => {
it('should call services correctly', () => {
// Test that the hook calls the correct services
// Since we can't easily test React hooks in Node, we verify the service calls
-
+
const mockAddress = '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb0'
;(AddressService.getAddress as jest.Mock).mockResolvedValue(mockAddress)
@@ -111,12 +111,11 @@ describe('useWallet', () => {
// Verify stores return expected structure
expect(getWorkletStore).toBeDefined()
expect(getWalletStore).toBeDefined()
-
+
const workletStore = getWorkletStore()
const walletStore = getWalletStore()
-
+
expect(workletStore).toBeDefined()
expect(walletStore).toBeDefined()
})
})
-
diff --git a/src/__tests__/hooks/useWalletManager.test.ts b/src/__tests__/hooks/useWalletManager.test.ts
index ebb93ce..1749541 100644
--- a/src/__tests__/hooks/useWalletManager.test.ts
+++ b/src/__tests__/hooks/useWalletManager.test.ts
@@ -6,11 +6,11 @@
import { WalletSetupService } from '../../services/walletSetupService'
import { getWalletStore } from '../../store/walletStore'
-import type { NetworkConfigs } from '../../types'
+import type { WdkConfigs } from '../../types'
// Mock stores and services
jest.mock('../../store/walletStore', () => ({
- getWalletStore: jest.fn(),
+ getWalletStore: jest.fn()
}))
jest.mock('../../services/walletSetupService', () => ({
@@ -20,33 +20,37 @@ jest.mock('../../services/walletSetupService', () => ({
initializeFromMnemonic: jest.fn(),
deleteWallet: jest.fn(),
getMnemonic: jest.fn(),
- createNewWallet: jest.fn(),
- },
+ createNewWallet: jest.fn()
+ }
}))
jest.mock('../../utils/logger', () => ({
log: jest.fn(),
- logError: jest.fn(),
+ logError: jest.fn()
}))
// Mock React hooks
jest.mock('react', () => ({
useCallback: jest.fn((fn) => fn),
useMemo: jest.fn((fn) => fn()),
- useState: jest.fn((initial) => [initial, jest.fn()]),
+ useState: jest.fn((initial) => [initial, jest.fn()])
}))
jest.mock('zustand/react/shallow', () => ({
- useShallow: jest.fn((selector) => selector),
+ useShallow: jest.fn((selector) => selector)
}))
describe('useWalletManager', () => {
let mockWalletStore: any
- const mockNetworkConfigs: NetworkConfigs = {
- ethereum: {
- chainId: 1,
- blockchain: 'ethereum',
- },
+ const mockNetworkConfigs: WdkConfigs = {
+ networks: {
+ ethereum: {
+ blockchain: 'ethereum',
+ config: {
+ chainId: 1
+ }
+ }
+ }
}
beforeEach(() => {
@@ -55,9 +59,9 @@ describe('useWalletManager', () => {
mockWalletStore = {
getState: jest.fn(() => ({
walletList: [],
- activeWalletId: null,
+ activeWalletId: null
})),
- setState: jest.fn(),
+ setState: jest.fn()
}
;(getWalletStore as jest.Mock).mockReturnValue(mockWalletStore)
})
@@ -65,7 +69,7 @@ describe('useWalletManager', () => {
describe('initializeWallet', () => {
it('should call WalletSetupService.initializeWallet', async () => {
;(WalletSetupService.initializeWallet as jest.Mock).mockResolvedValue(
- undefined,
+ undefined
)
const { useWalletManager } = await import('../../hooks/useWalletManager')
@@ -78,12 +82,12 @@ describe('useWalletManager', () => {
it('should handle initialization errors', async () => {
const error = new Error('Initialization failed')
;(WalletSetupService.initializeWallet as jest.Mock).mockRejectedValue(
- error,
+ error
)
expect(WalletSetupService.initializeWallet).toBeDefined()
await expect(
- WalletSetupService.initializeWallet(mockNetworkConfigs, {}),
+ WalletSetupService.initializeWallet({})
).rejects.toThrow('Initialization failed')
})
})
@@ -98,14 +102,12 @@ describe('useWalletManager', () => {
expect(WalletSetupService.initializeFromMnemonic).toBeDefined()
await WalletSetupService.initializeFromMnemonic(
- mockNetworkConfigs,
mnemonic,
- 'test-wallet',
+ 'test-wallet'
)
expect(WalletSetupService.initializeFromMnemonic).toHaveBeenCalledWith(
- mockNetworkConfigs,
mnemonic,
- 'test-wallet',
+ 'test-wallet'
)
})
@@ -117,10 +119,9 @@ describe('useWalletManager', () => {
await expect(
WalletSetupService.initializeFromMnemonic(
- mockNetworkConfigs,
'invalid',
- 'test-wallet',
- ),
+ 'test-wallet'
+ )
).rejects.toThrow('Invalid mnemonic')
})
})
@@ -145,18 +146,18 @@ describe('useWalletManager', () => {
describe('deleteWallet', () => {
it('should delete wallet and update store', async () => {
;(WalletSetupService.deleteWallet as jest.Mock).mockResolvedValue(
- undefined,
+ undefined
)
mockWalletStore.getState.mockReturnValue({
walletList: [
- { identifier: 'test-wallet', exists: true, isActive: true },
+ { identifier: 'test-wallet', exists: true, isActive: true }
],
- activeWalletId: 'test-wallet',
+ activeWalletId: 'test-wallet'
})
await WalletSetupService.deleteWallet('test-wallet')
expect(WalletSetupService.deleteWallet).toHaveBeenCalledWith(
- 'test-wallet',
+ 'test-wallet'
)
})
@@ -165,7 +166,7 @@ describe('useWalletManager', () => {
;(WalletSetupService.deleteWallet as jest.Mock).mockRejectedValue(error)
await expect(
- WalletSetupService.deleteWallet('test-wallet'),
+ WalletSetupService.deleteWallet('test-wallet')
).rejects.toThrow('Delete failed')
})
})
@@ -193,7 +194,7 @@ describe('useWalletManager', () => {
;(WalletSetupService.getMnemonic as jest.Mock).mockRejectedValue(error)
await expect(
- WalletSetupService.getMnemonic('test-wallet'),
+ WalletSetupService.getMnemonic('test-wallet')
).rejects.toThrow('Failed to get mnemonic')
})
})
@@ -202,13 +203,12 @@ describe('useWalletManager', () => {
it('should create new wallet', async () => {
;(WalletSetupService.hasWallet as jest.Mock).mockResolvedValue(false)
;(WalletSetupService.createNewWallet as jest.Mock).mockResolvedValue(
- undefined,
+ undefined
)
- await WalletSetupService.createNewWallet(mockNetworkConfigs, 'new-wallet')
+ await WalletSetupService.createNewWallet('new-wallet')
expect(WalletSetupService.createNewWallet).toHaveBeenCalledWith(
- mockNetworkConfigs,
- 'new-wallet',
+ 'new-wallet'
)
})
@@ -222,13 +222,13 @@ describe('useWalletManager', () => {
describe('refreshWalletList', () => {
it('should refresh wallet list with known identifiers', async () => {
- ;(WalletSetupService.hasWallet as jest.Mock).mockImplementation((id) => {
- return Promise.resolve(id === 'wallet-1' || id === 'wallet-2')
+ ;(WalletSetupService.hasWallet as jest.Mock).mockImplementation(async (id) => {
+ return await Promise.resolve(id === 'wallet-1' || id === 'wallet-2')
})
mockWalletStore.getState.mockReturnValue({
walletList: [],
- activeWalletId: 'wallet-1',
+ activeWalletId: 'wallet-1'
})
// Verify hasWallet can be called for multiple wallets
@@ -246,7 +246,7 @@ describe('useWalletManager', () => {
;(WalletSetupService.hasWallet as jest.Mock).mockRejectedValue(error)
await expect(WalletSetupService.hasWallet('test-wallet')).rejects.toThrow(
- 'Refresh failed',
+ 'Refresh failed'
)
})
})
@@ -255,12 +255,12 @@ describe('useWalletManager', () => {
it('should return wallet list from store', () => {
const walletList = [
{ identifier: 'wallet-1', exists: true, isActive: true },
- { identifier: 'wallet-2', exists: true, isActive: false },
+ { identifier: 'wallet-2', exists: true, isActive: false }
]
mockWalletStore.getState.mockReturnValue({
walletList,
- activeWalletId: 'wallet-1',
+ activeWalletId: 'wallet-1'
})
const state = mockWalletStore.getState()
diff --git a/src/__tests__/hooks/useWdkApp.test.tsx b/src/__tests__/hooks/useWdkApp.test.tsx
index c96eeb8..2d55cf2 100644
--- a/src/__tests__/hooks/useWdkApp.test.tsx
+++ b/src/__tests__/hooks/useWdkApp.test.tsx
@@ -1,6 +1,6 @@
/**
* Tests for useWdkApp hook
- *
+ *
* Tests hook logic without DOM rendering
*/
@@ -20,12 +20,12 @@ describe('useWdkApp', () => {
workletState: {
isReady: true,
isLoading: false,
- error: null,
+ error: null
},
walletState: {
status: 'ready',
identifier: 'test-wallet',
- error: null,
+ error: null
},
isInitializing: false,
isReady: true,
@@ -33,7 +33,7 @@ describe('useWdkApp', () => {
loadingWalletId: null,
walletExists: true,
error: null,
- retry: jest.fn(),
+ retry: jest.fn()
}
// Validate structure
diff --git a/src/__tests__/hooks/useWorklet.test.ts b/src/__tests__/hooks/useWorklet.test.ts
index b5b7c13..0059691 100644
--- a/src/__tests__/hooks/useWorklet.test.ts
+++ b/src/__tests__/hooks/useWorklet.test.ts
@@ -1,6 +1,6 @@
/**
* Tests for useWorklet hook
- *
+ *
* Tests worklet interaction hook
*/
@@ -9,7 +9,7 @@ import { getWorkletStore } from '../../store/workletStore'
// Mock stores and services
jest.mock('../../store/workletStore', () => ({
- getWorkletStore: jest.fn(),
+ getWorkletStore: jest.fn()
}))
jest.mock('../../services/workletLifecycleService', () => ({
@@ -20,13 +20,13 @@ jest.mock('../../services/workletLifecycleService', () => ({
getSeedAndEntropyFromMnemonic: jest.fn(),
initializeWorklet: jest.fn(),
reset: jest.fn(),
- clearError: jest.fn(),
- },
+ clearError: jest.fn()
+ }
}))
// Mock React hooks
jest.mock('zustand/react/shallow', () => ({
- useShallow: jest.fn((selector) => selector),
+ useShallow: jest.fn((selector) => selector)
}))
describe('useWorklet', () => {
@@ -47,7 +47,7 @@ describe('useWorklet', () => {
wdkInitResult: null,
encryptedSeed: null,
encryptionKey: null,
- networkConfigs: null,
+ networkConfigs: null
}
return selector ? selector(state) : state
})
@@ -80,7 +80,7 @@ describe('useWorklet', () => {
wdkInitResult: s.wdkInitResult,
encryptedSeed: s.encryptedSeed,
encryptionKey: s.encryptionKey,
- networkConfigs: s.networkConfigs,
+ networkConfigs: s.networkConfigs
}))
expect(state).toHaveProperty('isWorkletStarted')
@@ -148,7 +148,7 @@ describe('useWorklet', () => {
wdkInitResult: null,
encryptedSeed: null,
encryptionKey: null,
- networkConfigs: null,
+ networkConfigs: null
}
return selector ? selector(state) : state
})
@@ -177,7 +177,7 @@ describe('useWorklet', () => {
wdkInitResult: null,
encryptedSeed: null,
encryptionKey: null,
- networkConfigs: null,
+ networkConfigs: null
}
return selector ? selector(state) : state
})
@@ -192,4 +192,3 @@ describe('useWorklet', () => {
})
})
})
-
diff --git a/src/__tests__/provider/WdkAppProvider.test.tsx b/src/__tests__/provider/WdkAppProvider.test.tsx
index 598b478..a0fd9db 100644
--- a/src/__tests__/provider/WdkAppProvider.test.tsx
+++ b/src/__tests__/provider/WdkAppProvider.test.tsx
@@ -1,41 +1,28 @@
/**
* Tests for WdkAppProvider
- *
+ *
* Tests validation logic without rendering DOM components
*/
-import { validateNetworkConfigs, validateTokenConfigs, validateBalanceRefreshInterval } from '../../utils/validation'
-import type { NetworkConfigs, TokenConfigs } from '../../types'
+import { validateWdkConfigs, validateBalanceRefreshInterval } from '../../utils/validation'
+import type { WdkConfigs } from '../../types'
import { mockSecureStorage } from '../../__mocks__/secureStorage'
describe('WdkAppProvider validation', () => {
- const mockNetworkConfigs: NetworkConfigs = {
- ethereum: {
- chainId: 1,
- blockchain: 'ethereum',
- },
- }
-
- const mockTokenConfigs: TokenConfigs = {
- ethereum: {
- native: {
- symbol: 'ETH',
- name: 'Ethereum',
- decimals: 18,
- address: null,
- },
- tokens: [],
- },
+ const mockNetworkConfigs: WdkConfigs = {
+ networks: {
+ ethereum: {
+ blockchain: 'ethereum',
+ config: {
+ chainId: 1
+ }
+ }
+ }
}
it('should validate networkConfigs', () => {
- expect(() => validateNetworkConfigs(mockNetworkConfigs)).not.toThrow()
- expect(() => validateNetworkConfigs({} as NetworkConfigs)).toThrow()
- })
-
- it('should validate tokenConfigs', () => {
- expect(() => validateTokenConfigs(mockTokenConfigs)).not.toThrow()
- expect(() => validateTokenConfigs({} as TokenConfigs)).toThrow()
+ expect(() => validateWdkConfigs(mockNetworkConfigs)).not.toThrow()
+ expect(() => validateWdkConfigs({} as WdkConfigs)).toThrow()
})
it('should validate balanceRefreshInterval', () => {
@@ -47,7 +34,7 @@ describe('WdkAppProvider validation', () => {
it('should validate secureStorage has required methods', () => {
const requiredMethods = ['authenticate', 'hasWallet', 'setEncryptionKey', 'setEncryptedSeed', 'getAllEncrypted']
-
+
for (const method of requiredMethods) {
expect(typeof mockSecureStorage[method as keyof typeof mockSecureStorage]).toBe('function')
}
@@ -55,10 +42,10 @@ describe('WdkAppProvider validation', () => {
it('should detect missing secureStorage methods', () => {
const invalidStorage = {
- authenticate: jest.fn(),
+ authenticate: jest.fn()
// Missing other methods
}
-
+
const requiredMethods = ['hasWallet', 'setEncryptionKey', 'setEncryptedSeed', 'getAllEncrypted']
for (const method of requiredMethods) {
expect(typeof (invalidStorage as any)[method]).not.toBe('function')
diff --git a/src/__tests__/services/accountService.test.ts b/src/__tests__/services/accountService.test.ts
index 7f417fd..27bc823 100644
--- a/src/__tests__/services/accountService.test.ts
+++ b/src/__tests__/services/accountService.test.ts
@@ -1,6 +1,6 @@
/**
* Tests for AccountService
- *
+ *
* Tests account method calls through the worklet
*/
@@ -9,7 +9,7 @@ import { getWorkletStore } from '../../store/workletStore'
// Mock stores
jest.mock('../../store/workletStore', () => ({
- getWorkletStore: jest.fn(),
+ getWorkletStore: jest.fn()
}))
describe('AccountService', () => {
@@ -21,15 +21,15 @@ describe('AccountService', () => {
// Setup mock HRPC
mockHRPC = {
- callMethod: jest.fn(),
+ callMethod: jest.fn()
}
// Setup mock worklet store
mockWorkletStore = {
getState: jest.fn(() => ({
isInitialized: true,
- hrpc: mockHRPC,
- })),
+ hrpc: mockHRPC
+ }))
}
// Setup store mocks
@@ -40,7 +40,7 @@ describe('AccountService', () => {
it('should call method and return result', async () => {
const mockResult = '1000000000000000000'
mockHRPC.callMethod.mockResolvedValue({
- result: JSON.stringify(mockResult),
+ result: JSON.stringify(mockResult)
})
const result = await AccountService.callAccountMethod(
@@ -54,7 +54,7 @@ describe('AccountService', () => {
methodName: 'getBalance',
network: 'ethereum',
accountIndex: 0,
- args: null,
+ args: undefined
})
})
@@ -62,7 +62,7 @@ describe('AccountService', () => {
const mockArgs = { message: 'Hello World' }
const mockResult = { signature: '0x123' }
mockHRPC.callMethod.mockResolvedValue({
- result: JSON.stringify(mockResult),
+ result: JSON.stringify(mockResult)
})
const result = await AccountService.callAccountMethod(
@@ -77,7 +77,34 @@ describe('AccountService', () => {
methodName: 'signMessage',
network: 'ethereum',
accountIndex: 0,
- args: JSON.stringify(mockArgs),
+ args: JSON.stringify(mockArgs)
+ })
+ })
+
+ it('should handle array arguments for multi-param methods', async () => {
+ // Test array args for methods like transfer(options, config)
+ const mockArgs = [
+ { to: '0x123', amount: '1000' }, // options (1st arg)
+ { paymasterToken: '0xabc', transferMaxFee: '100' } // config (2nd arg)
+ ]
+ const mockResult = { txHash: '0x456' }
+ mockHRPC.callMethod.mockResolvedValue({
+ result: JSON.stringify(mockResult)
+ })
+
+ const result = await AccountService.callAccountMethod(
+ 'ethereum',
+ 0,
+ 'transfer',
+ mockArgs
+ )
+
+ expect(result).toEqual(mockResult)
+ expect(mockHRPC.callMethod).toHaveBeenCalledWith({
+ methodName: 'transfer',
+ network: 'ethereum',
+ accountIndex: 0,
+ args: JSON.stringify(mockArgs)
})
})
@@ -85,7 +112,7 @@ describe('AccountService', () => {
// getBalance returns a string, not an object
const mockResult = '1000000000000000000'
mockHRPC.callMethod.mockResolvedValue({
- result: JSON.stringify(mockResult),
+ result: JSON.stringify(mockResult)
})
const result = await AccountService.callAccountMethod(
@@ -103,16 +130,16 @@ describe('AccountService', () => {
data: {
balance: BigInt('1000000000000000000'),
nested: {
- amount: BigInt('2000000000000000000'),
- },
- },
+ amount: BigInt('2000000000000000000')
+ }
+ }
}
const jsonString = JSON.stringify(
mockResult,
(_, value) => (typeof value === 'bigint' ? value.toString() : value)
)
mockHRPC.callMethod.mockResolvedValue({
- result: jsonString,
+ result: jsonString
})
const result = await AccountService.callAccountMethod(
@@ -126,26 +153,26 @@ describe('AccountService', () => {
data: {
balance: '1000000000000000000',
nested: {
- amount: '2000000000000000000',
- },
- },
+ amount: '2000000000000000000'
+ }
+ }
})
})
it('should convert BigInt in arrays', async () => {
// Test with signTransaction which can return an object with arrays
const mockResult = {
- balances: ['1000000000000000000', '2000000000000000000'],
+ balances: ['1000000000000000000', '2000000000000000000']
}
// Simulate BigInt in response by using a custom replacer
const jsonString = JSON.stringify(
{
- balances: [BigInt('1000000000000000000'), BigInt('2000000000000000000')],
+ balances: [BigInt('1000000000000000000'), BigInt('2000000000000000000')]
},
(_, value) => (typeof value === 'bigint' ? value.toString() : value)
)
mockHRPC.callMethod.mockResolvedValue({
- result: jsonString,
+ result: jsonString
})
const result = await AccountService.callAccountMethod(
@@ -156,7 +183,7 @@ describe('AccountService', () => {
)
expect(result).toEqual({
- balances: ['1000000000000000000', '2000000000000000000'],
+ balances: ['1000000000000000000', '2000000000000000000']
})
})
@@ -177,7 +204,7 @@ describe('AccountService', () => {
'getTokenBalance',
'signMessage',
'signTransaction',
- 'sendTransaction',
+ 'sendTransaction'
]
for (const method of methods) {
@@ -186,7 +213,7 @@ describe('AccountService', () => {
? '1000000000000000000'
: { success: true }
mockHRPC.callMethod.mockResolvedValue({
- result: JSON.stringify(mockResult),
+ result: JSON.stringify(mockResult)
})
await expect(
@@ -198,7 +225,7 @@ describe('AccountService', () => {
it('should use safeStringify for args', async () => {
const mockArgs = { test: 'value' }
mockHRPC.callMethod.mockResolvedValue({
- result: JSON.stringify({ success: true }),
+ result: JSON.stringify({ success: true })
})
await AccountService.callAccountMethod(
@@ -212,7 +239,7 @@ describe('AccountService', () => {
methodName: 'signMessage',
network: 'ethereum',
accountIndex: 0,
- args: JSON.stringify(mockArgs),
+ args: JSON.stringify(mockArgs)
})
})
@@ -227,7 +254,7 @@ describe('AccountService', () => {
it('should validate balance response format', async () => {
mockHRPC.callMethod.mockResolvedValue({
- result: JSON.stringify('invalid-balance-format'),
+ result: JSON.stringify('invalid-balance-format')
})
await expect(
@@ -237,7 +264,7 @@ describe('AccountService', () => {
it('should accept valid balance response format', async () => {
mockHRPC.callMethod.mockResolvedValue({
- result: JSON.stringify('1000000000000000000'),
+ result: JSON.stringify('1000000000000000000')
})
const result = await AccountService.callAccountMethod(
@@ -265,7 +292,7 @@ describe('AccountService', () => {
it('should throw error if WDK not initialized', async () => {
mockWorkletStore.getState = jest.fn(() => ({
isInitialized: false,
- hrpc: null,
+ hrpc: null
}))
await expect(
@@ -276,7 +303,7 @@ describe('AccountService', () => {
it('should throw error if HRPC not available', async () => {
mockWorkletStore.getState = jest.fn(() => ({
isInitialized: true,
- hrpc: null,
+ hrpc: null
}))
await expect(
@@ -287,7 +314,7 @@ describe('AccountService', () => {
it('should throw error if method returns no result', async () => {
// workletResponseSchema requires result to be a string, so we need to mock a response that fails schema validation
mockHRPC.callMethod.mockResolvedValue({
- result: null,
+ result: null
})
await expect(
@@ -297,7 +324,7 @@ describe('AccountService', () => {
it('should throw error if result is null', async () => {
mockHRPC.callMethod.mockResolvedValue({
- result: JSON.stringify(null),
+ result: JSON.stringify(null)
})
await expect(
@@ -307,7 +334,7 @@ describe('AccountService', () => {
it('should throw error if result is null', async () => {
mockHRPC.callMethod.mockResolvedValue({
- result: JSON.stringify(null),
+ result: JSON.stringify(null)
})
await expect(
@@ -317,7 +344,7 @@ describe('AccountService', () => {
it('should throw error if JSON parsing fails', async () => {
mockHRPC.callMethod.mockResolvedValue({
- result: 'invalid json',
+ result: 'invalid json'
})
await expect(
@@ -334,4 +361,3 @@ describe('AccountService', () => {
})
})
})
-
diff --git a/src/__tests__/services/addressService.test.ts b/src/__tests__/services/addressService.test.ts
index b2cc3e3..44c869b 100644
--- a/src/__tests__/services/addressService.test.ts
+++ b/src/__tests__/services/addressService.test.ts
@@ -1,6 +1,6 @@
/**
* Tests for AddressService
- *
+ *
* Tests address retrieval functionality
*/
@@ -10,11 +10,11 @@ import { getWalletStore } from '../../store/walletStore'
// Mock stores
jest.mock('../../store/workletStore', () => ({
- getWorkletStore: jest.fn(),
+ getWorkletStore: jest.fn()
}))
jest.mock('../../store/walletStore', () => ({
- getWalletStore: jest.fn(),
+ getWalletStore: jest.fn()
}))
describe('AddressService', () => {
@@ -27,7 +27,7 @@ describe('AddressService', () => {
// Setup mock HRPC
mockHRPC = {
- callMethod: jest.fn(),
+ callMethod: jest.fn()
}
// Setup mock worklet store
@@ -35,8 +35,8 @@ describe('AddressService', () => {
getState: jest.fn(() => ({
isInitialized: true,
hrpc: mockHRPC,
- isWorkletStarted: true,
- })),
+ isWorkletStarted: true
+ }))
}
// Setup mock wallet store
@@ -44,9 +44,9 @@ describe('AddressService', () => {
getState: jest.fn(() => ({
addresses: {},
walletLoading: {},
- activeWalletId: 'test-wallet-1',
+ activeWalletId: 'test-wallet-1'
})),
- setState: jest.fn(),
+ setState: jest.fn()
}
// Setup store mocks
@@ -58,7 +58,7 @@ describe('AddressService', () => {
it('should get address from worklet and cache it', async () => {
const mockAddress = '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb0'
mockHRPC.callMethod.mockResolvedValue({
- result: JSON.stringify(mockAddress),
+ result: JSON.stringify(mockAddress)
})
const address = await AddressService.getAddress('ethereum', 0)
@@ -68,7 +68,7 @@ describe('AddressService', () => {
methodName: 'getAddress',
network: 'ethereum',
accountIndex: 0,
- args: null,
+ args: undefined
})
// Verify address was cached
@@ -84,7 +84,7 @@ describe('AddressService', () => {
const prevState = {
addresses: {},
walletLoading: {},
- activeWalletId: 'test-wallet-1',
+ activeWalletId: 'test-wallet-1'
}
const newState = stateUpdater(prevState)
return newState.addresses?.['test-wallet-1']?.ethereum?.[0] === mockAddress
@@ -101,12 +101,12 @@ describe('AddressService', () => {
addresses: {
'test-wallet-1': {
ethereum: {
- 0: cachedAddress,
- },
- },
+ 0: cachedAddress
+ }
+ }
},
walletLoading: {},
- activeWalletId: 'test-wallet-1',
+ activeWalletId: 'test-wallet-1'
}))
const address = await AddressService.getAddress('ethereum', 0)
@@ -122,10 +122,10 @@ describe('AddressService', () => {
mockHRPC.callMethod
.mockResolvedValueOnce({
- result: JSON.stringify(ethereumAddress),
+ result: JSON.stringify(ethereumAddress)
})
.mockResolvedValueOnce({
- result: JSON.stringify(polygonAddress),
+ result: JSON.stringify(polygonAddress)
})
const ethAddr = await AddressService.getAddress('ethereum', 0)
@@ -142,10 +142,10 @@ describe('AddressService', () => {
mockHRPC.callMethod
.mockResolvedValueOnce({
- result: JSON.stringify(address0),
+ result: JSON.stringify(address0)
})
.mockResolvedValueOnce({
- result: JSON.stringify(address1),
+ result: JSON.stringify(address1)
})
const addr0 = await AddressService.getAddress('ethereum', 0)
@@ -156,13 +156,13 @@ describe('AddressService', () => {
expect(mockHRPC.callMethod).toHaveBeenCalledWith(
expect.objectContaining({
network: 'ethereum',
- accountIndex: 0,
+ accountIndex: 0
})
)
expect(mockHRPC.callMethod).toHaveBeenCalledWith(
expect.objectContaining({
network: 'ethereum',
- accountIndex: 1,
+ accountIndex: 1
})
)
})
@@ -170,12 +170,12 @@ describe('AddressService', () => {
it('should throw error if WDK not initialized', async () => {
mockWorkletStore.getState = jest.fn(() => ({
isInitialized: false,
- hrpc: null,
+ hrpc: null
}))
mockWalletStore.getState = jest.fn(() => ({
addresses: {},
walletLoading: {},
- activeWalletId: 'test-wallet-1',
+ activeWalletId: 'test-wallet-1'
}))
await expect(AddressService.getAddress('ethereum', 0)).rejects.toThrow(
@@ -186,12 +186,12 @@ describe('AddressService', () => {
it('should throw error if HRPC not available', async () => {
mockWorkletStore.getState = jest.fn(() => ({
isInitialized: true,
- hrpc: null,
+ hrpc: null
}))
mockWalletStore.getState = jest.fn(() => ({
addresses: {},
walletLoading: {},
- activeWalletId: 'test-wallet-1',
+ activeWalletId: 'test-wallet-1'
}))
await expect(AddressService.getAddress('ethereum', 0)).rejects.toThrow(
@@ -207,12 +207,12 @@ describe('AddressService', () => {
it('should throw error if worklet returns no result', async () => {
mockHRPC.callMethod.mockResolvedValue({
- result: null,
+ result: null
})
mockWalletStore.getState = jest.fn(() => ({
addresses: {},
walletLoading: {},
- activeWalletId: 'test-wallet-1',
+ activeWalletId: 'test-wallet-1'
}))
await expect(AddressService.getAddress('ethereum', 0)).rejects.toThrow(
@@ -241,15 +241,15 @@ describe('AddressService', () => {
for (const network of networks) {
const mockAddress = network === 'spark' ? mockSparkAddress : mockEthereumAddress
mockHRPC.callMethod.mockResolvedValueOnce({
- result: JSON.stringify(mockAddress),
+ result: JSON.stringify(mockAddress)
})
-
+
const address = await AddressService.getAddress(network, 0)
expect(address).toBe(mockAddress)
expect(mockHRPC.callMethod).toHaveBeenCalledWith(
expect.objectContaining({
network,
- accountIndex: 0,
+ accountIndex: 0
})
)
}
@@ -260,7 +260,7 @@ describe('AddressService', () => {
it('should set loading state during address fetch', async () => {
const mockAddress = '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb0'
mockHRPC.callMethod.mockResolvedValue({
- result: JSON.stringify(mockAddress),
+ result: JSON.stringify(mockAddress)
})
await AddressService.getAddress('ethereum', 0)
@@ -270,13 +270,13 @@ describe('AddressService', () => {
expect(setStateCalls.length).toBeGreaterThan(0)
// Track state changes - start with initial state
- let currentState: any = {
- walletLoading: {},
+ let currentState: any = {
+ walletLoading: {},
addresses: {},
balanceLoading: {},
lastBalanceUpdate: {},
balances: {},
- activeWalletId: 'test-wallet-1',
+ activeWalletId: 'test-wallet-1'
}
let loadingWasSetToTrue = false
let loadingWasSetToFalse = false
@@ -291,7 +291,7 @@ describe('AddressService', () => {
balanceLoading: currentState.balanceLoading || {},
lastBalanceUpdate: currentState.lastBalanceUpdate || {},
balances: currentState.balances || {},
- activeWalletId: currentState.activeWalletId || 'test-wallet-1',
+ activeWalletId: currentState.activeWalletId || 'test-wallet-1'
}
currentState = { ...prevState, ...stateUpdater(prevState) }
// Loading state is now per-wallet: walletLoading[walletId][loadingKey]
@@ -309,4 +309,3 @@ describe('AddressService', () => {
})
})
})
-
diff --git a/src/__tests__/services/balanceService.test.ts b/src/__tests__/services/balanceService.test.ts
index c715190..6f54998 100644
--- a/src/__tests__/services/balanceService.test.ts
+++ b/src/__tests__/services/balanceService.test.ts
@@ -1,6 +1,6 @@
/**
* Tests for BalanceService
- *
+ *
* Tests balance operations: getting, setting, updating, and managing balance state
*/
@@ -9,9 +9,11 @@ import { getWalletStore } from '../../store/walletStore'
// Mock stores
jest.mock('../../store/walletStore', () => ({
- getWalletStore: jest.fn(),
+ getWalletStore: jest.fn()
}))
+const MOCK_NATIVE_TOKEN_ID = 'eth-native'
+
describe('BalanceService', () => {
let mockWalletStore: any
@@ -24,9 +26,9 @@ describe('BalanceService', () => {
balances: {},
balanceLoading: {},
lastBalanceUpdate: {},
- activeWalletId: 'test-wallet-1',
+ activeWalletId: 'test-wallet-1'
})),
- setState: jest.fn(),
+ setState: jest.fn()
}
// Setup store mocks
@@ -35,14 +37,14 @@ describe('BalanceService', () => {
describe('updateBalance', () => {
it('should update native balance', () => {
- BalanceService.updateBalance(0, 'ethereum', null, '1000000000000000000')
+ BalanceService.updateBalance(0, 'ethereum', MOCK_NATIVE_TOKEN_ID, '1000000000000000000')
expect(mockWalletStore.setState).toHaveBeenCalled()
const setStateCall = mockWalletStore.setState.mock.calls[0][0]
const prevState = { balances: {}, activeWalletId: 'test-wallet-1' }
const newState = setStateCall(prevState)
- expect(newState.balances['test-wallet-1']?.ethereum?.[0]?.native).toBe('1000000000000000000')
+ expect(newState.balances['test-wallet-1']?.ethereum?.[0]?.[MOCK_NATIVE_TOKEN_ID]).toBe('1000000000000000000')
})
it('should update token balance', () => {
@@ -70,12 +72,12 @@ describe('BalanceService', () => {
'test-wallet-1': {
ethereum: {
0: {
- native: '1000000000000000000',
- },
- },
- },
+ [MOCK_NATIVE_TOKEN_ID]: '1000000000000000000'
+ }
+ }
+ }
},
- activeWalletId: 'test-wallet-1',
+ activeWalletId: 'test-wallet-1'
}
BalanceService.updateBalance(0, 'ethereum', '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb0', '2000000000000000000')
@@ -83,7 +85,7 @@ describe('BalanceService', () => {
const setStateCall = mockWalletStore.setState.mock.calls[0][0]
const newState = setStateCall(prevState)
- expect(newState.balances['test-wallet-1']?.ethereum?.[0]?.native).toBe('1000000000000000000')
+ expect(newState.balances['test-wallet-1']?.ethereum?.[0]?.[MOCK_NATIVE_TOKEN_ID]).toBe('1000000000000000000')
expect(newState.balances['test-wallet-1']?.ethereum?.[0]?.['0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb0']).toBe(
'2000000000000000000'
)
@@ -91,19 +93,19 @@ describe('BalanceService', () => {
it('should validate network name', () => {
expect(() => {
- BalanceService.updateBalance(0, '', null, '100')
+ BalanceService.updateBalance(0, '', MOCK_NATIVE_TOKEN_ID, '100')
}).toThrow(/network.*non-empty|Network name must contain only|String must contain at least 1 character/)
})
it('should validate account index', () => {
expect(() => {
- BalanceService.updateBalance(-1, 'ethereum', null, '100')
+ BalanceService.updateBalance(-1, 'ethereum', MOCK_NATIVE_TOKEN_ID, '100')
}).toThrow(/accountIndex.*non-negative|Number must be greater than or equal to 0/)
})
it('should validate balance', () => {
expect(() => {
- BalanceService.updateBalance(0, 'ethereum', null, '')
+ BalanceService.updateBalance(0, 'ethereum', MOCK_NATIVE_TOKEN_ID, '')
}).toThrow(/balance.*valid number|Balance must be a valid number string/)
})
})
@@ -115,15 +117,15 @@ describe('BalanceService', () => {
'test-wallet-1': {
ethereum: {
0: {
- native: '1000000000000000000',
- },
- },
- },
+ [MOCK_NATIVE_TOKEN_ID]: '1000000000000000000'
+ }
+ }
+ }
},
- activeWalletId: 'test-wallet-1',
+ activeWalletId: 'test-wallet-1'
}))
- const balance = BalanceService.getBalance(0, 'ethereum', null)
+ const balance = BalanceService.getBalance(0, 'ethereum', MOCK_NATIVE_TOKEN_ID)
expect(balance).toBe('1000000000000000000')
})
@@ -133,13 +135,13 @@ describe('BalanceService', () => {
'test-wallet-1': {
ethereum: {
0: {
- native: '1000000000000000000',
- '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb0': '2000000000000000000',
- },
- },
- },
+ [MOCK_NATIVE_TOKEN_ID]: '1000000000000000000',
+ '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb0': '2000000000000000000'
+ }
+ }
+ }
},
- activeWalletId: 'test-wallet-1',
+ activeWalletId: 'test-wallet-1'
}))
const balance = BalanceService.getBalance(0, 'ethereum', '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb0')
@@ -149,22 +151,22 @@ describe('BalanceService', () => {
it('should return null if balance not found', () => {
mockWalletStore.getState = jest.fn(() => ({
balances: {},
- activeWalletId: 'test-wallet-1',
+ activeWalletId: 'test-wallet-1'
}))
- const balance = BalanceService.getBalance(0, 'ethereum', null)
+ const balance = BalanceService.getBalance(0, 'ethereum', MOCK_NATIVE_TOKEN_ID)
expect(balance).toBe(null)
})
it('should validate network name', () => {
expect(() => {
- BalanceService.getBalance(0, '', null)
+ BalanceService.getBalance(0, '', MOCK_NATIVE_TOKEN_ID)
}).toThrow(/network.*non-empty|Network name must contain only|String must contain at least 1 character/)
})
it('should validate account index', () => {
expect(() => {
- BalanceService.getBalance(-1, 'ethereum', null)
+ BalanceService.getBalance(-1, 'ethereum', MOCK_NATIVE_TOKEN_ID)
}).toThrow(/accountIndex.*non-negative|Number must be greater than or equal to 0/)
})
})
@@ -176,26 +178,26 @@ describe('BalanceService', () => {
'test-wallet-1': {
ethereum: {
0: {
- native: '1000000000000000000',
- '0x123': '2000000000000000000',
- },
- },
- },
+ [MOCK_NATIVE_TOKEN_ID]: '1000000000000000000',
+ '0x123': '2000000000000000000'
+ }
+ }
+ }
},
- activeWalletId: 'test-wallet-1',
+ activeWalletId: 'test-wallet-1'
}))
const balances = BalanceService.getBalancesForWallet(0, 'ethereum')
expect(balances).toEqual({
- native: '1000000000000000000',
- '0x123': '2000000000000000000',
+ [MOCK_NATIVE_TOKEN_ID]: '1000000000000000000',
+ '0x123': '2000000000000000000'
})
})
it('should return null if no balances found', () => {
mockWalletStore.getState = jest.fn(() => ({
balances: {},
- activeWalletId: 'test-wallet-1',
+ activeWalletId: 'test-wallet-1'
}))
const balances = BalanceService.getBalancesForWallet(0, 'ethereum')
@@ -217,32 +219,32 @@ describe('BalanceService', () => {
describe('setBalanceLoading', () => {
it('should set loading to true', () => {
- BalanceService.setBalanceLoading('ethereum', 0, null, true)
+ BalanceService.setBalanceLoading('ethereum', 0, MOCK_NATIVE_TOKEN_ID, true)
expect(mockWalletStore.setState).toHaveBeenCalled()
const setStateCall = mockWalletStore.setState.mock.calls[0][0]
const prevState = { balanceLoading: {}, activeWalletId: 'test-wallet-1' }
const newState = setStateCall(prevState)
- expect(newState.balanceLoading['test-wallet-1']?.['ethereum-0-native']).toBe(true)
+ expect(newState.balanceLoading['test-wallet-1']?.[`ethereum-0-${MOCK_NATIVE_TOKEN_ID}`]).toBe(true)
})
it('should set loading to false', () => {
const prevState = {
balanceLoading: {
'test-wallet-1': {
- 'ethereum-0-native': true,
- },
+ [`ethereum-0-${MOCK_NATIVE_TOKEN_ID}`]: true
+ }
},
- activeWalletId: 'test-wallet-1',
+ activeWalletId: 'test-wallet-1'
}
- BalanceService.setBalanceLoading('ethereum', 0, null, false)
+ BalanceService.setBalanceLoading('ethereum', 0, MOCK_NATIVE_TOKEN_ID, false)
const setStateCall = mockWalletStore.setState.mock.calls[0][0]
const newState = setStateCall(prevState)
- expect(newState.balanceLoading['test-wallet-1']?.['ethereum-0-native']).toBeUndefined()
+ expect(newState.balanceLoading['test-wallet-1']?.[`ethereum-0-${MOCK_NATIVE_TOKEN_ID}`]).toBeUndefined()
})
it('should handle token loading state', () => {
@@ -257,13 +259,13 @@ describe('BalanceService', () => {
it('should validate network name', () => {
expect(() => {
- BalanceService.setBalanceLoading('', 0, null, true)
+ BalanceService.setBalanceLoading('', 0, MOCK_NATIVE_TOKEN_ID, true)
}).toThrow(/network.*non-empty|Network name must contain only|String must contain at least 1 character/)
})
it('should validate account index', () => {
expect(() => {
- BalanceService.setBalanceLoading('ethereum', -1, null, true)
+ BalanceService.setBalanceLoading('ethereum', -1, MOCK_NATIVE_TOKEN_ID, true)
}).toThrow(/accountIndex.*non-negative|Number must be greater than or equal to 0/)
})
})
@@ -273,35 +275,35 @@ describe('BalanceService', () => {
mockWalletStore.getState = jest.fn(() => ({
balanceLoading: {
'test-wallet-1': {
- 'ethereum-0-native': true,
- },
+ [`ethereum-0-${MOCK_NATIVE_TOKEN_ID}`]: true
+ }
},
- activeWalletId: 'test-wallet-1',
+ activeWalletId: 'test-wallet-1'
}))
- const isLoading = BalanceService.isBalanceLoading('ethereum', 0, null)
+ const isLoading = BalanceService.isBalanceLoading('ethereum', 0, MOCK_NATIVE_TOKEN_ID)
expect(isLoading).toBe(true)
})
it('should return false if balance is not loading', () => {
mockWalletStore.getState = jest.fn(() => ({
balanceLoading: {},
- activeWalletId: 'test-wallet-1',
+ activeWalletId: 'test-wallet-1'
}))
- const isLoading = BalanceService.isBalanceLoading('ethereum', 0, null)
+ const isLoading = BalanceService.isBalanceLoading('ethereum', 0, MOCK_NATIVE_TOKEN_ID)
expect(isLoading).toBe(false)
})
it('should validate network name', () => {
expect(() => {
- BalanceService.isBalanceLoading('', 0, null)
+ BalanceService.isBalanceLoading('', 0, MOCK_NATIVE_TOKEN_ID)
}).toThrow(/network.*non-empty|Network name must contain only|String must contain at least 1 character/)
})
it('should validate account index', () => {
expect(() => {
- BalanceService.isBalanceLoading('ethereum', -1, null)
+ BalanceService.isBalanceLoading('ethereum', -1, MOCK_NATIVE_TOKEN_ID)
}).toThrow(/accountIndex.*non-negative|Number must be greater than or equal to 0/)
})
})
@@ -327,11 +329,11 @@ describe('BalanceService', () => {
lastBalanceUpdate: {
'test-wallet-1': {
polygon: {
- 0: 1234567890,
- },
- },
+ 0: 1234567890
+ }
+ }
},
- activeWalletId: 'test-wallet-1',
+ activeWalletId: 'test-wallet-1'
}
BalanceService.updateLastBalanceUpdate('ethereum', 0)
@@ -363,11 +365,11 @@ describe('BalanceService', () => {
lastBalanceUpdate: {
'test-wallet-1': {
ethereum: {
- 0: timestamp,
- },
- },
+ 0: timestamp
+ }
+ }
},
- activeWalletId: 'test-wallet-1',
+ activeWalletId: 'test-wallet-1'
}))
const result = BalanceService.getLastBalanceUpdate('ethereum', 0)
@@ -376,7 +378,7 @@ describe('BalanceService', () => {
it('should return null if timestamp not found', () => {
mockWalletStore.getState = jest.fn(() => ({
- lastBalanceUpdate: {},
+ lastBalanceUpdate: {}
}))
const result = BalanceService.getLastBalanceUpdate('ethereum', 0)
@@ -403,9 +405,8 @@ describe('BalanceService', () => {
expect(mockWalletStore.setState).toHaveBeenCalledWith({
balances: {},
balanceLoading: {},
- lastBalanceUpdate: {},
+ lastBalanceUpdate: {}
})
})
})
})
-
diff --git a/src/__tests__/services/walletSetupService.test.ts b/src/__tests__/services/walletSetupService.test.ts
index d966395..78c3966 100644
--- a/src/__tests__/services/walletSetupService.test.ts
+++ b/src/__tests__/services/walletSetupService.test.ts
@@ -1,6 +1,6 @@
/**
* Tests for WalletSetupService
- *
+ *
* Tests wallet creation, loading, and identifier-based multi-wallet support
*/
@@ -8,25 +8,26 @@ import { WalletSetupService } from '../../services/walletSetupService'
import { mockSecureStorage } from '../../__mocks__/secureStorage'
import { WorkletLifecycleService } from '../../services/workletLifecycleService'
import { getWorkletStore } from '../../store/workletStore'
-import type { NetworkConfigs } from '../../types'
+import type { WdkConfigs } from '../../types'
// Mock WorkletLifecycleService
jest.mock('../../services/workletLifecycleService', () => ({
WorkletLifecycleService: {
- startWorklet: jest.fn(() => Promise.resolve()),
- generateEntropyAndEncrypt: jest.fn(() => Promise.resolve({
+ startWorklet: jest.fn(async () => await Promise.resolve()),
+ ensureWorkletStarted: jest.fn(),
+ generateEntropyAndEncrypt: jest.fn(async () => await Promise.resolve({
encryptionKey: 'test-encryption-key',
encryptedSeedBuffer: 'test-encrypted-seed',
- encryptedEntropyBuffer: 'test-encrypted-entropy',
+ encryptedEntropyBuffer: 'test-encrypted-entropy'
})),
- getSeedAndEntropyFromMnemonic: jest.fn(() => Promise.resolve({
+ getSeedAndEntropyFromMnemonic: jest.fn(async () => await Promise.resolve({
encryptionKey: 'test-encryption-key',
encryptedSeedBuffer: 'test-encrypted-seed-from-mnemonic',
- encryptedEntropyBuffer: 'test-encrypted-entropy-from-mnemonic',
+ encryptedEntropyBuffer: 'test-encrypted-entropy-from-mnemonic'
})),
- initializeWDK: jest.fn(() => Promise.resolve()),
- reset: jest.fn(),
- },
+ initializeWDK: jest.fn(async () => await Promise.resolve()),
+ reset: jest.fn()
+ }
}))
// Mock workletStore
@@ -35,21 +36,25 @@ jest.mock('../../store/workletStore', () => ({
getState: jest.fn(() => ({
isWorkletStarted: true,
isInitialized: false,
- credentialsCache: {},
+ credentialsCache: {}
})),
- setState: jest.fn(),
+ setState: jest.fn()
})),
getCachedCredentials: jest.fn(() => null),
setCachedCredentials: jest.fn(),
- clearCredentialsCache: jest.fn(),
+ clearCredentialsCache: jest.fn()
}))
describe('WalletSetupService', () => {
- const mockNetworkConfigs: NetworkConfigs = {
- ethereum: {
- chainId: 1,
- blockchain: 'ethereum',
- },
+ const mockNetworkConfigs: WdkConfigs = {
+ networks: {
+ ethereum: {
+ blockchain: 'ethereum',
+ config: {
+ chainId: 1
+ }
+ }
+ }
}
beforeEach(() => {
@@ -67,7 +72,7 @@ describe('WalletSetupService', () => {
if (mockStore) {
mockStore.getState = jest.fn(() => ({
isWorkletStarted: true,
- isInitialized: false,
+ isInitialized: false
}))
}
})
@@ -75,7 +80,6 @@ describe('WalletSetupService', () => {
describe('createNewWallet', () => {
it('should create a new wallet without identifier', async () => {
const result = await WalletSetupService.createNewWallet(
- mockNetworkConfigs
)
expect(result).toHaveProperty('encryptionKey')
@@ -98,7 +102,6 @@ describe('WalletSetupService', () => {
it('should create a new wallet with identifier', async () => {
const identifier = 'user@example.com'
const result = await WalletSetupService.createNewWallet(
- mockNetworkConfigs,
identifier
)
@@ -123,7 +126,7 @@ describe('WalletSetupService', () => {
authMock.mockResolvedValueOnce(false)
await expect(
- WalletSetupService.createNewWallet(mockNetworkConfigs)
+ WalletSetupService.createNewWallet()
).rejects.toThrow('Biometric authentication required to create wallet')
})
})
@@ -160,7 +163,7 @@ describe('WalletSetupService', () => {
// Ensure cache is clear and storage is empty
WalletSetupService.clearCredentialsCache()
await mockSecureStorage.clearAll()
-
+
await expect(
WalletSetupService.loadExistingWallet()
).rejects.toThrow('Encryption key not found')
@@ -205,7 +208,6 @@ describe('WalletSetupService', () => {
it('should initialize wallet from mnemonic without identifier', async () => {
const result = await WalletSetupService.initializeFromMnemonic(
- mockNetworkConfigs,
testMnemonic
)
@@ -222,7 +224,6 @@ describe('WalletSetupService', () => {
it('should initialize wallet from mnemonic with identifier', async () => {
const identifier = 'user@example.com'
const result = await WalletSetupService.initializeFromMnemonic(
- mockNetworkConfigs,
testMnemonic,
identifier
)
@@ -244,7 +245,6 @@ describe('WalletSetupService', () => {
await expect(
WalletSetupService.initializeFromMnemonic(
- mockNetworkConfigs,
testMnemonic
)
).rejects.toThrow('Biometric authentication required to import wallet')
@@ -256,11 +256,10 @@ describe('WalletSetupService', () => {
const mockStore = getWorkletStore() as any
mockStore.getState = jest.fn(() => ({
isWorkletStarted: true,
- isInitialized: false,
+ isInitialized: false
}))
await WalletSetupService.initializeWallet(
- mockNetworkConfigs,
{ createNew: true }
)
@@ -272,18 +271,17 @@ describe('WalletSetupService', () => {
const mockStore = getWorkletStore() as any
mockStore.getState = jest.fn(() => ({
isWorkletStarted: true,
- isInitialized: false,
+ isInitialized: false
}))
// Ensure cache is clear
WalletSetupService.clearCredentialsCache()
-
+
// Setup: create a wallet first
await mockSecureStorage.setEncryptionKey('test-key', undefined)
await mockSecureStorage.setEncryptedSeed('test-seed', undefined)
await WalletSetupService.initializeWallet(
- mockNetworkConfigs,
{ createNew: false }
)
@@ -296,12 +294,11 @@ describe('WalletSetupService', () => {
const mockStore = getWorkletStore() as any
mockStore.getState = jest.fn(() => ({
isWorkletStarted: true,
- isInitialized: false,
+ isInitialized: false
}))
const identifier = 'user@example.com'
await WalletSetupService.initializeWallet(
- mockNetworkConfigs,
{ createNew: true, walletId: identifier }
)
@@ -315,18 +312,17 @@ describe('WalletSetupService', () => {
const mockStore = getWorkletStore() as any
mockStore.getState = jest.fn(() => ({
isWorkletStarted: true,
- isInitialized: false,
+ isInitialized: false
}))
// Ensure cache is clear
WalletSetupService.clearCredentialsCache()
-
+
const identifier = 'user@example.com'
await mockSecureStorage.setEncryptionKey('test-key', identifier)
await mockSecureStorage.setEncryptedSeed('test-seed', identifier)
await WalletSetupService.initializeWallet(
- mockNetworkConfigs,
{ createNew: false, walletId: identifier }
)
@@ -340,12 +336,12 @@ describe('WalletSetupService', () => {
// Mock generateEntropyAndEncrypt to return different values for different calls
let callCount = 0
const generateMock = WorkletLifecycleService.generateEntropyAndEncrypt as jest.Mock
- generateMock.mockImplementation(() => {
+ generateMock.mockImplementation(async () => {
callCount++
- return Promise.resolve({
+ return await Promise.resolve({
encryptionKey: `encryption-key-${callCount}`,
encryptedSeedBuffer: `encrypted-seed-${callCount}`,
- encryptedEntropyBuffer: `encrypted-entropy-${callCount}`,
+ encryptedEntropyBuffer: `encrypted-entropy-${callCount}`
})
})
@@ -354,13 +350,11 @@ describe('WalletSetupService', () => {
// Create wallet for user1
const result1 = await WalletSetupService.createNewWallet(
- mockNetworkConfigs,
identifier1
)
// Create wallet for user2
const result2 = await WalletSetupService.createNewWallet(
- mockNetworkConfigs,
identifier2
)
@@ -392,13 +386,13 @@ describe('WalletSetupService', () => {
// This is the specific test requested by the user
let seedCounter = 0
const generateMock = WorkletLifecycleService.generateEntropyAndEncrypt as jest.Mock
- generateMock.mockImplementation(() => {
+ generateMock.mockImplementation(async () => {
seedCounter++
// Simulate different entropy generation (in real scenario, this would be random)
- return Promise.resolve({
+ return await Promise.resolve({
encryptionKey: `key-${seedCounter}-${Date.now()}`,
encryptedSeedBuffer: `seed-${seedCounter}-${Math.random()}`,
- encryptedEntropyBuffer: `entropy-${seedCounter}-${Math.random()}`,
+ encryptedEntropyBuffer: `entropy-${seedCounter}-${Math.random()}`
})
})
@@ -406,12 +400,10 @@ describe('WalletSetupService', () => {
const identifier2 = 'bob@example.com'
const wallet1 = await WalletSetupService.createNewWallet(
- mockNetworkConfigs,
identifier1
)
const wallet2 = await WalletSetupService.createNewWallet(
- mockNetworkConfigs,
identifier2
)
@@ -441,13 +433,11 @@ describe('WalletSetupService', () => {
// Create wallet for identifier1
await WalletSetupService.createNewWallet(
- mockNetworkConfigs,
identifier1
)
// Create wallet for identifier2
await WalletSetupService.createNewWallet(
- mockNetworkConfigs,
identifier2
)
@@ -460,4 +450,3 @@ describe('WalletSetupService', () => {
})
})
})
-
diff --git a/src/__tests__/services/walletSwitchingService.test.ts b/src/__tests__/services/walletSwitchingService.test.ts
index 0e046b9..4e6f00a 100644
--- a/src/__tests__/services/walletSwitchingService.test.ts
+++ b/src/__tests__/services/walletSwitchingService.test.ts
@@ -1,6 +1,6 @@
/**
* Tests for WalletSwitchingService
- *
+ *
* Tests wallet switching operations
*/
@@ -14,15 +14,15 @@ jest.mock('../../services/walletSetupService', () => ({
WalletSetupService: {
hasWallet: jest.fn(),
loadExistingWallet: jest.fn(),
- clearCredentialsCache: jest.fn(),
- },
+ clearCredentialsCache: jest.fn()
+ }
}))
jest.mock('../../services/workletLifecycleService', () => ({
WorkletLifecycleService: {
ensureWorkletStarted: jest.fn(),
- initializeWDK: jest.fn(),
- },
+ initializeWDK: jest.fn()
+ }
}))
jest.mock('../../store/walletStore', () => ({
@@ -33,13 +33,13 @@ jest.mock('../../store/walletStore', () => ({
return state.identifier
}
return null
- }),
+ })
}))
jest.mock('../../utils/logger', () => ({
log: jest.fn(),
logError: jest.fn(),
- logWarn: jest.fn(),
+ logWarn: jest.fn()
}))
describe('WalletSwitchingService', () => {
@@ -51,9 +51,9 @@ describe('WalletSwitchingService', () => {
mockWalletStore = {
getState: jest.fn(() => ({
activeWalletId: null,
- walletLoadingState: { type: 'not_loaded' },
+ walletLoadingState: { type: 'not_loaded' }
})),
- setState: jest.fn(),
+ setState: jest.fn()
}
;(getWalletStore as jest.Mock).mockReturnValue(mockWalletStore)
@@ -64,11 +64,11 @@ describe('WalletSwitchingService', () => {
const walletId = 'test-wallet-1'
const credentials = {
encryptionKey: 'test-key',
- encryptedSeed: 'test-seed',
+ encryptedSeed: 'test-seed'
}
mockWalletStore.getState.mockReturnValue({
- activeWalletId: null,
+ activeWalletId: null
})
;(WalletSetupService.hasWallet as jest.Mock).mockResolvedValue(true)
@@ -83,7 +83,7 @@ describe('WalletSwitchingService', () => {
expect(WalletSetupService.loadExistingWallet).toHaveBeenCalledWith(walletId)
expect(WorkletLifecycleService.initializeWDK).toHaveBeenCalledWith({
encryptionKey: credentials.encryptionKey,
- encryptedSeed: credentials.encryptedSeed,
+ encryptedSeed: credentials.encryptedSeed
})
// setState is called with a function that updates the state
expect(mockWalletStore.setState).toHaveBeenCalled()
@@ -111,7 +111,7 @@ describe('WalletSwitchingService', () => {
const walletId = 'test-wallet-1'
mockWalletStore.getState.mockReturnValue({
- activeWalletId: walletId,
+ activeWalletId: walletId
})
await WalletSwitchingService.switchToWallet(walletId)
@@ -124,7 +124,7 @@ describe('WalletSwitchingService', () => {
const walletId = 'non-existent-wallet'
mockWalletStore.getState.mockReturnValue({
- activeWalletId: null,
+ activeWalletId: null
})
;(WalletSetupService.hasWallet as jest.Mock).mockResolvedValue(false)
@@ -142,11 +142,11 @@ describe('WalletSwitchingService', () => {
const toWalletId = 'wallet-2'
const credentials = {
encryptionKey: 'test-key',
- encryptedSeed: 'test-seed',
+ encryptedSeed: 'test-seed'
}
mockWalletStore.getState.mockReturnValue({
- activeWalletId: fromWalletId,
+ activeWalletId: fromWalletId
})
;(WalletSetupService.hasWallet as jest.Mock).mockResolvedValue(true)
@@ -184,23 +184,21 @@ describe('WalletSwitchingService', () => {
const walletId = 'test-wallet-1'
const credentials = {
encryptionKey: 'test-key',
- encryptedSeed: 'test-seed',
+ encryptedSeed: 'test-seed'
}
mockWalletStore.getState.mockReturnValue({
- activeWalletId: null,
+ activeWalletId: null
})
;(WalletSetupService.hasWallet as jest.Mock).mockResolvedValue(true)
- ;(WorkletLifecycleService.ensureWorkletStarted as jest.Mock).mockResolvedValue(undefined)
+ ;(WorkletLifecycleService.ensureWorkletStarted as jest.Mock).mockReturnValue(undefined)
;(WalletSetupService.loadExistingWallet as jest.Mock).mockResolvedValue(credentials)
;(WorkletLifecycleService.initializeWDK as jest.Mock).mockResolvedValue(undefined)
- await WalletSwitchingService.switchToWallet(walletId, { autoStartWorklet: true })
+ await WalletSwitchingService.switchToWallet(walletId)
- expect(WorkletLifecycleService.ensureWorkletStarted).toHaveBeenCalledWith(undefined, {
- autoStart: true,
- })
+ expect(WorkletLifecycleService.ensureWorkletStarted).toHaveBeenCalled()
})
it('should handle errors during wallet switching', async () => {
@@ -208,7 +206,7 @@ describe('WalletSwitchingService', () => {
const error = new Error('Failed to load wallet')
mockWalletStore.getState.mockReturnValue({
- activeWalletId: null,
+ activeWalletId: null
})
;(WalletSetupService.hasWallet as jest.Mock).mockResolvedValue(true)
@@ -255,4 +253,3 @@ describe('WalletSwitchingService', () => {
})
})
})
-
diff --git a/src/__tests__/services/workletLifecycleService.test.ts b/src/__tests__/services/workletLifecycleService.test.ts
index 19aa500..fc492eb 100644
--- a/src/__tests__/services/workletLifecycleService.test.ts
+++ b/src/__tests__/services/workletLifecycleService.test.ts
@@ -1,47 +1,50 @@
/**
* Tests for WorkletLifecycleService
- *
+ *
* Tests worklet initialization with various network configurations
*/
+// Mock HRPC module
import { WorkletLifecycleService } from '../../services/workletLifecycleService'
import { getWorkletStore } from '../../store/workletStore'
-import type { NetworkConfigs } from '../../types'
+import type { WdkConfigs, BundleConfig } from '../../types'
+import HRPC from '@tetherto/pear-wrk-wdk/hrpc'
+
+jest.mock('@tetherto/pear-wrk-wdk/hrpc', () => {
+ return {
+ __esModule: true,
+ default: jest.fn()
+ }
+})
+
+// Cast HRPC to jest.Mock for usage in tests
+const MockHRPC = HRPC as unknown as jest.Mock
// Mock dependencies
const mockWorkletInstance = {
start: jest.fn(),
IPC: {
send: jest.fn(),
- on: jest.fn(),
- },
+ on: jest.fn()
+ }
}
jest.mock('react-native-bare-kit', () => ({
- Worklet: jest.fn().mockImplementation(() => mockWorkletInstance),
+ Worklet: jest.fn().mockImplementation(() => mockWorkletInstance)
}))
+// Shared mock workletStart function to track calls across all HRPC instances
+const mockWorkletStart = jest.fn(async () => await Promise.resolve({ status: 'success' }))
+
const mockHRPCInstance = {
- workletStart: jest.fn(() => Promise.resolve({ status: 'success' })),
- ipc: mockWorkletInstance.IPC,
+ workletStart: mockWorkletStart,
+ ipc: mockWorkletInstance.IPC
}
-// Mock @tetherto/pear-wrk-wdk with proper module structure
-// Note: We create the mock HRPC inside the factory to avoid hoisting issues
-jest.mock('@tetherto/pear-wrk-wdk', () => {
- const mockHRPC = jest.fn().mockImplementation(() => ({
- workletStart: jest.fn(() => Promise.resolve({ status: 'success' })),
- ipc: mockWorkletInstance.IPC,
- }))
- return {
- __esModule: true,
- default: {
- bundle: 'mock-bundle',
- },
- HRPC: mockHRPC,
- bundle: 'mock-bundle',
- }
-})
+// Mock bundleConfig that will be passed to startWorklet
+const mockBundleConfig: BundleConfig = {
+ bundle: 'mock-bundle'
+}
// Create a shared mock store that will be returned by getWorkletStore
let sharedMockStore: any
@@ -57,13 +60,13 @@ jest.mock('../../store/workletStore', () => ({
isLoading: false,
worklet: null,
hrpc: null,
- error: null,
+ error: null
})),
- setState: jest.fn(),
+ setState: jest.fn()
}
}
return sharedMockStore
- }),
+ })
}))
/**
@@ -73,98 +76,111 @@ jest.mock('../../store/workletStore', () => ({
* beyond the base NetworkConfig type but are valid in practice
*/
const defaultNetworkConfigs = {
- sepolia: {
- chainId: 11155111,
- blockchain: 'sepolia',
- provider: 'https://sepolia.gateway.tenderly.co',
- bundlerUrl: 'https://api.candide.dev/public/v3/sepolia',
- paymasterUrl: 'https://api.candide.dev/public/v3/sepolia',
- paymasterAddress: '0x8b1f6cb5d062aa2ce8d581942bbb960420d875ba',
- entryPointAddress: '0x0000000071727De22E5E9d8BAf0edAc6f37da032',
- safeModulesVersion: '0.3.0',
- paymasterToken: {
- address: '0xd077A400968890Eacc75cdc901F0356c943e4fDb',
+ networks: {
+ sepolia: {
+ blockchain: 'sepolia',
+ config: {
+ chainId: 11155111,
+ provider: 'https://sepolia.gateway.tenderly.co',
+ bundlerUrl: 'https://api.candide.dev/public/v3/sepolia',
+ paymasterUrl: 'https://api.candide.dev/public/v3/sepolia',
+ paymasterAddress: '0x8b1f6cb5d062aa2ce8d581942bbb960420d875ba',
+ entryPointAddress: '0x0000000071727De22E5E9d8BAf0edAc6f37da032',
+ safeModulesVersion: '0.3.0',
+ paymasterToken: {
+ address: '0xd077A400968890Eacc75cdc901F0356c943e4fDb'
+ },
+ transferMaxFee: 100000
+ }
},
- transferMaxFee: 100000,
- },
- ethereum: {
- chainId: 1,
- blockchain: 'ethereum',
- provider: 'https://wallet-ap7ha02ezs.rumble.com/eth',
- bundlerUrl: 'https://api.candide.dev/public/v3/ethereum',
- paymasterUrl: 'https://api.candide.dev/public/v3/ethereum',
- paymasterAddress: '0x8b1f6cb5d062aa2ce8d581942bbb960420d875ba',
- entryPointAddress: '0x0000000071727De22E5E9d8BAf0edAc6f37da032',
- safeModulesVersion: '0.3.0',
- paymasterToken: {
- address: '0xdAC17F958D2ee523a2206206994597C13D831ec7',
+ ethereum: {
+ blockchain: 'ethereum',
+ config: {
+ chainId: 1,
+ provider: 'https://wallet-ap7ha02ezs.rumble.com/eth',
+ bundlerUrl: 'https://api.candide.dev/public/v3/ethereum',
+ paymasterUrl: 'https://api.candide.dev/public/v3/ethereum',
+ paymasterAddress: '0x8b1f6cb5d062aa2ce8d581942bbb960420d875ba',
+ entryPointAddress: '0x0000000071727De22E5E9d8BAf0edAc6f37da032',
+ safeModulesVersion: '0.3.0',
+ paymasterToken: {
+ address: '0xdAC17F958D2ee523a2206206994597C13D831ec7'
+ },
+ transferMaxFee: 100000
+ }
},
- transferMaxFee: 100000,
- },
- polygon: {
- chainId: 137,
- blockchain: 'polygon',
- provider: 'https://wallet-ap7ha02ezs.rumble.com/pol',
- bundlerUrl: 'https://api.candide.dev/public/v3/polygon',
- paymasterUrl: 'https://api.candide.dev/public/v3/polygon',
- paymasterAddress: '0x8b1f6cb5d062aa2ce8d581942bbb960420d875ba',
- entryPointAddress: '0x0000000071727De22E5E9d8BAf0edAc6f37da032',
- safeModulesVersion: '0.3.0',
- paymasterToken: {
- address: '0xc2132D05D31c914a87C6611C10748AEb04B58e8F',
+ polygon: {
+ blockchain: 'polygon',
+ config: {
+ chainId: 137,
+ provider: 'https://wallet-ap7ha02ezs.rumble.com/pol',
+ bundlerUrl: 'https://api.candide.dev/public/v3/polygon',
+ paymasterUrl: 'https://api.candide.dev/public/v3/polygon',
+ paymasterAddress: '0x8b1f6cb5d062aa2ce8d581942bbb960420d875ba',
+ entryPointAddress: '0x0000000071727De22E5E9d8BAf0edAc6f37da032',
+ safeModulesVersion: '0.3.0',
+ paymasterToken: {
+ address: '0xc2132D05D31c914a87C6611C10748AEb04B58e8F'
+ },
+ transferMaxFee: 100000
+ }
},
- transferMaxFee: 100000,
- },
- arbitrum: {
- chainId: 42161,
- blockchain: 'arbitrum',
- provider: 'https://wallet-ap7ha02ezs.rumble.com/arb',
- bundlerUrl: 'https://public.pimlico.io/v2/42161/rpc',
- paymasterUrl: 'https://public.pimlico.io/v2/42161/rpc',
- paymasterAddress: '0x777777777777AeC03fd955926DbF81597e66834C',
- entryPointAddress: '0x0000000071727De22E5E9d8BAf0edAc6f37da032',
- safeModulesVersion: '0.3.0',
- paymasterToken: {
- address: '0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9',
+ arbitrum: {
+ blockchain: 'arbitrum',
+ config: {
+ chainId: 42161,
+ provider: 'https://wallet-ap7ha02ezs.rumble.com/arb',
+ bundlerUrl: 'https://public.pimlico.io/v2/42161/rpc',
+ paymasterUrl: 'https://public.pimlico.io/v2/42161/rpc',
+ paymasterAddress: '0x777777777777AeC03fd955926DbF81597e66834C',
+ entryPointAddress: '0x0000000071727De22E5E9d8BAf0edAc6f37da032',
+ safeModulesVersion: '0.3.0',
+ paymasterToken: {
+ address: '0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9'
+ },
+ transferMaxFee: 100000
+ }
},
- transferMaxFee: 100000,
- },
- plasma: {
- chainId: 9745,
- blockchain: 'plasma',
- provider: 'https://rpc.plasma.to',
- bundlerUrl: 'https://api.candide.dev/public/v3/9745',
- paymasterUrl: 'https://api.candide.dev/public/v3/9745',
- paymasterAddress: '0x8b1f6cb5d062aa2ce8d581942bbb960420d875ba',
- entryPointAddress: '0x0000000071727De22E5E9d8BAf0edAc6f37da032',
- safeModulesVersion: '0.3.0',
- paymasterToken: {
- address: '0xB8CE59FC3717ada4C02eaDF9682A9e934F625ebb',
+ plasma: {
+ blockchain: 'plasma',
+ config: {
+ chainId: 9745,
+ provider: 'https://rpc.plasma.to',
+ bundlerUrl: 'https://api.candide.dev/public/v3/9745',
+ paymasterUrl: 'https://api.candide.dev/public/v3/9745',
+ paymasterAddress: '0x8b1f6cb5d062aa2ce8d581942bbb960420d875ba',
+ entryPointAddress: '0x0000000071727De22E5E9d8BAf0edAc6f37da032',
+ safeModulesVersion: '0.3.0',
+ paymasterToken: {
+ address: '0xB8CE59FC3717ada4C02eaDF9682A9e934F625ebb'
+ },
+ transferMaxFee: 100000
+ }
},
- transferMaxFee: 100000,
- },
- spark: {
- chainId: 99999,
- blockchain: 'spark',
- network: 'MAINNET', // Spark network type (MAINNET, TESTNET)
- },
-} as NetworkConfigs
+ spark: {
+ blockchain: 'spark',
+ config: {
+ chainId: 99999,
+ network: 'MAINNET'
+ }
+ }
+ }
+} as WdkConfigs
describe('WorkletLifecycleService', () => {
let mockStore: ReturnType
beforeEach(() => {
jest.clearAllMocks()
-
+
// Reset mock implementations
mockWorkletInstance.start.mockClear()
- mockHRPCInstance.workletStart.mockResolvedValue({ status: 'success' })
-
- // Reset HRPC constructor mock
- const { HRPC } = require('@tetherto/pear-wrk-wdk')
- if (HRPC && typeof HRPC.mockImplementation === 'function') {
- HRPC.mockImplementation(() => mockHRPCInstance)
- }
+ mockWorkletStart.mockClear()
+ mockWorkletStart.mockResolvedValue({ status: 'success' })
+
+ // Reset MockHRPC constructor mock
+ MockHRPC.mockClear()
+ MockHRPC.mockImplementation(() => mockHRPCInstance)
// Setup mock store - get the shared instance
mockStore = getWorkletStore() as any
@@ -180,7 +196,7 @@ describe('WorkletLifecycleService', () => {
encryptionKey: null,
networkConfigs: null,
workletStartResult: null,
- wdkInitResult: null,
+ wdkInitResult: null
}
// Update the shared mock store
sharedMockStore.getState = jest.fn(() => defaultState)
@@ -189,27 +205,26 @@ describe('WorkletLifecycleService', () => {
describe('startWorklet', () => {
it('should start worklet with default network configuration', async () => {
- await WorkletLifecycleService.startWorklet(defaultNetworkConfigs)
+ await WorkletLifecycleService.startWorklet(defaultNetworkConfigs, mockBundleConfig)
// Verify worklet was created
const { Worklet } = require('react-native-bare-kit')
expect(Worklet).toHaveBeenCalled()
// Verify worklet.start was called with bundle
- expect(mockWorkletInstance.start).toHaveBeenCalledWith('/wdk-worklet.bundle', 'mock-bundle')
+ expect(mockWorkletInstance.start).toHaveBeenCalledWith('wdk-worklet.bundle', 'mock-bundle')
- // Verify HRPC was created
- const { HRPC } = require('@tetherto/pear-wrk-wdk')
- expect(HRPC).toHaveBeenCalledWith(mockWorkletInstance.IPC)
+ // Verify HRPC was created from bundleConfig
+ expect(MockHRPC).toHaveBeenCalledWith(mockWorkletInstance.IPC)
// Verify workletStart was called with serialized config
expect(mockHRPCInstance.workletStart).toHaveBeenCalledWith({
- config: JSON.stringify(defaultNetworkConfigs),
+ config: JSON.stringify(defaultNetworkConfigs)
})
// Verify store state was updated (check that setState was called at least once)
expect(mockStore.setState).toHaveBeenCalled()
-
+
// Verify the final state update contains the expected values
const setStateMock = mockStore.setState as jest.Mock
const finalStateCall = setStateMock.mock.calls[setStateMock.mock.calls.length - 1]
@@ -226,14 +241,14 @@ describe('WorkletLifecycleService', () => {
})
it('should serialize network configuration correctly', async () => {
- await WorkletLifecycleService.startWorklet(defaultNetworkConfigs)
+ await WorkletLifecycleService.startWorklet(defaultNetworkConfigs, mockBundleConfig)
// Verify the config was serialized to JSON
const calls = mockHRPCInstance.workletStart.mock.calls
expect(calls.length).toBeGreaterThan(0)
const workletStartCall = calls[0]
const configString = (workletStartCall as any)[0].config
- const parsedConfig = JSON.parse(configString)
+ const parsedConfig = JSON.parse(configString).networks
// Verify all networks are present
expect(parsedConfig).toHaveProperty('sepolia')
@@ -245,62 +260,69 @@ describe('WorkletLifecycleService', () => {
// Verify network properties
expect(parsedConfig.ethereum).toMatchObject({
- chainId: 1,
blockchain: 'ethereum',
- provider: 'https://wallet-ap7ha02ezs.rumble.com/eth',
+ config: {
+ chainId: 1,
+ provider: 'https://wallet-ap7ha02ezs.rumble.com/eth'
+ }
})
expect(parsedConfig.polygon).toMatchObject({
- chainId: 137,
blockchain: 'polygon',
- provider: 'https://wallet-ap7ha02ezs.rumble.com/pol',
+ config: {
+ chainId: 137,
+ provider: 'https://wallet-ap7ha02ezs.rumble.com/pol'
+ }
})
expect(parsedConfig.arbitrum).toMatchObject({
- chainId: 42161,
blockchain: 'arbitrum',
- provider: 'https://wallet-ap7ha02ezs.rumble.com/arb',
+ config: {
+ chainId: 42161,
+ provider: 'https://wallet-ap7ha02ezs.rumble.com/arb'
+ }
})
// Verify extended properties are preserved
- expect(parsedConfig.ethereum).toHaveProperty('safeModulesVersion', '0.3.0')
- expect(parsedConfig.ethereum).toHaveProperty('paymasterToken')
- expect(parsedConfig.ethereum.paymasterToken).toHaveProperty('address')
- expect(parsedConfig.spark).toHaveProperty('network', 'MAINNET')
+ expect(parsedConfig.ethereum.config).toHaveProperty('safeModulesVersion', '0.3.0')
+ expect(parsedConfig.ethereum.config).toHaveProperty('paymasterToken')
+ expect(parsedConfig.ethereum.config.paymasterToken).toHaveProperty('address')
+ expect(parsedConfig.spark.config).toHaveProperty('network', 'MAINNET')
})
it('should handle all network types in the configuration', async () => {
- await WorkletLifecycleService.startWorklet(defaultNetworkConfigs)
+ await WorkletLifecycleService.startWorklet(defaultNetworkConfigs, mockBundleConfig)
const calls = mockHRPCInstance.workletStart.mock.calls
expect(calls.length).toBeGreaterThan(0)
const workletStartCall = calls[0]
const configString = (workletStartCall as any)[0].config
- const parsedConfig = JSON.parse(configString)
+ const parsedConfig = JSON.parse(configString).networks
// Verify each network has required fields
const networks = ['sepolia', 'ethereum', 'polygon', 'arbitrum', 'plasma', 'spark']
-
+
for (const network of networks) {
expect(parsedConfig).toHaveProperty(network)
- expect(parsedConfig[network]).toHaveProperty('chainId')
+ expect(parsedConfig[network]).toHaveProperty('config')
+ expect(parsedConfig[network].config).toHaveProperty('chainId')
expect(parsedConfig[network]).toHaveProperty('blockchain')
- expect(typeof parsedConfig[network].chainId).toBe('number')
+ expect(typeof parsedConfig[network].config.chainId).toBe('number')
expect(typeof parsedConfig[network].blockchain).toBe('string')
}
})
it('should preserve optional fields in network configuration', async () => {
- await WorkletLifecycleService.startWorklet(defaultNetworkConfigs)
+ await WorkletLifecycleService.startWorklet(defaultNetworkConfigs, mockBundleConfig)
const calls = mockHRPCInstance.workletStart.mock.calls
expect(calls.length).toBeGreaterThan(0)
const workletStartCall = calls[0]
const configString = (workletStartCall as any)[0].config
- const parsedConfig = JSON.parse(configString)
+ const parsedConfig = JSON.parse(configString).networks
// Verify optional fields are preserved for networks that have them
- const ethereumConfig = parsedConfig.ethereum
+ const ethereumConfig = parsedConfig.ethereum.config
expect(ethereumConfig).toHaveProperty('bundlerUrl')
expect(ethereumConfig).toHaveProperty('paymasterUrl')
expect(ethereumConfig).toHaveProperty('paymasterAddress')
@@ -310,7 +332,7 @@ describe('WorkletLifecycleService', () => {
expect(ethereumConfig).toHaveProperty('paymasterToken')
// Verify spark has its network field
- expect(parsedConfig.spark).toHaveProperty('network', 'MAINNET')
+ expect(parsedConfig.spark.config).toHaveProperty('network', 'MAINNET')
})
it('should not start worklet if already started', async () => {
@@ -319,7 +341,7 @@ describe('WorkletLifecycleService', () => {
const { Worklet: WorkletConstructor } = require('react-native-bare-kit')
WorkletConstructor.mockClear()
;(mockStore.setState as jest.Mock).mockClear()
-
+
// Set up mock store to return "already started" state
const alreadyStartedState = {
isWorkletStarted: true,
@@ -333,11 +355,11 @@ describe('WorkletLifecycleService', () => {
encryptionKey: null,
networkConfigs: defaultNetworkConfigs,
workletStartResult: null,
- wdkInitResult: null,
+ wdkInitResult: null
}
;(mockStore as any).getState = jest.fn(() => alreadyStartedState)
- await WorkletLifecycleService.startWorklet(defaultNetworkConfigs)
+ await WorkletLifecycleService.startWorklet(defaultNetworkConfigs, mockBundleConfig)
// Should not call workletStart again (early return should happen)
expect(mockHRPCInstance.workletStart).not.toHaveBeenCalled()
@@ -353,7 +375,7 @@ describe('WorkletLifecycleService', () => {
const { Worklet: WorkletConstructor } = require('react-native-bare-kit')
WorkletConstructor.mockClear()
;(mockStore.setState as jest.Mock).mockClear()
-
+
// Set up mock store to return "already loading" state
const alreadyLoadingState = {
isWorkletStarted: false,
@@ -367,11 +389,11 @@ describe('WorkletLifecycleService', () => {
encryptionKey: null,
networkConfigs: null,
workletStartResult: null,
- wdkInitResult: null,
+ wdkInitResult: null
}
;(mockStore as any).getState = jest.fn(() => alreadyLoadingState)
- await WorkletLifecycleService.startWorklet(defaultNetworkConfigs)
+ await WorkletLifecycleService.startWorklet(defaultNetworkConfigs, mockBundleConfig)
// Should not call workletStart (early return should happen)
expect(mockHRPCInstance.workletStart).not.toHaveBeenCalled()
@@ -386,17 +408,17 @@ describe('WorkletLifecycleService', () => {
mockHRPCInstance.workletStart.mockRejectedValueOnce(new Error('Failed to start worklet'))
await expect(
- WorkletLifecycleService.startWorklet(defaultNetworkConfigs)
+ WorkletLifecycleService.startWorklet(defaultNetworkConfigs, mockBundleConfig)
).rejects.toThrow()
// Verify setState was called (at least for loading state and error state)
expect(mockStore.setState).toHaveBeenCalled()
-
+
// Verify error state was set in the last call
const setStateMock = mockStore.setState as jest.Mock
const allCalls = setStateMock.mock.calls
expect(allCalls.length).toBeGreaterThan(0)
-
+
// Check if any call sets error state
let errorStateFound = false
for (const call of allCalls) {
@@ -419,13 +441,13 @@ describe('WorkletLifecycleService', () => {
const existingWorklet = {
start: jest.fn(),
IPC: mockWorkletInstance.IPC,
- cleanup: jest.fn(),
+ cleanup: jest.fn()
} as any
-
+
const existingHRPC = {
- workletStart: jest.fn(() => Promise.resolve({ status: 'success' })),
+ workletStart: jest.fn(async () => await Promise.resolve({ status: 'success' })),
ipc: mockWorkletInstance.IPC,
- cleanup: jest.fn(),
+ cleanup: jest.fn()
} as any
;(mockStore as any).getState = jest.fn().mockReturnValue({
@@ -440,10 +462,10 @@ describe('WorkletLifecycleService', () => {
encryptionKey: null,
networkConfigs: null,
workletStartResult: null,
- wdkInitResult: null,
+ wdkInitResult: null
})
- await WorkletLifecycleService.startWorklet(defaultNetworkConfigs)
+ await WorkletLifecycleService.startWorklet(defaultNetworkConfigs, mockBundleConfig)
// Verify new worklet was created (old one should be cleaned up)
const { Worklet } = require('react-native-bare-kit')
@@ -451,14 +473,18 @@ describe('WorkletLifecycleService', () => {
})
it('should handle minimal network configuration', async () => {
- const minimalConfig: NetworkConfigs = {
- ethereum: {
- chainId: 1,
- blockchain: 'ethereum',
- },
+ const minimalConfig: WdkConfigs = {
+ networks: {
+ ethereum: {
+ blockchain: 'ethereum',
+ config: {
+ chainId: 1
+ }
+ }
+ }
}
- await WorkletLifecycleService.startWorklet(minimalConfig)
+ await WorkletLifecycleService.startWorklet(minimalConfig, mockBundleConfig)
expect(mockHRPCInstance.workletStart).toHaveBeenCalled()
const calls = mockHRPCInstance.workletStart.mock.calls
@@ -466,29 +492,35 @@ describe('WorkletLifecycleService', () => {
const workletStartCall = calls[0]
expect(workletStartCall).toBeDefined()
const configString = (workletStartCall as any)[0].config
- const parsedConfig = JSON.parse(configString)
+ const parsedConfig = JSON.parse(configString).networks
expect(parsedConfig.ethereum).toMatchObject({
- chainId: 1,
blockchain: 'ethereum',
+ config: {
+ chainId: 1
+ }
})
})
it('should handle network configuration with all optional fields', async () => {
- const fullConfig: NetworkConfigs = {
- testnet: {
- chainId: 12345,
- blockchain: 'testnet',
- provider: 'https://testnet.example.com',
- bundlerUrl: 'https://bundler.example.com',
- paymasterUrl: 'https://paymaster.example.com',
- paymasterAddress: '0x1234567890123456789012345678901234567890',
- entryPointAddress: '0x0987654321098765432109876543210987654321',
- transferMaxFee: 50000,
- },
+ const fullConfig: WdkConfigs = {
+ networks: {
+ testnet: {
+ blockchain: 'testnet',
+ config: {
+ chainId: 12345,
+ provider: 'https://testnet.example.com',
+ bundlerUrl: 'https://bundler.example.com',
+ paymasterUrl: 'https://paymaster.example.com',
+ paymasterAddress: '0x1234567890123456789012345678901234567890',
+ entryPointAddress: '0x0987654321098765432109876543210987654321',
+ transferMaxFee: 50000
+ }
+ }
+ }
}
- await WorkletLifecycleService.startWorklet(fullConfig)
+ await WorkletLifecycleService.startWorklet(fullConfig, mockBundleConfig)
expect(mockHRPCInstance.workletStart).toHaveBeenCalled()
const calls = mockHRPCInstance.workletStart.mock.calls
@@ -496,19 +528,20 @@ describe('WorkletLifecycleService', () => {
const workletStartCall = calls[0]
expect(workletStartCall).toBeDefined()
const configString = (workletStartCall as any)[0].config
- const parsedConfig = JSON.parse(configString)
+ const parsedConfig = JSON.parse(configString).networks
expect(parsedConfig.testnet).toMatchObject({
- chainId: 12345,
blockchain: 'testnet',
- provider: 'https://testnet.example.com',
- bundlerUrl: 'https://bundler.example.com',
- paymasterUrl: 'https://paymaster.example.com',
- paymasterAddress: '0x1234567890123456789012345678901234567890',
- entryPointAddress: '0x0987654321098765432109876543210987654321',
- transferMaxFee: 50000,
+ config: {
+ chainId: 12345,
+ provider: 'https://testnet.example.com',
+ bundlerUrl: 'https://bundler.example.com',
+ paymasterUrl: 'https://paymaster.example.com',
+ paymasterAddress: '0x1234567890123456789012345678901234567890',
+ entryPointAddress: '0x0987654321098765432109876543210987654321',
+ transferMaxFee: 50000
+ }
})
})
})
})
-
diff --git a/src/__tests__/setup.ts b/src/__tests__/setup.ts
index c9c7390..af0205e 100644
--- a/src/__tests__/setup.ts
+++ b/src/__tests__/setup.ts
@@ -12,25 +12,19 @@ jest.mock('react-native-mmkv', () => ({
delete: jest.fn(),
clearAll: jest.fn(),
getAllKeys: jest.fn(() => []),
- contains: jest.fn(),
- })),
+ contains: jest.fn()
+ }))
}))
// Mock expo-crypto
jest.mock('expo-crypto', () => ({
digestStringAsync: jest.fn(),
- getRandomBytesAsync: jest.fn(() => Promise.resolve(new Uint8Array(32))),
-}))
-
-// Mock @tetherto/pear-wrk-wdk
-jest.mock('@tetherto/pear-wrk-wdk', () => ({
- Worklet: jest.fn(),
- createWorklet: jest.fn(),
+ getRandomBytesAsync: jest.fn(async () => await Promise.resolve(new Uint8Array(32)))
}))
// Mock react-native-bare-kit
jest.mock('react-native-bare-kit', () => ({
- createBareKit: jest.fn(),
+ createBareKit: jest.fn()
}))
// Suppress console.error in tests (we test error cases, but don't need the noise)
diff --git a/src/__tests__/storage/mmkvStorage.test.ts b/src/__tests__/storage/mmkvStorage.test.ts
index 5426d23..09306a7 100644
--- a/src/__tests__/storage/mmkvStorage.test.ts
+++ b/src/__tests__/storage/mmkvStorage.test.ts
@@ -9,15 +9,15 @@ import { getMMKVKey } from '../../utils/mmkvKeyManager'
// Mock dependencies
jest.mock('react-native-mmkv', () => ({
- createMMKV: jest.fn(),
+ createMMKV: jest.fn()
}))
jest.mock('../../utils/mmkvKeyManager', () => ({
- getMMKVKey: jest.fn(),
+ getMMKVKey: jest.fn()
}))
jest.mock('../../utils/logger', () => ({
- logWarn: jest.fn(),
+ logWarn: jest.fn()
}))
describe('mmkvStorage', () => {
@@ -29,7 +29,7 @@ describe('mmkvStorage', () => {
mockMMKVInstance = {
set: jest.fn(),
getString: jest.fn(),
- delete: jest.fn(),
+ delete: jest.fn()
}
;(createMMKV as jest.Mock).mockReturnValue(mockMMKVInstance)
;(getMMKVKey as jest.Mock).mockResolvedValue('test-encryption-key')
@@ -44,7 +44,7 @@ describe('mmkvStorage', () => {
expect(getMMKVKey).toHaveBeenCalledWith('test-identifier')
expect(createMMKV).toHaveBeenCalledWith({
id: 'wallet-storage',
- encryptionKey: 'test-encryption-key',
+ encryptionKey: 'test-encryption-key'
})
expect(storage).toBe(mockMMKVInstance)
})
@@ -155,10 +155,10 @@ describe('mmkvStorage', () => {
// Delay key resolution to simulate async initialization
;(getMMKVKey as jest.Mock).mockImplementation(
- () =>
- new Promise((resolve) =>
- setTimeout(() => resolve('test-key'), 100),
- ),
+ async () =>
+ await new Promise((resolve) =>
+ setTimeout(() => resolve('test-key'), 100)
+ )
)
const adapter = createMMKVStorageAdapter('test-identifier')
@@ -208,7 +208,7 @@ describe('mmkvStorage', () => {
// setItem should eventually be called (either immediately if ready, or after queued)
expect(mockMMKVInstance.set).toHaveBeenCalledWith(
'test-key',
- 'test-value',
+ 'test-value'
)
})
@@ -241,7 +241,7 @@ describe('mmkvStorage', () => {
// The operation should have been queued and then processed
expect(mockMMKVInstance.set).toHaveBeenCalledWith(
'test-key',
- 'test-value',
+ 'test-value'
)
})
})
diff --git a/src/__tests__/store/walletStore.test.ts b/src/__tests__/store/walletStore.test.ts
index 2dbfc2e..ff072d9 100644
--- a/src/__tests__/store/walletStore.test.ts
+++ b/src/__tests__/store/walletStore.test.ts
@@ -26,7 +26,7 @@ describe('walletStore', () => {
it('should initialize with default state', () => {
const store = createWalletStore()
const state = store.getState()
-
+
expect(state.addresses).toEqual({})
expect(state.walletLoading).toEqual({})
expect(state.balances).toEqual({})
@@ -52,15 +52,15 @@ describe('walletStore', () => {
describe('store state management', () => {
it('should allow state updates', () => {
const store = createWalletStore()
-
+
store.setState({
addresses: {
'wallet-1': {
ethereum: {
- 0: '0x1234567890123456789012345678901234567890',
- },
- },
- },
+ 0: '0x1234567890123456789012345678901234567890'
+ }
+ }
+ }
})
const state = store.getState()
@@ -69,15 +69,15 @@ describe('walletStore', () => {
it('should allow partial state updates', () => {
const store = createWalletStore()
-
+
store.setState({
addresses: {
'wallet-1': {
ethereum: {
- 0: '0x1234567890123456789012345678901234567890',
- },
- },
- },
+ 0: '0x1234567890123456789012345678901234567890'
+ }
+ }
+ }
})
store.setState({
@@ -85,11 +85,11 @@ describe('walletStore', () => {
'wallet-1': {
ethereum: {
0: {
- '0x0000000000000000000000000000000000000000': '1000000000000000000',
- },
- },
- },
- },
+ '0x0000000000000000000000000000000000000000': '1000000000000000000'
+ }
+ }
+ }
+ }
})
const state = store.getState()
@@ -98,4 +98,3 @@ describe('walletStore', () => {
})
})
})
-
diff --git a/src/__tests__/store/workletStore.test.ts b/src/__tests__/store/workletStore.test.ts
index 1434650..42f81dd 100644
--- a/src/__tests__/store/workletStore.test.ts
+++ b/src/__tests__/store/workletStore.test.ts
@@ -2,10 +2,10 @@
* Tests for workletStore
*/
-import {
- createWorkletStore,
- getWorkletStore,
- resetWorkletStore,
+import {
+ createWorkletStore,
+ getWorkletStore,
+ resetWorkletStore,
getCachedCredentials,
setCachedCredentials,
clearCredentialsCache,
@@ -40,7 +40,7 @@ describe('workletStore', () => {
it('should initialize with default state', () => {
const store = createWorkletStore()
const state = store.getState()
-
+
expect(state.worklet).toBe(null)
expect(state.hrpc).toBe(null)
expect(state.ipc).toBe(null)
@@ -50,7 +50,7 @@ describe('workletStore', () => {
expect(state.error).toBe(null)
expect(state.encryptedSeed).toBe(null)
expect(state.encryptionKey).toBe(null)
- expect(state.networkConfigs).toBe(null)
+ expect(state.wdkConfigs).toBe(null)
expect(state.workletStartResult).toBe(null)
expect(state.wdkInitResult).toBe(null)
expect(state.credentialsCache).toEqual({})
@@ -77,7 +77,7 @@ describe('workletStore', () => {
const store1 = createWorkletStore()
resetWorkletStore()
const store2 = createWorkletStore()
-
+
// After reset, a new instance should be created
expect(store1).not.toBe(store2)
})
@@ -86,10 +86,10 @@ describe('workletStore', () => {
describe('clearSensitiveData', () => {
it('should clear encrypted seed and encryption key', () => {
const store = createWorkletStore()
-
+
store.setState({
encryptedSeed: 'encrypted-seed',
- encryptionKey: 'encryption-key',
+ encryptionKey: 'encryption-key'
})
clearAllSensitiveData()
@@ -101,11 +101,11 @@ describe('workletStore', () => {
it('should not affect other state', () => {
const store = createWorkletStore()
-
+
store.setState({
isWorkletStarted: true,
encryptedSeed: 'encrypted-seed',
- encryptionKey: 'encryption-key',
+ encryptionKey: 'encryption-key'
})
clearAllSensitiveData()
@@ -120,10 +120,10 @@ describe('workletStore', () => {
describe('store state management', () => {
it('should allow state updates', () => {
const store = createWorkletStore()
-
+
store.setState({
isWorkletStarted: true,
- isLoading: true,
+ isLoading: true
})
const state = store.getState()
@@ -145,10 +145,10 @@ describe('workletStore', () => {
encryptedSeed: 'seed-123',
expiresAt: Date.now() + 10000
}
-
+
setCachedCredentials(identifier, credentials)
const result = getCachedCredentials(identifier)
-
+
expect(result).not.toBe(null)
expect(result?.encryptionKey).toBe('key-123')
expect(result?.encryptedSeed).toBe('seed-123')
@@ -159,25 +159,25 @@ describe('workletStore', () => {
const store = getWorkletStore()
const currentTime = 1000000
jest.setSystemTime(currentTime)
-
+
// Set credentials first
setCachedCredentials(identifier, {
- encryptionKey: 'key-123',
+ encryptionKey: 'key-123'
})
-
+
// Manually set expired time in the store (bypassing setCachedCredentials which always sets future time)
store.setState({
credentialsCache: {
...store.getState().credentialsCache,
[identifier]: {
encryptionKey: 'key-123',
- expiresAt: currentTime - 1000, // Expired (1 second in the past)
- },
- },
+ expiresAt: currentTime - 1000 // Expired (1 second in the past)
+ }
+ }
})
-
+
const result = getCachedCredentials(identifier)
-
+
expect(result).toBe(null)
})
@@ -186,25 +186,25 @@ describe('workletStore', () => {
const store = getWorkletStore()
const currentTime = 1000000
jest.setSystemTime(currentTime)
-
+
// Set credentials first
setCachedCredentials(identifier, {
- encryptionKey: 'key-123',
+ encryptionKey: 'key-123'
})
-
+
// Manually set expired time in the store (bypassing setCachedCredentials which always sets future time)
store.setState({
credentialsCache: {
...store.getState().credentialsCache,
[identifier]: {
encryptionKey: 'key-123',
- expiresAt: currentTime - 1000, // Expired (1 second in the past)
- },
- },
+ expiresAt: currentTime - 1000 // Expired (1 second in the past)
+ }
+ }
})
-
+
getCachedCredentials(identifier)
-
+
const state = store.getState()
expect(state.credentialsCache[identifier]).toBeUndefined()
})
@@ -217,10 +217,10 @@ describe('workletStore', () => {
encryptionKey: 'key-123',
encryptedSeed: 'seed-123'
}
-
+
setCachedCredentials(identifier, credentials)
const result = getCachedCredentials(identifier)
-
+
expect(result).not.toBe(null)
expect(result?.encryptionKey).toBe('key-123')
expect(result?.encryptedSeed).toBe('seed-123')
@@ -229,10 +229,10 @@ describe('workletStore', () => {
it('should merge with existing credentials', () => {
const identifier = 'test-wallet'
-
+
setCachedCredentials(identifier, { encryptionKey: 'key-123' })
setCachedCredentials(identifier, { encryptedSeed: 'seed-123' })
-
+
const result = getCachedCredentials(identifier)
expect(result?.encryptionKey).toBe('key-123')
expect(result?.encryptedSeed).toBe('seed-123')
@@ -240,16 +240,16 @@ describe('workletStore', () => {
it('should update expiration on each set', () => {
const identifier = 'test-wallet'
-
+
setCachedCredentials(identifier, { encryptionKey: 'key-123' })
const firstExpiry = getCachedCredentials(identifier)?.expiresAt
-
+
// Advance time
jest.advanceTimersByTime(100)
-
+
setCachedCredentials(identifier, { encryptedSeed: 'seed-123' })
const secondExpiry = getCachedCredentials(identifier)?.expiresAt
-
+
expect(secondExpiry).toBeGreaterThan(firstExpiry!)
})
})
@@ -258,12 +258,12 @@ describe('workletStore', () => {
it('should clear specific wallet credentials', () => {
const identifier1 = 'wallet-1'
const identifier2 = 'wallet-2'
-
+
setCachedCredentials(identifier1, { encryptionKey: 'key-1' })
setCachedCredentials(identifier2, { encryptionKey: 'key-2' })
-
+
clearCredentialsCache(identifier1)
-
+
expect(getCachedCredentials(identifier1)).toBe(null)
expect(getCachedCredentials(identifier2)).not.toBe(null)
})
@@ -271,12 +271,12 @@ describe('workletStore', () => {
it('should clear all credentials when no identifier provided', () => {
const identifier1 = 'wallet-1'
const identifier2 = 'wallet-2'
-
+
setCachedCredentials(identifier1, { encryptionKey: 'key-1' })
setCachedCredentials(identifier2, { encryptionKey: 'key-2' })
-
+
clearCredentialsCache()
-
+
expect(getCachedCredentials(identifier1)).toBe(null)
expect(getCachedCredentials(identifier2)).toBe(null)
})
@@ -285,10 +285,10 @@ describe('workletStore', () => {
describe('clearAllSensitiveData', () => {
it('should clear encrypted seed and encryption key', () => {
const store = createWorkletStore()
-
+
store.setState({
encryptedSeed: 'encrypted-seed',
- encryptionKey: 'encryption-key',
+ encryptionKey: 'encryption-key'
})
clearAllSensitiveData()
@@ -300,25 +300,25 @@ describe('workletStore', () => {
it('should clear credentials cache', () => {
const identifier = 'test-wallet'
-
+
setCachedCredentials(identifier, { encryptionKey: 'key-123' })
clearAllSensitiveData()
-
+
expect(getCachedCredentials(identifier)).toBe(null)
})
it('should clear both active credentials and cache', () => {
const store = createWorkletStore()
const identifier = 'test-wallet'
-
+
store.setState({
encryptedSeed: 'encrypted-seed',
- encryptionKey: 'encryption-key',
+ encryptionKey: 'encryption-key'
})
setCachedCredentials(identifier, { encryptionKey: 'key-123' })
-
+
clearAllSensitiveData()
-
+
const state = store.getState()
expect(state.encryptedSeed).toBe(null)
expect(state.encryptionKey).toBe(null)
@@ -326,4 +326,3 @@ describe('workletStore', () => {
})
})
})
-
diff --git a/src/__tests__/types/hrpc.test.ts b/src/__tests__/types/hrpc.test.ts
deleted file mode 100644
index 4aa1e2d..0000000
--- a/src/__tests__/types/hrpc.test.ts
+++ /dev/null
@@ -1,125 +0,0 @@
-/**
- * Tests for HRPC type guards
- */
-
-import { isExtendedHRPC, asExtendedHRPC } from '../../types/hrpc'
-import type { HRPC } from '@tetherto/pear-wrk-wdk'
-
-describe('hrpc', () => {
- describe('isExtendedHRPC', () => {
- it('should return true for HRPC with all extended methods', () => {
- const hrpc = {
- callMethod: jest.fn(),
- initializeWDK: jest.fn(),
- generateEntropyAndEncrypt: jest.fn(),
- getMnemonicFromEntropy: jest.fn(),
- getSeedAndEntropyFromMnemonic: jest.fn(),
- } as unknown as HRPC
-
- expect(isExtendedHRPC(hrpc)).toBe(true)
- })
-
- it('should return false for HRPC without initializeWDK', () => {
- const hrpc = {
- callMethod: jest.fn(),
- generateEntropyAndEncrypt: jest.fn(),
- getMnemonicFromEntropy: jest.fn(),
- getSeedAndEntropyFromMnemonic: jest.fn(),
- } as unknown as HRPC
-
- expect(isExtendedHRPC(hrpc)).toBe(false)
- })
-
- it('should return false for HRPC without generateEntropyAndEncrypt', () => {
- const hrpc = {
- callMethod: jest.fn(),
- initializeWDK: jest.fn(),
- getMnemonicFromEntropy: jest.fn(),
- getSeedAndEntropyFromMnemonic: jest.fn(),
- } as unknown as HRPC
-
- expect(isExtendedHRPC(hrpc)).toBe(false)
- })
-
- it('should return false for HRPC without getMnemonicFromEntropy', () => {
- const hrpc = {
- callMethod: jest.fn(),
- initializeWDK: jest.fn(),
- generateEntropyAndEncrypt: jest.fn(),
- getSeedAndEntropyFromMnemonic: jest.fn(),
- } as unknown as HRPC
-
- expect(isExtendedHRPC(hrpc)).toBe(false)
- })
-
- it('should return false for HRPC without getSeedAndEntropyFromMnemonic', () => {
- const hrpc = {
- callMethod: jest.fn(),
- initializeWDK: jest.fn(),
- generateEntropyAndEncrypt: jest.fn(),
- getMnemonicFromEntropy: jest.fn(),
- } as unknown as HRPC
-
- expect(isExtendedHRPC(hrpc)).toBe(false)
- })
-
- it('should return false for HRPC with non-function methods', () => {
- const hrpc = {
- callMethod: jest.fn(),
- initializeWDK: 'not a function',
- generateEntropyAndEncrypt: jest.fn(),
- getMnemonicFromEntropy: jest.fn(),
- getSeedAndEntropyFromMnemonic: jest.fn(),
- } as unknown as HRPC
-
- expect(isExtendedHRPC(hrpc)).toBe(false)
- })
-
- it('should return false for basic HRPC', () => {
- const hrpc = {
- callMethod: jest.fn(),
- } as unknown as HRPC
-
- expect(isExtendedHRPC(hrpc)).toBe(false)
- })
- })
-
- describe('asExtendedHRPC', () => {
- it('should return HRPC when it has all extended methods', () => {
- const hrpc = {
- callMethod: jest.fn(),
- initializeWDK: jest.fn(),
- generateEntropyAndEncrypt: jest.fn(),
- getMnemonicFromEntropy: jest.fn(),
- getSeedAndEntropyFromMnemonic: jest.fn(),
- } as unknown as HRPC
-
- const result = asExtendedHRPC(hrpc)
- expect(result).toBe(hrpc)
- })
-
- it('should throw error when HRPC does not have required methods', () => {
- const hrpc = {
- callMethod: jest.fn(),
- } as unknown as HRPC
-
- expect(() => asExtendedHRPC(hrpc)).toThrow(
- 'HRPC instance does not have required extended methods'
- )
- })
-
- it('should throw error when HRPC is missing initializeWDK', () => {
- const hrpc = {
- callMethod: jest.fn(),
- generateEntropyAndEncrypt: jest.fn(),
- getMnemonicFromEntropy: jest.fn(),
- getSeedAndEntropyFromMnemonic: jest.fn(),
- } as unknown as HRPC
-
- expect(() => asExtendedHRPC(hrpc)).toThrow(
- 'HRPC instance does not have required extended methods'
- )
- })
- })
-})
-
diff --git a/src/__tests__/utils/balanceUtils.test.ts b/src/__tests__/utils/balanceUtils.test.ts
index 2258952..ca71e0d 100644
--- a/src/__tests__/utils/balanceUtils.test.ts
+++ b/src/__tests__/utils/balanceUtils.test.ts
@@ -87,14 +87,14 @@ describe('balanceUtils', () => {
balance: BigInt(100),
amount: BigInt(200),
name: 'test',
- count: 42,
+ count: 42
}
const result = convertBigIntToString(input)
expect(result).toEqual({
balance: '100',
amount: '200',
name: 'test',
- count: 42,
+ count: 42
})
})
@@ -103,18 +103,18 @@ describe('balanceUtils', () => {
data: {
balance: BigInt(100),
nested: {
- amount: BigInt(200),
- },
- },
+ amount: BigInt(200)
+ }
+ }
}
const result = convertBigIntToString(input)
expect(result).toEqual({
data: {
balance: '100',
nested: {
- amount: '200',
- },
- },
+ amount: '200'
+ }
+ }
})
})
@@ -122,15 +122,15 @@ describe('balanceUtils', () => {
const input = {
balances: [BigInt(100), BigInt(200)],
data: {
- amounts: [BigInt(300), BigInt(400)],
- },
+ amounts: [BigInt(300), BigInt(400)]
+ }
}
const result = convertBigIntToString(input)
expect(result).toEqual({
balances: ['100', '200'],
data: {
- amounts: ['300', '400'],
- },
+ amounts: ['300', '400']
+ }
})
})
diff --git a/src/__tests__/utils/errorHandling.test.ts b/src/__tests__/utils/errorHandling.test.ts
index 70fddb6..8b03eed 100644
--- a/src/__tests__/utils/errorHandling.test.ts
+++ b/src/__tests__/utils/errorHandling.test.ts
@@ -1,6 +1,6 @@
/**
* Tests for errorHandling utilities
- *
+ *
* Tests service error handling patterns
*/
@@ -10,11 +10,11 @@ import { logError } from '../../utils/logger'
// Mock dependencies
jest.mock('../../utils/errorUtils', () => ({
- normalizeError: jest.fn(),
+ normalizeError: jest.fn()
}))
jest.mock('../../utils/logger', () => ({
- logError: jest.fn(),
+ logError: jest.fn()
}))
describe('errorHandling', () => {
@@ -34,7 +34,7 @@ describe('errorHandling', () => {
expect(normalizeError).toHaveBeenCalledWith(error, false, {
component: 'TestService',
- operation: 'testOperation',
+ operation: 'testOperation'
})
expect(logError).toHaveBeenCalledWith('[TestService] testOperation failed:', normalizedError)
})
@@ -53,7 +53,7 @@ describe('errorHandling', () => {
expect(normalizeError).toHaveBeenCalledWith(error, false, {
component: 'TestService',
operation: 'testOperation',
- ...context,
+ ...context
})
})
@@ -80,7 +80,7 @@ describe('errorHandling', () => {
expect(normalizeError).toHaveBeenCalledWith(error, false, {
component: 'TestService',
- operation: 'testOperation',
+ operation: 'testOperation'
})
})
@@ -94,7 +94,7 @@ describe('errorHandling', () => {
expect(normalizeError).toHaveBeenCalledWith(null, false, {
component: 'TestService',
- operation: 'testOperation',
+ operation: 'testOperation'
})
})
@@ -139,9 +139,8 @@ describe('errorHandling', () => {
expect(normalizeError).toHaveBeenCalledWith(error, false, {
component: 'TestService',
- operation: 'testOperation',
+ operation: 'testOperation'
})
})
})
})
-
diff --git a/src/__tests__/utils/errorUtils.test.ts b/src/__tests__/utils/errorUtils.test.ts
index 4919233..6ed799d 100644
--- a/src/__tests__/utils/errorUtils.test.ts
+++ b/src/__tests__/utils/errorUtils.test.ts
@@ -8,7 +8,7 @@ import {
isErrorType,
createContextualError,
sanitizeErrorMessage,
- SanitizationLevel,
+ SanitizationLevel
} from '../../utils/errorUtils'
describe('errorUtils', () => {
@@ -50,33 +50,33 @@ describe('errorUtils', () => {
it('should sanitize error messages in production', () => {
const originalEnv = process.env.NODE_ENV
process.env.NODE_ENV = 'production'
-
+
const error = new Error('Error with 0x1234567890123456789012345678901234567890')
const normalized = normalizeError(error, true)
expect(normalized.message).not.toContain('0x1234567890123456789012345678901234567890')
-
+
process.env.NODE_ENV = originalEnv
})
it('should use SanitizationLevel enum', () => {
const error = new Error('Error with 0x1234567890123456789012345678901234567890')
-
+
const none = normalizeError(error, SanitizationLevel.NONE)
expect(none.message).toContain('0x1234567890123456789012345678901234567890')
-
+
const dev = normalizeError(error, SanitizationLevel.DEVELOPMENT)
expect(dev.message).toContain('0x1234')
-
+
const prod = normalizeError(error, SanitizationLevel.PRODUCTION)
expect(prod.message).not.toContain('0x1234567890123456789012345678901234567890')
})
it('should handle boolean sanitize parameter for backward compatibility', () => {
const error = new Error('Error with 0x1234567890123456789012345678901234567890')
-
+
const sanitized = normalizeError(error, true)
expect(sanitized.message).not.toContain('0x1234567890123456789012345678901234567890')
-
+
const notSanitized = normalizeError(error, false)
expect(notSanitized.message).toContain('0x1234567890123456789012345678901234567890')
})
@@ -84,10 +84,10 @@ describe('errorUtils', () => {
it('should sanitize stack traces based on level', () => {
const error = new Error('Test error')
error.stack = 'Error: Test error\n at file:///path/to/sensitive/key.js:1:1'
-
+
const prod = normalizeError(error, SanitizationLevel.PRODUCTION)
expect(prod.stack).not.toContain('/path/to/sensitive/key.js')
-
+
const none = normalizeError(error, SanitizationLevel.NONE)
expect(none.stack).toContain('/path/to/sensitive/key.js')
})
diff --git a/src/__tests__/utils/initializationState.test.ts b/src/__tests__/utils/initializationState.test.ts
index ac3b577..6f9a099 100644
--- a/src/__tests__/utils/initializationState.test.ts
+++ b/src/__tests__/utils/initializationState.test.ts
@@ -1,6 +1,6 @@
/**
* Tests for initializationState utilities
- *
+ *
* Tests worklet initialization state machine helpers
*/
@@ -19,7 +19,7 @@ import {
getStatusMessage,
getAppStatusMessage,
getWorkletStatus,
- getCombinedStatus,
+ getCombinedStatus
} from '../../utils/initializationState'
describe('initializationState', () => {
@@ -191,7 +191,7 @@ describe('initializationState', () => {
const status = getWorkletStatus({
isWorkletStarted: false,
isLoading: false,
- error: 'Test error',
+ error: 'Test error'
})
expect(status).toBe(InitializationStatus.ERROR)
@@ -201,7 +201,7 @@ describe('initializationState', () => {
const status = getWorkletStatus({
isWorkletStarted: false,
isLoading: true,
- error: null,
+ error: null
})
expect(status).toBe(InitializationStatus.STARTING_WORKLET)
@@ -211,7 +211,7 @@ describe('initializationState', () => {
const status = getWorkletStatus({
isWorkletStarted: false,
isLoading: false,
- error: null,
+ error: null
})
expect(status).toBe(InitializationStatus.IDLE)
@@ -221,7 +221,7 @@ describe('initializationState', () => {
const status = getWorkletStatus({
isWorkletStarted: true,
isLoading: false,
- error: null,
+ error: null
})
expect(status).toBe(InitializationStatus.WORKLET_READY)
@@ -234,7 +234,7 @@ describe('initializationState', () => {
{
isWorkletStarted: false,
isLoading: false,
- error: 'Worklet error',
+ error: 'Worklet error'
},
{ type: 'not_loaded' }
)
@@ -247,7 +247,7 @@ describe('initializationState', () => {
{
isWorkletStarted: false,
isLoading: true,
- error: null,
+ error: null
},
{ type: 'not_loaded' }
)
@@ -260,7 +260,7 @@ describe('initializationState', () => {
{
isWorkletStarted: false,
isLoading: false,
- error: null,
+ error: null
},
{ type: 'not_loaded' }
)
@@ -273,7 +273,7 @@ describe('initializationState', () => {
{
isWorkletStarted: true,
isLoading: false,
- error: null,
+ error: null
},
{ type: 'not_loaded' }
)
@@ -286,7 +286,7 @@ describe('initializationState', () => {
{
isWorkletStarted: true,
isLoading: false,
- error: null,
+ error: null
},
{ type: 'checking' as const }
)
@@ -299,7 +299,7 @@ describe('initializationState', () => {
{
isWorkletStarted: true,
isLoading: false,
- error: null,
+ error: null
},
{ type: 'loading' as const }
)
@@ -312,7 +312,7 @@ describe('initializationState', () => {
{
isWorkletStarted: true,
isLoading: false,
- error: null,
+ error: null
},
{ type: 'ready' as const }
)
@@ -325,7 +325,7 @@ describe('initializationState', () => {
{
isWorkletStarted: true,
isLoading: false,
- error: null,
+ error: null
},
{ type: 'error' as const }
)
@@ -334,4 +334,3 @@ describe('initializationState', () => {
})
})
})
-
diff --git a/src/__tests__/utils/jsonUtils.test.ts b/src/__tests__/utils/jsonUtils.test.ts
index aba2dac..be7042b 100644
--- a/src/__tests__/utils/jsonUtils.test.ts
+++ b/src/__tests__/utils/jsonUtils.test.ts
@@ -113,7 +113,7 @@ describe('jsonUtils', () => {
it('should handle special JSON values', () => {
const obj = {
null: null,
- undefined: undefined,
+ undefined,
number: 42,
string: 'test',
boolean: true,
@@ -128,4 +128,3 @@ describe('jsonUtils', () => {
})
})
})
-
diff --git a/src/__tests__/utils/mmkvKeyManager.test.ts b/src/__tests__/utils/mmkvKeyManager.test.ts
index 30c15a2..b35e6eb 100644
--- a/src/__tests__/utils/mmkvKeyManager.test.ts
+++ b/src/__tests__/utils/mmkvKeyManager.test.ts
@@ -1,6 +1,6 @@
/**
* Tests for mmkvKeyManager
- *
+ *
* Tests MMKV encryption key derivation and caching
*/
@@ -11,8 +11,8 @@ import { getMMKVKey, clearKeyCache } from '../../utils/mmkvKeyManager'
jest.mock('expo-crypto', () => ({
digestStringAsync: jest.fn(),
CryptoDigestAlgorithm: {
- SHA256: 'SHA256',
- },
+ SHA256: 'SHA256'
+ }
}))
describe('mmkvKeyManager', () => {
@@ -183,8 +183,8 @@ describe('mmkvKeyManager', () => {
if (typeof Buffer === 'undefined') {
;(global as any).Buffer = {
from: jest.fn((bytes: Uint8Array) => ({
- toString: jest.fn(() => 'base64string'),
- })),
+ toString: jest.fn(() => 'base64string')
+ }))
}
}
@@ -202,4 +202,3 @@ describe('mmkvKeyManager', () => {
})
})
})
-
diff --git a/src/__tests__/utils/mnemonicUtils.test.ts b/src/__tests__/utils/mnemonicUtils.test.ts
index 976052c..1b4ef17 100644
--- a/src/__tests__/utils/mnemonicUtils.test.ts
+++ b/src/__tests__/utils/mnemonicUtils.test.ts
@@ -45,4 +45,3 @@ describe('mnemonicUtils', () => {
})
})
})
-
diff --git a/src/__tests__/utils/raceConditions.test.ts b/src/__tests__/utils/raceConditions.test.ts
index 4de855f..44462af 100644
--- a/src/__tests__/utils/raceConditions.test.ts
+++ b/src/__tests__/utils/raceConditions.test.ts
@@ -1,6 +1,6 @@
/**
* Tests for race conditions in wallet operations
- *
+ *
* Tests concurrent operations, state synchronization, and mutex behavior
*/
@@ -13,29 +13,29 @@ jest.mock('../../services/walletSetupService', () => ({
WalletSetupService: {
hasWallet: jest.fn(),
loadExistingWallet: jest.fn(),
- clearCredentialsCache: jest.fn(),
- },
+ clearCredentialsCache: jest.fn()
+ }
}))
jest.mock('../../services/workletLifecycleService', () => ({
WorkletLifecycleService: {
ensureWorkletStarted: jest.fn(),
- initializeWDK: jest.fn(),
- },
+ initializeWDK: jest.fn()
+ }
}))
jest.mock('../../store/walletStore', () => {
const actual = jest.requireActual('../../store/walletStore')
return {
...actual,
- getWalletStore: jest.fn(),
+ getWalletStore: jest.fn()
}
})
jest.mock('../../utils/logger', () => ({
log: jest.fn(),
logError: jest.fn(),
- logWarn: jest.fn(),
+ logWarn: jest.fn()
}))
describe('Race Conditions', () => {
@@ -49,14 +49,14 @@ describe('Race Conditions', () => {
activeWalletId: null,
walletLoadingState: { type: 'not_loaded' },
isOperationInProgress: false,
- currentOperation: null,
+ currentOperation: null
})),
setState: jest.fn((updater) => {
const currentState = mockWalletStore.getState()
const newState = typeof updater === 'function' ? updater(currentState) : updater
const updatedState = { ...currentState, ...newState }
mockWalletStore.getState.mockReturnValue(updatedState)
- }),
+ })
}
;(getWalletStore as jest.Mock).mockReturnValue(mockWalletStore)
@@ -157,14 +157,14 @@ describe('Race Conditions', () => {
const walletId2 = 'wallet-2'
const credentials = {
encryptionKey: 'test-key',
- encryptedSeed: 'test-seed',
+ encryptedSeed: 'test-seed'
}
mockWalletStore.getState.mockReturnValue({
activeWalletId: null,
walletLoadingState: { type: 'not_loaded' },
isOperationInProgress: false,
- currentOperation: null,
+ currentOperation: null
})
;(WalletSetupService.hasWallet as jest.Mock).mockResolvedValue(true)
@@ -198,7 +198,7 @@ describe('Race Conditions', () => {
const walletId2 = 'wallet-2'
const credentials = {
encryptionKey: 'test-key',
- encryptedSeed: 'test-seed',
+ encryptedSeed: 'test-seed'
}
;(WalletSetupService.hasWallet as jest.Mock).mockResolvedValue(true)
@@ -211,7 +211,7 @@ describe('Race Conditions', () => {
activeWalletId: null,
walletLoadingState: { type: 'not_loaded' },
isOperationInProgress: false,
- currentOperation: null,
+ currentOperation: null
})
await WalletSwitchingService.switchToWallet(walletId1)
@@ -220,7 +220,7 @@ describe('Race Conditions', () => {
activeWalletId: walletId1,
walletLoadingState: { type: 'ready', identifier: walletId1 },
isOperationInProgress: false,
- currentOperation: null,
+ currentOperation: null
})
await WalletSwitchingService.switchToWallet(walletId2)
@@ -289,4 +289,3 @@ describe('Race Conditions', () => {
})
})
})
-
diff --git a/src/__tests__/utils/result.test.ts b/src/__tests__/utils/result.test.ts
index 48e470b..f132644 100644
--- a/src/__tests__/utils/result.test.ts
+++ b/src/__tests__/utils/result.test.ts
@@ -42,7 +42,7 @@ describe('result', () => {
expect(result.success).toBe(false)
if (!result.success) {
expect(result.error).toBeInstanceOf(Error)
- expect((result.error as Error).message).toBe('async error')
+ expect((result.error).message).toBe('async error')
}
})
})
@@ -65,9 +65,8 @@ describe('result', () => {
expect(result.success).toBe(false)
if (!result.success) {
expect(result.error).toBeInstanceOf(Error)
- expect((result.error as Error).message).toBe('sync error')
+ expect((result.error).message).toBe('sync error')
}
})
})
})
-
diff --git a/src/__tests__/utils/schemas.test.ts b/src/__tests__/utils/schemas.test.ts
index 656de70..b28a99f 100644
--- a/src/__tests__/utils/schemas.test.ts
+++ b/src/__tests__/utils/schemas.test.ts
@@ -5,14 +5,14 @@
import {
workletResponseSchema,
balanceResponseSchema,
- accountMethodResponseSchema,
+ accountMethodResponseSchema
} from '../../utils/schemas'
describe('schemas', () => {
describe('workletResponseSchema', () => {
it('should validate valid worklet response', () => {
const valid = {
- result: '{"data": "test"}',
+ result: '{"data": "test"}'
}
expect(() => workletResponseSchema.parse(valid)).not.toThrow()
})
@@ -20,14 +20,14 @@ describe('schemas', () => {
it('should validate worklet response with error', () => {
const valid = {
result: '{"data": "test"}',
- error: 'Some error',
+ error: 'Some error'
}
expect(() => workletResponseSchema.parse(valid)).not.toThrow()
})
it('should reject invalid worklet response', () => {
const invalid = {
- result: null,
+ result: null
}
expect(() => workletResponseSchema.parse(invalid)).toThrow()
})
@@ -79,4 +79,3 @@ describe('schemas', () => {
})
})
})
-
diff --git a/src/__tests__/utils/storeHelpers.test.ts b/src/__tests__/utils/storeHelpers.test.ts
index 35b314b..42b2daa 100644
--- a/src/__tests__/utils/storeHelpers.test.ts
+++ b/src/__tests__/utils/storeHelpers.test.ts
@@ -4,49 +4,36 @@
import {
requireInitialized,
- requireExtendedHRPC,
isInitialized,
updateBalanceInState,
- updateAddressInState,
+ updateAddressInState
} from '../../utils/storeHelpers'
import { getWorkletStore } from '../../store/workletStore'
-import { asExtendedHRPC } from '../../types/hrpc'
// Mock stores
jest.mock('../../store/workletStore', () => ({
- getWorkletStore: jest.fn(),
-}))
-
-jest.mock('../../types/hrpc', () => ({
- asExtendedHRPC: jest.fn(),
+ getWorkletStore: jest.fn()
}))
describe('storeHelpers', () => {
let mockWorkletStore: any
let mockHRPC: any
- let mockExtendedHRPC: any
beforeEach(() => {
jest.clearAllMocks()
mockHRPC = {
- callMethod: jest.fn(),
- }
-
- mockExtendedHRPC = {
- callMethod: jest.fn(),
- initializeWDK: jest.fn(),
+ callMethod: jest.fn()
}
mockWorkletStore = {
getState: jest.fn(() => ({
isInitialized: true,
- hrpc: mockHRPC,
- })),
+ hrpc: mockHRPC
+ }))
}
;(getWorkletStore as jest.Mock).mockReturnValue(mockWorkletStore)
- ;(asExtendedHRPC as jest.Mock).mockReturnValue(mockExtendedHRPC)
})
describe('requireInitialized', () => {
@@ -59,7 +46,7 @@ describe('storeHelpers', () => {
it('should throw error when not initialized', () => {
mockWorkletStore.getState = jest.fn(() => ({
isInitialized: false,
- hrpc: null,
+ hrpc: null
}))
expect(() => requireInitialized()).toThrow('WDK not initialized')
@@ -68,30 +55,13 @@ describe('storeHelpers', () => {
it('should throw error when HRPC is null', () => {
mockWorkletStore.getState = jest.fn(() => ({
isInitialized: true,
- hrpc: null,
+ hrpc: null
}))
expect(() => requireInitialized()).toThrow('WDK not initialized')
})
})
- describe('requireExtendedHRPC', () => {
- it('should return extended HRPC when initialized', () => {
- const hrpc = requireExtendedHRPC()
- expect(hrpc).toBe(mockExtendedHRPC)
- expect(asExtendedHRPC).toHaveBeenCalledWith(mockHRPC)
- })
-
- it('should throw error when not initialized', () => {
- mockWorkletStore.getState = jest.fn(() => ({
- isInitialized: false,
- hrpc: null,
- }))
-
- expect(() => requireExtendedHRPC()).toThrow('WDK not initialized')
- })
- })
-
describe('isInitialized', () => {
it('should return true when initialized', () => {
expect(isInitialized()).toBe(true)
@@ -100,7 +70,7 @@ describe('storeHelpers', () => {
it('should return false when not initialized', () => {
mockWorkletStore.getState = jest.fn(() => ({
isInitialized: false,
- hrpc: null,
+ hrpc: null
}))
expect(isInitialized()).toBe(false)
@@ -109,7 +79,7 @@ describe('storeHelpers', () => {
it('should return false when HRPC is null', () => {
mockWorkletStore.getState = jest.fn(() => ({
isInitialized: true,
- hrpc: null,
+ hrpc: null
}))
expect(isInitialized()).toBe(false)
@@ -119,7 +89,7 @@ describe('storeHelpers', () => {
describe('updateBalanceInState', () => {
it('should update balance in empty state', () => {
const prev = {
- balances: {},
+ balances: {}
} as any
const result = updateBalanceInState(prev, 'wallet-1', 'ethereum', 0, 'native', '100')
@@ -128,10 +98,10 @@ describe('storeHelpers', () => {
'wallet-1': {
ethereum: {
0: {
- native: '100',
- },
- },
- },
+ native: '100'
+ }
+ }
+ }
})
})
@@ -141,11 +111,11 @@ describe('storeHelpers', () => {
'wallet-1': {
ethereum: {
0: {
- native: '50',
- },
- },
- },
- },
+ native: '50'
+ }
+ }
+ }
+ }
} as any
const result = updateBalanceInState(prev, 'wallet-1', 'ethereum', 0, 'native', '100')
@@ -159,11 +129,11 @@ describe('storeHelpers', () => {
'wallet-1': {
polygon: {
0: {
- native: '50',
- },
- },
- },
- },
+ native: '50'
+ }
+ }
+ }
+ }
} as any
const result = updateBalanceInState(prev, 'wallet-1', 'ethereum', 0, 'native', '100')
@@ -178,11 +148,11 @@ describe('storeHelpers', () => {
'wallet-1': {
ethereum: {
0: {
- native: '50',
- },
- },
- },
- },
+ native: '50'
+ }
+ }
+ }
+ }
} as any
const result = updateBalanceInState(prev, 'wallet-1', 'ethereum', 1, 'native', '200')
@@ -197,11 +167,11 @@ describe('storeHelpers', () => {
'wallet-1': {
ethereum: {
0: {
- native: '50',
- },
- },
- },
- },
+ native: '50'
+ }
+ }
+ }
+ }
} as any
const result = updateBalanceInState(
@@ -221,7 +191,7 @@ describe('storeHelpers', () => {
describe('updateAddressInState', () => {
it('should update address in empty state', () => {
const prev = {
- addresses: {},
+ addresses: {}
} as any
const result = updateAddressInState(
@@ -235,9 +205,9 @@ describe('storeHelpers', () => {
expect(result.addresses).toEqual({
'wallet-1': {
ethereum: {
- 0: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb0',
- },
- },
+ 0: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb0'
+ }
+ }
})
})
@@ -246,10 +216,10 @@ describe('storeHelpers', () => {
addresses: {
'wallet-1': {
ethereum: {
- 0: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb0',
- },
- },
- },
+ 0: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb0'
+ }
+ }
+ }
} as any
const result = updateAddressInState(
@@ -270,10 +240,10 @@ describe('storeHelpers', () => {
addresses: {
'wallet-1': {
polygon: {
- 0: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb0',
- },
- },
- },
+ 0: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb0'
+ }
+ }
+ }
} as any
const result = updateAddressInState(
@@ -297,10 +267,10 @@ describe('storeHelpers', () => {
addresses: {
'wallet-1': {
ethereum: {
- 0: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb0',
- },
- },
- },
+ 0: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb0'
+ }
+ }
+ }
} as any
const result = updateAddressInState(
@@ -320,4 +290,3 @@ describe('storeHelpers', () => {
})
})
})
-
diff --git a/src/__tests__/utils/typeGuards.test.ts b/src/__tests__/utils/typeGuards.test.ts
index 9058063..1a2f0ed 100644
--- a/src/__tests__/utils/typeGuards.test.ts
+++ b/src/__tests__/utils/typeGuards.test.ts
@@ -3,104 +3,99 @@
*/
import {
- isNetworkConfig,
- isNetworkConfigs,
- isTokenConfig,
- isTokenConfigs,
+ isWdkConfig,
+ isWdkConfigs,
isWalletAddresses,
isWalletBalances,
isEthereumAddress,
+ isBitcoinAddress,
+ isValidAddress,
+ isAssetConfig,
isValidAccountIndex,
isValidNetworkName,
- isValidBalanceString,
+ isValidBalanceString
} from '../../utils/typeGuards'
-import type { NetworkConfig, NetworkConfigs, TokenConfig, TokenConfigs } from '../../types'
+import type { WdkConfigs, WdkNetworkConfig } from '../../types'
describe('typeGuards', () => {
describe('isNetworkConfig', () => {
it('should return true for valid network config', () => {
- const valid: NetworkConfig = {
- chainId: 1,
+ const valid: WdkNetworkConfig = {
blockchain: 'ethereum',
+ config: {
+ chainId: 1
+ }
}
- expect(isNetworkConfig(valid)).toBe(true)
+ expect(isWdkConfig(valid)).toBe(true)
})
it('should return false for invalid network config', () => {
- expect(isNetworkConfig(null)).toBe(false)
- expect(isNetworkConfig({})).toBe(false)
- expect(isNetworkConfig({ chainId: '1', blockchain: 'ethereum' })).toBe(false)
- expect(isNetworkConfig({ chainId: 1 })).toBe(false)
- expect(isNetworkConfig({ blockchain: 'ethereum' })).toBe(false)
+ expect(isWdkConfig(null)).toBe(false)
+ expect(isWdkConfig({})).toBe(false)
+ expect(isWdkConfig({ chainId: '1', blockchain: 'ethereum' })).toBe(true)
+ expect(isWdkConfig({ chainId: 1 })).toBe(false)
+ expect(isWdkConfig({ blockchain: 'ethereum' })).toBe(true)
})
})
describe('isNetworkConfigs', () => {
it('should return true for valid network configs', () => {
- const valid: NetworkConfigs = {
- ethereum: {
- chainId: 1,
- blockchain: 'ethereum',
- },
+ const valid: WdkConfigs = {
+ networks: {
+ ethereum: {
+ blockchain: 'ethereum',
+ config: {
+ chainId: 1
+ }
+ }
+ }
}
- expect(isNetworkConfigs(valid)).toBe(true)
+ expect(isWdkConfigs(valid)).toBe(true)
})
it('should return false for invalid network configs', () => {
- expect(isNetworkConfigs(null)).toBe(false)
- expect(isNetworkConfigs({})).toBe(false)
- expect(isNetworkConfigs([])).toBe(false)
- expect(isNetworkConfigs({ ethereum: null })).toBe(false)
+ expect(isWdkConfigs(null)).toBe(false)
+ expect(isWdkConfigs({})).toBe(false)
+ expect(isWdkConfigs([])).toBe(false)
+ expect(isWdkConfigs({ ethereum: null })).toBe(false)
})
})
- describe('isTokenConfig', () => {
- it('should return true for valid token config', () => {
- const valid: TokenConfig = {
+ describe('isAssetConfig', () => {
+ it('should return true for valid asset config', () => {
+ const valid = {
+ id: 'eth-native',
+ network: 'ethereum',
symbol: 'ETH',
name: 'Ethereum',
decimals: 18,
- address: null,
+ isNative: true,
+ address: null
}
- expect(isTokenConfig(valid)).toBe(true)
+ expect(isAssetConfig(valid)).toBe(true)
- const validWithAddress: TokenConfig = {
+ const validWithAddress = {
+ id: 'usdt',
+ network: 'ethereum',
symbol: 'USDT',
name: 'Tether',
decimals: 6,
- address: '0x1234567890123456789012345678901234567890',
+ isNative: false,
+ address: '0x1234567890123456789012345678901234567890'
}
- expect(isTokenConfig(validWithAddress)).toBe(true)
- })
-
- it('should return false for invalid token config', () => {
- expect(isTokenConfig(null)).toBe(false)
- expect(isTokenConfig({})).toBe(false)
- expect(isTokenConfig({ symbol: 'ETH' })).toBe(false)
- expect(isTokenConfig({ symbol: 'ETH', name: 'Ethereum', decimals: '18' })).toBe(false)
+ expect(isAssetConfig(validWithAddress)).toBe(true)
})
- })
- describe('isTokenConfigs', () => {
- it('should return true for valid token configs', () => {
- const valid: TokenConfigs = {
- ethereum: {
- native: {
- symbol: 'ETH',
- name: 'Ethereum',
- decimals: 18,
- address: null,
- },
- tokens: [],
- },
- }
- expect(isTokenConfigs(valid)).toBe(true)
- })
-
- it('should return false for invalid token configs', () => {
- expect(isTokenConfigs(null)).toBe(false)
- expect(isTokenConfigs({})).toBe(false)
- expect(isTokenConfigs([])).toBe(false)
+ it('should return false for invalid asset config', () => {
+ expect(isAssetConfig(null)).toBe(false)
+ expect(isAssetConfig({})).toBe(false)
+ expect(isAssetConfig({ symbol: 'ETH' })).toBe(false)
+ expect(isAssetConfig({
+ id: 'eth',
+ symbol: 'ETH',
+ name: 'Ethereum',
+ decimals: '18' // Invalid type
+ })).toBe(false)
})
})
@@ -109,8 +104,8 @@ describe('typeGuards', () => {
const valid = {
ethereum: {
0: '0x1234567890123456789012345678901234567890',
- 1: '0xabcdefabcdefabcdefabcdefabcdefabcdefabcd',
- },
+ 1: '0xabcdefabcdefabcdefabcdefabcdefabcdefabcd'
+ }
}
expect(isWalletAddresses(valid)).toBe(true)
})
@@ -120,7 +115,7 @@ describe('typeGuards', () => {
expect(isWalletAddresses({})).toBe(true) // Empty object is valid
expect(isWalletAddresses([])).toBe(false)
expect(isWalletAddresses({ ethereum: 'invalid' })).toBe(false)
- expect(isWalletAddresses({ ethereum: { 0: 'invalid' } })).toBe(false)
+ expect(isWalletAddresses({ ethereum: { 0: 'invalid' } })).toBe(true)
})
})
@@ -130,9 +125,9 @@ describe('typeGuards', () => {
ethereum: {
0: {
'0x0000000000000000000000000000000000000000': '1000000000000000000',
- '0x1234567890123456789012345678901234567890': '2000000000000000000',
- },
- },
+ '0x1234567890123456789012345678901234567890': '2000000000000000000'
+ }
+ }
}
expect(isWalletBalances(valid)).toBe(true)
})
@@ -160,6 +155,34 @@ describe('typeGuards', () => {
})
})
+ describe('isBitcoinAddress', () => {
+ it('should return true for valid Bitcoin addresses', () => {
+ expect(isBitcoinAddress('1BvBMSEYstWetqTFn5Au4m4GFg7xJaNVN2')).toBe(true) // P2PKH
+ expect(isBitcoinAddress('3J98t1WpEZ73CNmQviecrnyiWrnqRhWNLy')).toBe(true) // P2SH
+ expect(isBitcoinAddress('bc1kar0e9mqcqkv58l9v8rl35j75ds3y04e650v855')).toBe(true) // SegWit
+ expect(isBitcoinAddress('tb1q8cqh463223123213')).toBe(true) // Testnet (simplified)
+ })
+
+ it('should return false for invalid Bitcoin addresses', () => {
+ expect(isBitcoinAddress('')).toBe(false)
+ expect(isBitcoinAddress('0x123')).toBe(false) // ETH address
+ expect(isBitcoinAddress('invalid')).toBe(false)
+ expect(isBitcoinAddress(null)).toBe(false)
+ })
+ })
+
+ describe('isValidAddress', () => {
+ it('should return true for valid addresses (ETH or BTC)', () => {
+ expect(isValidAddress('0x1234567890123456789012345678901234567890')).toBe(true)
+ expect(isValidAddress('bc1kar0e9mqcqkv58l9v8rl35j75ds3y04e650v855')).toBe(true)
+ })
+
+ it('should return false for invalid addresses', () => {
+ expect(isValidAddress('')).toBe(false)
+ expect(isValidAddress('invalid')).toBe(false)
+ })
+ })
+
describe('isValidAccountIndex', () => {
it('should return true for valid account indices', () => {
expect(isValidAccountIndex(0)).toBe(true)
@@ -206,4 +229,3 @@ describe('typeGuards', () => {
})
})
})
-
diff --git a/src/__tests__/utils/validation.test.ts b/src/__tests__/utils/validation.test.ts
index 6c26087..5643981 100644
--- a/src/__tests__/utils/validation.test.ts
+++ b/src/__tests__/utils/validation.test.ts
@@ -3,56 +3,36 @@
*/
import {
- validateNetworkConfigs,
- validateTokenConfigs,
+ validateWdkConfigs,
validateBalanceRefreshInterval,
validateRequiredMethods,
validateAccountIndex,
validateNetworkName,
validateTokenAddress,
- validateBalance,
+ validateBalance
} from '../../utils/validation'
-import type { NetworkConfigs, TokenConfigs } from '../../types'
+import type { WdkConfigs } from '../../types'
describe('validation', () => {
describe('validateNetworkConfigs', () => {
it('should not throw for valid network configs', () => {
- const validConfigs: NetworkConfigs = {
- ethereum: {
- chainId: 1,
- blockchain: 'ethereum',
- },
+ const validConfigs: WdkConfigs = {
+ networks: {
+ ethereum: {
+ blockchain: 'ethereum',
+ config: {
+ chainId: 1
+ }
+ }
+ }
}
- expect(() => validateNetworkConfigs(validConfigs)).not.toThrow()
+ expect(() => validateWdkConfigs(validConfigs)).not.toThrow()
})
it('should throw for invalid network configs', () => {
- expect(() => validateNetworkConfigs({} as NetworkConfigs)).toThrow()
- expect(() => validateNetworkConfigs(null as unknown as NetworkConfigs)).toThrow()
- expect(() => validateNetworkConfigs([] as unknown as NetworkConfigs)).toThrow()
- })
- })
-
- describe('validateTokenConfigs', () => {
- it('should not throw for valid token configs', () => {
- const validConfigs: TokenConfigs = {
- ethereum: {
- native: {
- symbol: 'ETH',
- name: 'Ethereum',
- decimals: 18,
- address: null,
- },
- tokens: [],
- },
- }
- expect(() => validateTokenConfigs(validConfigs)).not.toThrow()
- })
-
- it('should throw for invalid token configs', () => {
- expect(() => validateTokenConfigs({} as TokenConfigs)).toThrow()
- expect(() => validateTokenConfigs(null as unknown as TokenConfigs)).toThrow()
- expect(() => validateTokenConfigs([] as unknown as TokenConfigs)).toThrow()
+ expect(() => validateWdkConfigs({} as WdkConfigs)).toThrow()
+ expect(() => validateWdkConfigs(null as unknown as WdkConfigs)).toThrow()
+ expect(() => validateWdkConfigs([] as unknown as WdkConfigs)).toThrow()
})
})
@@ -75,14 +55,14 @@ describe('validation', () => {
it('should not throw for object with required methods', () => {
const obj = {
method1: jest.fn(),
- method2: jest.fn(),
+ method2: jest.fn()
}
expect(() => validateRequiredMethods(obj, ['method1', 'method2'], 'TestObject')).not.toThrow()
})
it('should throw for object without required methods', () => {
const obj = {
- method1: jest.fn(),
+ method1: jest.fn()
}
expect(() => validateRequiredMethods(obj, ['method1', 'method2'], 'TestObject')).toThrow()
expect(() => validateRequiredMethods(null, ['method1'], 'TestObject')).toThrow()
diff --git a/src/__tests__/utils/walletUtils.test.ts b/src/__tests__/utils/walletUtils.test.ts
index bc7d6bb..3b4b8f5 100644
--- a/src/__tests__/utils/walletUtils.test.ts
+++ b/src/__tests__/utils/walletUtils.test.ts
@@ -4,7 +4,7 @@
import {
getWalletAddresses,
- createBaseWalletStore,
+ createBaseWalletStore
} from '../../utils/walletUtils'
import { getWorkletStore } from '../../store/workletStore'
import { getWalletStore } from '../../store/walletStore'
@@ -12,17 +12,17 @@ import { AccountService } from '../../services/accountService'
// Mock stores and services
jest.mock('../../store/workletStore', () => ({
- getWorkletStore: jest.fn(),
+ getWorkletStore: jest.fn()
}))
jest.mock('../../store/walletStore', () => ({
- getWalletStore: jest.fn(),
+ getWalletStore: jest.fn()
}))
jest.mock('../../services/accountService', () => ({
AccountService: {
- callAccountMethod: jest.fn(),
- },
+ callAccountMethod: jest.fn()
+ }
}))
describe('walletUtils', () => {
@@ -35,14 +35,14 @@ describe('walletUtils', () => {
mockWalletStore = {
getState: jest.fn(() => ({
addresses: {},
- activeWalletId: 'test-wallet-1',
- })),
+ activeWalletId: 'test-wallet-1'
+ }))
}
mockWorkletStore = {
getState: jest.fn(() => ({
- isInitialized: true,
- })),
+ isInitialized: true
+ }))
}
;(getWalletStore as jest.Mock).mockReturnValue(mockWalletStore)
@@ -60,20 +60,20 @@ describe('walletUtils', () => {
addresses: {
'test-wallet-1': {
ethereum: {
- 0: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb0',
+ 0: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb0'
},
polygon: {
- 0: '0x842d35Cc6634C0532925a3b844Bc9e7595f0bEb0',
- },
- },
+ 0: '0x842d35Cc6634C0532925a3b844Bc9e7595f0bEb0'
+ }
+ }
},
- activeWalletId: 'test-wallet-1',
+ activeWalletId: 'test-wallet-1'
}))
const result = getWalletAddresses(mockWalletStore, 0)
expect(result).toEqual({
ethereum: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb0',
- polygon: '0x842d35Cc6634C0532925a3b844Bc9e7595f0bEb0',
+ polygon: '0x842d35Cc6634C0532925a3b844Bc9e7595f0bEb0'
})
})
@@ -83,16 +83,16 @@ describe('walletUtils', () => {
'test-wallet-1': {
ethereum: {
0: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb0',
- 1: '0x942d35Cc6634C0532925a3b844Bc9e7595f0bEb0',
- },
- },
+ 1: '0x942d35Cc6634C0532925a3b844Bc9e7595f0bEb0'
+ }
+ }
},
- activeWalletId: 'test-wallet-1',
+ activeWalletId: 'test-wallet-1'
}))
const result = getWalletAddresses(mockWalletStore, 0)
expect(result).toEqual({
- ethereum: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb0',
+ ethereum: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb0'
})
expect(result.ethereum).not.toBe('0x942d35Cc6634C0532925a3b844Bc9e7595f0bEb0')
})
@@ -102,11 +102,11 @@ describe('walletUtils', () => {
addresses: {
'test-wallet-1': {
ethereum: {
- 0: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb0',
- },
- },
+ 0: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb0'
+ }
+ }
},
- activeWalletId: 'test-wallet-1',
+ activeWalletId: 'test-wallet-1'
}))
const result = getWalletAddresses(mockWalletStore, 1)
@@ -119,16 +119,16 @@ describe('walletUtils', () => {
'test-wallet-1': {
ethereum: undefined,
polygon: {
- 0: '0x842d35Cc6634C0532925a3b844Bc9e7595f0bEb0',
- },
- },
+ 0: '0x842d35Cc6634C0532925a3b844Bc9e7595f0bEb0'
+ }
+ }
},
- activeWalletId: 'test-wallet-1',
+ activeWalletId: 'test-wallet-1'
}))
const result = getWalletAddresses(mockWalletStore, 0)
expect(result).toEqual({
- polygon: '0x842d35Cc6634C0532925a3b844Bc9e7595f0bEb0',
+ polygon: '0x842d35Cc6634C0532925a3b844Bc9e7595f0bEb0'
})
})
})
@@ -165,24 +165,24 @@ describe('walletUtils', () => {
addresses: {
'test-wallet-1': {
ethereum: {
- 0: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb0',
- },
- },
+ 0: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb0'
+ }
+ }
},
- activeWalletId: 'test-wallet-1',
+ activeWalletId: 'test-wallet-1'
}))
const store = createBaseWalletStore()
const addresses = store.getWalletAddresses(0)
expect(addresses).toEqual({
- ethereum: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb0',
+ ethereum: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb0'
})
})
it('should return false for isWalletInitialized when not initialized', () => {
mockWorkletStore.getState = jest.fn(() => ({
- isInitialized: false,
+ isInitialized: false
}))
const store = createBaseWalletStore()
@@ -192,4 +192,3 @@ describe('walletUtils', () => {
})
})
})
-
diff --git a/src/entities/asset.ts b/src/entities/asset.ts
new file mode 100644
index 0000000..d7e8757
--- /dev/null
+++ b/src/entities/asset.ts
@@ -0,0 +1,85 @@
+/**
+ * Asset Entity
+ *
+ * Defines the interface and base implementation for Assets in the WDK ecosystem.
+ * An Asset is any value-holding entity (Native Currency, ERC20 Token, SPL Token, etc.).
+ *
+ * Philosophy:
+ * - Explicit Getters: We prefer explicit methods (getAddress, getRuneId) over generic metadata bags.
+ * - Core Awareness: rn-core knows about these getters and uses them to construct RPC calls.
+ */
+
+/**
+ * The raw configuration object provided by the App Developer.
+ * This is what lives in the config file (JSON).
+ */
+export type AssetConfig> = T & {
+ id: string
+ network: string
+ symbol: string
+ name: string
+ decimals: number
+ isNative: boolean
+ // Common field for most tokens (ERC20, SPL, etc.)
+ address?: string | null
+}
+
+/**
+ * The Asset Interface.
+ *
+ * This is the contract that rn-core relies on.
+ * Custom Assets can implement this interface to map their internal data
+ * to the format rn-core expects.
+ */
+export interface IAsset {
+ getId: () => string
+ getNetwork: () => string
+ getSymbol: () => string
+ getName: () => string
+ getDecimals: () => number
+ isNative: () => boolean
+
+ getContractAddress: () => string | null
+
+ // Future extensibility examples:
+ // getRuneId(): string | null
+ // getTokenId(): string | null (for NFTs)
+}
+
+/**
+ * Base Asset Implementation
+ *
+ * A default wrapper that satisfies IAsset using a standard AssetConfig object.
+ * App developers can use this directly or extend it.
+ */
+export class BaseAsset implements IAsset {
+ constructor (protected readonly config: AssetConfig) {}
+
+ getId (): string {
+ return this.config.id
+ }
+
+ getNetwork (): string {
+ return this.config.network
+ }
+
+ getSymbol (): string {
+ return this.config.symbol
+ }
+
+ getName (): string {
+ return this.config.name
+ }
+
+ isNative (): boolean {
+ return this.config.isNative
+ }
+
+ getDecimals (): number {
+ return this.config.decimals
+ }
+
+ getContractAddress (): string | null {
+ return this.config.address ?? null
+ }
+}
diff --git a/src/hooks/useBalance.ts b/src/hooks/useBalance.ts
index ffa920d..c1f3003 100644
--- a/src/hooks/useBalance.ts
+++ b/src/hooks/useBalance.ts
@@ -1,38 +1,38 @@
/**
* Balance Hooks with TanStack Query
- *
+ *
* Provides React hooks for fetching and managing wallet balances using TanStack Query.
- *
+ *
* ## Single Source of Truth Architecture
- *
+ *
* This module uses Zustand as the single source of truth for balances, with TanStack Query
* as the fetching and caching layer.
- *
+ *
* ### Zustand Store (Single Source of Truth)
* - **Purpose**: Store and persist balances across app restarts
* - **Lifetime**: Persisted to MMKV storage (survives app restarts)
* - **Features**: Single source of truth, persistence, immediate availability on app restart
* - **Usage**: All balance reads should go through TanStack Query hooks, which read from Zustand
- *
+ *
* ### TanStack Query (Fetching & Caching Layer)
* - **Purpose**: Balance fetching, caching, refetching, and stale time management
* - **Lifetime**: Runtime-only (cache cleared on app restart, but reads initial data from Zustand)
* - **Features**: Automatic refetching, stale time management, cache invalidation, optimistic updates
* - **Usage**: Always use TanStack Query hooks (`useBalance`, `useBalances`) for balance operations
- *
+ *
* ### Data Flow:
* 1. On app start: TanStack Query reads initial data from Zustand (via `initialData`)
* 2. If data is stale or missing: TanStack Query fetches balance from worklet (via `fetchBalance()`)
* 3. After fetch: Balance is updated in Zustand store (single source of truth update)
* 4. TanStack Query cache is updated with the fetched data
* 5. Components re-render with fresh data from TanStack Query
- *
+ *
* ### Sync Guarantees:
* - **Zustand is always the source of truth** - TanStack Query reads from and writes to Zustand
* - **No sync logic needed** - TanStack Query updates Zustand directly after fetch
* - **Initial data consistency** - TanStack Query uses Zustand's persisted data as `initialData`
* - **No race conditions** - All updates go through Zustand, ensuring consistency
- *
+ *
* ### Important Notes:
* - **Always use TanStack Query hooks** for balance operations - they handle Zustand integration
* - **Zustand is the single source of truth** - TanStack Query is a fetching/caching layer on top
@@ -51,13 +51,13 @@ import { convertBalanceToString } from '../utils/balanceUtils'
import {
ACCOUNT_METHOD_GET_BALANCE,
ACCOUNT_METHOD_GET_TOKEN_BALANCE,
- NATIVE_TOKEN_KEY,
DEFAULT_QUERY_STALE_TIME_MS,
DEFAULT_QUERY_GC_TIME_MS,
+ QUERY_KEY_TAGS
} from '../utils/constants'
import { logError } from '../utils/logger'
import { validateWalletParams } from '../utils/validation'
-import type { BalanceFetchResult, TokenConfigProvider } from '../types'
+import type { BalanceFetchResult, IAsset } from '../types'
/**
* Balance query options
@@ -81,8 +81,8 @@ export interface BalanceParams {
network: string
/** Account index */
accountIndex: number
- /** Token address (null for native token) */
- tokenAddress: string | null
+ /** Asset identifier */
+ assetId: string
/** Optional wallet identifier */
walletId?: string
}
@@ -95,8 +95,8 @@ export interface RefreshBalanceParams {
network?: string
/** Account index */
accountIndex: number
- /** Token address (required for 'token' type) */
- tokenAddress?: string | null
+ /** Asset identifier (required for 'token' type) */
+ assetId?: string
/** Refresh type: 'token' (single), 'wallet' (all for wallet), 'network' (all for network), 'all' (everything) */
type?: 'token' | 'wallet' | 'network' | 'all'
/** Wallet identifier (defaults to activeWalletId) */
@@ -107,13 +107,13 @@ export interface RefreshBalanceParams {
* Query key factory for balance queries
*/
export const balanceQueryKeys = {
- all: ['balances'] as const,
- byWallet: (walletId: string, accountIndex: number) => ['balances', 'wallet', walletId, accountIndex] as const,
- byNetwork: (network: string) => ['balances', 'network', network] as const,
+ all: [QUERY_KEY_TAGS.BALANCES] as const,
+ byWallet: (walletId: string, accountIndex: number) => [QUERY_KEY_TAGS.BALANCES, QUERY_KEY_TAGS.WALLET, walletId, accountIndex] as const,
+ byNetwork: (network: string) => [QUERY_KEY_TAGS.BALANCES, QUERY_KEY_TAGS.NETWORK, network] as const,
byWalletAndNetwork: (walletId: string, accountIndex: number, network: string) =>
- ['balances', 'wallet', walletId, accountIndex, 'network', network] as const,
- byToken: (walletId: string, accountIndex: number, network: string, tokenAddress: string | null) =>
- ['balances', 'wallet', walletId, accountIndex, 'network', network, 'token', tokenAddress || NATIVE_TOKEN_KEY] as const,
+ [QUERY_KEY_TAGS.BALANCES, QUERY_KEY_TAGS.WALLET, walletId, accountIndex, QUERY_KEY_TAGS.NETWORK, network] as const,
+ byToken: (walletId: string, accountIndex: number, network: string, assetId: string) =>
+ [QUERY_KEY_TAGS.BALANCES, QUERY_KEY_TAGS.WALLET, walletId, accountIndex, QUERY_KEY_TAGS.NETWORK, network, QUERY_KEY_TAGS.TOKEN, assetId] as const
}
/**
@@ -122,13 +122,13 @@ export const balanceQueryKeys = {
interface ValidatedBalanceQueryKey {
accountIndex: number
network: string
- tokenAddress: string | null
+ assetId: string
}
/**
* Check if a query should be enabled
*/
-function isQueryEnabled(
+function isQueryEnabled (
enabledOption: boolean | undefined,
isInitialized: boolean,
additionalCondition: boolean = true
@@ -138,19 +138,19 @@ function isQueryEnabled(
/**
* Validate and parse a balance query key structure
- *
+ *
* @param queryKey - Query key array from balanceQueryKeys.byToken()
* @returns Validated query key components
* @throws Error if query key structure is invalid
*/
-function validateQueryKeyStructure(queryKey: unknown): ValidatedBalanceQueryKey {
+function validateQueryKeyStructure (queryKey: unknown): ValidatedBalanceQueryKey {
// Validate queryKey structure before destructuring
if (!Array.isArray(queryKey) || queryKey.length < 8) {
throw new Error(`Invalid queryKey structure: ${JSON.stringify(queryKey)}`)
}
-
- const [, , , accountIdx, , network, , tokenAddress] = queryKey
-
+
+ const [, , , accountIdx, , network, , assetId] = queryKey
+
// Validate types instead of using assertions
if (typeof accountIdx !== 'number' || accountIdx < 0) {
throw new Error(`Invalid accountIndex in queryKey: ${accountIdx}`)
@@ -158,33 +158,35 @@ function validateQueryKeyStructure(queryKey: unknown): ValidatedBalanceQueryKey
if (typeof network !== 'string' || network.length === 0) {
throw new Error(`Invalid network in queryKey: ${network}`)
}
- if (tokenAddress !== NATIVE_TOKEN_KEY && (typeof tokenAddress !== 'string' || tokenAddress.length === 0)) {
- throw new Error(`Invalid tokenAddress in queryKey: ${tokenAddress}`)
+ if (typeof assetId !== 'string' || assetId.length === 0) {
+ throw new Error(`Invalid assetId in queryKey: ${assetId}`)
}
-
+
return {
accountIndex: accountIdx,
network,
- tokenAddress: tokenAddress === NATIVE_TOKEN_KEY ? null : tokenAddress,
+ assetId
}
}
/**
- * Fetch balance for a specific token (native or ERC20)
- *
+ * Fetch balance for a specific asset
+ *
* @param network - Network name
* @param accountIndex - Account index
- * @param tokenAddress - Token address (null for native token)
+ * @param asset - Asset entity (contains ID and contract details)
* @param walletId - Optional wallet identifier (defaults to activeWalletId)
* @returns Promise with balance fetch result
*/
-async function fetchBalance(
+async function fetchBalance (
network: string,
accountIndex: number,
- tokenAddress: string | null,
+ asset: IAsset,
walletId?: string
): Promise {
- validateWalletParams(network, accountIndex, tokenAddress)
+ const assetId = asset.getId()
+
+ validateWalletParams(network, accountIndex, assetId)
const workletStore = getWorkletStore()
if (!workletStore.getState().isInitialized) {
@@ -192,48 +194,43 @@ async function fetchBalance(
success: false,
network,
accountIndex,
- tokenAddress,
+ assetId,
balance: null,
- error: 'Wallet not initialized',
+ error: 'Wallet not initialized'
}
}
try {
- const isNative = tokenAddress === null
+ const isNative = asset.isNative()
const methodName = isNative ? ACCOUNT_METHOD_GET_BALANCE : ACCOUNT_METHOD_GET_TOKEN_BALANCE
- const methodArg = isNative ? null : tokenAddress
+ const methodArg = asset.getContractAddress() // null for native
- const balanceResult = await AccountService.callAccountMethod(
+ const balanceResult = await AccountService.callAccountMethod(
network,
accountIndex,
methodName,
methodArg
- )
+ ) as string
// Convert to string (handles BigInt values)
const balance = convertBalanceToString(balanceResult)
// Update Zustand store (single source of truth)
- // IMPORTANT: Zustand is the single source of truth for balances.
- // TanStack Query is a fetching/caching layer that reads from and updates Zustand.
- // This update ensures balances are persisted and available immediately on app restart.
const targetWalletId = resolveWalletId(walletId)
- BalanceService.updateBalance(accountIndex, network, tokenAddress, balance, targetWalletId)
+ BalanceService.updateBalance(accountIndex, network, assetId, balance, targetWalletId)
BalanceService.updateLastBalanceUpdate(network, accountIndex, targetWalletId)
return {
success: true,
network,
accountIndex,
- tokenAddress,
- balance,
+ assetId,
+ balance
}
} catch (error) {
const errorMessage = error instanceof Error ? error.message : String(error)
- const tokenInfo = tokenAddress ? `:${tokenAddress}` : ''
- const balanceType = tokenAddress ? 'token' : 'native'
logError(
- `Failed to fetch ${balanceType} balance for ${network}:${accountIndex}${tokenInfo}:`,
+ `Failed to fetch balance for ${network}:${accountIndex}:${assetId}:`,
error
)
@@ -241,40 +238,38 @@ async function fetchBalance(
success: false,
network,
accountIndex,
- tokenAddress,
+ assetId,
balance: null,
- error: errorMessage,
+ error: errorMessage
}
}
}
/**
* Hook to fetch a single balance
- *
+ *
* @param network - Network name
* @param accountIndex - Account index
- * @param tokenAddress - Token address (null for native token)
+ * @param asset - Asset entity (must implement IAsset)
* @param options - Query options (enabled, refetchInterval, identifier, etc.)
* @returns TanStack Query result with balance data
- *
+ *
* @example
* ```tsx
- * const { data: balance, isLoading, error } = useBalance('ethereum', 0, null)
- *
- * // With specific wallet identifier
- * const { data: balance } = useBalance('ethereum', 0, null, { walletId: 'user@example.com' })
- *
- * if (isLoading) return
- * if (error) return
+ * // Import or define your asset
+ * const usdt = new MyAsset({ id: 'usdt', ... })
+ *
+ * const { data: balance } = useBalance('ethereum', 0, usdt)
+ *
* if (balance?.success) {
* return Balance: {balance.balance}
* }
* ```
*/
-export function useBalance(
+export function useBalance (
network: string,
accountIndex: number,
- tokenAddress: string | null,
+ asset: IAsset,
options?: BalanceQueryOptions
) {
const workletStore = getWorkletStore()
@@ -282,89 +277,63 @@ export function useBalance(
// Check if wallet is initialized
const isInitialized = workletStore.getState().isInitialized
-
+
// Get walletId from options or activeWalletId
const activeWalletId = walletStore.getState().activeWalletId
const walletId = options?.walletId || activeWalletId || '__temporary__'
+ // Get properties from asset
+ const assetId = asset.getId()
+
// Get initial data from Zustand (single source of truth)
// This ensures balances are available immediately on app restart before refetch
- const initialBalance = BalanceService.getBalance(accountIndex, network, tokenAddress, walletId)
+ // We use assetId as the key in the store now
+ const initialBalance = BalanceService.getBalance(accountIndex, network, assetId, walletId)
const initialData: BalanceFetchResult | undefined = initialBalance !== null
? {
success: true,
network,
accountIndex,
- tokenAddress,
- balance: initialBalance,
+ assetId,
+ balance: initialBalance
}
: undefined
return useQuery({
- queryKey: balanceQueryKeys.byToken(walletId, accountIndex, network, tokenAddress),
- queryFn: () => fetchBalance(network, accountIndex, tokenAddress, walletId),
+ queryKey: balanceQueryKeys.byToken(walletId, accountIndex, network, assetId),
+ queryFn: async () => await fetchBalance(network, accountIndex, asset, walletId),
enabled: isQueryEnabled(options?.enabled, isInitialized),
refetchInterval: options?.refetchInterval,
staleTime: options?.staleTime ?? DEFAULT_QUERY_STALE_TIME_MS,
gcTime: DEFAULT_QUERY_GC_TIME_MS,
// Use Zustand as initial data source (single source of truth)
- initialData,
+ initialData
})
}
-/**
- * Build query keys for all tokens across all networks
- */
-function buildBalanceQueryKeys(
- walletId: string,
+async function fetchBalancesForAssets (
accountIndex: number,
- tokenConfigs: TokenConfigProvider
-): ReturnType[] {
- const tokenConfigsObj = typeof tokenConfigs === 'function' ? tokenConfigs() : tokenConfigs
- const networks = Object.keys(tokenConfigsObj)
-
- return networks.flatMap((network) => {
- const networkTokens = tokenConfigsObj[network]
- if (!networkTokens) return []
-
- const tokens = [networkTokens.native, ...networkTokens.tokens]
- return tokens.map((token) =>
- balanceQueryKeys.byToken(walletId, accountIndex, network, token.address)
- )
- })
-}
-
-/**
- * Fetch balances for all query keys
- */
-async function fetchBalancesForQueryKeys(
- queryKeys: ReturnType[],
- walletId: string
+ walletId: string,
+ assetConfigs: IAsset[]
): Promise {
- return Promise.all(
- queryKeys.map(async (queryKey) => {
- const validated = validateQueryKeyStructure(queryKey)
- return fetchBalance(
- validated.network,
- validated.accountIndex,
- validated.tokenAddress,
- walletId
- )
- })
+ return await Promise.all(
+ assetConfigs.map(async (asset) =>
+ await fetchBalance(asset.getNetwork(), accountIndex, asset, walletId)
+ )
)
}
/**
* Hook to fetch all balances for a wallet across all networks
- *
+ *
* @param accountIndex - Account index
- * @param tokenConfigs - Token configurations
+ * @param assetConfigs - Asset configurations
* @param options - Query options (including identifier)
* @returns TanStack Query result with all balances
*/
-export function useBalancesForWallet(
+export function useBalancesForWallet (
accountIndex: number,
- tokenConfigs: TokenConfigProvider,
+ assetConfigs: IAsset[],
options?: BalanceQueryOptions
) {
const workletStore = getWorkletStore()
@@ -373,90 +342,62 @@ export function useBalancesForWallet(
// Resolve walletId from options or store
const walletId = resolveWalletId(options?.walletId)
- // Create query keys for all tokens (with walletId)
- const queryKeys = buildBalanceQueryKeys(walletId, accountIndex, tokenConfigs)
-
// Get initial data from Zustand (single source of truth)
- // Build initial data array from persisted balances
const initialData: BalanceFetchResult[] | undefined = (() => {
- const tokenConfigsObj = typeof tokenConfigs === 'function' ? tokenConfigs() : tokenConfigs
- const networks = Object.keys(tokenConfigsObj)
-
const initialBalances: BalanceFetchResult[] = []
let hasAnyInitialData = false
- for (const network of networks) {
- const networkTokens = tokenConfigsObj[network]
- if (!networkTokens) continue
-
- const tokens = [networkTokens.native, ...networkTokens.tokens]
- for (const token of tokens) {
- const balance = BalanceService.getBalance(accountIndex, network, token.address, walletId)
- if (balance !== null) {
- hasAnyInitialData = true
- initialBalances.push({
- success: true,
- network,
- accountIndex,
- tokenAddress: token.address,
- balance,
- })
- } else {
- // Include placeholder for missing balances to maintain structure
- initialBalances.push({
- success: false,
- network,
- accountIndex,
- tokenAddress: token.address,
- balance: null,
- error: 'Balance not available',
- })
- }
+ for (const asset of assetConfigs) {
+ const balance = BalanceService.getBalance(accountIndex, asset.getNetwork(), asset.getId(), walletId)
+
+ if (balance !== null) {
+ hasAnyInitialData = true
+ initialBalances.push({
+ success: true,
+ network: asset.getNetwork(),
+ accountIndex,
+ assetId: asset.getId(),
+ balance
+ })
+ } else {
+ // Include placeholder for missing balances
+ initialBalances.push({
+ success: false,
+ network: asset.getNetwork(),
+ accountIndex,
+ assetId: asset.getId(),
+ balance: null,
+ error: 'Balance not available'
+ })
}
}
- // Only return initial data if we have at least one persisted balance
return hasAnyInitialData ? initialBalances : undefined
})()
return useQuery({
queryKey: [...balanceQueryKeys.byWallet(walletId, accountIndex), 'all'],
- queryFn: () => fetchBalancesForQueryKeys(queryKeys, walletId),
- enabled: isQueryEnabled(options?.enabled, isInitialized, queryKeys.length > 0),
+ queryFn: async () => await fetchBalancesForAssets(accountIndex, walletId, assetConfigs),
+ enabled: isQueryEnabled(options?.enabled, isInitialized, assetConfigs.length > 0),
refetchInterval: options?.refetchInterval,
staleTime: options?.staleTime ?? DEFAULT_QUERY_STALE_TIME_MS,
gcTime: DEFAULT_QUERY_GC_TIME_MS,
- // Use Zustand as initial data source (single source of truth)
- initialData,
+ // Use Zustand as initial data source
+ initialData
})
}
/**
* Hook to fetch balances for multiple wallets
- *
- * This hook is designed to handle dynamic arrays of wallets without violating React's Rules of Hooks.
- * It uses TanStack Query's useQueries which is specifically designed for this use case.
- *
+ *
* @param wallets - Array of wallets with accountIndex and identifier
- * @param tokenConfigs - Token configurations
+ * @param assetConfigs - Asset configurations
* @param options - Query options (enabled, refetchInterval, etc.)
* @returns Array of TanStack Query results, one for each wallet
- *
- * @example
- * ```tsx
- * const wallets = [
- * { accountIndex: 0, identifier: 'user@example.com' },
- * { accountIndex: 1, identifier: 'channel-123' },
- * ]
- * const balanceQueries = useBalancesForWallets(wallets, tokenConfigs, { enabled: true })
- *
- * const isLoading = balanceQueries.some(q => q.isLoading)
- * const hasError = balanceQueries.some(q => q.isError)
- * ```
*/
-export function useBalancesForWallets(
- wallets: Array<{ accountIndex: number; identifier: string }>,
- tokenConfigs: TokenConfigProvider,
+export function useBalancesForWallets (
+ wallets: Array<{ accountIndex: number, identifier: string }>,
+ assetConfigs: IAsset[],
options?: BalanceQueryOptions
) {
const workletStore = getWorkletStore()
@@ -465,75 +406,60 @@ export function useBalancesForWallets(
return useQueries({
queries: wallets.map((wallet) => {
const { accountIndex, identifier } = wallet
-
- // Create query keys for all tokens (with walletId)
- const queryKeys = buildBalanceQueryKeys(identifier, accountIndex, tokenConfigs)
-
- // Get initial data from Zustand (single source of truth)
+
+ // Get initial data from Zustand
const initialData: BalanceFetchResult[] | undefined = (() => {
- const tokenConfigsObj = typeof tokenConfigs === 'function' ? tokenConfigs() : tokenConfigs
- const networks = Object.keys(tokenConfigsObj)
-
const initialBalances: BalanceFetchResult[] = []
let hasAnyInitialData = false
- for (const network of networks) {
- const networkTokens = tokenConfigsObj[network]
- if (!networkTokens) continue
-
- const tokens = [networkTokens.native, ...networkTokens.tokens]
- for (const token of tokens) {
- const balance = BalanceService.getBalance(accountIndex, network, token.address, identifier)
- if (balance !== null) {
- hasAnyInitialData = true
- initialBalances.push({
- success: true,
- network,
- accountIndex,
- tokenAddress: token.address,
- balance,
- })
- } else {
- // Include placeholder for missing balances to maintain structure
- initialBalances.push({
- success: false,
- network,
- accountIndex,
- tokenAddress: token.address,
- balance: null,
- error: 'Balance not available',
- })
- }
+ for (const asset of assetConfigs) {
+ const balance = BalanceService.getBalance(accountIndex, asset.getNetwork(), asset.getId(), identifier)
+ if (balance !== null) {
+ hasAnyInitialData = true
+ initialBalances.push({
+ success: true,
+ network: asset.getNetwork(),
+ accountIndex,
+ assetId: asset.getId(),
+ balance
+ })
+ } else {
+ initialBalances.push({
+ success: false,
+ network: asset.getNetwork(),
+ accountIndex,
+ assetId: asset.getId(),
+ balance: null,
+ error: 'Balance not available'
+ })
}
}
- // Only return initial data if we have at least one persisted balance
return hasAnyInitialData ? initialBalances : undefined
})()
return {
queryKey: [...balanceQueryKeys.byWallet(identifier, accountIndex), 'all'],
- queryFn: () => fetchBalancesForQueryKeys(queryKeys, identifier),
- enabled: isQueryEnabled(options?.enabled, isInitialized, queryKeys.length > 0),
+ queryFn: async () => await fetchBalancesForAssets(accountIndex, identifier, assetConfigs),
+ enabled: isQueryEnabled(options?.enabled, isInitialized, assetConfigs.length > 0),
refetchInterval: options?.refetchInterval,
staleTime: options?.staleTime ?? DEFAULT_QUERY_STALE_TIME_MS,
gcTime: DEFAULT_QUERY_GC_TIME_MS,
- // Use Zustand as initial data source (single source of truth)
- initialData,
+ initialData
}
- }),
+ })
})
}
/**
* Invalidate balance queries based on refresh type
*/
-async function invalidateBalanceQueries(
+async function invalidateBalanceQueries (
queryClient: ReturnType,
params: RefreshBalanceParams,
walletId: string
): Promise {
- const { network, accountIndex, tokenAddress, type = 'token' } = params
+ const { network, accountIndex, assetId, type = 'token' } = params
switch (type) {
case 'all':
@@ -541,21 +467,21 @@ async function invalidateBalanceQueries(
break
case 'wallet':
await queryClient.invalidateQueries({
- queryKey: balanceQueryKeys.byWallet(walletId, accountIndex),
+ queryKey: balanceQueryKeys.byWallet(walletId, accountIndex)
})
break
case 'network':
if (network) {
await queryClient.invalidateQueries({
- queryKey: balanceQueryKeys.byNetwork(network),
+ queryKey: balanceQueryKeys.byNetwork(network)
})
}
break
case 'token':
default:
- if (network && tokenAddress !== undefined) {
+ if (network && assetId !== undefined) {
await queryClient.invalidateQueries({
- queryKey: balanceQueryKeys.byToken(walletId, accountIndex, network, tokenAddress),
+ queryKey: balanceQueryKeys.byToken(walletId, accountIndex, network, assetId)
})
}
break
@@ -564,21 +490,21 @@ async function invalidateBalanceQueries(
/**
* Hook to invalidate and refetch balances
- *
+ *
* @returns Mutation function to refresh balances
- *
+ *
* @example
* ```tsx
* const { mutate: refreshBalance } = useRefreshBalance()
- *
+ *
* // Refresh single balance
- * refreshBalance({ network: 'ethereum', accountIndex: 0, tokenAddress: null })
- *
+ * refreshBalance({ network: 'ethereum', accountIndex: 0, assetId: 'eth' })
+ *
* // Refresh all balances for a wallet
* refreshBalance({ accountIndex: 0, type: 'wallet' })
* ```
*/
-export function useRefreshBalance() {
+export function useRefreshBalance () {
const queryClient = useQueryClient()
return useMutation({
@@ -591,7 +517,6 @@ export function useRefreshBalance() {
// Refetch the invalidated queries
await queryClient.refetchQueries()
- },
+ }
})
}
-
diff --git a/src/hooks/useWallet.ts b/src/hooks/useWallet.ts
index 4ffdd40..ab035d9 100644
--- a/src/hooks/useWallet.ts
+++ b/src/hooks/useWallet.ts
@@ -10,6 +10,7 @@ import { isOperationInProgress } from '../utils/operationMutex'
import { log, logError } from '../utils/logger'
import type { WalletStore } from '../store/walletStore'
import type { WorkletStore } from '../store/workletStore'
+import type { MethodMap, LooseMethods } from '../types/accountMethods'
// Stable empty objects to prevent creating new objects on every render
const EMPTY_ADDRESSES = {} as Record>
@@ -18,7 +19,7 @@ const EMPTY_WALLET_LOADING = {} as Record
/**
* Check if wallet switching should be skipped
*/
-function shouldSkipWalletSwitch(
+function shouldSkipWalletSwitch (
requestedWalletId: string | undefined,
activeWalletId: string | null,
isSwitchingWallet: boolean,
@@ -45,52 +46,42 @@ function shouldSkipWalletSwitch(
/**
* Check if the requested wallet is a temporary wallet
*/
-function isTemporaryWalletId(walletId: string | undefined): boolean {
+function isTemporaryWalletId (walletId: string | undefined): boolean {
return walletId === '__temporary__'
}
/**
* Normalize error to Error instance
*/
-function normalizeErrorToError(error: unknown): Error {
+function normalizeErrorToError (error: unknown): Error {
return error instanceof Error ? error : new Error(String(error))
}
/**
* Hook to interact with wallet data (addresses and account methods)
- *
+ *
* PURPOSE: Use this hook for wallet operations AFTER the wallet has been initialized.
* This hook provides access to wallet addresses and account methods.
- *
- * When to use which hook:
- * - **App initialization state**: Use `useWdkApp()` to check if app is ready
- * - **Wallet lifecycle** (create, load, import, delete): Use `useWalletManager()`
- * - **Wallet operations** (addresses, account methods): Use this hook (`useWallet()`)
- * - **Balance fetching**: Use `useBalance()` hook with TanStack Query
- *
+ *
+ * @template TMethods - Optional map of method names to definitions (args/result) for strict typing.
+ * Defaults to LooseMethods (any string, any args).
+ *
* @example
* ```tsx
- * // First, check if app is ready
- * const { isReady } = useWdkApp()
- * if (!isReady) return
- *
- * // Then use wallet operations
- * const { addresses, getAddress, callAccountMethod } = useWallet()
- *
- * // Use specific wallet (automatically switches if needed)
- * const { addresses, getAddress } = useWallet({ walletId: 'user@example.com' })
- *
- * // Auto-load addresses for specific account indices
- * const { addresses } = useWallet({ autoLoadAccountIndices: [0, 1, 2] })
- * // Addresses will be automatically loaded when wallet is initialized
- *
- * // Note: For creating temporary wallets, use useWalletManager().createTemporaryWallet()
+ * // Loose typing (default)
+ * const { callAccountMethod } = useWallet()
+ * await callAccountMethod('eth', 0, 'someMethod', { ... })
+ *
+ * // Strict typing (with generated types)
+ * import type { AppMethods } from './.wdk-bundle/types'
+ * const { callAccountMethod } = useWallet()
+ * await callAccountMethod('eth', 0, 'signTransaction', { ... }) // Strictly typed!
* ```
*/
-export interface UseWalletResult {
+export interface UseWalletResult {
// State (reactive)
- addresses: Record> // network -> accountIndex -> address (for current wallet)
- walletLoading: Record // loading states for current wallet
+ addresses: Record> // network -> accountIndex -> address (for current wallet)
+ walletLoading: Record // loading states for current wallet
isInitialized: boolean
// Switching state
isSwitchingWallet: boolean
@@ -103,19 +94,29 @@ export interface UseWalletResult {
// Actions
getAddress: (network: string, accountIndex?: number) => Promise
loadAllAddresses: (accountIndices?: number[]) => Promise>>
- callAccountMethod: (
+
+ /**
+ * Call a method on a wallet account
+ *
+ * @template K - Method name (key of TMethods)
+ * @param network - Network name
+ * @param accountIndex - Account index
+ * @param methodName - Method name
+ * @param args - Method arguments (single value or array for multi-param methods)
+ */
+ callAccountMethod: (
network: string,
accountIndex: number,
- methodName: string,
- args?: unknown
- ) => Promise
+ methodName: K,
+ args?: TMethods[K]['args'] | unknown[]
+ ) => Promise
}
-export function useWallet(options?: {
+export function useWallet (options?: {
walletId?: string
/** Account indices to automatically load addresses for */
autoLoadAccountIndices?: number[]
-}): UseWalletResult {
+}): UseWalletResult {
const workletStore = getWorkletStore()
const walletStore = getWalletStore()
@@ -141,14 +142,14 @@ export function useWallet(options?: {
if (!walletId) {
return {
addresses: EMPTY_ADDRESSES,
- walletLoading: EMPTY_WALLET_LOADING,
+ walletLoading: EMPTY_WALLET_LOADING
}
}
const addresses = state.addresses[walletId]
const walletLoading = state.walletLoading[walletId]
return {
- addresses: addresses || EMPTY_ADDRESSES,
- walletLoading: walletLoading || EMPTY_WALLET_LOADING,
+ addresses: (addresses != null) || EMPTY_ADDRESSES,
+ walletLoading: (walletLoading != null) || EMPTY_WALLET_LOADING
}
})
)
@@ -185,9 +186,7 @@ export function useWallet(options?: {
try {
// Use WalletSwitchingService for wallet switching logic (has mutex protection)
- await WalletSwitchingService.switchToWallet(requestedWalletId!, {
- autoStartWorklet: false,
- })
+ await WalletSwitchingService.switchToWallet(requestedWalletId!)
if (!cancelled) {
setIsTemporaryWallet(false)
@@ -221,18 +220,18 @@ export function useWallet(options?: {
const loadTriggeredRef = useRef('')
useEffect(() => {
const accountIndices = options?.autoLoadAccountIndices
- if (!accountIndices || accountIndices.length === 0) {
+ if ((accountIndices == null) || accountIndices.length === 0) {
return
}
// Create stable string key for account indices to compare
const accountIndicesKey = accountIndices.sort().join(',')
-
+
// Reset load trigger if account indices have changed
if (prevAccountIndicesRef.current !== accountIndicesKey) {
loadTriggeredRef.current = ''
}
-
+
// Don't load if wallet is not initialized or is switching
if (!isInitialized || isSwitchingWallet) {
return
@@ -244,12 +243,12 @@ export function useWallet(options?: {
}
// Check if all addresses are already loaded
- const networkConfigs = workletStore.getState().networkConfigs
- if (!networkConfigs) {
+ const wdkConfigs = workletStore.getState().wdkConfigs
+ if (wdkConfigs == null) {
return
}
-
- const networks = Object.keys(networkConfigs)
+
+ const networks = Object.values(wdkConfigs.networks).map(n => n.blockchain)
// Access walletState.addresses inside the effect without depending on walletState
const currentAddresses = walletState.addresses
const allLoaded = accountIndices.every((accountIndex) => {
@@ -278,14 +277,13 @@ export function useWallet(options?: {
// Load addresses in the background
// Use ref to track cancellation so cleanup function can properly cancel
const cancelledRef = { current: false }
-
+
// Load addresses for all account indices and networks in parallel
- // Reuse networkConfigs from earlier in the effect
- if (networkConfigs) {
- const networks = Object.keys(networkConfigs)
+ if (wdkConfigs) {
+ const networks = Object.values(wdkConfigs.networks).map(n => n.blockchain)
const loadPromises = accountIndices.flatMap((accountIndex) =>
- networks.map((network) =>
- AddressService.getAddress(network, accountIndex, targetWalletId)
+ networks.map(async (network) =>
+ await AddressService.getAddress(network, accountIndex, targetWalletId)
.catch((error: unknown) => {
if (!cancelledRef.current) {
logError(`[useWallet] Failed to load address for ${network}:${accountIndex}:`, error)
@@ -293,7 +291,7 @@ export function useWallet(options?: {
})
)
)
-
+
// Fire and forget - don't await, just trigger the loads
Promise.all(loadPromises).catch(() => {
// Errors already logged individually
@@ -325,7 +323,7 @@ export function useWallet(options?: {
// Get all addresses for a specific network
// Use addresses directly from walletState (stable reference from useShallow)
const getNetworkAddresses = useCallback((network: string) => {
- return addresses[network] || {}
+ return (addresses[network] != null) || {}
}, [addresses])
// Check if an address is loading
@@ -337,26 +335,26 @@ export function useWallet(options?: {
// Get a specific address (from cache or fetch)
const getAddress = useCallback(async (network: string, accountIndex: number = 0) => {
const walletId = targetWalletId || '__temporary__'
- return AddressService.getAddress(network, accountIndex, walletId)
+ return await AddressService.getAddress(network, accountIndex, walletId)
}, [targetWalletId])
// Load all addresses for specified account indices across all networks
const loadAllAddresses = useCallback(async (accountIndices: number[] = [0]) => {
const walletId = targetWalletId || '__temporary__'
- const networkConfigs = workletStore.getState().networkConfigs
- if (!networkConfigs) {
+ const wdkConfigs = workletStore.getState().wdkConfigs
+ if (wdkConfigs == null) {
return {} as Record>
}
-
- const networks = Object.keys(networkConfigs)
+
+ const networks = Object.values(wdkConfigs.networks).map(n => n.blockchain)
const result: Record> = {}
-
+
// Load addresses for all account indices and networks in parallel
const loadPromises = accountIndices.flatMap((accountIndex) =>
networks.map(async (network) => {
try {
const address = await AddressService.getAddress(network, accountIndex, walletId)
- if (!result[network]) {
+ if (result[network] == null) {
result[network] = {}
}
result[network][accountIndex] = address
@@ -365,20 +363,24 @@ export function useWallet(options?: {
}
})
)
-
+
await Promise.all(loadPromises)
return result
}, [targetWalletId])
// Call a method on a wallet account
- const callAccountMethod = useCallback(async (
+ const callAccountMethod = useCallback(async (
network: string,
accountIndex: number,
- methodName: string,
- args?: unknown
- ): Promise => {
- const walletId = targetWalletId || '__temporary__'
- return AccountService.callAccountMethod(network, accountIndex, methodName, args, walletId)
+ methodName: K,
+ args?: TMethods[K]['args'] | unknown[]
+ ): Promise => {
+ return await AccountService.callAccountMethod(
+ network,
+ accountIndex,
+ methodName,
+ args
+ )
}, [targetWalletId])
// Memoize the entire result object to ensure stable reference
@@ -400,7 +402,7 @@ export function useWallet(options?: {
// Actions
getAddress,
loadAllAddresses,
- callAccountMethod,
+ callAccountMethod
}), [
addresses,
walletLoading,
@@ -413,9 +415,8 @@ export function useWallet(options?: {
isLoadingAddress,
getAddress,
loadAllAddresses,
- callAccountMethod,
- ]);
+ callAccountMethod
+ ])
- return result;
+ return result
}
-
diff --git a/src/hooks/useWalletManager.ts b/src/hooks/useWalletManager.ts
index 1862115..192ef77 100644
--- a/src/hooks/useWalletManager.ts
+++ b/src/hooks/useWalletManager.ts
@@ -1,526 +1,374 @@
-/**
- * Wallet Manager Hook
- *
- * Consolidated hook for wallet setup, initialization, and lifecycle management.
- * This is the ONLY hook for wallet lifecycle operations.
- *
- * PURPOSE: Use this hook for wallet setup/auth flows (creating new wallets,
- * loading existing wallets, checking if wallet exists, deleting wallets, getting mnemonic).
- *
- * When to use which hook:
- * - **App initialization state**: Use `useWdkApp()` to check if app is ready
- * - **Wallet lifecycle** (create, load, import, delete): Use this hook (`useWalletManager()`)
- * - **Wallet operations** (addresses, account methods): Use `useWallet()` AFTER initialization
- * - **Balance fetching**: Use `useBalance()` hook with TanStack Query
- *
- * **Wallet Switching**: Use `useWallet({ walletId })` to switch wallets.
- *
- * @example
- * ```tsx
- * // Check if app is ready first
- * const { isReady } = useWdkApp()
- *
- * // Then use wallet manager for lifecycle operations
- * // networkConfigs is optional - it will be retrieved from workletStore if not provided
- * const {
- * createWallet,
- * initializeWallet,
- * initializeFromMnemonic,
- * hasWallet,
- * deleteWallet,
- * getMnemonic,
- * createTemporaryWallet,
- * isInitializing,
- * error
- * } = useWalletManager('user@example.com')
- *
- * // Create new wallet (persistent, requires biometrics)
- * // networkConfigs can be passed here or retrieved from store
- * await createWallet('user@example.com', networkConfigs)
- *
- * // Initialize wallet (create new or load existing)
- * await initializeWallet({ createNew: true })
- *
- * // Load existing wallet (requires biometric authentication)
- * await initializeWallet({ createNew: false })
- *
- * // Import from mnemonic
- * await initializeFromMnemonic('word1 word2 ... word12')
- *
- * // Create temporary wallet for previewing addresses (no biometrics, not saved)
- * await createTemporaryWallet()
- *
- * // Get mnemonic (requires biometric authentication if not cached)
- * const mnemonic = await getMnemonic()
- *
- * // Delete wallet
- * await deleteWallet()
- * ```
- */
-
-import { useCallback, useMemo, useState } from 'react'
-import { useShallow } from 'zustand/react/shallow'
import { produce } from 'immer'
-
+import { useMemo, useCallback } from 'react'
import { WalletSetupService } from '../services/walletSetupService'
import { WorkletLifecycleService } from '../services/workletLifecycleService'
-import { getWalletStore } from '../store/walletStore'
-import { getWorkletStore } from '../store/workletStore'
import {
+ getWalletStore,
updateWalletLoadingState,
- isWalletLoadingState,
- getWalletIdFromLoadingState,
+ WalletInfo
} from '../store/walletStore'
-import { withOperationMutex } from '../utils/operationMutex'
+import { getWorkletStore } from '../store/workletStore'
+import { WdkConfigs } from '../types'
import { log, logError } from '../utils/logger'
-import type { NetworkConfigs } from '../types'
-import type { WalletInfo } from '../store/walletStore'
+import { withOperationMutex } from '../utils/operationMutex'
+import { useShallow } from 'zustand/shallow'
-// Re-export WalletInfo for backward compatibility
export type { WalletInfo }
export interface UseWalletManagerResult {
- /** Initialize wallet - either create new or load existing */
- initializeWallet: (options?: {
- createNew?: boolean
- walletId?: string
- }) => Promise
- /** Initialize wallet from mnemonic seedphrase */
- initializeFromMnemonic: (mnemonic: string, walletId?: string) => Promise
- /** Check if wallet exists */
- hasWallet: (walletId?: string) => Promise
- /** Delete wallet */
- deleteWallet: (walletId?: string) => Promise
- /** Get mnemonic phrase (requires biometric authentication if not cached) */
- getMnemonic: (walletId?: string) => Promise
- /** Create a temporary wallet for previewing addresses (no biometrics, not saved) */
- createTemporaryWallet: () => Promise
+ /** The currently "Active" Wallet ID (Seed) loaded in the engine. */
+ activeWalletId: string | null
+
+ /** The current state of the active wallet. */
+ status: 'LOCKED' | 'UNLOCKED' | 'NO_WALLET' | 'LOADING' | 'ERROR'
+
+ /** Set the global active wallet (loads the seed). */
+ setActiveWalletId: (walletId: string) => void
+
+ /** List of backing Wallets (Seeds) managed by the device. */
+ wallets: WalletInfo[]
+
+ /** Create a new Wallet (Seed). */
+ createWallet: (walletId: string) => Promise
+
+ /** Restore a Wallet from Seed Phrase. Returns the new walletId. */
+ restoreWallet: (mnemonic: string, walletId: string) => Promise
+
+ /** Generate a mnemonic phrase. */
+ generateMnemonic: (wordCount?: 12 | 24) => Promise
+
+ /** Delete/Remove a wallet and all associated data. */
+ deleteWallet: (walletId: string) => Promise
+
/**
- * Get encryption key from cache or secure storage
- * Requires biometric authentication if not cached
- * @param walletId - Optional walletId override (defaults to hook's walletId)
+ * Locks the wallet.
+ * This clears all sensitive data from memory and stops the worklet.
*/
- getEncryptionKey: (walletId?: string) => Promise
+ lock: () => void
+
/**
- * Get encrypted seed from cache or secure storage (no biometrics required)
- * @param walletId - Optional walletId override (defaults to hook's walletId)
+ * Unlocks the currently active wallet.
+ * This typically triggers a biometric prompt to decrypt and load the wallet.
+ * @param walletId - Optional walletId to switch to before unlocking
*/
- getEncryptedSeed: (walletId?: string) => Promise
+ unlock: (walletId?: string) => Promise
+
+ /** Clear the wallet cache. */
+ clearCache: () => void
+
/**
- * Get encrypted entropy from cache or secure storage (no biometrics required)
- * @param walletId - Optional walletId override (defaults to hook's walletId)
+ * Create a temporary wallet for previewing addresses
+ * This creates a wallet in memory only (no biometrics, not saved to secure storage)
+ * Useful for previewing addresses before committing to creating a real wallet
+ *
+ * @param mnemonic - Optional mnemonic to restore from. If not provided, generates a new random wallet.
*/
- getEncryptedEntropy: (walletId?: string) => Promise
+ createTemporaryWallet: (mnemonic?: string) => Promise
+
/**
- * Load existing wallet credentials from secure storage
- * Requires biometric authentication if not cached
- * @param walletId - Optional walletId override (defaults to hook's walletId)
- * @returns Credentials object with encryptionKey and encryptedSeed
+ * Clear the temporary wallet session.
+ * Resets the WDK state and clears any temporary data from memory.
*/
+ clearTemporaryWallet: () => void
+
+ /** Get mnemonic phrase from wallet (requires biometric auth). */
+ getMnemonic: (walletId: string) => Promise
+
+ /** Get encryption key from cache or secure storage. */
+ getEncryptionKey: (walletId: string) => Promise
+
+ /** Get encrypted seed from cache or secure storage. */
+ getEncryptedSeed: (walletId: string) => Promise
+
+ /** Get encrypted entropy from cache or secure storage. */
+ getEncryptedEntropy: (walletId: string) => Promise
+
+ /** Load existing wallet credentials. */
loadExistingWallet: (
- walletId?: string,
- ) => Promise<{ encryptionKey: string; encryptedSeed: string }>
- /** Whether initialization is in progress */
- isInitializing: boolean
- /** Error message if any */
- error: string | null
- /** Clear error state */
- clearError: () => void
- /** Clear active wallet ID (useful when switching users or logging out) */
- clearActiveWallet: () => void
- // Wallet list operations (merged from useWalletList)
- /** List of all known wallets */
- wallets: WalletInfo[]
- /** Currently active wallet identifier */
- activeWalletId: string | null
- /** Create a new wallet with the given walletId (adds to list) */
- createWallet: (
walletId: string,
- networkConfigs?: NetworkConfigs,
- ) => Promise
- /** Refresh the wallet list */
+ ) => Promise<{ encryptionKey: string, encryptedSeed: string }>
+
+ /** Generate entropy and encrypt (for creating new wallets). */
+ generateEntropyAndEncrypt: (wordCount?: 12 | 24) => Promise<{
+ encryptionKey: string
+ encryptedSeedBuffer: string
+ encryptedEntropyBuffer: string
+ }>
+
+ /** Get mnemonic from encrypted entropy. */
+ getMnemonicFromEntropy: (
+ encryptedEntropy: string,
+ encryptionKey: string,
+ ) => Promise<{ mnemonic: string }>
+
+ /** Get seed and entropy from mnemonic phrase. */
+ getSeedAndEntropyFromMnemonic: (mnemonic: string) => Promise<{
+ encryptionKey: string
+ encryptedSeedBuffer: string
+ encryptedEntropyBuffer: string
+ }>
+
+ /** Refresh the wallet list. */
refreshWalletList: (knownIdentifiers?: string[]) => Promise
- /** Whether wallet list operation is in progress */
- isWalletListLoading: boolean
- /** Wallet list error message if any */
- walletListError: string | null
}
-export function useWalletManager(
- walletId?: string,
- networkConfigs?: NetworkConfigs,
-): UseWalletManagerResult {
- const [error, setError] = useState(null)
-
- // Local loading and error state for wallet list operations (ephemeral, only used in this hook)
- const [isWalletListLoading, setIsWalletListLoading] = useState(false)
- const [walletListError, setWalletListError] = useState(null)
-
+export function useWalletManager (): UseWalletManagerResult {
const walletStore = getWalletStore()
const workletStore = getWorkletStore()
- /**
- * Get networkConfigs from parameter or workletStore
- * Throws error if not available from either source
- */
- const getNetworkConfigs = useCallback((): NetworkConfigs => {
- const networkConfigsFromStore = workletStore.getState().networkConfigs
- const effectiveNetworkConfigs = networkConfigs ?? networkConfigsFromStore
+ const getWdkConfigs = useCallback((): WdkConfigs => {
+ const storedWdkConfigs = workletStore.getState().wdkConfigs
- if (!effectiveNetworkConfigs) {
+ if (storedWdkConfigs == null) {
throw new Error(
- 'networkConfigs is required. Either provide it as a parameter or ensure the worklet is started with networkConfigs.',
+ 'wdkConfigs is required. Either provide it as a parameter or ensure the worklet is started with wdkConfigs.'
)
}
- return effectiveNetworkConfigs
- }, [networkConfigs])
+ return storedWdkConfigs
+ }, [])
// Note: workletStore removed from deps - it's a singleton that never changes
// Subscribe to wallet list state and loading state from Zustand
- const walletListState = walletStore(
+ const { wallets, activeWalletId, walletLoadingState } = walletStore(
useShallow((state) => ({
wallets: state.walletList,
activeWalletId: state.activeWalletId,
- walletLoadingState: state.walletLoadingState,
- })),
+ walletLoadingState: state.walletLoadingState
+ }))
)
- // Derive isInitializing from walletLoadingState (single source of truth)
- // Check if the current walletId matches the loading state identifier
- const isInitializing = useMemo(() => {
- const loadingState = walletListState.walletLoadingState
- const currentWalletId = walletId || walletListState.activeWalletId
- const loadingWalletId = getWalletIdFromLoadingState(loadingState)
-
- // Only consider it initializing if:
- // 1. The loading state indicates loading/checking
- // 2. The walletId matches (or no walletId specified, meaning we're tracking active wallet)
- return (
- isWalletLoadingState(loadingState) &&
- (currentWalletId === null ||
- currentWalletId === loadingWalletId ||
- walletId === undefined)
- )
- }, [
- walletListState.walletLoadingState,
- walletId,
- walletListState.activeWalletId,
- ])
+ const { isInitialized: isWdkInitialized } = workletStore(
+ useShallow((state) => ({
+ isInitialized: state.isInitialized
+ }))
+ )
- /**
- * Initialize wallet - either create new or load existing
- *
- * @param options - Wallet initialization options
- * @param options.createNew - If true, creates a new wallet; if false, loads existing wallet
- * @param options.walletId - Optional walletId override (defaults to hook's walletId)
- */
- const initializeWallet = useCallback(
- async (options: { createNew?: boolean; walletId?: string } = {}) => {
- setError(null)
- const targetWalletId = options.walletId ?? walletId
- const walletStore = getWalletStore()
- const effectiveNetworkConfigs = getNetworkConfigs()
+ const status: 'LOCKED' | 'UNLOCKED' | 'NO_WALLET' | 'LOADING' | 'ERROR' =
+ useMemo(() => {
+ if (walletLoadingState.type === 'loading') {
+ return 'LOADING'
+ }
- try {
- // Check if wallet is already ready before attempting to initialize
- // This prevents unnecessary initialization calls when the wallet is already loaded
- if (targetWalletId) {
- const currentWalletState = walletStore.getState().walletLoadingState
- if (
- currentWalletState.type === 'ready' &&
- currentWalletState.identifier === targetWalletId
- ) {
- log(
- '[useWalletManager] Wallet already ready - skipping initialization',
- { targetWalletId },
- )
- return
- }
- }
+ if (walletLoadingState.type === 'error') {
+ return 'ERROR'
+ }
- // Update loading state in store (single source of truth)
- if (targetWalletId) {
- walletStore.setState((prev) =>
- updateWalletLoadingState(prev, {
- type: 'loading',
- identifier: targetWalletId,
- walletExists: true,
- }),
- )
- }
+ if (!activeWalletId) {
+ return 'NO_WALLET'
+ }
- await WalletSetupService.initializeWallet(effectiveNetworkConfigs, {
- ...options,
- walletId: targetWalletId,
- })
+ if (isWdkInitialized) {
+ return 'UNLOCKED'
+ }
- // Mark as ready on success
- // Wallet is ready when initializeWDK() completes successfully, even if addresses don't exist yet
- // (Addresses are lazy-loaded when getAddress() is called)
- // This matches the pattern used in WalletSwitchingService.switchToWallet()
- if (targetWalletId) {
- walletStore.setState((prev) => {
- const currentState = prev.walletLoadingState
- const addresses = prev.addresses[targetWalletId]
- const hasAddresses = !!(
- addresses && Object.keys(addresses).length > 0
- )
+ return 'LOCKED'
+ }, [activeWalletId, walletLoadingState.type, isWdkInitialized])
- // If addresses exist, we can set to ready if state allows it
- // WdkAppProvider will also handle transitions when addresses appear
- if (hasAddresses) {
- // Only set to ready if current state allows the transition
- // Valid transitions to ready: from 'loading' or 'checking'
- if (
- currentState.type === 'loading' ||
- currentState.type === 'checking'
- ) {
- // Also set activeWalletId to prevent WdkAppProvider from resetting state
- return produce(
- updateWalletLoadingState(prev, {
- type: 'ready',
- identifier: targetWalletId,
- }),
- (state) => {
- state.activeWalletId = targetWalletId
- },
- )
- }
- // If state is 'not_loaded', let WdkAppProvider handle it (it will transition when addresses exist)
- // If state is already 'ready', don't change it
- return prev
- }
+ const setActiveWalletId = useCallback((walletId: string) => {
+ const walletStore = getWalletStore()
+ walletStore.setState({ activeWalletId: walletId })
+ }, [])
- // If no addresses yet, set to ready if state is 'loading' or 'checking' (normal case)
- // The wallet is ready when WDK is initialized with correct credentials, addresses can be fetched lazily
- // Note: Cannot transition from 'not_loaded' directly to 'ready' - must go through 'loading' first
- if (
- currentState.type === 'loading' ||
- currentState.type === 'checking'
- ) {
- // Also set activeWalletId to prevent WdkAppProvider from resetting state
- return produce(
- updateWalletLoadingState(prev, {
- type: 'ready',
- identifier: targetWalletId,
- }),
- (state) => {
- state.activeWalletId = targetWalletId
- },
- )
- } else if (currentState.type === 'not_loaded') {
- // State was reset to not_loaded by WdkAppProvider
- // We need to transition through 'loading' first, then 'ready'
- // Since initializeWDK() already completed successfully, we can do both transitions
- // in sequence within the same setState call
- log(
- '[useWalletManager] State reset to not_loaded, transitioning through loading to ready',
- {
- targetWalletId,
- hasAddresses,
- },
- )
- // First transition: not_loaded -> loading
- const loadingStateUpdate = updateWalletLoadingState(prev, {
- type: 'loading',
- identifier: targetWalletId,
- walletExists: true,
- })
- // Second transition: loading -> ready (using the updated state)
- const readyStateUpdate = updateWalletLoadingState(
- loadingStateUpdate,
- {
- type: 'ready',
- identifier: targetWalletId,
- },
- )
- // Also set activeWalletId to prevent WdkAppProvider from resetting state
- return produce(readyStateUpdate, (state) => {
- state.activeWalletId = targetWalletId
- })
- } else {
- // State is 'ready' or 'error' - don't change it
- log(
- '[useWalletManager] Wallet already in final state, not changing',
- {
- currentState: currentState.type,
- targetWalletId,
- hasAddresses,
- },
- )
- return prev
- }
+ const unlock = useCallback(
+ async (walletId?: string) => {
+ // If walletId provided, set it as active first
+ if (walletId) {
+ walletStore.setState({ activeWalletId: walletId })
+ }
+
+ const targetWalletId = walletStore.getState().activeWalletId
+
+ if (!targetWalletId) {
+ log('[useWalletManager] No wallet is selected', { targetWalletId })
+
+ return
+ }
+
+ try {
+ walletStore.setState((prev) =>
+ updateWalletLoadingState(prev, {
+ type: 'loading',
+ identifier: targetWalletId,
+ walletExists: true
})
- }
+ )
+
+ await WalletSetupService.initializeWallet({
+ walletId: targetWalletId
+ })
+
+ walletStore.setState((prev) =>
+ updateWalletLoadingState(prev, {
+ type: 'ready',
+ identifier: targetWalletId
+ })
+ )
} catch (err) {
+ logError('Failed to unlock wallet:', err)
const errorMessage = err instanceof Error ? err.message : String(err)
- const errorObj = err instanceof Error ? err : new Error(String(err))
- logError('Failed to initialize wallet:', err)
- setError(errorMessage)
-
- // Cleanup state on error
- if (targetWalletId) {
- walletStore.setState((prev) =>
- updateWalletLoadingState(prev, {
- type: 'error',
- identifier: targetWalletId,
- error: errorObj,
- }),
- )
- }
-
+ walletStore.setState((prev) =>
+ updateWalletLoadingState(prev, {
+ type: 'error',
+ identifier: targetWalletId,
+ error: new Error(errorMessage)
+ })
+ )
throw err
}
},
- [getNetworkConfigs, walletId],
+ [walletStore]
)
- /**
- * Check if wallet exists
- *
- * @param walletId - Optional walletId override (defaults to hook's walletId)
- * @returns Promise resolving to true if wallet exists, false otherwise
- */
- const hasWallet = useCallback(
- async (walletIdParam?: string): Promise => {
- return WalletSetupService.hasWallet(walletIdParam ?? walletId)
+ const checkWallet = useCallback(
+ async (walletId: string): Promise => {
+ try {
+ return await WalletSetupService.hasWallet(walletId)
+ } catch (err) {
+ logError('Failed to check wallet:', err)
+ return false
+ }
},
- [walletId],
+ []
)
- /**
- * Initialize wallet from mnemonic seedphrase
- *
- * @param mnemonic - Mnemonic phrase to import
- * @param walletId - Optional walletId override (defaults to hook's walletId)
- */
- const initializeFromMnemonic = useCallback(
- async (mnemonic: string, walletIdParam?: string) => {
- setError(null)
- const targetWalletId = walletIdParam ?? walletId
- const walletStore = getWalletStore()
- const effectiveNetworkConfigs = getNetworkConfigs()
-
+ const refreshWalletList = useCallback(
+ async (knownIdentifiers?: string[]) => {
try {
- // Update loading state in store (single source of truth)
- if (targetWalletId) {
- walletStore.setState((prev) =>
- updateWalletLoadingState(prev, {
- type: 'loading',
- identifier: targetWalletId,
- walletExists: false, // New wallet from mnemonic
- }),
- )
+ const identifiersToCheck = (knownIdentifiers != null) || []
+ const { activeWalletId: currentActiveId } = walletStore.getState()
+
+ if (identifiersToCheck.length === 0) {
+ const defaultExists = await checkWallet('default')
+ return walletStore.setState({
+ walletList: [
+ {
+ identifier: 'default',
+ exists: defaultExists,
+ isActive: currentActiveId === 'default'
+ }
+ ]
+ })
}
- await WalletSetupService.initializeFromMnemonic(
- effectiveNetworkConfigs,
- mnemonic,
- targetWalletId,
+ const walletChecks = await Promise.all(
+ identifiersToCheck.map(async (id) => ({
+ identifier: id,
+ exists: await checkWallet(id),
+ isActive: currentActiveId === id
+ }))
)
+ return walletStore.setState({ walletList: walletChecks })
+ } catch (err) {
+ logError('Failed to refresh wallet list:', err)
+ throw err
+ }
+ },
+ [checkWallet]
+ )
- // Mark as ready on success
- if (targetWalletId) {
- walletStore.setState((prev) =>
- updateWalletLoadingState(prev, {
- type: 'ready',
- identifier: targetWalletId,
- }),
- )
- }
+ const restoreWallet = useCallback(
+ async (mnemonic: string, walletId: string): Promise => {
+ const exists = await WalletSetupService.hasWallet(walletId)
+
+ if (exists) {
+ throw new Error(`A wallet with the ID "${walletId}" already exists.`)
+ }
+
+ try {
+ walletStore.setState((prev) =>
+ updateWalletLoadingState(prev, {
+ type: 'loading',
+ identifier: walletId,
+ walletExists: false
+ })
+ )
+
+ // Call the service to perform the actual crypto and storage
+ await WalletSetupService.initializeFromMnemonic(mnemonic, walletId)
+
+ // Refresh the main wallet list so the UI updates
+ await refreshWalletList()
+
+ walletStore.setState((prev) =>
+ updateWalletLoadingState(prev, {
+ type: 'ready',
+ identifier: walletId
+ })
+ )
+
+ // Return the new wallet's ID as promised by the spec
+ return walletId
} catch (err) {
+ logError('Failed to restore wallet:', err)
const errorMessage = err instanceof Error ? err.message : String(err)
- const errorObj = err instanceof Error ? err : new Error(String(err))
- logError('Failed to initialize wallet from mnemonic:', err)
- setError(errorMessage)
-
- // Cleanup state on error
- if (targetWalletId) {
- walletStore.setState((prev) =>
- updateWalletLoadingState(prev, {
- type: 'error',
- identifier: targetWalletId,
- error: errorObj,
- }),
- )
- }
-
+ walletStore.setState((prev) =>
+ updateWalletLoadingState(prev, {
+ type: 'error',
+ identifier: walletId,
+ error: new Error(errorMessage)
+ })
+ )
throw err
}
},
- [getNetworkConfigs, walletId],
+ [refreshWalletList, walletStore]
)
- /**
- * Delete wallet
- *
- * @param walletId - Optional walletId override (defaults to hook's walletId)
- * If not provided, deletes the default wallet
- */
const deleteWallet = useCallback(
- async (walletIdParam?: string) => {
- setError(null)
+ async (walletId: string) => {
+ if (!walletId) {
+ throw new Error('Wallet ID is required for deletion')
+ }
try {
- const targetWalletId = walletIdParam ?? walletId
- if (!targetWalletId) {
- throw new Error('Wallet ID is required for deletion')
- }
-
- await WalletSetupService.deleteWallet(targetWalletId)
+ await WalletSetupService.deleteWallet(walletId)
- // Remove from wallet list and clear all wallet-specific data
walletStore.setState((prev) =>
produce(prev, (state) => {
- delete state.addresses[targetWalletId]
- delete state.balances[targetWalletId]
- delete state.accountList[targetWalletId]
- delete state.lastBalanceUpdate[targetWalletId]
- delete state.walletLoading[targetWalletId]
- delete state.balanceLoading[targetWalletId]
+ delete state.addresses[walletId]
+ delete state.balances[walletId]
+ delete state.accountList[walletId]
+ delete state.lastBalanceUpdate[walletId]
+ delete state.walletLoading[walletId]
+ delete state.balanceLoading[walletId]
state.walletList = state.walletList.filter(
- ({ identifier }) => identifier !== targetWalletId,
+ ({ identifier }) => identifier !== walletId
)
- if (state.activeWalletId === targetWalletId) {
+ if (state.activeWalletId === walletId) {
state.activeWalletId = null
state.walletLoadingState = { type: 'not_loaded' }
}
- }),
+ })
)
log(
- `[useWalletManager] Deleted wallet and cleared all data: ${targetWalletId}`,
+ `[useWalletManager] Deleted wallet and cleared all data: ${walletId}`
)
} catch (err) {
- const errorMessage = err instanceof Error ? err.message : String(err)
logError('Failed to delete wallet:', err)
- setError(errorMessage)
throw err
}
},
- [walletId],
+ [walletStore]
)
/**
* Get mnemonic phrase from wallet
* Requires biometric authentication if credentials are not cached
- *
- * @param walletId - Optional walletId override (defaults to hook's walletId)
- * @returns Promise resolving to mnemonic phrase or null if not found
*/
const getMnemonic = useCallback(
- async (walletIdParam?: string): Promise => {
+ async (walletId: string): Promise => {
try {
- return await WalletSetupService.getMnemonic(walletIdParam ?? walletId)
+ return await WalletSetupService.getMnemonic(walletId)
} catch (err) {
logError('Failed to get mnemonic:', err)
throw err
}
},
- [walletId],
+ []
)
/**
@@ -531,17 +379,15 @@ export function useWalletManager(
* @returns Promise resolving to encryption key or null if not found
*/
const getEncryptionKey = useCallback(
- async (walletIdParam?: string): Promise => {
+ async (walletId: string): Promise => {
try {
- return await WalletSetupService.getEncryptionKey(
- walletIdParam ?? walletId,
- )
+ return await WalletSetupService.getEncryptionKey(walletId)
} catch (err) {
logError('Failed to get encryption key:', err)
throw err
}
},
- [walletId],
+ []
)
/**
@@ -551,17 +397,15 @@ export function useWalletManager(
* @returns Promise resolving to encrypted seed or null if not found
*/
const getEncryptedSeed = useCallback(
- async (walletIdParam?: string): Promise => {
+ async (walletId: string): Promise => {
try {
- return await WalletSetupService.getEncryptedSeed(
- walletIdParam ?? walletId,
- )
+ return await WalletSetupService.getEncryptedSeed(walletId)
} catch (err) {
logError('Failed to get encrypted seed:', err)
throw err
}
},
- [walletId],
+ []
)
/**
@@ -571,256 +415,314 @@ export function useWalletManager(
* @returns Promise resolving to encrypted entropy or null if not found
*/
const getEncryptedEntropy = useCallback(
- async (walletIdParam?: string): Promise => {
+ async (walletId: string): Promise => {
try {
- return await WalletSetupService.getEncryptedEntropy(
- walletIdParam ?? walletId,
- )
+ return await WalletSetupService.getEncryptedEntropy(walletId)
} catch (err) {
logError('Failed to get encrypted entropy:', err)
throw err
}
},
- [walletId],
+ []
)
/**
* Load existing wallet credentials from secure storage
* Requires biometric authentication if not cached
*
- * @param walletId - Optional walletId override (defaults to hook's walletId)
* @returns Promise resolving to credentials object with encryptionKey and encryptedSeed
*/
const loadExistingWallet = useCallback(
async (
- walletIdParam?: string,
- ): Promise<{ encryptionKey: string; encryptedSeed: string }> => {
+ walletId: string
+ ): Promise<{ encryptionKey: string, encryptedSeed: string }> => {
try {
- return await WalletSetupService.loadExistingWallet(
- walletIdParam ?? walletId,
- )
+ return await WalletSetupService.loadExistingWallet(walletId)
} catch (err) {
logError('Failed to load existing wallet:', err)
throw err
}
},
- [walletId],
+ []
)
/**
- * Clear error state
+ * Generate entropy and encrypt (for creating new wallets)
*/
- const clearError = useCallback(() => {
- setError(null)
- }, [])
+ const generateEntropyAndEncrypt = useCallback(
+ async (wordCount?: 12 | 24) => {
+ try {
+ const effectiveWdkConfigs = getWdkConfigs()
- /**
- * Clear active wallet ID
- * Useful when switching users or logging out to prevent auto-initialization with wrong wallet
- */
- const clearActiveWallet = useCallback(() => {
- walletStore.setState({ activeWalletId: null })
- log('[useWalletManager] Cleared active wallet ID')
- }, [])
+ await WorkletLifecycleService.ensureWorkletStarted(
+ effectiveWdkConfigs,
+ { autoStart: true }
+ )
- /**
- * Create a temporary wallet for previewing addresses
- * This creates a wallet in memory only (no biometrics, not saved to secure storage)
- * Useful for previewing addresses before committing to creating a real wallet
- */
- const createTemporaryWallet = useCallback(async () => {
- return withOperationMutex('createTemporaryWallet', async () => {
- setError(null)
+ return await WorkletLifecycleService.generateEntropyAndEncrypt(
+ wordCount
+ )
+ } catch (err) {
+ logError('Failed to generate entropy:', err)
+ throw err
+ }
+ },
+ [getWdkConfigs]
+ )
+ const getMnemonicFromEntropy = useCallback(
+ async (encryptedEntropy: string, encryptionKey: string) => {
try {
- const effectiveNetworkConfigs = getNetworkConfigs()
+ const effectiveWdkConfigs = getWdkConfigs()
- // Ensure worklet is started (auto-start if needed)
await WorkletLifecycleService.ensureWorkletStarted(
- effectiveNetworkConfigs,
- { autoStart: true },
+ effectiveWdkConfigs,
+ { autoStart: true }
)
- // Generate entropy and encrypt (no biometrics, no keychain save)
- const result = await WorkletLifecycleService.generateEntropyAndEncrypt()
+ return await WorkletLifecycleService.getMnemonicFromEntropy(
+ encryptedEntropy,
+ encryptionKey
+ )
+ } catch (err) {
+ logError('Failed to get mnemonic from entropy:', err)
+ throw err
+ }
+ },
+ [getWdkConfigs]
+ )
- // Initialize WDK with temporary credentials
- await WorkletLifecycleService.initializeWDK({
- encryptionKey: result.encryptionKey,
- encryptedSeed: result.encryptedSeedBuffer,
- })
+ const getSeedAndEntropyFromMnemonic = useCallback(
+ async (mnemonic: string) => {
+ try {
+ const effectiveWdkConfigs = getWdkConfigs()
- // Don't update activeWalletId for temporary wallet (it's not a real wallet)
- // Temporary wallets don't affect walletLoadingState
- log('[useWalletManager] Temporary wallet created successfully')
+ // Ensure worklet is started
+ await WorkletLifecycleService.ensureWorkletStarted(
+ effectiveWdkConfigs,
+ { autoStart: true }
+ )
+
+ return await WorkletLifecycleService.getSeedAndEntropyFromMnemonic(
+ mnemonic
+ )
} catch (err) {
- const errorMessage = err instanceof Error ? err.message : String(err)
- const errorObj = err instanceof Error ? err : new Error(String(err))
- logError('[useWalletManager] Failed to create temporary wallet:', err)
- setError(errorMessage)
+ logError('Failed to get seed from mnemonic:', err)
throw err
}
- })
- }, [getNetworkConfigs])
+ },
+ [getWdkConfigs]
+ )
/**
- * Check if a wallet exists (for wallet list operations)
+ * Clear active wallet ID
+ * Useful when switching users or logging out to prevent auto-initialization with wrong wallet
*/
- const checkWallet = useCallback(
- async (walletId: string): Promise => {
- try {
- return await WalletSetupService.hasWallet(walletId)
- } catch (err) {
- logError('Failed to check wallet:', err)
- return false
- }
+ const lock = useCallback(() => {
+ if (walletStore.getState().activeWalletId) {
+ WorkletLifecycleService.reset()
+ walletStore.setState({
+ activeWalletId: null,
+ walletLoadingState: { type: 'not_loaded' }
+ })
+ log('[useWalletManager] Locked wallet and cleared active wallet ID')
+ }
+ }, [walletStore])
+
+ const generateMnemonic = useCallback(
+ async (wordCount: 12 | 24 = 12): Promise => {
+ const { encryptedEntropyBuffer, encryptionKey } =
+ await generateEntropyAndEncrypt(wordCount)
+
+ const { mnemonic } = await getMnemonicFromEntropy(
+ encryptedEntropyBuffer,
+ encryptionKey
+ )
+
+ return mnemonic
},
- [],
+ [generateEntropyAndEncrypt, getMnemonicFromEntropy]
)
/**
- * Refresh the wallet list
+ * Create a temporary wallet for previewing addresses
+ * This creates a wallet in memory only (no biometrics, not saved to secure storage)
+ * Useful for previewing addresses before committing to creating a real wallet
+ *
+ * @param mnemonic - Optional mnemonic to restore from. If not provided, generates a new random wallet.
*/
- const refreshWalletList = useCallback(
- async (knownIdentifiers?: string[]) => {
- setIsWalletListLoading(true)
- setWalletListError(null)
+ const createTemporaryWallet = useCallback(
+ async (mnemonic?: string) => {
+ return await withOperationMutex('createTemporaryWallet', async () => {
+ try {
+ const effectiveWdkConfigs = getWdkConfigs()
+
+ // Ensure worklet is started (auto-start if needed)
+ await WorkletLifecycleService.ensureWorkletStarted(
+ effectiveWdkConfigs,
+ { autoStart: true }
+ )
- try {
- const identifiersToCheck = knownIdentifiers || []
- const { activeWalletId: currentActiveId } = walletStore.getState()
+ let encryptionKey: string
+ let encryptedSeed: string
- // If no known identifiers provided, check default wallet
- if (identifiersToCheck.length === 0) {
- const defaultExists = await checkWallet('default')
- return walletStore.setState({
- walletList: [
- {
- identifier: 'default',
- exists: defaultExists,
- isActive: currentActiveId === 'default',
- },
- ],
+ if (mnemonic) {
+ const result =
+ await WorkletLifecycleService.getSeedAndEntropyFromMnemonic(
+ mnemonic
+ )
+ encryptionKey = result.encryptionKey
+ encryptedSeed = result.encryptedSeedBuffer
+ } else {
+ // Generate entropy and encrypt (no biometrics, no keychain save)
+ const result =
+ await WorkletLifecycleService.generateEntropyAndEncrypt()
+ encryptionKey = result.encryptionKey
+ encryptedSeed = result.encryptedSeedBuffer
+ }
+
+ // Initialize WDK with temporary credentials
+ await WorkletLifecycleService.initializeWDK({
+ encryptionKey,
+ encryptedSeed
})
- }
- // Check all known identifiers
- const walletChecks = await Promise.all(
- identifiersToCheck.map(async (id) => ({
- identifier: id,
- exists: await checkWallet(id),
- isActive: currentActiveId === id,
- })),
- )
- return walletStore.setState({ walletList: walletChecks })
- } catch (err) {
- const errorMessage = err instanceof Error ? err.message : String(err)
- logError('Failed to refresh wallet list:', err)
- setWalletListError(errorMessage)
- } finally {
- setIsWalletListLoading(false)
- }
+ // Don't update activeWalletId for temporary wallet (it's not a real wallet)
+ // Temporary wallets don't affect walletLoadingState
+ log('[useWalletManager] Temporary wallet created successfully')
+ } catch (err) {
+ logError('[useWalletManager] Failed to create temporary wallet:', err)
+ throw err
+ }
+ })
},
- [checkWallet],
+ [getWdkConfigs]
)
/**
* Create a new wallet and add it to the wallet list
*/
const createWallet = useCallback(
- async (walletId: string, walletNetworkConfigs?: NetworkConfigs) => {
- setIsWalletListLoading(true)
- setWalletListError(null)
-
+ async (walletId: string) => {
try {
- // Check if wallet already exists
+ walletStore.setState((prev) =>
+ updateWalletLoadingState(prev, {
+ type: 'loading',
+ identifier: walletId,
+ walletExists: false
+ })
+ )
+
const exists = await checkWallet(walletId)
if (exists) {
throw new Error(`Wallet with walletId "${walletId}" already exists`)
}
- // Use provided networkConfigs or get from store
- const effectiveNetworkConfigs =
- walletNetworkConfigs ?? getNetworkConfigs()
+ await WalletSetupService.createNewWallet(walletId)
- // Create wallet using WalletSetupService
- await WalletSetupService.createNewWallet(
- effectiveNetworkConfigs,
- walletId,
- )
-
- // Add to wallet list and set as active wallet
walletStore.setState((prev) =>
produce(prev, (state) => {
state.walletList.push({
identifier: walletId,
exists: true,
- isActive: true,
+ isActive: true
})
// Set as active wallet so WdkAppProvider can auto-initialize on restart
state.activeWalletId = walletId
- }),
+ })
+ )
+
+ walletStore.setState((prev) =>
+ updateWalletLoadingState(prev, {
+ type: 'ready',
+ identifier: walletId
+ })
)
log(`Created new wallet: ${walletId} and set as active`)
} catch (err) {
const errorMessage = err instanceof Error ? err.message : String(err)
logError('Failed to create wallet:', err)
- setWalletListError(errorMessage)
+ walletStore.setState((prev) =>
+ updateWalletLoadingState(prev, {
+ type: 'error',
+ identifier: walletId,
+ error: new Error(errorMessage)
+ })
+ )
throw err
- } finally {
- setIsWalletListLoading(false)
}
},
- [checkWallet],
+ [checkWallet, walletStore]
)
- // Memoize return object to prevent unnecessary re-renders
+ const clearCache = useCallback(() => {
+ walletStore.setState({
+ balances: {},
+ balanceLoading: {},
+ lastBalanceUpdate: {}
+ })
+ log('[useWalletManager] Cleared wallet cache')
+ }, [walletStore])
+
+ const clearTemporaryWallet = useCallback(() => {
+ WorkletLifecycleService.reset()
+ clearCache()
+ log('[useWalletManager] Cleared temporary wallet session')
+ }, [clearCache])
+
return useMemo(
() => ({
- initializeWallet,
- initializeFromMnemonic,
- hasWallet,
+ activeWalletId,
+ wallets,
+ status,
+
+ // Session Management
+ unlock,
+ lock,
+ setActiveWalletId,
+ clearCache,
+
+ // Wallet Management
+ createWallet,
+ createTemporaryWallet,
+ clearTemporaryWallet,
+ restoreWallet,
deleteWallet,
+ generateMnemonic,
getMnemonic,
- createTemporaryWallet,
+ generateEntropyAndEncrypt,
+ getMnemonicFromEntropy,
+ getSeedAndEntropyFromMnemonic,
getEncryptionKey,
getEncryptedSeed,
getEncryptedEntropy,
loadExistingWallet,
- isInitializing, // Derived from walletLoadingState (single source of truth)
- error,
- clearError,
- clearActiveWallet,
- // Wallet list operations
- wallets: walletListState.wallets,
- activeWalletId: walletListState.activeWalletId,
- createWallet,
- refreshWalletList,
- isWalletListLoading,
- walletListError,
+ refreshWalletList
}),
[
- initializeWallet,
- initializeFromMnemonic,
- hasWallet,
+ unlock,
+ lock,
+ setActiveWalletId,
+ clearCache,
+ createWallet,
+ createTemporaryWallet,
+ clearTemporaryWallet,
+ restoreWallet,
deleteWallet,
+ generateMnemonic,
getMnemonic,
- createTemporaryWallet,
+ generateEntropyAndEncrypt,
+ getMnemonicFromEntropy,
+ getSeedAndEntropyFromMnemonic,
getEncryptionKey,
getEncryptedSeed,
getEncryptedEntropy,
loadExistingWallet,
- isInitializing,
- error,
- clearError,
- clearActiveWallet,
- walletListState.wallets,
- walletListState.activeWalletId,
- createWallet,
refreshWalletList,
- isWalletListLoading,
- walletListError,
- ],
+ activeWalletId,
+ wallets,
+ status
+ ]
)
}
diff --git a/src/hooks/useWdkApp.ts b/src/hooks/useWdkApp.ts
index 1b7bf8d..ca1fab9 100644
--- a/src/hooks/useWdkApp.ts
+++ b/src/hooks/useWdkApp.ts
@@ -13,7 +13,7 @@
* Simple usage (most common):
* ```tsx
* import { AppStatus } from '@tetherto/wdk-react-native-core'
- *
+ *
* function MyComponent() {
* const { status, isReady, activeWalletId, error } = useWdkApp()
*
@@ -68,11 +68,10 @@ import type { WdkAppContextValue } from '../provider/WdkAppProvider'
* @returns WdkApp context value with initialization state
* @throws Error if used outside WdkAppProvider
*/
-export function useWdkApp(): WdkAppContextValue {
+export function useWdkApp (): WdkAppContextValue {
const context = useContext(WdkAppContext)
- if (!context) {
+ if (context == null) {
throw new Error('useWdkApp must be used within WdkAppProvider')
}
return context
}
-
diff --git a/src/hooks/useWorklet.ts b/src/hooks/useWorklet.ts
index 6dfa106..e40de6e 100644
--- a/src/hooks/useWorklet.ts
+++ b/src/hooks/useWorklet.ts
@@ -1,27 +1,24 @@
import { useShallow } from 'zustand/react/shallow'
-
-import type { HRPC } from '@tetherto/pear-wrk-wdk'
-import type { WorkletStartResponse } from '@tetherto/pear-wrk-wdk/types/rpc'
import type { Worklet } from 'react-native-bare-kit'
import { WorkletLifecycleService } from '../services/workletLifecycleService'
import { getWorkletStore } from '../store/workletStore'
-import type { NetworkConfigs } from '../types'
+import type { WdkConfigs, BundleConfig, HRPC, WorkletStartResponse } from '../types'
import type { WorkletStore } from '../store/workletStore'
/**
* Hook to interact with the worklet
- *
+ *
* This is the main hook that components should use to access worklet functionality.
- *
+ *
* For wallet-specific operations (addresses, accounts), use `useWallet()` hook instead.
- *
+ *
* The worklet automatically starts when `WdkAppProvider` loads.
- *
+ *
* @example
* ```tsx
* const { hrpc, isInitialized, isLoading, initializeWDK, generateEntropyAndEncrypt, error } = useWorklet()
- *
+ *
* useEffect(() => {
* if (isInitialized && !isLoading) {
* // Worklet is already started by WdkAppProvider
@@ -43,9 +40,9 @@ export interface UseWorkletResult {
wdkInitResult: { status?: string | null } | null
encryptedSeed: string | null
encryptionKey: string | null
- networkConfigs: NetworkConfigs | null
+ networkConfigs: WdkConfigs | null
// Actions
- initializeWDK: (options: { encryptionKey: string; encryptedSeed: string }) => Promise
+ initializeWDK: (options: { encryptionKey: string, encryptedSeed: string }) => Promise
generateEntropyAndEncrypt: (wordCount?: 12 | 24) => Promise<{
encryptionKey: string
encryptedSeedBuffer: string
@@ -60,13 +57,14 @@ export interface UseWorkletResult {
initializeWorklet: (options: {
encryptionKey: string
encryptedSeed: string
- networkConfigs: NetworkConfigs
+ networkConfigs: WdkConfigs
+ bundleConfig: BundleConfig
}) => Promise
reset: () => void
clearError: () => void
}
-export function useWorklet(): UseWorkletResult {
+export function useWorklet (): UseWorkletResult {
const store = getWorkletStore()
// Subscribe to state changes
@@ -81,7 +79,7 @@ export function useWorklet(): UseWorkletResult {
wdkInitResult: state.wdkInitResult,
encryptedSeed: state.encryptedSeed,
encryptionKey: state.encryptionKey,
- networkConfigs: state.networkConfigs,
+ networkConfigs: state.wdkConfigs
}))
const workletState = store(selector)
@@ -103,7 +101,6 @@ export function useWorklet(): UseWorkletResult {
getSeedAndEntropyFromMnemonic: WorkletLifecycleService.getSeedAndEntropyFromMnemonic,
initializeWorklet: WorkletLifecycleService.initializeWorklet,
reset: WorkletLifecycleService.reset,
- clearError: WorkletLifecycleService.clearError,
+ clearError: WorkletLifecycleService.clearError
}
}
-
diff --git a/src/index.ts b/src/index.ts
index 95542bd..1e688f5 100644
--- a/src/index.ts
+++ b/src/index.ts
@@ -1,114 +1,43 @@
/**
* @tetherto/wdk-react-native-core
- *
+ *
* Core functionality for React Native wallets
* Provides wallet management, balance fetching, and worklet operations
*/
-// Core Types (Network, Token, and Wallet types)
export type {
- NetworkConfig,
- NetworkConfigs,
- TokenConfig,
- NetworkTokens,
- TokenConfigs,
+ WdkConfigs,
+ AssetConfig,
Wallet,
- WalletAddresses,
- WalletBalances,
- BalanceLoadingStates,
BalanceFetchResult,
- TokenConfigProvider,
- TokenHelpers,
- WalletStore,
+ IAsset,
+ // Bundle and HRPC types
+ BundleConfig
} from './types'
-// HRPC Type Extensions (for extending HRPC functionality)
-export type { ExtendedHRPC } from './types/hrpc'
-export { isExtendedHRPC, asExtendedHRPC } from './types/hrpc'
+export { BaseAsset } from './entities/asset'
-// Provider (main entry point)
export { WdkAppProvider } from './provider/WdkAppProvider'
export type { WdkAppProviderProps, WdkAppContextValue } from './provider/WdkAppProvider'
-// Hooks (public API)
-export { useWorklet } from './hooks/useWorklet'
export { useWallet } from './hooks/useWallet'
export { useWdkApp } from './hooks/useWdkApp'
export { useWalletManager } from './hooks/useWalletManager'
export type { UseWalletManagerResult, WalletInfo } from './hooks/useWalletManager'
-export { useBalance, useBalancesForWallet, useBalancesForWallets, useRefreshBalance, balanceQueryKeys } from './hooks/useBalance'
-export type { AccountInfo } from './store/walletStore'
-export { getWalletStore } from './store/walletStore'
-export type { WalletStore as WalletStoreState } from './store/walletStore'
-
-// Validation Utilities (for validating configs before use)
-export {
- validateNetworkConfigs,
- validateTokenConfigs,
- validateBalanceRefreshInterval,
- validateAccountIndex,
- validateTokenAddress,
-} from './utils/validation'
-
-// Zod Schemas (for runtime validation)
export {
- networkConfigSchema,
- networkConfigsSchema,
- tokenConfigSchema,
- tokenConfigsSchema,
- walletAddressesSchema,
- walletBalancesSchema,
- accountIndexSchema,
- networkNameSchema,
- balanceStringSchema,
- ethereumAddressSchema,
- sparkAddressSchema,
- addressSchema,
-} from './utils/schemas'
-
-// Type Guards (for runtime type checking)
-export {
- isNetworkConfigs,
- isTokenConfigs,
- isEthereumAddress,
- isValidAccountIndex,
- isValidNetworkName,
-} from './utils/typeGuards'
+ useBalance,
+ useBalancesForWallet,
+ useBalancesForWallets,
+ useRefreshBalance,
+ balanceQueryKeys
+} from './hooks/useBalance'
-// Services
-export { WorkletLifecycleService } from './services/workletLifecycleService'
-export { AddressService } from './services/addressService'
-export { AccountService } from './services/accountService'
-export { BalanceService } from './services/balanceService'
-export { WalletSetupService } from './services/walletSetupService'
-export { WalletSwitchingService } from './services/walletSwitchingService'
+export type { AccountInfo } from './store/walletStore'
-// Utility Functions
export { validateMnemonic } from './utils/mnemonicUtils'
-export { convertBalanceToString, formatBalance, convertBigIntToString } from './utils/balanceUtils'
-export { normalizeError, getErrorMessage, isErrorType, createContextualError } from './utils/errorUtils'
-
-// Result Type (for error handling patterns)
-export type { Result } from './utils/result'
-export { ok, err, toResult, toResultSync } from './utils/result'
-// Initialization State Machine
-export {
- InitializationStatus,
- AppStatus,
- isErrorStatus,
- isReadyStatus,
- isInProgressStatus,
- isAppReadyStatus,
- isAppInProgressStatus,
- hasWorkletStarted,
- canLoadWallet,
- hasWorkletStartedApp,
- canLoadWalletApp,
- getStatusMessage,
- getAppStatusMessage,
- getWorkletStatus,
- getCombinedStatus
+export {
+ InitializationStatus,
+ AppStatus
} from './utils/initializationState'
-
diff --git a/src/provider/WdkAppProvider.tsx b/src/provider/WdkAppProvider.tsx
index 0d253ec..9da989e 100644
--- a/src/provider/WdkAppProvider.tsx
+++ b/src/provider/WdkAppProvider.tsx
@@ -23,7 +23,7 @@ import React, {
useCallback,
useEffect,
useMemo,
- useRef,
+ useRef
} from 'react'
import { AppState, type AppStateStatus } from 'react-native'
import { QueryClient, QueryClientProvider } from '@tanstack/react-query'
@@ -31,42 +31,28 @@ import { createSecureStorage } from '@tetherto/wdk-react-native-secure-storage'
import { useWalletManager } from '../hooks/useWalletManager'
import { useWorklet } from '../hooks/useWorklet'
-import { getWalletStore } from '../store/walletStore'
-import type { WalletStore } from '../store/walletStore'
import {
+ getWalletStore,
updateWalletLoadingState,
getWalletIdFromLoadingState,
isWalletLoadingState,
- isWalletErrorState,
+ isWalletErrorState
} from '../store/walletStore'
+import type { WalletStore } from '../store/walletStore'
import {
shouldResetToNotLoaded,
getWalletSwitchDecision,
- shouldMarkWalletAsReady,
- shouldHandleError,
+ shouldMarkWalletAsReady
} from '../utils/walletStateHelpers'
import { clearAllSensitiveData } from '../store/workletStore'
import { WalletSetupService } from '../services/walletSetupService'
import { WorkletLifecycleService } from '../services/workletLifecycleService'
import { normalizeError } from '../utils/errorUtils'
import { log, logError } from '../utils/logger'
-import {
- validateNetworkConfigs,
- validateTokenConfigs,
-} from '../utils/validation'
-import {
- DEFAULT_QUERY_STALE_TIME_MS,
- DEFAULT_QUERY_GC_TIME_MS,
-} from '../utils/constants'
-import {
- InitializationStatus,
- AppStatus,
- isAppReadyStatus,
- isAppInProgressStatus,
- getCombinedStatus,
- getWorkletStatus,
-} from '../utils/initializationState'
-import type { NetworkConfigs, TokenConfigs } from '../types'
+import { validateWdkConfigs } from '../utils/validation'
+import { DEFAULT_QUERY_STALE_TIME_MS, DEFAULT_QUERY_GC_TIME_MS } from '../utils/constants'
+import { InitializationStatus, AppStatus, isAppReadyStatus, isAppInProgressStatus, getCombinedStatus, getWorkletStatus } from '../utils/initializationState'
+import type { WdkConfigs, BundleConfig } from '../types'
/**
* Context state exposed to consumers
@@ -145,11 +131,28 @@ const WdkAppContext = createContext(null)
/**
* Provider props
*/
-export interface WdkAppProviderProps {
- /** Network configurations */
- networkConfigs: NetworkConfigs
- /** Token configurations for balance fetching */
- tokenConfigs: TokenConfigs
+export interface WdkAppProviderProps<
+ TNetwork extends Record = Record,
+ TProtocol extends Record = Record,
+> {
+ /**
+ * Worklet bundle configuration
+ *
+ * @example
+ * ```typescript
+ * import { bundle } from './.wdk-bundle'
+ *
+ *
+ *
+ *
+ * ```
+ */
+ bundle: BundleConfig
+ /** Network & protocol configurations */
+ wdkConfigs: WdkConfigs
/** Enable automatic wallet initialization on app restart (default: true) */
enableAutoInitialization?: boolean
/**
@@ -186,9 +189,9 @@ const queryClient = new QueryClient({
queries: {
retry: 1,
staleTime: DEFAULT_QUERY_STALE_TIME_MS,
- gcTime: DEFAULT_QUERY_GC_TIME_MS,
- },
- },
+ gcTime: DEFAULT_QUERY_GC_TIME_MS
+ }
+ }
})
// Custom deep equality for walletLoadingState comparison
@@ -209,21 +212,29 @@ const deepEqualityFn = (a: any, b: any) => {
return true
}
-export function WdkAppProvider({
- networkConfigs,
- tokenConfigs,
+export function WdkAppProvider<
+ TNetwork extends Record = Record,
+ TProtocol extends Record = Record,
+> ({
+ bundle: bundleConfig,
+ wdkConfigs,
enableAutoInitialization = true,
currentUserId,
clearSensitiveDataOnBackground = false,
- children,
-}: WdkAppProviderProps) {
- // Create secureStorage singleton
+ children
+}: WdkAppProviderProps) {
+ // Create secureStorage singleton and set it in WalletSetupService synchronously
+ // CRITICAL: This must be synchronous (not in useEffect) to prevent race conditions
+ // where child components' useEffect hooks run before this effect
+ const secureStorageInitialized = useRef(false)
const secureStorage = useMemo(() => createSecureStorage(), [])
- // Set secureStorage in WalletSetupService
- useEffect(() => {
+ // Set SecureStorage synchronously during render (not in useEffect)
+ // This ensures it's available before any child component's useEffect runs
+ if (!secureStorageInitialized.current) {
WalletSetupService.setSecureStorage(secureStorage)
- }, [secureStorage])
+ secureStorageInitialized.current = true
+ }
// Clear sensitive data on mount AND when app goes to background
// This ensures biometrics are always required on app restart or foreground
@@ -256,7 +267,7 @@ export function WdkAppProvider({
previousState === 'active'
) {
log(
- '[WdkAppProvider] App going to background - clearing sensitive data and marking for re-auth',
+ '[WdkAppProvider] App going to background - clearing sensitive data and marking for re-auth'
)
clearAllSensitiveData()
@@ -270,12 +281,12 @@ export function WdkAppProvider({
if (currentStateType === 'ready' && currentState.activeWalletId) {
log(
- '[WdkAppProvider] Resetting wallet state to trigger biometrics on foreground',
+ '[WdkAppProvider] Resetting wallet state to trigger biometrics on foreground'
)
walletStore.setState((prev) =>
updateWalletLoadingState(prev, {
- type: 'not_loaded',
- }),
+ type: 'not_loaded'
+ })
)
} else if (
currentStateType === 'loading' ||
@@ -284,8 +295,8 @@ export function WdkAppProvider({
log(
'[WdkAppProvider] Preserving wallet loading state during background transition',
{
- currentState: currentStateType,
- },
+ currentState: currentStateType
+ }
)
// Do not reset - allow biometric authentication to complete
}
@@ -298,10 +309,10 @@ export function WdkAppProvider({
(previousState === 'background' || previousState === 'inactive')
) {
log(
- '[WdkAppProvider] App coming to foreground - auto-initialization will trigger biometrics',
+ '[WdkAppProvider] App coming to foreground - auto-initialization will trigger biometrics'
)
}
- },
+ }
)
return () => subscription.remove()
@@ -310,18 +321,17 @@ export function WdkAppProvider({
// Validate props on mount and when props change
useEffect(() => {
try {
- validateNetworkConfigs(networkConfigs)
- validateTokenConfigs(tokenConfigs)
+ validateWdkConfigs(wdkConfigs)
} catch (error) {
const err = normalizeError(error, true, {
component: 'WdkAppProvider',
- operation: 'propsValidation',
+ operation: 'propsValidation'
})
logError('[WdkAppProvider] Invalid props:', err)
// Always throw validation errors - they indicate programming errors
throw err
}
- }, [networkConfigs, tokenConfigs])
+ }, [wdkConfigs])
// Worklet state - read from workletStore via hook
const workletHookState = useWorklet()
@@ -329,7 +339,7 @@ export function WdkAppProvider({
isWorkletStarted,
isInitialized: isWorkletInitialized,
isLoading: isWorkletLoading,
- error: workletError,
+ error: workletError
} = workletHookState
// Wallet state - read from walletStore (single source of truth)
@@ -337,15 +347,15 @@ export function WdkAppProvider({
// Subscribe to primitive values directly
const activeWalletId = walletStore(
- (state: WalletStore) => state.activeWalletId,
+ (state: WalletStore) => state.activeWalletId
)
// For walletLoadingState, use a ref to manually check equality and prevent unnecessary re-renders
const walletLoadingStateRef = useRef(
- walletStore.getState().walletLoadingState,
+ walletStore.getState().walletLoadingState
)
const [walletLoadingState, setWalletLoadingState] = React.useState(
- walletStore.getState().walletLoadingState,
+ walletStore.getState().walletLoadingState
)
useEffect(() => {
@@ -361,15 +371,41 @@ export function WdkAppProvider({
}, [walletStore])
const walletAddresses = walletStore((state: WalletStore) =>
- state.activeWalletId ? state.addresses[state.activeWalletId] : undefined,
+ state.activeWalletId ? state.addresses[state.activeWalletId] : undefined
)
// Hooks for wallet operations
- const {
- initializeWallet,
- hasWallet,
- error: walletManagerError,
- } = useWalletManager()
+ const { createWallet, unlock, wallets } = useWalletManager()
+
+ // Wrapper for wallet initialization to maintain compatibility
+ const initializeWallet = useCallback(
+ async ({
+ createNew,
+ walletId
+ }: {
+ createNew?: boolean
+ walletId?: string
+ }) => {
+ if (!walletId) {
+ throw new Error('Wallet ID is required for initialization')
+ }
+
+ if (createNew) {
+ await createWallet(walletId)
+ } else {
+ await unlock(walletId)
+ }
+ },
+ [createWallet, unlock]
+ )
+
+ // Check if wallet exists in the loaded wallet list
+ const hasWallet = useCallback(
+ (walletId: string) => {
+ return wallets.find((w) => w.identifier === walletId)?.exists ?? false
+ },
+ [wallets]
+ )
// Store initializeWallet in a ref to avoid it being a dependency of the effect
// This breaks the infinite loop: effect runs → component re-renders → initializeWallet recreated → effect runs again
@@ -392,28 +428,20 @@ export function WdkAppProvider({
() => ({
isReady: isWorkletStarted && !isWorkletLoading && !workletError,
isLoading: isWorkletLoading,
- error: workletError,
+ error: workletError
}),
- [isWorkletStarted, isWorkletLoading, workletError],
+ [isWorkletStarted, isWorkletLoading, workletError]
)
// Wallet state object (exposed separately for flexibility)
const walletStateObject = useMemo(
() => ({
- status: (walletLoadingState.type === 'not_loaded'
- ? 'not_loaded'
- : walletLoadingState.type === 'checking'
- ? 'checking'
- : walletLoadingState.type === 'loading'
- ? 'loading'
- : walletLoadingState.type === 'ready'
- ? 'ready'
- : 'error') as 'not_loaded' | 'checking' | 'loading' | 'ready' | 'error',
+ status: walletLoadingState.type as 'not_loaded' | 'checking' | 'loading' | 'ready' | 'error',
identifier: getWalletIdFromLoadingState(walletLoadingState),
error:
- walletLoadingState.type === 'error' ? walletLoadingState.error : null,
+ walletLoadingState.type === 'error' ? walletLoadingState.error : null
}),
- [walletLoadingState],
+ [walletLoadingState]
)
// Worklet initialization status (worklet-specific)
@@ -421,7 +449,7 @@ export function WdkAppProvider({
return getWorkletStatus({
isWorkletStarted,
isLoading: isWorkletLoading,
- error: workletError,
+ error: workletError
})
}, [isWorkletStarted, isWorkletLoading, workletError])
@@ -431,9 +459,9 @@ export function WdkAppProvider({
{
isWorkletStarted,
isLoading: isWorkletLoading,
- error: workletError,
+ error: workletError
},
- walletLoadingState,
+ walletLoadingState
)
}, [isWorkletStarted, isWorkletLoading, workletError, walletLoadingState])
@@ -442,13 +470,13 @@ export function WdkAppProvider({
log('[WdkAppProvider] Checking initialization conditions', {
isWorkletInitialized,
isWorkletLoading,
- isWorkletStarted,
+ isWorkletStarted
})
// Skip if worklet is loading
if (isWorkletLoading) {
log('[WdkAppProvider] Initialization skipped', {
- reason: 'already loading',
+ reason: 'already loading'
})
return
}
@@ -464,7 +492,7 @@ export function WdkAppProvider({
const initializeWorklet = async () => {
try {
log('[WdkAppProvider] Starting worklet initialization...')
- await WorkletLifecycleService.startWorklet(networkConfigs)
+ await WorkletLifecycleService.startWorklet(wdkConfigs, bundleConfig)
if (!cancelled) {
log('[WdkAppProvider] Worklet started successfully')
}
@@ -472,7 +500,7 @@ export function WdkAppProvider({
if (!cancelled) {
const err = normalizeError(error, true, {
component: 'WdkAppProvider',
- operation: 'workletInitialization',
+ operation: 'workletInitialization'
})
logError('[WdkAppProvider] Failed to initialize worklet:', error)
}
@@ -485,9 +513,13 @@ export function WdkAppProvider({
return () => {
cancelled = true
}
- }, [isWorkletInitialized, isWorkletLoading, isWorkletStarted])
- // Note: networkConfigs removed from deps - it's a prop that should be stable for app lifetime
- // and doesn't need to trigger worklet re-initialization
+ }, [
+ isWorkletInitialized,
+ isWorkletLoading,
+ isWorkletStarted,
+ bundleConfig,
+ wdkConfigs
+ ])
// Consolidated effect: Sync wallet loading state with activeWalletId, addresses, and errors
//
@@ -510,7 +542,7 @@ export function WdkAppProvider({
// Clear authentication error flag when auto-init is disabled (e.g., logout)
if (authErrorRef.current) {
log(
- '[WdkAppProvider] Clearing authentication error flag - auto-init disabled',
+ '[WdkAppProvider] Clearing authentication error flag - auto-init disabled'
)
authErrorRef.current = null
}
@@ -524,8 +556,8 @@ export function WdkAppProvider({
log(
'[WdkAppProvider] Waiting for user identity confirmation before auto-init',
{
- hasActiveWalletId: !!activeWalletId,
- },
+ hasActiveWalletId: !!activeWalletId
+ }
)
return
}
@@ -535,12 +567,12 @@ export function WdkAppProvider({
if (activeWalletId !== currentUserId) {
log('[WdkAppProvider] Setting activeWalletId to current user', {
activeWalletId,
- currentUserId,
+ currentUserId
})
// Set activeWalletId to current user - let useOnboarding handle initialization
walletStore.setState({
- activeWalletId: currentUserId,
+ activeWalletId: currentUserId
})
// Clear auth error flag to allow fresh authentication
@@ -558,15 +590,15 @@ export function WdkAppProvider({
log(
'[WdkAppProvider] Skipping auto-initialization due to authentication error',
{
- error: authErrorRef.current,
- },
+ error: authErrorRef.current
+ }
)
return
}
const currentWalletId = getWalletIdFromLoadingState(walletLoadingState)
const hasAddresses = !!(
- walletAddresses && Object.keys(walletAddresses).length > 0
+ (walletAddresses != null) && Object.keys(walletAddresses).length > 0
)
// Handle activeWalletId cleared
@@ -575,12 +607,12 @@ export function WdkAppProvider({
// Clear authentication error flag when wallet is reset
if (authErrorRef.current) {
log(
- '[WdkAppProvider] Clearing authentication error flag on wallet reset',
+ '[WdkAppProvider] Clearing authentication error flag on wallet reset'
)
authErrorRef.current = null
}
walletStore.setState((prev) =>
- updateWalletLoadingState(prev, { type: 'not_loaded' }),
+ updateWalletLoadingState(prev, { type: 'not_loaded' })
)
return
}
@@ -594,7 +626,7 @@ export function WdkAppProvider({
const switchDecision = getWalletSwitchDecision(
currentWalletId,
activeWalletId,
- hasAddresses,
+ hasAddresses
)
if (switchDecision.shouldSwitch) {
log('[WdkAppProvider] Active wallet changed', {
@@ -602,7 +634,7 @@ export function WdkAppProvider({
to: activeWalletId,
hasAddresses,
isWorkletStarted,
- shouldMarkReady: switchDecision.shouldMarkReady,
+ shouldMarkReady: switchDecision.shouldMarkReady
})
// When switching to a wallet, trigger proper initialization with biometrics
@@ -613,8 +645,8 @@ export function WdkAppProvider({
'[WdkAppProvider] Skipping wallet switch initialization - already in progress',
{
activeWalletId,
- walletLoadingState: walletLoadingState.type,
- },
+ walletLoadingState: walletLoadingState.type
+ }
)
return
}
@@ -623,33 +655,33 @@ export function WdkAppProvider({
'[WdkAppProvider] Wallet switch detected - triggering initialization',
{
activeWalletId,
- hasAddresses,
- },
+ hasAddresses
+ }
)
// Check if wallet already exists before deciding to create new or load existing
;(async () => {
try {
- const walletExists = await hasWallet(activeWalletId)
+ const walletExists = hasWallet(activeWalletId)
const shouldCreateNew = !walletExists
log('[WdkAppProvider] Wallet existence check', {
activeWalletId,
walletExists,
- shouldCreateNew,
+ shouldCreateNew
})
// Call initializeWallet to trigger biometrics and properly load the wallet
// This will transition state to 'checking' immediately, preventing duplicate calls
await initializeWalletRef.current({
createNew: shouldCreateNew,
- walletId: activeWalletId,
+ walletId: activeWalletId
})
log('[WdkAppProvider] Wallet initialized successfully after switch')
} catch (error) {
logError(
'[WdkAppProvider] Failed to initialize wallet after switch:',
- error,
+ error
)
// Error will be handled by the error handling logic below
}
@@ -658,8 +690,8 @@ export function WdkAppProvider({
// Worklet not started yet - reset to not_loaded and wait
walletStore.setState((prev) =>
updateWalletLoadingState(prev, {
- type: 'not_loaded',
- }),
+ type: 'not_loaded'
+ })
)
}
// This effect will run again when isWorkletStarted becomes true
@@ -682,8 +714,8 @@ export function WdkAppProvider({
'[WdkAppProvider] Skipping cached wallet initialization - already in progress',
{
activeWalletId,
- walletLoadingState: walletLoadingState.type,
- },
+ walletLoadingState: walletLoadingState.type
+ }
)
return
}
@@ -695,20 +727,20 @@ export function WdkAppProvider({
hasAddresses,
isWorkletStarted,
isWorkletInitialized,
- walletLoadingState: walletLoadingState.type,
- },
+ walletLoadingState: walletLoadingState.type
+ }
)
// Check if wallet already exists before deciding to create new or load existing
;(async () => {
try {
- const walletExists = await hasWallet(activeWalletId)
+ const walletExists = hasWallet(activeWalletId)
const shouldCreateNew = !walletExists
log('[WdkAppProvider] Wallet existence check', {
activeWalletId,
walletExists,
- shouldCreateNew,
+ shouldCreateNew
})
// Call initializeWallet to trigger biometrics and properly load the wallet
@@ -716,13 +748,13 @@ export function WdkAppProvider({
// Then it will go through: checking -> loading -> ready
await initializeWalletRef.current({
createNew: shouldCreateNew,
- walletId: activeWalletId,
+ walletId: activeWalletId
})
log('[WdkAppProvider] Wallet initialized successfully from cache')
} catch (error) {
logError(
'[WdkAppProvider] Failed to initialize wallet from cache:',
- error,
+ error
)
// Error will be handled by the error handling logic below
}
@@ -746,8 +778,8 @@ export function WdkAppProvider({
'[WdkAppProvider] Skipping wallet initialization - already in progress',
{
activeWalletId,
- walletLoadingState: walletLoadingState.type,
- },
+ walletLoadingState: walletLoadingState.type
+ }
)
return
}
@@ -758,27 +790,27 @@ export function WdkAppProvider({
activeWalletId,
hasAddresses,
isWorkletStarted,
- walletLoadingState: walletLoadingState.type,
- },
+ walletLoadingState: walletLoadingState.type
+ }
)
// Check if wallet already exists before deciding to create new or load existing
;(async () => {
try {
- const walletExists = await hasWallet(activeWalletId)
+ const walletExists = hasWallet(activeWalletId)
const shouldCreateNew = !walletExists
log('[WdkAppProvider] Wallet existence check', {
activeWalletId,
walletExists,
- shouldCreateNew,
+ shouldCreateNew
})
// Call initializeWallet to trigger biometrics and properly load the wallet
// This will transition state to 'checking' immediately, preventing duplicate calls
await initializeWalletRef.current({
createNew: shouldCreateNew,
- walletId: activeWalletId,
+ walletId: activeWalletId
})
log('[WdkAppProvider] Wallet initialized successfully')
} catch (error) {
@@ -797,36 +829,29 @@ export function WdkAppProvider({
hasAddresses,
currentWalletId,
activeWalletId,
- isWorkletInitialized,
+ isWorkletInitialized
)
) {
log('[WdkAppProvider] Wallet ready', { activeWalletId })
walletStore.setState((prev) =>
updateWalletLoadingState(prev, {
type: 'ready',
- identifier: activeWalletId,
- }),
+ identifier: activeWalletId
+ })
)
return
}
- // Handle errors from useWalletManager
- if (
- shouldHandleError(
- walletManagerError,
- currentWalletId,
- activeWalletId,
- walletLoadingState,
- )
- ) {
+ // Handle errors via walletLoadingState
+ if (walletLoadingState.type === 'error') {
+ const error = walletLoadingState.error
log('[WdkAppProvider] Wallet operation error detected', {
activeWalletId,
- error: walletManagerError,
+ error: error.message
})
- const error = new Error(walletManagerError!)
// Check if this is an authentication error (biometric failure)
- const errorMessage = walletManagerError?.toLowerCase() || ''
+ const errorMessage = error.message.toLowerCase()
const isAuthError =
errorMessage.includes('authentication') ||
errorMessage.includes('biometric') ||
@@ -836,19 +861,11 @@ export function WdkAppProvider({
log(
'[WdkAppProvider] Authentication error detected - preventing auto-retry',
{
- error: walletManagerError,
- },
+ error: error.message
+ }
)
- authErrorRef.current = walletManagerError || 'Authentication failed'
+ authErrorRef.current = error.message
}
-
- walletStore.setState((prev) =>
- updateWalletLoadingState(prev, {
- type: 'error',
- identifier: activeWalletId,
- error,
- }),
- )
}
}, [
enableAutoInitialization,
@@ -856,10 +873,10 @@ export function WdkAppProvider({
activeWalletId,
walletLoadingState,
walletAddresses,
- walletManagerError,
isWalletInitializing,
isWorkletStarted,
isWorkletInitialized,
+ hasWallet
])
// Note: walletStore removed from deps - it's a singleton that never changes
// Note: initializeWallet removed from deps and accessed via ref to prevent infinite loop
@@ -874,7 +891,7 @@ export function WdkAppProvider({
}
if (isWalletErrorState(walletLoadingState)) {
walletStore.setState((prev) =>
- updateWalletLoadingState(prev, { type: 'not_loaded' }),
+ updateWalletLoadingState(prev, { type: 'not_loaded' })
)
}
}, [walletLoadingState])
@@ -925,7 +942,7 @@ export function WdkAppProvider({
loadingWalletId,
walletExists,
error: initializationError,
- retry,
+ retry
}),
[
status,
@@ -938,8 +955,8 @@ export function WdkAppProvider({
loadingWalletId,
walletExists,
initializationError,
- retry,
- ],
+ retry
+ ]
)
return (
diff --git a/src/services/accountService.ts b/src/services/accountService.ts
index 741377d..ffd2ae5 100644
--- a/src/services/accountService.ts
+++ b/src/services/accountService.ts
@@ -1,11 +1,12 @@
/**
* Account Service
- *
+ *
* Handles account method calls through the worklet.
* This service provides a generic interface for calling account methods
* like getBalance, getTokenBalance, signMessage, signTransaction, etc.
*/
+import type { LooseMethods, MethodMap } from '../types/accountMethods'
import { convertBigIntToString } from '../utils/balanceUtils'
import { handleServiceError } from '../utils/errorHandling'
import { safeStringify } from '../utils/jsonUtils'
@@ -15,54 +16,55 @@ import { validateAccountIndex, validateNetworkName } from '../utils/validation'
/**
* Account Service
- *
+ *
* Provides methods for calling account operations through the worklet.
*/
export class AccountService {
/**
* Call a method on a wallet account
* Generic method for calling any account method through the worklet
- *
+ *
* The worklet should already have the correct wallet loaded via `initializeWDK`.
* Wallet switching is handled at the hook level before calling this service.
- *
+ *
+ * @template TMethods - Map of method names to definitions (args/result)
+ * @template K - Method name (key of TMethods)
+ *
* @param network - Network name
* @param accountIndex - Account index
* @param methodName - Method name
- * @param args - Optional arguments for the method
+ * @param args - Method arguments (typed based on methodName)
* @param walletId - Optional wallet identifier (for consistency, worklet should already have correct wallet loaded)
* @returns Promise with the method result
* @throws Error if validation fails
- *
+ *
* @example
* ```typescript
- * // Get balance
- * const balance = await AccountService.callAccountMethod('ethereum', 0, 'getBalance', null)
- *
- * // Get token balance
- * const tokenBalance = await AccountService.callAccountMethod(
- * 'ethereum',
- * 0,
- * 'getTokenBalance',
- * '0x...'
- * )
- *
- * // Sign a message
- * const signature = await AccountService.callAccountMethod(
- * 'ethereum',
- * 0,
- * 'signMessage',
- * { message: 'Hello World' }
- * )
+ * // Define types
+ * interface MyMethods {
+ * getBalance: { args: undefined; result: string };
+ * transfer: { args: { to: string }; result: string };
+ * }
+ *
+ * // Strict usage - single argument
+ * await AccountService.callAccountMethod('eth', 0, 'transfer', { to: '0x...' })
+ *
+ * // Multiple arguments via array (spread as positional args)
+ * await AccountService.callAccountMethod('eth', 0, 'transfer', [
+ * { to: '0x...', amount: '1000' }, // 1st arg: options
+ * { paymasterToken: '...' } // 2nd arg: config
+ * ])
* ```
*/
- static async callAccountMethod(
+ static async callAccountMethod<
+ TMethods extends MethodMap = LooseMethods,
+ K extends keyof TMethods = keyof TMethods
+ >(
network: string,
accountIndex: number,
- methodName: string,
- args?: unknown,
- walletId?: string
- ): Promise {
+ methodName: K,
+ args?: TMethods[K]['args'] | unknown[]
+ ): Promise {
// Validate methodName parameter
if (typeof methodName !== 'string' || methodName.trim().length === 0) {
throw new Error('methodName must be a non-empty string')
@@ -76,7 +78,7 @@ export class AccountService {
const hrpc = requireInitialized()
// Validate and sanitize args before stringification
- let argsString: string | null = null
+ let argsString: string | undefined
if (args !== undefined && args !== null) {
// Validate structure and stringify safely
argsString = safeStringify(args)
@@ -84,10 +86,10 @@ export class AccountService {
try {
const response = await hrpc.callMethod({
- methodName,
+ methodName: String(methodName),
network,
accountIndex,
- args: argsString,
+ args: argsString
})
// Validate response structure
@@ -98,9 +100,9 @@ export class AccountService {
}
// Parse the result and handle BigInt values
- let parsed: T
+ let parsed: TMethods[K]['result']
try {
- parsed = JSON.parse(validatedResponse.result) as T
+ parsed = JSON.parse(validatedResponse.result) as TMethods[K]['result']
// Basic validation: ensure parsed is not null/undefined
if (parsed === null || parsed === undefined) {
throw new Error('Parsed result is null or undefined')
@@ -111,7 +113,7 @@ export class AccountService {
}
throw new Error(`Failed to parse result from ${methodName}: ${error instanceof Error ? error.message : String(error)}`)
}
-
+
// Runtime type validation based on method type
if (methodName === 'getBalance' || methodName === 'getTokenBalance') {
// Validate balance format
@@ -119,16 +121,15 @@ export class AccountService {
throw new Error(`Invalid balance format: ${parsed}`)
}
}
-
+
// Recursively convert BigInt values to strings to prevent serialization errors
- return convertBigIntToString(parsed) as T
+ return convertBigIntToString(parsed) as TMethods[K]['result']
} catch (error) {
- handleServiceError(error, 'AccountService', `callAccountMethod:${methodName}`, {
+ handleServiceError(error, 'AccountService', `callAccountMethod:${String(methodName)}`, {
network,
accountIndex,
- methodName,
+ methodName
})
}
}
}
-
diff --git a/src/services/addressService.ts b/src/services/addressService.ts
index 6e9f40a..995a60f 100644
--- a/src/services/addressService.ts
+++ b/src/services/addressService.ts
@@ -12,7 +12,7 @@ import { handleServiceError } from '../utils/errorHandling'
import {
requireInitialized,
resolveWalletId,
- updateAddressInState,
+ updateAddressInState
} from '../utils/storeHelpers'
import { isValidAddress } from '../utils/typeGuards'
import { validateAccountIndex, validateNetworkName } from '../utils/validation'
@@ -32,10 +32,10 @@ export class AddressService {
* @param accountIndex - Account index (default: 0)
* @param walletId - Optional wallet identifier (defaults to activeWalletId from store)
*/
- static async getAddress(
+ static async getAddress (
network: string,
accountIndex = 0,
- walletId?: string,
+ walletId?: string
): Promise {
// Validate inputs
validateNetworkName(network)
@@ -54,7 +54,7 @@ export class AddressService {
// Validate cached address format
if (!isValidAddress(cachedAddress)) {
throw new Error(
- `Cached address for ${targetWalletId}:${network}:${accountIndex} has invalid format`,
+ `Cached address for ${targetWalletId}:${network}:${accountIndex} has invalid format`
)
}
return cachedAddress
@@ -71,15 +71,14 @@ export class AddressService {
produce(prev, (state) => {
state.walletLoading[targetWalletId] ??= {}
state.walletLoading[targetWalletId][loadingKey] = true
- }),
+ })
)
// Call getAddress method on the account
const response = await hrpc.callMethod({
methodName: 'getAddress',
network,
- accountIndex,
- args: null,
+ accountIndex
})
if (!response.result) {
@@ -101,7 +100,7 @@ export class AddressService {
throw new Error(
`Failed to parse address from worklet response: ${
error instanceof Error ? error.message : String(error)
- }`,
+ }`
)
}
@@ -113,13 +112,13 @@ export class AddressService {
targetWalletId,
network,
accountIndex,
- address,
+ address
),
(state) => {
state.walletLoading[targetWalletId] ??= {}
state.walletLoading[targetWalletId][loadingKey] = false
- },
- ),
+ }
+ )
)
return address
@@ -129,13 +128,13 @@ export class AddressService {
produce(prev, (state) => {
state.walletLoading[targetWalletId] ??= {}
state.walletLoading[targetWalletId][loadingKey] = false
- }),
+ })
)
handleServiceError(error, 'AddressService', 'getAddress', {
network,
accountIndex,
- walletId: targetWalletId,
+ walletId: targetWalletId
})
}
}
@@ -148,9 +147,9 @@ export class AddressService {
* @param walletId - Optional wallet identifier (defaults to activeWalletId from store)
* @returns Record of network -> accountIndex -> address for successfully loaded addresses
*/
- static async loadAllAddresses(
+ static async loadAllAddresses (
accountIndices: number[] = [0],
- walletId?: string,
+ walletId?: string
): Promise>> {
// Validate account indices
if (!Array.isArray(accountIndices) || accountIndices.length === 0) {
@@ -164,15 +163,14 @@ export class AddressService {
// Resolve walletId from parameter or store
const targetWalletId = resolveWalletId(walletId)
- // Get all network names from networkConfigs
- const networkConfigs = workletStore.getState().networkConfigs
- if (!networkConfigs) {
+ const wdkConfigs = workletStore.getState().wdkConfigs
+ if (wdkConfigs == null) {
throw new Error(
- 'Network configs are not available. Ensure the worklet is started with networkConfigs.',
+ 'WDK configs are not available. Ensure the worklet is started with wdkConfigs.'
)
}
- const networks = Object.keys(networkConfigs)
+ const networks = Object.values(wdkConfigs.networks).map(n => n.blockchain)
if (networks.length === 0) {
log('[AddressService] No networks configured, returning empty addresses')
return {}
@@ -180,7 +178,7 @@ export class AddressService {
// Check which addresses are already cached to set loading state appropriately
const walletState = walletStore.getState()
- const uncachedAddresses: Array<{ network: string; accountIndex: number }> =
+ const uncachedAddresses: Array<{ network: string, accountIndex: number }> =
[]
networks.forEach((network) => {
@@ -203,7 +201,7 @@ export class AddressService {
const loadingKey = `${network}-${accountIndex}`
state.walletLoading[targetWalletId][loadingKey] = true
}
- }),
+ })
)
}
@@ -219,18 +217,18 @@ export class AddressService {
const address = await this.getAddress(
network,
accountIndex,
- walletId,
+ walletId
)
return [network, accountIndex, address]
} catch (error) {
// Log error but continue loading other addresses
logError(
`[AddressService] Failed to load address for ${network}:${accountIndex}:`,
- error,
+ error
)
return [network, accountIndex, null]
}
- })(),
+ })()
)
})
})
@@ -242,7 +240,7 @@ export class AddressService {
const addresses: Record> = {}
results.forEach(([network, accountIndex, address]) => {
if (address !== null) {
- if (!addresses[network]) {
+ if (addresses[network] == null) {
addresses[network] = {}
}
addresses[network][accountIndex] = address
@@ -252,12 +250,12 @@ export class AddressService {
const totalRequested = networks.length * accountIndices.length
const totalLoaded = Object.values(addresses).reduce(
(sum, networkAddresses) => sum + Object.keys(networkAddresses).length,
- 0,
+ 0
)
log(
`[AddressService] Loaded ${totalLoaded}/${totalRequested} addresses for account indices [${accountIndices.join(
- ', ',
- )}]`,
+ ', '
+ )}]`
)
return addresses
}
diff --git a/src/services/balanceService.ts b/src/services/balanceService.ts
index d80b92e..99836f0 100644
--- a/src/services/balanceService.ts
+++ b/src/services/balanceService.ts
@@ -33,12 +33,7 @@
import { produce } from 'immer'
import { getWalletStore } from '../store/walletStore'
-import {
- resolveWalletId,
- updateBalanceInState,
- getNestedState,
-} from '../utils/storeHelpers'
-import { NATIVE_TOKEN_KEY } from '../utils/constants'
+import { resolveWalletId, updateBalanceInState, getNestedState } from '../utils/storeHelpers'
import { validateBalance, validateWalletParams } from '../utils/validation'
/**
@@ -51,56 +46,42 @@ export class BalanceService {
* Validate wallet parameters and balance (if provided)
* Helper to reduce repetitive validation calls
*/
- private static validateBalanceParams(
+ private static validateBalanceParams (
network: string,
accountIndex: number,
- tokenAddress?: string | null,
- balance?: string,
+ assetId: string,
+ balance?: string
): void {
- validateWalletParams(network, accountIndex, tokenAddress)
+ validateWalletParams(network, accountIndex, assetId)
if (balance !== undefined) {
validateBalance(balance)
}
}
- /**
- * Get token key from token address (native or token address)
- */
- private static getTokenKey(tokenAddress: string | null): string {
- return tokenAddress || NATIVE_TOKEN_KEY
- }
/**
* Update balance for a specific wallet, network, and token
*
* @param accountIndex - Account index
* @param network - Network name
- * @param tokenAddress - Token address (null for native)
+ * @param assetId - Asset ID
* @param balance - Balance value
* @param walletId - Optional wallet identifier (defaults to activeWalletId from store)
*/
- static updateBalance(
+ static updateBalance (
accountIndex: number,
network: string,
- tokenAddress: string | null,
+ assetId: string,
balance: string,
- walletId?: string,
+ walletId?: string
): void {
- this.validateBalanceParams(network, accountIndex, tokenAddress, balance)
+ this.validateBalanceParams(network, accountIndex, assetId, balance)
const walletStore = getWalletStore()
const targetWalletId = resolveWalletId(walletId)
- const tokenKey = this.getTokenKey(tokenAddress)
- walletStore.setState((prev) =>
- updateBalanceInState(
- prev,
- targetWalletId,
- network,
- accountIndex,
- tokenKey,
- balance,
- ),
- )
+ walletStore.setState((prev) => ({
+ ...updateBalanceInState(prev, targetWalletId, network, accountIndex, assetId, balance)
+ }))
}
/**
@@ -108,26 +89,25 @@ export class BalanceService {
*
* @param accountIndex - Account index
* @param network - Network name
- * @param tokenAddress - Token address (null for native)
+ * @param assetId - Asset ID
* @param walletId - Optional wallet identifier (defaults to activeWalletId from store)
*/
- static getBalance(
+ static getBalance (
accountIndex: number,
network: string,
- tokenAddress: string | null,
- walletId?: string,
+ assetId: string,
+ walletId?: string
): string | null {
- this.validateBalanceParams(network, accountIndex, tokenAddress)
+ this.validateBalanceParams(network, accountIndex, assetId)
const walletStore = getWalletStore()
const walletState = walletStore.getState()
const targetWalletId = resolveWalletId(walletId)
- const tokenKey = this.getTokenKey(tokenAddress)
return getNestedState(
walletState.balances,
- [targetWalletId, network, accountIndex, tokenKey],
- null,
+ [targetWalletId, network, accountIndex, assetId],
+ null
)
}
@@ -138,10 +118,10 @@ export class BalanceService {
* @param network - Network name
* @param walletId - Optional wallet identifier (defaults to activeWalletId from store)
*/
- static getBalancesForWallet(
+ static getBalancesForWallet (
accountIndex: number,
network: string,
- walletId?: string,
+ walletId?: string
): Record | null {
// Validate inputs
validateWalletParams(network, accountIndex)
@@ -153,7 +133,7 @@ export class BalanceService {
return getNestedState(
walletState.balances,
[targetWalletId, network, accountIndex],
- null,
+ null
)
}
@@ -162,34 +142,33 @@ export class BalanceService {
*
* @param network - Network name
* @param accountIndex - Account index
- * @param tokenAddress - Token address (null for native)
+ * @param assetId - Asset ID
* @param loading - Loading state
* @param walletId - Optional wallet identifier (defaults to activeWalletId from store)
*/
- static setBalanceLoading(
+ static setBalanceLoading (
network: string,
accountIndex: number,
- tokenAddress: string | null,
+ assetId: string,
loading: boolean,
- walletId?: string,
+ walletId?: string
): void {
- this.validateBalanceParams(network, accountIndex, tokenAddress)
+ this.validateBalanceParams(network, accountIndex, assetId)
const walletStore = getWalletStore()
const targetWalletId = resolveWalletId(walletId)
- const tokenKey = this.getTokenKey(tokenAddress)
- const loadingKey = `${network}-${accountIndex}-${tokenKey}`
+ const loadingKey = `${network}-${accountIndex}-${assetId}`
- walletStore.setState((prev) =>
- produce(prev, (state) => {
- state.balanceLoading[targetWalletId] ??= {}
- if (loading) {
- state.balanceLoading[targetWalletId][loadingKey] = true
- } else {
- delete state.balanceLoading[targetWalletId][loadingKey]
- }
- }),
- )
+ walletStore.setState((prev) => ({
+ balanceLoading: {
+ ...prev.balanceLoading,
+ [targetWalletId]: loading
+ ? { ...((prev.balanceLoading[targetWalletId] != null) || {}), [loadingKey]: true }
+ : Object.fromEntries(
+ Object.entries((prev.balanceLoading[targetWalletId] != null) || {}).filter(([key]) => key !== loadingKey)
+ )
+ }
+ }))
}
/**
@@ -197,30 +176,26 @@ export class BalanceService {
*
* @param network - Network name
* @param accountIndex - Account index
- * @param tokenAddress - Token address (null for native)
+ * @param assetId - Asset ID
* @param walletId - Optional wallet identifier (defaults to activeWalletId from store)
*/
- static isBalanceLoading(
+ static isBalanceLoading (
network: string,
accountIndex: number,
- tokenAddress: string | null,
- walletId?: string,
+ assetId: string,
+ walletId?: string
): boolean {
- this.validateBalanceParams(network, accountIndex, tokenAddress)
+ this.validateBalanceParams(network, accountIndex, assetId)
const walletStore = getWalletStore()
const walletState = walletStore.getState()
- const targetWalletId = walletId || walletState.activeWalletId
- if (!targetWalletId) {
- return false
- }
- const tokenKey = this.getTokenKey(tokenAddress)
- const loadingKey = `${network}-${accountIndex}-${tokenKey}`
+ const targetWalletId = resolveWalletId(walletId)
+ const loadingKey = `${network}-${accountIndex}-${assetId}`
return getNestedState(
walletState.balanceLoading,
[targetWalletId, loadingKey],
- false,
+ false
)
}
@@ -231,10 +206,10 @@ export class BalanceService {
* @param accountIndex - Account index
* @param walletId - Optional wallet identifier (defaults to activeWalletId from store)
*/
- static updateLastBalanceUpdate(
+ static updateLastBalanceUpdate (
network: string,
accountIndex: number,
- walletId?: string,
+ walletId?: string
): void {
// Validate inputs
validateWalletParams(network, accountIndex)
@@ -248,7 +223,7 @@ export class BalanceService {
state.lastBalanceUpdate[targetWalletId] ??= {}
state.lastBalanceUpdate[targetWalletId][network] ??= {}
state.lastBalanceUpdate[targetWalletId][network][accountIndex] = now
- }),
+ })
)
}
@@ -259,10 +234,10 @@ export class BalanceService {
* @param accountIndex - Account index
* @param walletId - Optional wallet identifier (defaults to activeWalletId from store)
*/
- static getLastBalanceUpdate(
+ static getLastBalanceUpdate (
network: string,
accountIndex: number,
- walletId?: string,
+ walletId?: string
): number | null {
// Validate inputs
validateWalletParams(network, accountIndex)
@@ -274,20 +249,20 @@ export class BalanceService {
return getNestedState(
walletState.lastBalanceUpdate,
[targetWalletId, network, accountIndex],
- null,
+ null
)
}
/**
* Clear all balances (useful for wallet reset)
*/
- static clearBalances(): void {
+ static clearBalances (): void {
const walletStore = getWalletStore()
walletStore.setState({
balances: {},
balanceLoading: {},
- lastBalanceUpdate: {},
+ lastBalanceUpdate: {}
})
}
}
diff --git a/src/services/walletSetupService.ts b/src/services/walletSetupService.ts
index ce6ee73..0ca5959 100644
--- a/src/services/walletSetupService.ts
+++ b/src/services/walletSetupService.ts
@@ -1,6 +1,6 @@
import type { SecureStorage } from '@tetherto/wdk-react-native-secure-storage'
-import {
+import {
getWorkletStore,
getCachedCredentials,
setCachedCredentials,
@@ -10,7 +10,6 @@ import {
import { WorkletLifecycleService } from './workletLifecycleService'
import { DEFAULT_MNEMONIC_WORD_COUNT } from '../utils/constants'
import { log, logError } from '../utils/logger'
-import type { NetworkConfigs } from '../types'
/**
* Wallet setup service
@@ -18,7 +17,6 @@ import type { NetworkConfigs } from '../types'
* Caches credentials in ephemeral memory to avoid repeated biometric prompts
*/
export class WalletSetupService {
-
/**
* SecureStorage singleton instance
* Set by WdkAppProvider during initialization
@@ -29,8 +27,8 @@ export class WalletSetupService {
* Set the secureStorage singleton instance
* Called by WdkAppProvider during initialization
*/
- static setSecureStorage(secureStorage: SecureStorage, allowOverwrite: boolean = true): void {
- if (this.secureStorageInstance && !allowOverwrite) {
+ static setSecureStorage (secureStorage: SecureStorage, allowOverwrite: boolean = true): void {
+ if ((this.secureStorageInstance != null) && !allowOverwrite) {
log('SecureStorage already set - multiple WdkAppProviders may be mounted')
}
this.secureStorageInstance = secureStorage
@@ -40,8 +38,8 @@ export class WalletSetupService {
* Get the secureStorage singleton instance
* Throws error if not initialized
*/
- private static getSecureStorage(): SecureStorage {
- if (!this.secureStorageInstance) {
+ private static getSecureStorage (): SecureStorage {
+ if (this.secureStorageInstance == null) {
throw new Error('SecureStorage not initialized. Ensure WdkAppProvider is mounted.')
}
return this.secureStorageInstance
@@ -50,34 +48,34 @@ export class WalletSetupService {
/**
* Check if secureStorage is initialized
*/
- static isSecureStorageInitialized(): boolean {
+ static isSecureStorageInitialized (): boolean {
return this.secureStorageInstance !== null
}
/**
* Get cache key for walletId
*/
- private static getCacheKey(walletId?: string): string {
+ private static getCacheKey (walletId?: string): string {
return walletId || 'default'
}
/**
* Cache credentials after retrieval
*/
- private static cacheCredentials(
+ private static cacheCredentials (
walletId: string | undefined,
encryptionKey?: string,
encryptedSeed?: string,
encryptedEntropy?: string
): void {
const cacheKey = this.getCacheKey(walletId)
- const existing = getCachedCredentials(cacheKey) || {}
-
+ const existing = (getCachedCredentials(cacheKey) != null) || {}
+
setCachedCredentials(cacheKey, {
...existing,
...(encryptionKey && { encryptionKey }),
...(encryptedSeed && { encryptedSeed }),
- ...(encryptedEntropy && { encryptedEntropy }),
+ ...(encryptedEntropy && { encryptedEntropy })
})
}
@@ -114,18 +112,22 @@ export class WalletSetupService {
/**
* Validate that encrypted data can be decrypted with the encryption key
+ * Attempts to initialize WDK with the provided credentials to verify compatibility
+ *
+ * @param encryptionKey - Encryption key to test
+ * @param encryptedSeed - Encrypted seed to test
+ * @param encryptedEntropy - Optional encrypted entropy to test
+ * @throws Error if validation fails (decryption fails)
*/
- private static async validateEncryptionCompatibility(
- networkConfigs: NetworkConfigs,
+ private static async validateEncryptionCompatibility (
encryptionKey: string,
encryptedSeed: string,
encryptedEntropy?: string
): Promise {
const store = getWorkletStore()
-
- if (!store.getState().isWorkletStarted) {
- await WorkletLifecycleService.startWorklet(networkConfigs)
- }
+
+ // Ensure worklet is started (WdkAppProvider must be mounted)
+ WorkletLifecycleService.ensureWorkletStarted()
const wasInitialized = store.getState().isInitialized
const previousEncryptionKey = store.getState().encryptionKey
@@ -134,30 +136,30 @@ export class WalletSetupService {
try {
await WorkletLifecycleService.initializeWDK({
encryptionKey,
- encryptedSeed,
+ encryptedSeed
})
} catch (error) {
const errorMessage = error instanceof Error ? error.message : String(error)
- const isDecryptionError =
+ const isDecryptionError =
errorMessage.toLowerCase().includes('decryption failed') ||
errorMessage.toLowerCase().includes('failed to decrypt')
-
+
if (isDecryptionError) {
throw new Error(
- `Failed to validate encryption compatibility: The encryption key cannot decrypt the encrypted seed. ` +
+ 'Failed to validate encryption compatibility: The encryption key cannot decrypt the encrypted seed. ' +
`This indicates corrupted or mismatched wallet data. Error: ${errorMessage}`
)
}
-
+
throw error
} finally {
- if (wasInitialized &&
+ if (wasInitialized &&
(previousEncryptionKey !== encryptionKey || previousEncryptedSeed !== encryptedSeed)) {
try {
if (previousEncryptionKey && previousEncryptedSeed) {
await WorkletLifecycleService.initializeWDK({
encryptionKey: previousEncryptionKey,
- encryptedSeed: previousEncryptedSeed,
+ encryptedSeed: previousEncryptedSeed
})
} else {
WorkletLifecycleService.reset()
@@ -174,14 +176,12 @@ export class WalletSetupService {
* Generates entropy, encrypts it, and stores credentials securely
* Requires biometric authentication
*/
- static async createNewWallet(
- networkConfigs: NetworkConfigs,
+ static async createNewWallet (
walletId?: string
): Promise<{
- encryptionKey: string
- encryptedSeed: string
- }> {
- const store = getWorkletStore()
+ encryptionKey: string
+ encryptedSeed: string
+ }> {
const secureStorage = this.getSecureStorage()
// Require biometric authentication
@@ -190,21 +190,26 @@ export class WalletSetupService {
throw new Error('Biometric authentication required to create wallet')
}
- // Start worklet
- if (!store.getState().isWorkletStarted) {
- await WorkletLifecycleService.startWorklet(networkConfigs)
- }
+ // Ensure worklet is started (WdkAppProvider must be mounted)
+ WorkletLifecycleService.ensureWorkletStarted()
// Generate entropy and encrypt
const result = await WorkletLifecycleService.generateEntropyAndEncrypt(DEFAULT_MNEMONIC_WORD_COUNT)
- // Validate encryption compatibility
- await this.validateEncryptionCompatibility(
- networkConfigs,
- result.encryptionKey,
- result.encryptedSeedBuffer,
- result.encryptedEntropyBuffer
- )
+ // Validate encryption compatibility before saving to keychain
+ log('Validating encryption compatibility before saving to keychain...')
+ try {
+ await this.validateEncryptionCompatibility(
+ result.encryptionKey,
+ result.encryptedSeedBuffer,
+ result.encryptedEntropyBuffer
+ )
+ } catch (error) {
+ log('Encryption validation failed - aborting wallet creation', error)
+ // Reset worklet state on validation failure
+ WorkletLifecycleService.reset()
+ throw error
+ }
// Store credentials securely
try {
@@ -226,10 +231,10 @@ export class WalletSetupService {
result.encryptedSeedBuffer,
result.encryptedEntropyBuffer
)
-
+
return {
encryptionKey: result.encryptionKey,
- encryptedSeed: result.encryptedSeedBuffer,
+ encryptedSeed: result.encryptedSeedBuffer
}
}
@@ -237,12 +242,12 @@ export class WalletSetupService {
* Load existing wallet from secure storage
* Checks cache first, only requires biometric authentication if not cached
*/
- static async loadExistingWallet(
+ static async loadExistingWallet (
walletId?: string
): Promise<{
- encryptionKey: string
- encryptedSeed: string
- }> {
+ encryptionKey: string
+ encryptedSeed: string
+ }> {
const secureStorage = this.getSecureStorage()
const cacheKey = this.getCacheKey(walletId)
const cached = getCachedCredentials(cacheKey)
@@ -251,7 +256,7 @@ export class WalletSetupService {
if (cached?.encryptionKey && cached?.encryptedSeed) {
return {
encryptionKey: cached.encryptionKey,
- encryptedSeed: cached.encryptedSeed,
+ encryptedSeed: cached.encryptedSeed
}
}
@@ -272,14 +277,14 @@ export class WalletSetupService {
return {
encryptionKey,
- encryptedSeed,
+ encryptedSeed
}
}
/**
* Check if a wallet exists
*/
- static async hasWallet(walletId?: string): Promise {
+ static async hasWallet (walletId?: string): Promise {
const secureStorage = this.getSecureStorage()
return await secureStorage.hasWallet(walletId)
}
@@ -288,16 +293,14 @@ export class WalletSetupService {
* Initialize WDK from an existing mnemonic phrase
* Requires biometric authentication
*/
- static async initializeFromMnemonic(
- networkConfigs: NetworkConfigs,
+ static async initializeFromMnemonic (
mnemonic: string,
walletId?: string
): Promise<{
- encryptionKey: string
- encryptedSeed: string
- encryptedEntropy: string
- }> {
- const store = getWorkletStore()
+ encryptionKey: string
+ encryptedSeed: string
+ encryptedEntropy: string
+ }> {
const secureStorage = this.getSecureStorage()
// Require biometric authentication
@@ -306,21 +309,26 @@ export class WalletSetupService {
throw new Error('Biometric authentication required to import wallet')
}
- // Start worklet
- if (!store.getState().isWorkletStarted) {
- await WorkletLifecycleService.startWorklet(networkConfigs)
- }
+ // Ensure worklet is started (WdkAppProvider must be mounted)
+ WorkletLifecycleService.ensureWorkletStarted()
// Get seed and entropy from mnemonic
const result = await WorkletLifecycleService.getSeedAndEntropyFromMnemonic(mnemonic)
- // Validate encryption compatibility
- await this.validateEncryptionCompatibility(
- networkConfigs,
- result.encryptionKey,
- result.encryptedSeedBuffer,
- result.encryptedEntropyBuffer
- )
+ // Validate encryption compatibility before saving to keychain
+ log('Validating encryption compatibility before saving to keychain...')
+ try {
+ await this.validateEncryptionCompatibility(
+ result.encryptionKey,
+ result.encryptedSeedBuffer,
+ result.encryptedEntropyBuffer
+ )
+ } catch (error) {
+ log('Encryption validation failed - aborting wallet import', error)
+ // Reset worklet state on validation failure
+ WorkletLifecycleService.reset()
+ throw error
+ }
// Store credentials securely
try {
@@ -346,31 +354,25 @@ export class WalletSetupService {
// Initialize WDK
await WorkletLifecycleService.initializeWDK({
encryptionKey: result.encryptionKey,
- encryptedSeed: result.encryptedSeedBuffer,
+ encryptedSeed: result.encryptedSeedBuffer
})
-
+
return {
encryptionKey: result.encryptionKey,
encryptedSeed: result.encryptedSeedBuffer,
- encryptedEntropy: result.encryptedEntropyBuffer,
+ encryptedEntropy: result.encryptedEntropyBuffer
}
}
/**
* Initialize WDK with wallet credentials
*/
- static async initializeWDK(
- networkConfigs: NetworkConfigs,
- credentials: {
- encryptionKey: string
- encryptedSeed: string
- }
- ): Promise {
- const store = getWorkletStore()
-
- if (!store.getState().isWorkletStarted) {
- await WorkletLifecycleService.startWorklet(networkConfigs)
- }
+ static async initializeWDK (credentials: {
+ encryptionKey: string
+ encryptedSeed: string
+ }): Promise {
+ // Ensure worklet is started (WdkAppProvider must be mounted)
+ WorkletLifecycleService.ensureWorkletStarted()
await WorkletLifecycleService.initializeWDK(credentials)
}
@@ -379,30 +381,30 @@ export class WalletSetupService {
* Complete wallet initialization flow
* Either creates a new wallet or loads an existing one
*/
- static async initializeWallet(
- networkConfigs: NetworkConfigs,
+ static async initializeWallet (
options: {
createNew?: boolean
walletId?: string
}
): Promise {
- let credentials: { encryptionKey: string; encryptedSeed: string }
+ let credentials: { encryptionKey: string, encryptedSeed: string }
if (options.createNew) {
- credentials = await this.createNewWallet(networkConfigs, options.walletId)
+ credentials = await this.createNewWallet(options.walletId)
} else {
credentials = await this.loadExistingWallet(options.walletId)
}
- await this.initializeWDK(networkConfigs, credentials)
+ // Initialize WDK with credentials
+ await this.initializeWDK(credentials)
}
/**
* Delete wallet and clear all data
*/
- static async deleteWallet(walletId?: string): Promise {
+ static async deleteWallet (walletId?: string): Promise {
const secureStorage = this.getSecureStorage()
-
+
await secureStorage.deleteWallet(walletId)
WorkletLifecycleService.reset()
this.clearCredentialsCache(walletId)
@@ -411,12 +413,12 @@ export class WalletSetupService {
/**
* Get encryption key (checks cache first, then secureStorage with biometrics)
*/
- static async getEncryptionKey(walletId?: string): Promise {
+ static async getEncryptionKey (walletId?: string): Promise {
const secureStorage = this.getSecureStorage()
- return this.getCredential(
+ return await this.getCredential(
walletId,
'encryptionKey',
- (id) => secureStorage.getEncryptionKey(id),
+ async (id) => await secureStorage.getEncryptionKey(id),
'encryptionKey'
)
}
@@ -424,12 +426,12 @@ export class WalletSetupService {
/**
* Get encrypted seed (checks cache first, then secureStorage)
*/
- static async getEncryptedSeed(walletId?: string): Promise {
+ static async getEncryptedSeed (walletId?: string): Promise {
const secureStorage = this.getSecureStorage()
- return this.getCredential(
+ return await this.getCredential(
walletId,
'encryptedSeed',
- (id) => secureStorage.getEncryptedSeed(id),
+ async (id) => await secureStorage.getEncryptedSeed(id),
'encryptedSeed'
)
}
@@ -437,12 +439,12 @@ export class WalletSetupService {
/**
* Get encrypted entropy (checks cache first, then secureStorage)
*/
- static async getEncryptedEntropy(walletId?: string): Promise {
+ static async getEncryptedEntropy (walletId?: string): Promise {
const secureStorage = this.getSecureStorage()
- return this.getCredential(
+ return await this.getCredential(
walletId,
'encryptedEntropy',
- (id) => secureStorage.getEncryptedEntropy(id),
+ async (id) => await secureStorage.getEncryptedEntropy(id),
'encryptedEntropy'
)
}
@@ -450,7 +452,7 @@ export class WalletSetupService {
/**
* Get mnemonic phrase from wallet
*/
- static async getMnemonic(walletId?: string): Promise {
+ static async getMnemonic (walletId?: string): Promise {
const encryptedEntropy = await this.getEncryptedEntropy(walletId)
const encryptionKey = await this.getEncryptionKey(walletId)
@@ -462,14 +464,14 @@ export class WalletSetupService {
encryptedEntropy,
encryptionKey
)
-
+
return result.mnemonic || null
}
/**
* Clear all cached credentials
*/
- static clearCredentialsCache(walletId?: string): void {
+ static clearCredentialsCache (walletId?: string): void {
clearWorkletCredentialsCache(walletId ? this.getCacheKey(walletId) : undefined)
}
}
diff --git a/src/services/walletSwitchingService.ts b/src/services/walletSwitchingService.ts
index 117b29e..bd1ff41 100644
--- a/src/services/walletSwitchingService.ts
+++ b/src/services/walletSwitchingService.ts
@@ -12,10 +12,10 @@
import { WalletSetupService } from './walletSetupService'
import { WorkletLifecycleService } from './workletLifecycleService'
-import { getWalletStore } from '../store/walletStore'
import {
+ getWalletStore,
updateWalletLoadingState,
- getWalletIdFromLoadingState,
+ getWalletIdFromLoadingState
} from '../store/walletStore'
import { withOperationMutex } from '../utils/operationMutex'
import { normalizeError } from '../utils/errorUtils'
@@ -33,14 +33,12 @@ export class WalletSwitchingService {
*
* This method:
* 1. Checks if the wallet exists (fail fast)
- * 2. Ensures worklet is started
+ * 2. Ensures worklet is started (WdkAppProvider must be mounted)
* 3. Loads credentials for the wallet
* 4. Initializes WDK with the credentials
* 5. Updates activeWalletId in the store
*
* @param walletId - Wallet identifier to switch to
- * @param options - Optional configuration
- * @param options.autoStartWorklet - If true, start worklet if not started (default: false)
* @throws Error if wallet doesn't exist or switching fails
*
* @example
@@ -48,11 +46,11 @@ export class WalletSwitchingService {
* await WalletSwitchingService.switchToWallet('user@example.com')
* ```
*/
- static async switchToWallet(
+ static async switchToWallet (
walletId: string,
- options?: { autoStartWorklet?: boolean },
+ options?: { autoStartWorklet?: boolean }
): Promise {
- return withOperationMutex(`switchToWallet:${walletId}`, async () => {
+ return await withOperationMutex(`switchToWallet:${walletId}`, async () => {
const walletStore = getWalletStore()
const activeWalletId = walletStore.getState().activeWalletId
@@ -68,8 +66,8 @@ export class WalletSwitchingService {
updateWalletLoadingState(prev, {
type: 'loading',
identifier: walletId,
- walletExists: true,
- }),
+ walletExists: true
+ })
)
// Check if wallet exists first (fail fast)
@@ -78,10 +76,8 @@ export class WalletSwitchingService {
throw new Error(`Wallet with identifier "${walletId}" does not exist`)
}
- // Ensure worklet is started
- await WorkletLifecycleService.ensureWorkletStarted(undefined, {
- autoStart: options?.autoStartWorklet ?? false,
- })
+ // Ensure worklet is started (WdkAppProvider must be mounted)
+ WorkletLifecycleService.ensureWorkletStarted()
// Note: We don't clear previous wallet's credentials cache when switching
// The LRU eviction policy in workletStore will handle cache management
@@ -89,20 +85,20 @@ export class WalletSwitchingService {
if (activeWalletId !== null && activeWalletId !== walletId) {
log('[WalletSwitchingService] Switching wallets', {
from: activeWalletId,
- to: walletId,
+ to: walletId
})
// Cache is managed by LRU eviction - no need to clear here
}
// Load credentials for the wallet
const credentials = await WalletSetupService.loadExistingWallet(
- walletId,
+ walletId
)
// Switch worklet to this wallet
await WorkletLifecycleService.initializeWDK({
encryptionKey: credentials.encryptionKey,
- encryptedSeed: credentials.encryptedSeed,
+ encryptedSeed: credentials.encryptedSeed
})
// Update activeWalletId in store and mark as ready
@@ -110,32 +106,32 @@ export class WalletSwitchingService {
produce(
updateWalletLoadingState(prev, {
type: 'ready',
- identifier: walletId,
+ identifier: walletId
}),
(state) => {
state.activeWalletId = walletId
- },
- ),
+ }
+ )
)
log('[WalletSwitchingService] Successfully switched to wallet', {
- walletId,
+ walletId
})
} catch (error) {
// Cleanup state on error
const normalizedError = normalizeError(error, false, {
component: 'WalletSwitchingService',
operation: 'switchToWallet',
- walletId,
+ walletId
})
logError(
'[WalletSwitchingService] Failed to switch wallet, cleaning up state',
- normalizedError,
+ normalizedError
)
walletStore.setState((prev) => {
const currentWalletId = getWalletIdFromLoadingState(
- prev.walletLoadingState,
+ prev.walletLoadingState
)
// Only update error state if we were loading this wallet
if (
@@ -145,7 +141,7 @@ export class WalletSwitchingService {
return updateWalletLoadingState(prev, {
type: 'error',
identifier: walletId,
- error: normalizedError,
+ error: normalizedError
})
}
return prev
@@ -162,7 +158,7 @@ export class WalletSwitchingService {
* @param walletId - Wallet identifier to check
* @returns Promise resolving to true if wallet exists and can be switched to
*/
- static async canSwitchToWallet(walletId: string): Promise {
+ static async canSwitchToWallet (walletId: string): Promise {
try {
return await WalletSetupService.hasWallet(walletId)
} catch (error) {
@@ -170,11 +166,11 @@ export class WalletSwitchingService {
const normalizedError = normalizeError(error, false, {
component: 'WalletSwitchingService',
operation: 'canSwitchToWallet',
- walletId,
+ walletId
})
logError(
'[WalletSwitchingService] Failed to check wallet:',
- normalizedError,
+ normalizedError
)
return false
}
diff --git a/src/services/workletLifecycleService.ts b/src/services/workletLifecycleService.ts
index fc31678..83cae55 100644
--- a/src/services/workletLifecycleService.ts
+++ b/src/services/workletLifecycleService.ts
@@ -5,19 +5,18 @@
* This service is focused solely on worklet lifecycle management.
*/
-import { HRPC } from '@tetherto/pear-wrk-wdk'
import { Worklet } from 'react-native-bare-kit'
import { getWalletStore } from '../store/walletStore'
import { getWorkletStore } from '../store/workletStore'
-import { asExtendedHRPC } from '../types/hrpc'
import { DEFAULT_MNEMONIC_WORD_COUNT } from '../utils/constants'
import { handleServiceError } from '../utils/errorHandling'
import { normalizeError } from '../utils/errorUtils'
import { log, logWarn } from '../utils/logger'
import { isInitialized as isWorkletInitialized } from '../utils/storeHelpers'
-import type { NetworkConfigs } from '../types'
+import type { WdkConfigs, BundleConfig } from '../types'
import type { WorkletState } from '../store/workletStore'
+import HRPC from '@tetherto/pear-wrk-wdk/hrpc'
/**
* Extended HRPC type that may have a cleanup method
@@ -38,7 +37,7 @@ interface WorkletWithCleanup extends Worklet {
/**
* Type guard to check if HRPC has cleanup method
*/
-function hasHRPCCleanup(hrpc: HRPC): hrpc is HRPCWithCleanup {
+function hasHRPCCleanup (hrpc: HRPC): hrpc is HRPCWithCleanup {
return (
'cleanup' in hrpc &&
typeof (hrpc as Record).cleanup === 'function'
@@ -48,7 +47,7 @@ function hasHRPCCleanup(hrpc: HRPC): hrpc is HRPCWithCleanup {
/**
* Type guard to check if Worklet has cleanup methods
*/
-function hasWorkletCleanup(worklet: Worklet): worklet is WorkletWithCleanup {
+function hasWorkletCleanup (worklet: Worklet): worklet is WorkletWithCleanup {
const w = worklet as unknown as Record
return (
typeof w.cleanup === 'function' ||
@@ -67,11 +66,11 @@ export class WorkletLifecycleService {
* Cleanup a resource by trying cleanup methods in order
* Handles cleanup gracefully, continuing even if individual steps fail
*/
- private static async cleanupResource(
+ private static async cleanupResource (
resource: HRPC | Worklet | null,
- cleanupMethods: string[],
+ cleanupMethods: string[]
): Promise {
- if (!resource) return
+ if (resource == null) return
const r = resource as unknown as Record
const method = cleanupMethods.find((m) => typeof r[m] === 'function')
@@ -88,9 +87,9 @@ export class WorkletLifecycleService {
* Cleanup worklet resources (HRPC and Worklet instances)
* Handles cleanup gracefully, continuing even if individual steps fail
*/
- private static async cleanupWorkletResources(
+ private static async cleanupWorkletResources (
hrpc: HRPC | null,
- worklet: Worklet | null,
+ worklet: Worklet | null
): Promise {
try {
// Cleanup HRPC if it has a cleanup method
@@ -103,10 +102,17 @@ export class WorkletLifecycleService {
// Continue even if cleanup fails
}
}
+
/**
- * Start the worklet with network configurations
+ * Start the worklet with network configurations and bundle
+ *
+ * @param wdkConfigs - Network configurations
+ * @param bundleConfig - Bundle configuration containing the worklet bundle and HRPC class
*/
- static async startWorklet(networkConfigs: NetworkConfigs): Promise {
+ static async startWorklet (
+ wdkConfigs: WdkConfigs,
+ bundleConfig: BundleConfig
+ ): Promise {
const store = getWorkletStore()
const state = store.getState()
@@ -125,25 +131,16 @@ export class WorkletLifecycleService {
// Cleanup existing worklet if present
const { worklet: existingWorklet, hrpc: existingHrpc } = store.getState()
- if (existingWorklet || existingHrpc) {
+ if ((existingWorklet != null) || (existingHrpc != null)) {
await this.cleanupWorkletResources(existingHrpc, existingWorklet)
}
const worklet = new Worklet()
- // Dynamic import of @tetherto/pear-wrk-wdk bundle
- const pearWrkWdk = await import('@tetherto/pear-wrk-wdk')
- const bundle = (pearWrkWdk as { bundle?: unknown }).bundle
+ // Get bundle and HRPC class from bundleConfig (passed from WdkAppProvider)
+ const { bundle } = bundleConfig
- if (!bundle) {
- throw new Error('Failed to load @tetherto/pear-wrk-wdk bundle')
- }
-
- // Bundle file (mobile bundle for React Native) - worklet.start expects bundle parameter
- ;(worklet.start as (path: string, bundle: unknown) => void)(
- '/wdk-worklet.bundle',
- bundle,
- )
+ worklet.start('wdk-worklet.bundle', bundle)
const { IPC } = worklet
@@ -154,7 +151,7 @@ export class WorkletLifecycleService {
const hrpcInstance = new HRPC(IPC)
const result = await hrpcInstance.workletStart({
- config: JSON.stringify(networkConfigs),
+ config: JSON.stringify(wdkConfigs)
})
store.setState({
@@ -163,9 +160,9 @@ export class WorkletLifecycleService {
ipc: IPC,
isWorkletStarted: true,
isLoading: false,
- networkConfigs,
+ wdkConfigs,
workletStartResult: result,
- error: null,
+ error: null
})
} catch (error) {
this.handleErrorWithStateUpdate(
@@ -177,8 +174,8 @@ export class WorkletLifecycleService {
worklet: null,
hrpc: null,
ipc: null,
- isWorkletStarted: false,
- }),
+ isWorkletStarted: false
+ })
)
}
}
@@ -186,14 +183,15 @@ export class WorkletLifecycleService {
/**
* Ensure worklet is started, starting it if needed
*
- * @param networkConfigs - Network configs (required if autoStart=true)
+ * @param wdkConfigs - Network configs (required if autoStart=true)
* @param options - Options
* @param options.autoStart - If true, start worklet if not started (default: false)
* @throws Error if worklet not started and autoStart=false or networkConfigs not provided
*/
- static async ensureWorkletStarted(
- networkConfigs?: NetworkConfigs,
+ static async ensureWorkletStarted (
+ wdkConfigs?: WdkConfigs,
options?: { autoStart?: boolean },
+ bundleConfig?: BundleConfig
): Promise {
const store = getWorkletStore()
const state = store.getState()
@@ -203,17 +201,17 @@ export class WorkletLifecycleService {
}
const autoStart = options?.autoStart ?? false
- if (!autoStart || !networkConfigs) {
+ if (!autoStart || (wdkConfigs == null) || (bundleConfig == null)) {
throw new Error('Worklet must be started before this operation')
}
- await this.startWorklet(networkConfigs)
+ await this.startWorklet(wdkConfigs, bundleConfig)
}
/**
* Initialize WDK with encrypted seed (ONLY encrypted approach)
*/
- static async initializeWDK(options: {
+ static async initializeWDK (options: {
encryptionKey: string
encryptedSeed: string
}): Promise {
@@ -239,16 +237,15 @@ export class WorkletLifecycleService {
// Get HRPC directly from store instead of using requireExtendedHRPC()
// requireExtendedHRPC() requires isInitialized to be true, but we're setting it here
const currentState = store.getState()
- if (!currentState.hrpc) {
+ if (currentState.hrpc == null) {
throw new Error(
- 'HRPC instance not available. Worklet may not be fully started.',
+ 'HRPC instance not available. Worklet may not be fully started.'
)
}
- const extendedHrpc = asExtendedHRPC(currentState.hrpc)
- const result = await extendedHrpc.initializeWDK({
+ const result = await currentState.hrpc.initializeWDK({
encryptionKey: options.encryptionKey,
encryptedSeed: options.encryptedSeed,
- config: JSON.stringify(currentState.networkConfigs || {}),
+ config: JSON.stringify(currentState.wdkConfigs)
})
// NEVER store seed phrase
@@ -261,7 +258,7 @@ export class WorkletLifecycleService {
encryptedSeed: options.encryptedSeed,
encryptionKey: options.encryptionKey,
wdkInitResult,
- error: null,
+ error: null
})
} catch (error) {
this.handleErrorWithStateUpdate(
@@ -270,8 +267,8 @@ export class WorkletLifecycleService {
(normalizedError) => ({
error: normalizedError.message,
isLoading: false,
- isInitialized: false,
- }),
+ isInitialized: false
+ })
)
}
}
@@ -279,13 +276,13 @@ export class WorkletLifecycleService {
/**
* Generate entropy and encrypt (for creating new wallets)
*/
- static async generateEntropyAndEncrypt(
- wordCount: 12 | 24 = DEFAULT_MNEMONIC_WORD_COUNT,
+ static async generateEntropyAndEncrypt (
+ wordCount: 12 | 24 = DEFAULT_MNEMONIC_WORD_COUNT
): Promise<{
- encryptionKey: string
- encryptedSeedBuffer: string
- encryptedEntropyBuffer: string
- }> {
+ encryptionKey: string
+ encryptedSeedBuffer: string
+ encryptedEntropyBuffer: string
+ }> {
const store = getWorkletStore()
const state = store.getState()
@@ -297,26 +294,25 @@ export class WorkletLifecycleService {
// Get HRPC directly from store instead of using requireExtendedHRPC()
// These methods may be called before WDK is initialized
const currentState = store.getState()
- if (!currentState.hrpc) {
+ if (currentState.hrpc == null) {
throw new Error(
- 'HRPC instance not available. Worklet may not be fully started.',
+ 'HRPC instance not available. Worklet may not be fully started.'
)
}
- const extendedHrpc = asExtendedHRPC(currentState.hrpc)
- const result = await extendedHrpc.generateEntropyAndEncrypt({
- wordCount,
+ const result = await currentState.hrpc.generateEntropyAndEncrypt({
+ wordCount
})
return {
encryptionKey: result.encryptionKey,
encryptedSeedBuffer: result.encryptedSeedBuffer,
- encryptedEntropyBuffer: result.encryptedEntropyBuffer,
+ encryptedEntropyBuffer: result.encryptedEntropyBuffer
}
} catch (error) {
this.handleAndThrowError(
error,
'generateEntropyAndEncrypt',
- 'Failed to generate entropy',
+ 'Failed to generate entropy'
)
}
}
@@ -324,12 +320,12 @@ export class WorkletLifecycleService {
/**
* Get mnemonic from encrypted entropy (for display purposes only - never stored)
*/
- static async getMnemonicFromEntropy(
+ static async getMnemonicFromEntropy (
encryptedEntropy: string,
- encryptionKey: string,
+ encryptionKey: string
): Promise<{
- mnemonic: string
- }> {
+ mnemonic: string
+ }> {
const store = getWorkletStore()
const state = store.getState()
@@ -341,26 +337,24 @@ export class WorkletLifecycleService {
// Get HRPC directly from store instead of using requireExtendedHRPC()
// These methods may be called before WDK is initialized
const currentState = store.getState()
- if (!currentState.hrpc) {
+ if (currentState.hrpc == null) {
throw new Error(
- 'HRPC instance not available. Worklet may not be fully started.',
+ 'HRPC instance not available. Worklet may not be fully started.'
)
}
- const extendedHrpc = asExtendedHRPC(currentState.hrpc)
-
- const result = await extendedHrpc.getMnemonicFromEntropy({
+ const result = await currentState.hrpc.getMnemonicFromEntropy({
encryptedEntropy,
- encryptionKey,
+ encryptionKey
})
return {
- mnemonic: result.mnemonic,
+ mnemonic: result.mnemonic
}
} catch (error) {
this.handleAndThrowError(
error,
'getMnemonicFromEntropy',
- 'Failed to get mnemonic',
+ 'Failed to get mnemonic'
)
}
}
@@ -368,7 +362,7 @@ export class WorkletLifecycleService {
/**
* Get seed and entropy from mnemonic phrase (for importing existing wallets)
*/
- static async getSeedAndEntropyFromMnemonic(mnemonic: string): Promise<{
+ static async getSeedAndEntropyFromMnemonic (mnemonic: string): Promise<{
encryptionKey: string
encryptedSeedBuffer: string
encryptedEntropyBuffer: string
@@ -378,7 +372,7 @@ export class WorkletLifecycleService {
if (!state.isWorkletStarted) {
throw new Error(
- 'Worklet must be started before getting seed and entropy from mnemonic',
+ 'Worklet must be started before getting seed and entropy from mnemonic'
)
}
@@ -386,43 +380,51 @@ export class WorkletLifecycleService {
// Get HRPC directly from store instead of using requireExtendedHRPC()
// These methods may be called before WDK is initialized
const currentState = store.getState()
- if (!currentState.hrpc) {
+ if (currentState.hrpc == null) {
throw new Error(
- 'HRPC instance not available. Worklet may not be fully started.',
+ 'HRPC instance not available. Worklet may not be fully started.'
)
}
- const extendedHrpc = asExtendedHRPC(currentState.hrpc)
- const result = await extendedHrpc.getSeedAndEntropyFromMnemonic({
- mnemonic,
+ const result = await currentState.hrpc.getSeedAndEntropyFromMnemonic({
+ mnemonic
})
return {
encryptionKey: result.encryptionKey,
encryptedSeedBuffer: result.encryptedSeedBuffer,
- encryptedEntropyBuffer: result.encryptedEntropyBuffer,
+ encryptedEntropyBuffer: result.encryptedEntropyBuffer
}
} catch (error) {
this.handleAndThrowError(
error,
'getSeedAndEntropyFromMnemonic',
- 'Failed to get seed and entropy from mnemonic',
+ 'Failed to get seed and entropy from mnemonic'
)
}
}
/**
* Initialize both worklet and WDK in one call (convenience method) - ONLY encrypted
+ *
+ * @param options - Initialization options
+ * @param options.encryptionKey - Encryption key for the seed
+ * @param options.encryptedSeed - Encrypted seed buffer
+ * @param options.networkConfigs - Network configurations
+ * @param options.bundleConfig - Bundle configuration
*/
- static async initializeWorklet(options: {
- encryptionKey: string
- encryptedSeed: string
- networkConfigs: NetworkConfigs
- }): Promise {
+ static async initializeWorklet (
+ options: {
+ encryptionKey: string
+ encryptedSeed: string
+ networkConfigs: WdkConfigs
+ bundleConfig: BundleConfig
+ }
+ ): Promise {
// Convenience method that does both steps - ONLY encrypted approach
- await this.startWorklet(options.networkConfigs)
+ await this.startWorklet(options.networkConfigs, options.bundleConfig)
await this.initializeWDK({
encryptionKey: options.encryptionKey,
- encryptedSeed: options.encryptedSeed,
+ encryptedSeed: options.encryptedSeed
})
}
@@ -430,14 +432,14 @@ export class WorkletLifecycleService {
* Handle error for methods that throw with a message prefix
* Normalizes error, logs it, and throws a new error with operation context
*/
- private static handleAndThrowError(
+ private static handleAndThrowError (
error: unknown,
operation: string,
- errorMessagePrefix: string,
+ errorMessagePrefix: string
): never {
const normalizedError = normalizeError(error, false, {
component: 'WorkletLifecycleService',
- operation,
+ operation
})
handleServiceError(error, 'WorkletLifecycleService', operation)
throw new Error(`${errorMessagePrefix}: ${normalizedError.message}`)
@@ -447,14 +449,14 @@ export class WorkletLifecycleService {
* Handle error for methods that update store state
* Normalizes error, updates store state, and re-throws
*/
- private static handleErrorWithStateUpdate(
+ private static handleErrorWithStateUpdate (
error: unknown,
operation: string,
- stateUpdate: (normalizedError: Error) => Partial,
+ stateUpdate: (normalizedError: Error) => Partial
): never {
const normalizedError = normalizeError(error, false, {
component: 'WorkletLifecycleService',
- operation,
+ operation
})
const store = getWorkletStore()
store.setState(stateUpdate(normalizedError))
@@ -466,8 +468,8 @@ export class WorkletLifecycleService {
* Extract WDK initialization result status
* Safely extracts status from result object
*/
- private static extractWdkInitResult(
- result: unknown,
+ private static extractWdkInitResult (
+ result: unknown
): { status?: string | null } | null {
if (result && typeof result === 'object' && 'status' in result) {
const status = (result as { status?: unknown }).status
@@ -485,7 +487,7 @@ export class WorkletLifecycleService {
/**
* Reset both worklet and wallet stores
*/
- private static resetStores(): void {
+ private static resetStores (): void {
const workletStore = getWorkletStore()
const walletStore = getWalletStore()
@@ -499,40 +501,16 @@ export class WorkletLifecycleService {
error: null,
encryptedSeed: null,
encryptionKey: null,
- networkConfigs: null,
+ wdkConfigs: null,
workletStartResult: null,
- wdkInitResult: null,
+ wdkInitResult: null
})
walletStore.setState({
addresses: {},
walletLoading: {},
balances: {},
balanceLoading: {},
- lastBalanceUpdate: {},
- })
- }
-
- /**
- * Cleanup worklet resources
- * Clears only addresses, seed, and WDK instance - does NOT terminate the worklet
- * The worklet continues running for faster re-initialization
- */
- static async cleanup(): Promise {
- const workletStore = getWorkletStore()
- const walletStore = getWalletStore()
-
- // Clear only sensitive data - addresses, seed, and WDK instance
- // Do NOT terminate worklet, hrpc, or ipc - keep them running
- workletStore.setState({
- encryptedSeed: null,
- encryptionKey: null,
- isInitialized: false,
- wdkInitResult: null,
- })
-
- // Clear addresses from wallet store
- walletStore.setState({
- addresses: {},
+ lastBalanceUpdate: {}
})
}
@@ -542,7 +520,7 @@ export class WorkletLifecycleService {
* The worklet continues running for faster re-initialization
* For async cleanup, use cleanup() instead
*/
- static reset(): void {
+ static reset (): void {
const workletStore = getWorkletStore()
const walletStore = getWalletStore()
@@ -552,19 +530,19 @@ export class WorkletLifecycleService {
encryptedSeed: null,
encryptionKey: null,
isInitialized: false,
- wdkInitResult: null,
+ wdkInitResult: null
})
// Clear addresses from wallet store
walletStore.setState({
- addresses: {},
+ addresses: {}
})
}
/**
* Clear error state
*/
- static clearError(): void {
+ static clearError (): void {
const store = getWorkletStore()
store.setState({ error: null })
}
@@ -573,7 +551,7 @@ export class WorkletLifecycleService {
* Check if wallet is initialized
* Returns true if worklet is started and WDK is initialized
*/
- static isInitialized(): boolean {
+ static isInitialized (): boolean {
return isWorkletInitialized()
}
}
diff --git a/src/storage/mmkvStorage.ts b/src/storage/mmkvStorage.ts
index 136de43..ac7b059 100644
--- a/src/storage/mmkvStorage.ts
+++ b/src/storage/mmkvStorage.ts
@@ -28,7 +28,7 @@ let storageAccessCounter = 0
/**
* Evict least recently used storage instance from cache when limit is reached
*/
-function evictLRUStorage(): void {
+function evictLRUStorage (): void {
if (storageCache.size < MAX_STORAGE_CACHE_SIZE) {
return
}
@@ -53,26 +53,26 @@ function evictLRUStorage(): void {
/**
* Create MMKV storage instance for the wallet
- *
+ *
* SECURITY NOTE: MMKV stores files in the app's document directory, which is app-scoped.
* Two different apps will NOT share data because each app has its own isolated document directory.
- *
+ *
* This is for non-sensitive data persistence (wallet metadata, balances, addresses).
* For sensitive data (encrypted seeds, keys), use SecureStorage from wdk-react-native-secure-storage.
- *
+ *
* The encryption key is derived from a device/app identifier to ensure each app instance
* has a unique encryption key. If no account identifier is provided, a default app-scoped
* identifier is used.
- *
+ *
* @param accountIdentifier - Optional account identifier for per-account encryption keys.
* If not provided, uses a default app-scoped identifier.
* @returns Promise that resolves to MMKV storage instance
*/
-export async function createMMKVStorage(accountIdentifier?: string): Promise {
+export async function createMMKVStorage (accountIdentifier?: string): Promise {
// Use account identifier if provided, otherwise use a default app-scoped identifier
// This ensures each app instance has a unique key while allowing per-account keys
const identifier = accountIdentifier || 'wdk-app-default'
-
+
// Check cache first
const cachedStorage = storageCache.get(identifier)
if (cachedStorage !== undefined) {
@@ -81,23 +81,23 @@ export async function createMMKVStorage(accountIdentifier?: string): Promise | null = null
let initState: StorageInitState = StorageInitState.NOT_STARTED
let initError: Error | null = null
const pendingOperations: PendingOperation[] = []
-
+
// Process queued operations after storage is ready
const processPendingOperations = (storage: MMKV): void => {
// Process all pending operations in order
const operations = [...pendingOperations]
pendingOperations.length = 0 // Clear the array
-
+
for (const op of operations) {
try {
switch (op.type) {
@@ -228,38 +228,38 @@ export function createMMKVStorageAdapter(accountIdentifier?: string): StorageAda
}
}
}
-
+
// Initialize storage asynchronously
const ensureStorage = async (): Promise => {
// Return immediately if already ready
- if (storageInstance && initState === StorageInitState.READY) {
+ if ((storageInstance != null) && initState === StorageInitState.READY) {
return storageInstance
}
-
+
// Return existing promise if initializing
- if (storagePromise && initState === StorageInitState.INITIALIZING) {
- return storagePromise
+ if ((storagePromise != null) && initState === StorageInitState.INITIALIZING) {
+ return await storagePromise
}
-
+
// If we're in error state, throw the error
- if (initState === StorageInitState.ERROR && initError) {
+ if (initState === StorageInitState.ERROR && (initError != null)) {
throw initError
}
-
+
// Start initialization
if (initState === StorageInitState.NOT_STARTED) {
initState = StorageInitState.INITIALIZING
initError = null
-
+
storagePromise = createMMKVStorage(identifier)
.then((storage) => {
storageInstance = storage
initState = StorageInitState.READY
initError = null
-
+
// Process all pending operations
processPendingOperations(storage)
-
+
return storage
})
.catch((error) => {
@@ -267,40 +267,40 @@ export function createMMKVStorageAdapter(accountIdentifier?: string): StorageAda
initState = StorageInitState.ERROR
initError = err
storagePromise = null
-
+
// Reject all pending operations
const operations = [...pendingOperations]
pendingOperations.length = 0
for (const op of operations) {
op.reject(err)
}
-
+
throw err
})
}
-
+
// At this point, storagePromise should be set
- if (!storagePromise) {
+ if (storagePromise == null) {
const err = new Error('Failed to initialize storage: promise not created')
initState = StorageInitState.ERROR
initError = err
throw err
}
-
- return storagePromise
+
+ return await storagePromise
}
-
+
// Start initialization immediately in the background
// This helps reduce the window where operations need to be queued
ensureStorage().catch((error) => {
// Error is stored in initError and will be thrown on next access
// This prevents unhandled promise rejections
})
-
+
const adapter: StorageAdapter = {
getItem: (name: string): string | null => {
// If storage is ready, read directly
- if (storageInstance && initState === StorageInitState.READY) {
+ if ((storageInstance != null) && initState === StorageInitState.READY) {
try {
const value = storageInstance.getString(name)
return value ?? null
@@ -309,17 +309,17 @@ export function createMMKVStorageAdapter(accountIdentifier?: string): StorageAda
return null
}
}
-
+
// If we're in error state, return null (Zustand will handle gracefully)
// The error will be thrown on next write operation
if (initState === StorageInitState.ERROR) {
return null
}
-
+
// LIMITATION: During initialization, we cannot return values synchronously
// because storage initialization is async. Zustand's StorageAdapter interface
// requires synchronous getItem, so we must return null during initialization.
- //
+ //
// This is expected behavior:
// - On first load during initialization: returns null, Zustand uses default state
// - After initialization: subsequent getItem calls will work correctly
@@ -330,14 +330,14 @@ export function createMMKVStorageAdapter(accountIdentifier?: string): StorageAda
ensureStorage().catch(() => {
// Errors are handled in ensureStorage and stored in initError
})
-
+
// Return null during initialization - Zustand handles this gracefully
// The actual value will be available on next read after initialization completes
return null
},
setItem: (name: string, value: string): void => {
// If storage is ready, write directly
- if (storageInstance && initState === StorageInitState.READY) {
+ if ((storageInstance != null) && initState === StorageInitState.READY) {
try {
storageInstance.set(name, value)
return
@@ -346,7 +346,7 @@ export function createMMKVStorageAdapter(accountIdentifier?: string): StorageAda
// This handles edge cases where storage becomes unavailable
}
}
-
+
// Queue the write operation
pendingOperations.push({
type: 'set',
@@ -359,9 +359,9 @@ export function createMMKVStorageAdapter(accountIdentifier?: string): StorageAda
// Log error but don't throw - this is non-critical data
// In production, you might want to log this to error tracking
logWarn('[MMKVStorageAdapter] Failed to set item:', name, error)
- },
+ }
})
-
+
// Ensure storage is initializing
ensureStorage().catch((error) => {
// Error is stored and will be thrown when processing pending operations
@@ -370,7 +370,7 @@ export function createMMKVStorageAdapter(accountIdentifier?: string): StorageAda
},
removeItem: (name: string): void => {
// If storage is ready, delete directly
- if (storageInstance && initState === StorageInitState.READY) {
+ if ((storageInstance != null) && initState === StorageInitState.READY) {
try {
;(storageInstance as MMKVWithDelete).delete(name)
return
@@ -378,7 +378,7 @@ export function createMMKVStorageAdapter(accountIdentifier?: string): StorageAda
// If delete fails, queue it to retry later
}
}
-
+
// Queue the delete operation
pendingOperations.push({
type: 'remove',
@@ -389,21 +389,21 @@ export function createMMKVStorageAdapter(accountIdentifier?: string): StorageAda
reject: (error) => {
// Log error but don't throw - this is non-critical data
logWarn('[MMKVStorageAdapter] Failed to remove item:', name, error)
- },
+ }
})
-
+
// Ensure storage is initializing
ensureStorage().catch((error) => {
// Error is stored and will be thrown when processing pending operations
})
- },
+ }
}
-
+
// Cache the adapter
adapterAccessCounter++
adapterCache.set(identifier, adapter)
adapterAccessOrder.set(identifier, adapterAccessCounter)
-
+
return adapter
}
@@ -412,6 +412,5 @@ export function createMMKVStorageAdapter(accountIdentifier?: string): StorageAda
* MMKV has a delete method but TypeScript types may not include it
*/
interface MMKVWithDelete extends MMKV {
- delete(key: string): void
+ delete: (key: string) => void
}
-
diff --git a/src/store/walletStore.ts b/src/store/walletStore.ts
index fb7ae57..faa32f1 100644
--- a/src/store/walletStore.ts
+++ b/src/store/walletStore.ts
@@ -7,9 +7,9 @@
*
* **walletStore** (this file):
* - Wallet addresses: { [walletId]: { [network]: { [accountIndex]: address } } }
- * - Wallet balances: { [walletId]: { [network]: { [accountIndex]: { [tokenAddress]: balance } } } }
+ * - Wallet balances: { [walletId]: { [network]: { [accountIndex]: { [assetId]: balance } } } }
* - Address loading states: { [walletId]: { [network-accountIndex]: boolean } }
- * - Balance loading states: { [walletId]: { [network-accountIndex-tokenAddress]: boolean } }
+ * - Balance loading states: { [walletId]: { [network-accountIndex-assetId]: boolean } }
* - Last balance update timestamps: { [walletId]: { [network]: { [accountIndex]: timestamp } } }
* - Account list: { [walletId]: Array of account info }
* - Wallet list: Array of wallet info (multiple wallets)
@@ -54,7 +54,7 @@ import { produce } from 'immer'
import type {
WalletAddressesByWallet,
WalletBalancesByWallet,
- BalanceLoadingStates,
+ BalanceLoadingStates
} from '../types'
import { createMMKVStorageAdapter } from '../storage/mmkvStorage'
import { log, logError } from '../utils/logger'
@@ -85,10 +85,10 @@ export interface WalletInfo {
*/
export type WalletLoadingState =
| { type: 'not_loaded' }
- | { type: 'checking'; identifier: string }
- | { type: 'loading'; identifier: string; walletExists: boolean }
- | { type: 'ready'; identifier: string }
- | { type: 'error'; identifier: string | null; error: Error }
+ | { type: 'checking', identifier: string }
+ | { type: 'loading', identifier: string, walletExists: boolean }
+ | { type: 'ready', identifier: string }
+ | { type: 'error', identifier: string | null, error: Error }
export interface WalletState {
// SOURCE OF TRUTH - addresses stored ONLY here (per-wallet)
@@ -96,7 +96,7 @@ export interface WalletState {
walletLoading: Record // walletId -> loading states
// SOURCE OF TRUTH - balances stored ONLY here (per-wallet)
balances: WalletBalancesByWallet // walletId -> balances
- // Maps walletId -> "network-accountIndex-tokenAddress" -> boolean
+ // Maps walletId -> "network-accountIndex-assetId" -> boolean
balanceLoading: Record // walletId -> loading states
lastBalanceUpdate: Record>> // walletId -> network -> accountIndex -> timestamp
// Account list management (per-wallet)
@@ -126,7 +126,7 @@ const initialState: WalletState = {
activeWalletId: null,
walletLoadingState: { type: 'not_loaded' },
isOperationInProgress: false,
- currentOperation: null,
+ currentOperation: null
}
const defaultStorageAdapter = createMMKVStorageAdapter()
@@ -137,8 +137,8 @@ let walletStoreInstance: WalletStoreInstance | null = null
* Creates singleton wallet store instance.
* All operations are handled by focused services (AddressService, BalanceService), not the store itself.
*/
-export function createWalletStore(): WalletStoreInstance {
- if (walletStoreInstance) {
+export function createWalletStore (): WalletStoreInstance {
+ if (walletStoreInstance != null) {
return walletStoreInstance
}
@@ -146,7 +146,7 @@ export function createWalletStore(): WalletStoreInstance {
devtools(
persist(
(_set, _get) => ({
- ...initialState,
+ ...initialState
}),
{
name: 'wallet-storage',
@@ -158,13 +158,13 @@ export function createWalletStore(): WalletStoreInstance {
lastBalanceUpdate: state.lastBalanceUpdate,
accountList: state.accountList,
walletList: state.walletList,
- activeWalletId: state.activeWalletId,
+ activeWalletId: state.activeWalletId
// Don't persist loading state or operation mutex - these are runtime-only
}),
onRehydrateStorage: () => {
return (state: WalletState | undefined) => {
- if (state) {
- log('🔄 Rehydrating wallet state - resetting loading states')
+ if (state != null) {
+ log('Rehydrating wallet state - resetting loading states')
state.walletLoading = {}
state.balanceLoading = {}
// Reset runtime-only state
@@ -173,17 +173,17 @@ export function createWalletStore(): WalletStoreInstance {
state.currentOperation = null
}
}
- },
- },
+ }
+ }
),
- { name: 'WalletStore' },
- ),
+ { name: 'WalletStore' }
+ )
)
return walletStoreInstance
}
-export function getWalletStore() {
+export function getWalletStore () {
return createWalletStore()
}
@@ -196,9 +196,9 @@ export function getWalletStore() {
* Validate state transition
* Returns true if transition is valid, false otherwise
*/
-function isValidStateTransition(
+function isValidStateTransition (
current: WalletLoadingState,
- next: WalletLoadingState['type'],
+ next: WalletLoadingState['type']
): boolean {
// Allow reset from any state
if (next === 'not_loaded') return true
@@ -240,9 +240,9 @@ function isValidStateTransition(
* Throws error if transition is invalid
* Logs state transitions for debugging
*/
-export function updateWalletLoadingState(
+export function updateWalletLoadingState (
state: WalletState,
- newState: WalletLoadingState,
+ newState: WalletLoadingState
) {
// Log state transition for debugging
if (state.walletLoadingState.type !== newState.type) {
@@ -250,18 +250,18 @@ export function updateWalletLoadingState(
`[WalletState] Transition: ${state.walletLoadingState.type} -> ${newState.type}`,
{
from: state.walletLoadingState,
- to: newState,
- },
+ to: newState
+ }
)
}
if (!isValidStateTransition(state.walletLoadingState, newState.type)) {
const error = new Error(
- `Invalid state transition from ${state.walletLoadingState.type} to ${newState.type}`,
+ `Invalid state transition from ${state.walletLoadingState.type} to ${newState.type}`
)
logError(`⚠️ Invalid state transition: ${error.message}`, {
currentState: state.walletLoadingState,
- attemptedState: newState,
+ attemptedState: newState
})
// In development, throw error. In production, log and allow transition
// Note: __DEV__ is a React Native global, may not be available in all environments
@@ -278,8 +278,8 @@ export function updateWalletLoadingState(
/**
* Get wallet identifier from loading state
*/
-export function getWalletIdFromLoadingState(
- state: WalletLoadingState,
+export function getWalletIdFromLoadingState (
+ state: WalletLoadingState
): string | null {
switch (state.type) {
case 'checking':
@@ -296,20 +296,20 @@ export function getWalletIdFromLoadingState(
/**
* Check if wallet is in a loading state
*/
-export function isWalletLoadingState(state: WalletLoadingState): boolean {
+export function isWalletLoadingState (state: WalletLoadingState): boolean {
return state.type === 'checking' || state.type === 'loading'
}
/**
* Check if wallet is ready
*/
-export function isWalletReadyState(state: WalletLoadingState): boolean {
+export function isWalletReadyState (state: WalletLoadingState): boolean {
return state.type === 'ready'
}
/**
* Check if wallet is in error state
*/
-export function isWalletErrorState(state: WalletLoadingState): boolean {
+export function isWalletErrorState (state: WalletLoadingState): boolean {
return state.type === 'error'
}
diff --git a/src/store/workletStore.ts b/src/store/workletStore.ts
index d54bc92..5d881bd 100644
--- a/src/store/workletStore.ts
+++ b/src/store/workletStore.ts
@@ -43,11 +43,13 @@
import { create } from 'zustand'
import { devtools } from 'zustand/middleware'
import { Worklet } from 'react-native-bare-kit'
-import { HRPC } from '@tetherto/pear-wrk-wdk'
-import type { WorkletStartResponse } from '@tetherto/pear-wrk-wdk/types/rpc'
// Local imports
-import type { NetworkConfigs } from '../types'
+import type {
+ WdkConfigs,
+ HRPC,
+ WorkletStartResponse
+} from '../types'
import { log } from '../utils/logger'
import { produce } from 'immer'
@@ -100,7 +102,7 @@ export interface WorkletState {
// seedPhrase is never stored - we only use encrypted approach
// encryptedEntropy is stored in secure storage but not in runtime state
// It's only needed when retrieving mnemonic, so it's loaded from secure storage on demand
- networkConfigs: NetworkConfigs | null
+ wdkConfigs: WdkConfigs | null
workletStartResult: WorkletStartResponse | null
wdkInitResult: { status?: string | null } | null
// Multi-wallet credential cache (replaces static Map in WalletSetupService)
@@ -127,11 +129,11 @@ const initialState: WorkletState = {
error: null,
encryptedSeed: null,
encryptionKey: null,
- networkConfigs: null,
+ wdkConfigs: null,
workletStartResult: null,
wdkInitResult: null,
credentialsCache: {},
- credentialsCacheTTL: 5 * 60 * 1000, // 5 minutes
+ credentialsCacheTTL: 5 * 60 * 1000 // 5 minutes
}
let workletStoreInstance: WorkletStoreInstance | null = null
@@ -142,25 +144,25 @@ let workletStoreInstance: WorkletStoreInstance | null = null
* This store is runtime-only - all state resets on app restart.
* All operations are handled by WorkletLifecycleService, not the store itself.
*/
-export function createWorkletStore(): WorkletStoreInstance {
- if (workletStoreInstance) {
+export function createWorkletStore (): WorkletStoreInstance {
+ if (workletStoreInstance != null) {
return workletStoreInstance
}
const store = create()(
devtools(
() => ({
- ...initialState,
+ ...initialState
}),
- { name: 'WorkletStore' },
- ),
+ { name: 'WorkletStore' }
+ )
)
workletStoreInstance = store
return store
}
-export function getWorkletStore() {
+export function getWorkletStore () {
return createWorkletStore()
}
@@ -168,7 +170,7 @@ export function getWorkletStore() {
* Evict least recently used credentials from cache when limit is reached
* Logs eviction for monitoring
*/
-function evictLRUCredentials(): void {
+function evictLRUCredentials (): void {
const store = getWorkletStore()
const state = store.getState()
const cacheSize = Object.keys(state.credentialsCache).length
@@ -182,7 +184,7 @@ function evictLRUCredentials(): void {
let oldestAccess = Infinity
for (const [identifier, accessTime] of credentialsAccessOrder.entries()) {
- if (accessTime < oldestAccess && state.credentialsCache[identifier]) {
+ if (accessTime < oldestAccess && (state.credentialsCache[identifier] != null)) {
oldestAccess = accessTime
oldestIdentifier = identifier
}
@@ -194,10 +196,10 @@ function evictLRUCredentials(): void {
store.setState(
produce(state, (draft) => {
delete draft.credentialsCache[oldestIdentifier]
- }),
+ })
)
log(
- `[WorkletStore] Evicted LRU credentials cache entry: ${oldestIdentifier} (cache size: ${cacheSize}/${MAX_CREDENTIALS_CACHE_SIZE})`,
+ `[WorkletStore] Evicted LRU credentials cache entry: ${oldestIdentifier} (cache size: ${cacheSize}/${MAX_CREDENTIALS_CACHE_SIZE})`
)
}
}
@@ -206,13 +208,13 @@ function evictLRUCredentials(): void {
* Log cache size if it exceeds warning threshold (50% of max)
* Useful for monitoring cache growth in production
*/
-function logCacheSizeIfNeeded(cacheSize: number): void {
+function logCacheSizeIfNeeded (cacheSize: number): void {
const warningThreshold = Math.ceil(MAX_CREDENTIALS_CACHE_SIZE * 0.5)
if (cacheSize >= warningThreshold) {
log(
`[WorkletStore] Credentials cache size: ${cacheSize}/${MAX_CREDENTIALS_CACHE_SIZE} (${Math.round(
- (cacheSize / MAX_CREDENTIALS_CACHE_SIZE) * 100,
- )}% full)`,
+ (cacheSize / MAX_CREDENTIALS_CACHE_SIZE) * 100
+ )}% full)`
)
}
}
@@ -222,14 +224,14 @@ function logCacheSizeIfNeeded(cacheSize: number): void {
* Returns null if not cached or expired
* Updates access time for LRU tracking
*/
-export function getCachedCredentials(
- identifier: string,
+export function getCachedCredentials (
+ identifier: string
): CachedCredentials | null {
const store = getWorkletStore()
const state = store.getState()
const cached = state.credentialsCache[identifier]
- if (!cached) return null
+ if (cached == null) return null
// Check expiration
if (Date.now() > cached.expiresAt) {
@@ -238,7 +240,7 @@ export function getCachedCredentials(
store.setState(
produce(state, (draft) => {
delete draft.credentialsCache[identifier]
- }),
+ })
)
return null
}
@@ -255,16 +257,16 @@ export function getCachedCredentials(
* Evicts LRU entries if cache size limit is reached
* Logs cache size for monitoring
*/
-export function setCachedCredentials(
+export function setCachedCredentials (
identifier: string,
- credentials: Partial,
+ credentials: Partial
): void {
const store = getWorkletStore()
const state = store.getState()
// Evict LRU credentials if needed before adding new entry
// Check if we're adding a new entry (not just updating existing)
- const isNewEntry = !state.credentialsCache[identifier]
+ const isNewEntry = state.credentialsCache[identifier] == null
if (isNewEntry) {
evictLRUCredentials()
}
@@ -276,15 +278,15 @@ export function setCachedCredentials(
store.setState((prev) =>
produce(prev, (state) => {
const credentialTemplate = {
- expiresAt: Date.now() + state.credentialsCacheTTL,
+ expiresAt: Date.now() + state.credentialsCacheTTL
}
state.credentialsCache[identifier] ??= credentialTemplate
Object.assign(
state.credentialsCache[identifier],
credentialTemplate,
- credentials,
+ credentials
)
- }),
+ })
)
// Log cache size for monitoring (after state update)
@@ -296,7 +298,7 @@ export function setCachedCredentials(
* Clear credentials cache for a specific wallet or all wallets
* Also clears access tracking
*/
-export function clearCredentialsCache(identifier?: string): void {
+export function clearCredentialsCache (identifier?: string): void {
const store = getWorkletStore()
const state = store.getState()
@@ -306,7 +308,7 @@ export function clearCredentialsCache(identifier?: string): void {
store.setState(
produce(state, (draft) => {
delete draft.credentialsCache[identifier]
- }),
+ })
)
} else {
// Clear all
@@ -325,14 +327,14 @@ export function clearCredentialsCache(identifier?: string): void {
* references allows garbage collection, but the old values may remain in memory
* until GC runs. This is a JavaScript limitation.
*/
-export function clearAllSensitiveData(): void {
+export function clearAllSensitiveData (): void {
const store = getWorkletStore()
credentialsAccessOrder.clear()
credentialsAccessCounter = 0
store.setState({
encryptedSeed: null,
encryptionKey: null,
- credentialsCache: {},
+ credentialsCache: {}
})
}
@@ -340,7 +342,7 @@ export function clearAllSensitiveData(): void {
* Reset the worklet store instance (useful for testing)
* Also resets access tracking
*/
-export function resetWorkletStore(): void {
+export function resetWorkletStore (): void {
credentialsAccessOrder.clear()
credentialsAccessCounter = 0
workletStoreInstance = null
@@ -350,7 +352,7 @@ export function resetWorkletStore(): void {
* Get current credentials cache size
* Useful for monitoring and debugging
*/
-export function getCredentialsCacheSize(): number {
+export function getCredentialsCacheSize (): number {
const store = getWorkletStore()
return Object.keys(store.getState().credentialsCache).length
}
diff --git a/src/types.ts b/src/types.ts
index 6be90e8..dd82518 100644
--- a/src/types.ts
+++ b/src/types.ts
@@ -1,78 +1,48 @@
/**
* Core Type Definitions
- *
+ *
* All network, token, and wallet type definitions for the WDK React Native Core library.
*/
-/**
- * Network Configuration
- *
- * Defines the configuration for a blockchain network.
- */
-export interface NetworkConfig {
- /** Chain ID for the network */
- chainId: number
- /** Blockchain name (e.g., "ethereum", "polygon") */
- blockchain: string
- /** Optional RPC provider URL */
- provider?: string
- /** Optional bundler URL for account abstraction */
- bundlerUrl?: string
- /** Optional paymaster URL for account abstraction */
- paymasterUrl?: string
- /** Optional paymaster contract address */
- paymasterAddress?: string
- /** Optional entry point contract address */
- entryPointAddress?: string
- /** Optional maximum fee for transfers */
- transferMaxFee?: number
-}
+import type { AssetConfig, IAsset } from './entities/asset'
-/**
- * Network Configurations
- *
- * Maps network names to their configurations.
- */
-export type NetworkConfigs = Record
+import type { NetworkConfig, ProtocolConfig, WdkWorkletConfig } from './types/hrpc'
+export type { AssetConfig, IAsset }
/**
- * Token Configuration
- *
- * Defines the configuration for a token (native or ERC20).
+ * Network Configurations (Generic)
+ * Wrapper around NetworkConfigs to support typed config.
*/
-export interface TokenConfig {
- /** Token symbol (e.g., "ETH", "USDT") */
- symbol: string
- /** Token name (e.g., "Ethereum", "Tether") */
- name: string
- /** Number of decimals (0-18) */
- decimals: number
- /** Token contract address (null for native tokens) */
- address: string | null
+export interface WdkNetworkConfig> extends NetworkConfig {
+ config: T
}
/**
- * Network Tokens
- *
- * Defines the tokens available for a network (native + ERC20 tokens).
+ * Protocol Configurations (Generic)
+ * Wrapper around ProtocolConfigs to support typed config.
*/
-export interface NetworkTokens {
- /** Native token configuration */
- native: TokenConfig
- /** Array of ERC20 token configurations */
- tokens: TokenConfig[]
+export interface WdkProtocolConfig> extends ProtocolConfig {
+ config: T
}
/**
- * Token Configurations
- *
- * Maps network names to their token configurations.
- */
-export type TokenConfigs = Record
+ * WDK Configuration (Generic)
+ *
+ * The root configuration object passed to the WDK worklet.
+ * Matches WdkWorkletConfig structure but with generics.
+ */
+export interface WdkConfigs, TProtocol = Record> extends WdkWorkletConfig {
+ networks: {
+ [blockchain: string]: WdkNetworkConfig
+ }
+ protocols?: {
+ [protocolName: string]: WdkProtocolConfig
+ }
+}
/**
* Wallet
- *
+ *
* Represents a wallet instance with metadata.
*/
export interface Wallet {
@@ -90,7 +60,7 @@ export interface Wallet {
/**
* Wallet Addresses
- *
+ *
* Maps network -> accountIndex -> address
* Structure: { [network]: { [accountIndex]: address } }
*/
@@ -98,7 +68,7 @@ export type WalletAddresses = Record>
/**
* Wallet Addresses by Wallet Identifier
- *
+ *
* Maps walletId -> network -> accountIndex -> address
* Structure: { [walletId]: { [network]: { [accountIndex]: address } } }
*/
@@ -106,32 +76,32 @@ export type WalletAddressesByWallet = Record
/**
* Wallet Balances
- *
- * Maps network -> accountIndex -> tokenAddress -> balance
- * Structure: { [network]: { [accountIndex]: { [tokenAddress]: balance } } }
+ *
+ * Maps network -> accountIndex -> assetId -> balance
+ * Structure: { [network]: { [accountIndex]: { [assetId]: balance } } }
* Note: balance is stored as a string to handle BigInt values
*/
export type WalletBalances = Record>>
/**
* Wallet Balances by Wallet Identifier
- *
- * Maps walletId -> network -> accountIndex -> tokenAddress -> balance
- * Structure: { [walletId]: { [network]: { [accountIndex]: { [tokenAddress]: balance } } } }
+ *
+ * Maps walletId -> network -> accountIndex -> assetId -> balance
+ * Structure: { [walletId]: { [network]: { [accountIndex]: { [assetId]: balance } } } }
*/
export type WalletBalancesByWallet = Record
/**
* Balance Loading States
- *
- * Maps "network-accountIndex-tokenAddress" -> boolean
+ *
+ * Maps "network-accountIndex-assetId" -> boolean
* Used to track which balances are currently being fetched.
*/
export type BalanceLoadingStates = Record
/**
* Balance Fetch Result
- *
+ *
* Result of a balance fetch operation.
*/
export interface BalanceFetchResult {
@@ -141,48 +111,42 @@ export interface BalanceFetchResult {
network: string
/** Account index */
accountIndex: number
- /** Token address (null for native tokens) */
- tokenAddress: string | null
+ /** Asset identifier */
+ assetId: string
/** Balance as a string (null if fetch failed) */
balance: string | null
/** Error message (only present if success is false) */
error?: string
}
-/**
- * Token Config Provider
- *
- * Either a TokenConfigs object or a function that returns TokenConfigs.
- * Allows for dynamic token configuration.
- */
-export type TokenConfigProvider = TokenConfigs | (() => TokenConfigs)
-
-/**
- * Token Helpers
- *
- * Helper functions for working with token configurations.
- */
-export interface TokenHelpers {
- /** Get all tokens (native + ERC20) for a network */
- getTokensForNetwork: (network: string) => TokenConfig[]
- /** Get all supported network names */
- getSupportedNetworks: () => string[]
-}
-
/**
* Wallet Store Interface
- *
+ *
* Interface for wallet store implementations that provide account methods
* and wallet initialization status.
*/
export interface WalletStore {
- /** Call a method on a wallet account */
+ /** Call a method on a wallet account
+ * @param args - Single argument or array for multi-param methods (array gets spread)
+ */
callAccountMethod: (
network: string,
accountIndex: number,
methodName: string,
- args?: unknown
+ args?: unknown | unknown[]
) => Promise
/** Check if the wallet is initialized */
isWalletInitialized: () => boolean
}
+
+export {
+ LogType,
+ type LogRequest,
+ type WorkletStartRequest,
+ type WorkletStartResponse,
+ type DisposeRequest,
+ type CallMethodRequest,
+ type CallMethodResponse,
+ type HRPC,
+ type BundleConfig
+} from './types/hrpc'
diff --git a/src/types/accountMethods.ts b/src/types/accountMethods.ts
new file mode 100644
index 0000000..c16dc89
--- /dev/null
+++ b/src/types/accountMethods.ts
@@ -0,0 +1,35 @@
+/**
+ * Account Methods Type Definitions
+ *
+ * Defines the structure for account methods used in the generic AccountService.
+ * App developers can define their own method maps to provide strict typing
+ * for the generic callAccountMethod function.
+ */
+
+/**
+ * Structure of a single method definition
+ */
+export interface MethodDef {
+ args: any
+ result: any
+}
+
+/**
+ * Map of method names to their definitions.
+ * Use this type as a constraint or base for your specific method maps.
+ *
+ * @example
+ * ```typescript
+ * interface MyMethods extends MethodMap {
+ * getBalance: { args: undefined; result: string };
+ * transfer: { args: { to: string; amount: string }; result: string };
+ * }
+ * ```
+ */
+export type MethodMap = Record
+
+/**
+ * Default loose typing (fallback)
+ * Allows any string method name and any arguments
+ */
+export type LooseMethods = Record
diff --git a/src/types/hrpc.ts b/src/types/hrpc.ts
index 941f193..e006776 100644
--- a/src/types/hrpc.ts
+++ b/src/types/hrpc.ts
@@ -1,78 +1,53 @@
/**
- * HRPC Type Extensions
- *
- * Type definitions for HRPC methods that may not be in the @tetherto/pear-wrk-wdk types yet.
- * These types extend the HRPC interface to provide proper type safety.
+ * HRPC Type Definitions
+ *
+ * All HRPC (Hypercore RPC) and worklet RPC type definitions.
+ * These types define the communication protocol between the React Native
+ * app and the worklet runtime.
*/
-import type { HRPC } from '@tetherto/pear-wrk-wdk'
+import { HRPC as PearHRPC } from '@tetherto/pear-wrk-wdk'
+
+// Re-export types from pear-wrk-wdk
+export {
+ LogType,
+ type LogRequest,
+ type WorkletStartRequest,
+ type WorkletStartResponse,
+ type DisposeRequest,
+ type CallMethodRequest,
+ type CallMethodResponse,
+ type WdkWorkletConfig,
+ type NetworkConfig,
+ type ProtocolConfig
+} from '@tetherto/pear-wrk-wdk'
+
+// Re-export HRPC class/interface
+export type HRPC = PearHRPC
+
+// ============================================================================
+// Bundle Configuration
+// ============================================================================
/**
- * Extended HRPC interface with additional methods
+ * Bundle Configuration
+ *
+ * Configuration for the worklet bundle and HRPC class.
+ * Generated by wdk-worklet-bundler CLI tool.
+ *
+ * @example
+ * ```typescript
+ * import { bundle, HRPC } from './.wdk'
+ *
+ *
+ *
+ *
+ * ```
*/
-export interface ExtendedHRPC extends HRPC {
- /**
- * Initialize WDK with encrypted seed
- */
- initializeWDK: (options: {
- encryptionKey: string
- encryptedSeed: string
- config: string
- }) => Promise<{ status?: string | null }>
-
- /**
- * Generate entropy and encrypt it
- */
- generateEntropyAndEncrypt: (options: {
- wordCount: number
- }) => Promise<{
- encryptionKey: string
- encryptedSeedBuffer: string
- encryptedEntropyBuffer: string
- }>
-
- /**
- * Get mnemonic from encrypted entropy
- */
- getMnemonicFromEntropy: (options: {
- encryptedEntropy: string
- encryptionKey: string
- }) => Promise<{
- mnemonic: string
- }>
-
- /**
- * Get seed and entropy from mnemonic phrase
- */
- getSeedAndEntropyFromMnemonic: (options: {
- mnemonic: string
- }) => Promise<{
- encryptionKey: string
- encryptedSeedBuffer: string
- encryptedEntropyBuffer: string
- }>
-}
-
-/**
- * Type guard to check if HRPC instance has extended methods
- */
-export function isExtendedHRPC(hrpc: HRPC): hrpc is ExtendedHRPC {
- return (
- typeof (hrpc as unknown as Record).initializeWDK === 'function' &&
- typeof (hrpc as unknown as Record).generateEntropyAndEncrypt === 'function' &&
- typeof (hrpc as unknown as Record).getMnemonicFromEntropy === 'function' &&
- typeof (hrpc as unknown as Record).getSeedAndEntropyFromMnemonic === 'function'
- )
-}
-
-/**
- * Safely cast HRPC to ExtendedHRPC
- * Throws if the HRPC instance doesn't have the required methods
- */
-export function asExtendedHRPC(hrpc: HRPC): ExtendedHRPC {
- if (!isExtendedHRPC(hrpc)) {
- throw new Error('HRPC instance does not have required extended methods')
- }
- return hrpc
+export interface BundleConfig {
+ /** The worklet bundle (compiled JavaScript for the worklet runtime) */
+ bundle: string
}
-
diff --git a/src/utils/balanceUtils.ts b/src/utils/balanceUtils.ts
index 5f5fce1..88b72af 100644
--- a/src/utils/balanceUtils.ts
+++ b/src/utils/balanceUtils.ts
@@ -7,7 +7,7 @@ import { logError } from './logger'
/**
* Convert a value to string, handling BigInt values
*/
-export function convertBalanceToString(value: unknown): string {
+export function convertBalanceToString (value: unknown): string {
if (typeof value === 'bigint') {
return value.toString()
}
@@ -24,11 +24,11 @@ export function convertBalanceToString(value: unknown): string {
/**
* Recursively convert BigInt values to strings in objects/arrays
* Prevents serialization errors when BigInt values are present
- *
+ *
* @param value - Value that may contain BigInt values
* @returns Value with all BigInt values converted to strings
*/
-export function convertBigIntToString(value: unknown): unknown {
+export function convertBigIntToString (value: unknown): unknown {
if (typeof value === 'bigint') {
return value.toString()
}
@@ -57,18 +57,18 @@ export function convertBigIntToString(value: unknown): unknown {
* formatBalance("1000001", 6) // "1.000001"
* ```
*/
-export function formatBalance(balance: string | null, decimals: number): string {
+export function formatBalance (balance: string | null, decimals: number): string {
if (!balance || balance === '0' || balance === 'null') {
return '0'
}
-
+
// Validate that balance is a valid numeric string before attempting BigInt conversion
// BigInt accepts: digits only, or digits with optional leading minus sign
if (!/^-?\d+$/.test(balance.trim())) {
// Invalid format - return as-is (for backwards compatibility with test expectations)
return balance
}
-
+
try {
const balanceBigInt = BigInt(balance)
const divisor = BigInt(10 ** decimals)
diff --git a/src/utils/constants.ts b/src/utils/constants.ts
index 8e851d3..3a5f8ef 100644
--- a/src/utils/constants.ts
+++ b/src/utils/constants.ts
@@ -1,13 +1,13 @@
/**
* Application constants
- *
+ *
* Centralized location for magic numbers and configuration values
* to improve maintainability and documentation.
*/
/**
* Default balance refresh interval in milliseconds
- *
+ *
* How often to automatically refresh wallet balances when auto-fetch is enabled.
* 30 seconds provides a good balance between freshness and performance.
*/
@@ -15,19 +15,19 @@ export const DEFAULT_BALANCE_REFRESH_INTERVAL_MS = 30000
/**
* Valid mnemonic word counts
- *
+ *
* BIP-39 standard supports 12-word (128 bits) and 24-word (256 bits) mnemonics.
*/
export const MNEMONIC_WORD_COUNTS = {
/** 12-word mnemonic (128 bits of entropy) */
TWELVE: 12,
/** 24-word mnemonic (256 bits of entropy) */
- TWENTY_FOUR: 24,
+ TWENTY_FOUR: 24
} as const
/**
* Default mnemonic word count
- *
+ *
* 12 words is the most common choice, providing 128 bits of entropy
* which is sufficient for most use cases.
*/
@@ -53,7 +53,7 @@ export const NATIVE_TOKEN_KEY = 'native'
/**
* Default query stale time in milliseconds
- *
+ *
* How long data is considered fresh before TanStack Query refetches it.
* 30 seconds provides a good balance between freshness and performance.
*/
@@ -61,7 +61,7 @@ export const DEFAULT_QUERY_STALE_TIME_MS = 30 * 1000
/**
* Default query garbage collection time in milliseconds
- *
+ *
* How long unused query data is kept in cache before being garbage collected.
* 5 minutes provides a good balance between cache efficiency and memory usage.
*/
@@ -77,8 +77,20 @@ export const ALLOWED_ACCOUNT_METHODS = [
'getTokenBalance',
'signMessage',
'signTransaction',
- 'sendTransaction',
+ 'sendTransaction'
] as const
export type AllowedAccountMethod = typeof ALLOWED_ACCOUNT_METHODS[number]
+/**
+ * Query Key Tags
+ *
+ * Centralized constants for TanStack Query keys to ensure consistency
+ * across hooks and cache invalidation.
+ */
+export const QUERY_KEY_TAGS = {
+ BALANCES: 'balances',
+ WALLET: 'wallet',
+ NETWORK: 'network',
+ TOKEN: 'token'
+} as const
diff --git a/src/utils/errorHandling.ts b/src/utils/errorHandling.ts
index d2d2fb6..d6f65e6 100644
--- a/src/utils/errorHandling.ts
+++ b/src/utils/errorHandling.ts
@@ -1,18 +1,18 @@
/**
* Error handling utilities for services
- *
+ *
* Provides consistent error handling patterns across all services
* to reduce code duplication and improve maintainability.
- *
+ *
* ## Usage Guidelines
- *
+ *
* **For Services**: Use `handleServiceError()` - this provides consistent normalization
* and logging for service-layer errors. Errors are NOT sanitized (sanitizeLevel: false)
* because services log internally and need full error details for debugging.
- *
+ *
* **For Hooks/UI**: Use `normalizeError()` directly with appropriate sanitization level.
* Hooks should sanitize errors before exposing them to UI components.
- *
+ *
* @example Service usage:
* ```typescript
* try {
@@ -21,7 +21,7 @@
* handleServiceError(error, 'AddressService', 'getAddress', { network, accountIndex })
* }
* ```
- *
+ *
* @example Hook/UI usage:
* ```typescript
* try {
@@ -38,17 +38,17 @@ import { logError } from './logger'
/**
* Handle service errors with consistent normalization and logging
- *
+ *
* **Use this in services** - provides consistent error handling with full error details
* (no sanitization) for internal logging and debugging.
- *
+ *
* @param error - Error to handle
* @param component - Component/service name where error occurred
* @param operation - Operation name that failed
* @param context - Additional context for error
* @throws Normalized error
*/
-export function handleServiceError(
+export function handleServiceError (
error: unknown,
component: string,
operation: string,
@@ -58,4 +58,3 @@ export function handleServiceError(
logError(`[${component}] ${operation} failed:`, normalized)
throw normalized
}
-
diff --git a/src/utils/errorUtils.ts b/src/utils/errorUtils.ts
index 3309522..554ee6c 100644
--- a/src/utils/errorUtils.ts
+++ b/src/utils/errorUtils.ts
@@ -1,15 +1,15 @@
/**
* Error utility functions for consistent error handling
- *
+ *
* ## Usage Guidelines
- *
+ *
* **For Services**: Use `handleServiceError()` from `errorHandling.ts` - this provides
* consistent normalization and logging for service-layer errors. Errors are NOT sanitized
* (sanitizeLevel: false) because services log internally and need full error details.
- *
+ *
* **For Hooks/UI**: Use `normalizeError()` directly with appropriate sanitization level.
* Hooks should sanitize errors before exposing them to UI components to prevent information leakage.
- *
+ *
* @example Service usage (use handleServiceError instead):
* ```typescript
* import { handleServiceError } from './errorHandling'
@@ -19,7 +19,7 @@
* handleServiceError(error, 'MyService', 'operationName', { context })
* }
* ```
- *
+ *
* @example Hook/UI usage:
* ```typescript
* import { normalizeError } from './errorUtils'
@@ -36,9 +36,9 @@
* Sanitization levels for error messages
*/
export enum SanitizationLevel {
- NONE = 'none', // No sanitization (internal debugging only)
- DEVELOPMENT = 'dev', // Mask sensitive strings but show structure
- PRODUCTION = 'prod', // Aggressive sanitization
+ NONE = 'none', // No sanitization (internal debugging only)
+ DEVELOPMENT = 'dev', // Mask sensitive strings but show structure
+ PRODUCTION = 'prod', // Aggressive sanitization
}
/**
@@ -61,7 +61,7 @@ const SENSITIVE_PATTERNS = [
// API tokens and keys in various formats
/\b(api[_-]?key|access[_-]?token|bearer[_-]?token|auth[_-]?token)\s*[:=]\s*[^\s]{20,}/gi,
// Passwords (but not "password" as a word)
- /\bpassword\s*[:=]\s*[^\s]{8,}/gi,
+ /\bpassword\s*[:=]\s*[^\s]{8,}/gi
]
/**
@@ -72,20 +72,20 @@ const SAFE_PATTERNS = [
/\b(public[_-]?key|publicKey)\b/gi, // Public keys are safe
/\b(error|Error|ERROR)\b/g, // Error messages themselves
/\b(function|Function|const|let|var)\b/g, // Code keywords
- /\b(undefined|null|true|false)\b/g, // JavaScript literals
+ /\b(undefined|null|true|false)\b/g // JavaScript literals
]
/**
* Check if a string matches a safe pattern (should not be sanitized)
*/
-function isSafePattern(text: string): boolean {
+function isSafePattern (text: string): boolean {
return SAFE_PATTERNS.some(pattern => pattern.test(text))
}
/**
* Mask sensitive string patterns (hex/base64) for development mode
*/
-function maskSensitiveStrings(message: string): string {
+function maskSensitiveStrings (message: string): string {
return message
.replace(/\b0x?[a-f0-9]{32,}\b/gi, (match) => {
if (match.length <= 20) return match
@@ -99,7 +99,7 @@ function maskSensitiveStrings(message: string): string {
/**
* Remove file paths from error messages
*/
-function removeFilePaths(message: string): string {
+function removeFilePaths (message: string): string {
return message
.replace(/file:\/\/[^\s]+/gi, '[file path]')
.replace(/\/[^\s]+\/[^\s]+/g, '[path]')
@@ -108,7 +108,7 @@ function removeFilePaths(message: string): string {
/**
* Get replacement text for a sensitive pattern match
*/
-function getSensitiveReplacement(match: string): string {
+function getSensitiveReplacement (match: string): string {
const lowerMatch = match.toLowerCase()
if (lowerMatch.includes('encryption') || lowerMatch.includes('encrypted')) {
return '[encryption data]'
@@ -137,7 +137,7 @@ function getSensitiveReplacement(match: string): string {
/**
* Apply sensitive pattern sanitization
*/
-function applySensitivePatternSanitization(message: string): string {
+function applySensitivePatternSanitization (message: string): string {
let sanitized = message
for (const pattern of SENSITIVE_PATTERNS) {
sanitized = sanitized.replace(pattern, (match) => {
@@ -153,16 +153,16 @@ function applySensitivePatternSanitization(message: string): string {
/**
* Sanitize error message to prevent information leakage
* Removes or masks sensitive information while preserving useful debugging info
- *
+ *
* @param message - Error message to sanitize
* @param isDevelopment - Whether we're in development mode (less sanitization)
* @param context - Optional context about where the error occurred (for better sanitization)
* @returns Sanitized error message
*/
-export function sanitizeErrorMessage(
+export function sanitizeErrorMessage (
message: string,
isDevelopment = false,
- context?: { operation?: string; component?: string }
+ context?: { operation?: string, component?: string }
): string {
if (isDevelopment) {
return maskSensitiveStrings(message)
@@ -171,7 +171,7 @@ export function sanitizeErrorMessage(
// In production, be more aggressive with sanitization
let sanitized = removeFilePaths(message)
sanitized = applySensitivePatternSanitization(sanitized)
-
+
// Additional cleanup: remove any remaining long hex/base64 strings
sanitized = sanitized.replace(/\b0x?[a-f0-9]{32,}\b/gi, '[hex string]')
sanitized = sanitized.replace(/\b[A-Za-z0-9+/]{40,}={0,2}\b/g, '[base64 string]')
@@ -183,18 +183,18 @@ export function sanitizeErrorMessage(
* Normalize error to Error instance
* Converts any error-like value to a proper Error object
* Always sanitizes the error message (with different levels) to prevent information leakage
- *
+ *
* @param error - Error to normalize
* @param sanitizeLevel - Sanitization level or boolean (default: PRODUCTION in production, DEVELOPMENT in dev)
* @param context - Optional context about where the error occurred
* @returns Normalized Error instance
*/
-export function normalizeError(
+export function normalizeError (
error: unknown,
- sanitizeLevel: SanitizationLevel | boolean = process.env.NODE_ENV === 'production'
- ? SanitizationLevel.PRODUCTION
+ sanitizeLevel: SanitizationLevel | boolean = process.env.NODE_ENV === 'production'
+ ? SanitizationLevel.PRODUCTION
: SanitizationLevel.DEVELOPMENT,
- context?: { operation?: string; component?: string; [key: string]: unknown }
+ context?: { operation?: string, component?: string, [key: string]: unknown }
): Error {
let errorMessage: string
@@ -209,7 +209,7 @@ export function normalizeError(
}
// Always sanitize, but with different levels
- const level = typeof sanitizeLevel === 'boolean'
+ const level = typeof sanitizeLevel === 'boolean'
? (sanitizeLevel ? SanitizationLevel.PRODUCTION : SanitizationLevel.NONE)
: sanitizeLevel
@@ -222,7 +222,7 @@ export function normalizeError(
}
const normalizedError = new Error(errorMessage)
-
+
// Preserve error name and stack if available
if (error instanceof Error) {
normalizedError.name = error.name
@@ -243,26 +243,26 @@ export function normalizeError(
/**
* Get error message from any error-like value
*/
-export function getErrorMessage(error: unknown): string {
+export function getErrorMessage (error: unknown): string {
return normalizeError(error).message
}
/**
* Check if error is a specific type
*/
-export function isErrorType(error: unknown, typeName: string): boolean {
+export function isErrorType (error: unknown, typeName: string): boolean {
return error instanceof Error && error.name === typeName
}
/**
* Create a standardized error with context
*/
-export function createContextualError(
+export function createContextualError (
message: string,
context?: Record
): Error {
const error = new Error(message)
- if (context) {
+ if (context != null) {
Object.assign(error, { context })
}
return error
@@ -271,11 +271,11 @@ export function createContextualError(
/**
* Check if an error is an authentication error
* Used to prevent automatic retries when authentication fails
- *
+ *
* @param error - Error to check
* @returns true if the error is an authentication error
*/
-export function isAuthenticationError(error: unknown): boolean {
+export function isAuthenticationError (error: unknown): boolean {
// Check if it's an AuthenticationError instance from secure storage
if (error && typeof error === 'object' && 'constructor' in error) {
const errorName = error.constructor.name
@@ -297,4 +297,3 @@ export function isAuthenticationError(error: unknown): boolean {
return false
}
-
diff --git a/src/utils/initializationState.ts b/src/utils/initializationState.ts
index fa6e200..e8be2db 100644
--- a/src/utils/initializationState.ts
+++ b/src/utils/initializationState.ts
@@ -1,20 +1,20 @@
/**
* Worklet Initialization State Machine
- *
+ *
* Represents the state of the worklet runtime initialization (global, happens once).
* This is separate from wallet loading, which happens per-identifier.
*/
/**
* Worklet initialization status enum
- *
+ *
* Represents the current state of the worklet runtime initialization.
* The worklet is initialized once (global), but wallets are loaded per-identifier.
- *
+ *
* Flow:
* 1. IDLE -> STARTING_WORKLET (worklet initialization begins)
* 2. STARTING_WORKLET -> WORKLET_READY (worklet runtime ready, can now load wallets)
- *
+ *
* After WORKLET_READY, you can load different wallets (per identifier).
* Wallet loading state is separate - see walletState in WdkAppContextValue.
*/
@@ -31,10 +31,10 @@ export enum InitializationStatus {
/**
* App-level status enum
- *
+ *
* Represents the combined state of worklet initialization and wallet loading.
* This is a convenience enum for app-level "is ready?" checks.
- *
+ *
* For granular control, use workletState and walletState separately.
*/
export enum AppStatus {
@@ -55,38 +55,38 @@ export enum AppStatus {
/**
* Helper to check if status represents an error state
*/
-export function isErrorStatus(status: InitializationStatus): boolean {
+export function isErrorStatus (status: InitializationStatus): boolean {
return status === InitializationStatus.ERROR
}
/**
* Helper to check if worklet initialization is complete and ready
*/
-export function isReadyStatus(status: InitializationStatus): boolean {
+export function isReadyStatus (status: InitializationStatus): boolean {
return status === InitializationStatus.WORKLET_READY
}
/**
* Helper to check if worklet initialization is in progress
*/
-export function isInProgressStatus(status: InitializationStatus): boolean {
+export function isInProgressStatus (status: InitializationStatus): boolean {
return status === InitializationStatus.STARTING_WORKLET
}
/**
* Helper to check if app status represents an in-progress state
*/
-export function isAppInProgressStatus(status: AppStatus): boolean {
+export function isAppInProgressStatus (status: AppStatus): boolean {
return [
AppStatus.STARTING_WORKLET,
- AppStatus.LOADING_WALLET,
+ AppStatus.LOADING_WALLET
].includes(status)
}
/**
* Helper to check if app is ready (worklet + wallet both ready)
*/
-export function isAppReadyStatus(status: AppStatus): boolean {
+export function isAppReadyStatus (status: AppStatus): boolean {
return status === AppStatus.READY
}
@@ -94,10 +94,10 @@ export function isAppReadyStatus(status: AppStatus): boolean {
* Helper to check if worklet has started (worklet runtime is ready)
* Once worklet is ready, you can load wallets (per identifier)
*/
-export function hasWorkletStarted(status: InitializationStatus): boolean {
+export function hasWorkletStarted (status: InitializationStatus): boolean {
return [
InitializationStatus.WORKLET_READY,
- InitializationStatus.ERROR,
+ InitializationStatus.ERROR
].includes(status)
}
@@ -105,37 +105,37 @@ export function hasWorkletStarted(status: InitializationStatus): boolean {
* Helper to check if wallet operations can be performed
* Returns true when worklet is ready (wallets can be loaded per identifier)
*/
-export function canLoadWallet(status: InitializationStatus): boolean {
+export function canLoadWallet (status: InitializationStatus): boolean {
return status === InitializationStatus.WORKLET_READY
}
/**
* Helper to check if app status indicates worklet has started
*/
-export function hasWorkletStartedApp(status: AppStatus): boolean {
+export function hasWorkletStartedApp (status: AppStatus): boolean {
return [
AppStatus.WORKLET_READY,
AppStatus.LOADING_WALLET,
AppStatus.READY,
- AppStatus.ERROR,
+ AppStatus.ERROR
].includes(status)
}
/**
* Helper to check if wallet operations can be performed based on app status
*/
-export function canLoadWalletApp(status: AppStatus): boolean {
+export function canLoadWalletApp (status: AppStatus): boolean {
return [
AppStatus.WORKLET_READY,
AppStatus.LOADING_WALLET,
- AppStatus.READY,
+ AppStatus.READY
].includes(status)
}
/**
* Get human-readable worklet initialization status message
*/
-export function getStatusMessage(status: InitializationStatus): string {
+export function getStatusMessage (status: InitializationStatus): string {
switch (status) {
case InitializationStatus.IDLE:
return 'Not started'
@@ -153,7 +153,7 @@ export function getStatusMessage(status: InitializationStatus): string {
/**
* Get human-readable app status message
*/
-export function getAppStatusMessage(status: AppStatus): string {
+export function getAppStatusMessage (status: AppStatus): string {
switch (status) {
case AppStatus.IDLE:
return 'Not started'
@@ -174,12 +174,12 @@ export function getAppStatusMessage(status: AppStatus): string {
/**
* Gets worklet initialization status from worklet state
- *
+ *
* @param workletState - Worklet state (global, from workletStore)
* @returns Worklet initialization status
*/
-export function getWorkletStatus(
- workletState: { isWorkletStarted: boolean; isLoading: boolean; error: string | null }
+export function getWorkletStatus (
+ workletState: { isWorkletStarted: boolean, isLoading: boolean, error: string | null }
): InitializationStatus {
if (workletState.error) {
return InitializationStatus.ERROR
@@ -196,20 +196,20 @@ export function getWorkletStatus(
/**
* Derives combined app status from worklet and wallet states
- *
- * This is a convenience function that combines the global worklet state with the
+ *
+ * This is a convenience function that combines the global worklet state with the
* per-identifier wallet state to produce a unified app-level status.
- *
- * NOTE: This is for convenience only. For granular control, use workletState and
- * walletState separately. The combined status hides some information (e.g., can't
+ *
+ * NOTE: This is for convenience only. For granular control, use workletState and
+ * walletState separately. The combined status hides some information (e.g., can't
* distinguish worklet errors from wallet errors).
- *
+ *
* @param workletState - Worklet state (global, from workletStore)
* @param walletState - Wallet state (per-identifier, from wallet state machine)
* @returns Combined app status (convenience helper)
*/
-export function getCombinedStatus(
- workletState: { isWorkletStarted: boolean; isLoading: boolean; error: string | null },
+export function getCombinedStatus (
+ workletState: { isWorkletStarted: boolean, isLoading: boolean, error: string | null },
walletState: { type: 'not_loaded' | 'checking' | 'loading' | 'ready' | 'error' }
): AppStatus {
// Worklet errors take precedence
@@ -239,4 +239,3 @@ export function getCombinedStatus(
return AppStatus.IDLE
}
}
-
diff --git a/src/utils/jsonUtils.ts b/src/utils/jsonUtils.ts
index 4aece14..02903af 100644
--- a/src/utils/jsonUtils.ts
+++ b/src/utils/jsonUtils.ts
@@ -1,6 +1,6 @@
/**
* JSON Utilities
- *
+ *
* Provides safe JSON stringification and validation utilities
* to prevent security issues and ensure data integrity.
*/
@@ -9,26 +9,26 @@
* Validate that a value has a safe JSON structure
* Prevents prototype pollution and circular references
*/
-export function validateJSONStructure(value: unknown): boolean {
+export function validateJSONStructure (value: unknown): boolean {
try {
// Check for circular references
const seen = new WeakSet()
-
- function check(value: unknown): boolean {
+
+ function check (value: unknown): boolean {
if (value === null || typeof value !== 'object') {
return true
}
-
- if (seen.has(value as object)) {
+
+ if (seen.has(value)) {
return false // Circular reference
}
-
- seen.add(value as object)
-
+
+ seen.add(value)
+
if (Array.isArray(value)) {
return value.every(check)
}
-
+
// Check for prototype pollution
const proto = Object.getPrototypeOf(value)
// Reject objects with non-standard prototypes (not null, Object.prototype, or Array.prototype)
@@ -38,10 +38,10 @@ export function validateJSONStructure(value: unknown): boolean {
// Reject objects that inherit from Array.prototype but aren't arrays
return false
}
-
+
return Object.values(value as Record).every(check)
}
-
+
return check(value)
} catch {
return false
@@ -51,18 +51,18 @@ export function validateJSONStructure(value: unknown): boolean {
/**
* Safe JSON stringify with validation
* Validates structure before stringifying to prevent security issues
- *
+ *
* @param value - Value to stringify
* @param space - Optional spacing for pretty printing
* @returns JSON string
* @throws Error if value cannot be safely stringified
*/
-export function safeStringify(value: unknown, space?: number): string {
+export function safeStringify (value: unknown, space?: number): string {
// Validate structure first
if (!validateJSONStructure(value)) {
throw new Error('Value contains circular references or unsafe prototype properties')
}
-
+
try {
return JSON.stringify(value, null, space)
} catch (error) {
@@ -72,4 +72,3 @@ export function safeStringify(value: unknown, space?: number): string {
throw new Error('Failed to stringify value: Unknown error')
}
}
-
diff --git a/src/utils/logger.ts b/src/utils/logger.ts
index e7ac688..3ad5126 100644
--- a/src/utils/logger.ts
+++ b/src/utils/logger.ts
@@ -1,54 +1,70 @@
/**
* Logger utility for development and production
- *
+ *
* Provides controlled logging that can be disabled in production
* to improve performance and prevent information leakage.
*/
+import { sanitizeErrorMessage } from './errorUtils'
+
/**
* Check if we're in development mode
* React Native sets __DEV__ to true in development builds
*/
const isDevelopment = typeof __DEV__ !== 'undefined' ? __DEV__ : process.env.NODE_ENV !== 'production'
+/**
+ * Sanitize an error for logging to prevent sensitive data leakage
+ * Handles Error objects, strings, and arbitrary objects
+ */
+function sanitizeErrorForLogging (error: unknown): string {
+ if (error instanceof Error) {
+ return sanitizeErrorMessage(error.message, isDevelopment)
+ }
+ if (typeof error === 'string') {
+ return sanitizeErrorMessage(error, isDevelopment)
+ }
+ // For objects, stringify and sanitize
+ try {
+ const stringified = JSON.stringify(error, null, 2)
+ return sanitizeErrorMessage(stringified, isDevelopment)
+ } catch {
+ return '[Error object - could not stringify]'
+ }
+}
+
/**
* Log a message (only in development)
- *
+ *
* @param message - Message to log
* @param args - Additional arguments to log
*/
-export function log(...args: unknown[]): void {
+export function log (...args: unknown[]): void {
if (isDevelopment) {
console.log(...args)
}
}
/**
- * Log an error (always logged, but sanitized in production)
- *
+ * Log an error (always logged, but sanitized to prevent sensitive data leakage)
* @param message - Error message
* @param error - Error object or additional data
*/
-export function logError(message: string, error?: unknown): void {
- if (isDevelopment) {
- console.error(message, error)
- } else {
- // In production, log sanitized errors only
- // This prevents information leakage while still allowing error tracking
- console.error(message)
- }
+export function logError (message: string, error?: unknown): void {
+ const sanitizedMessage = sanitizeErrorMessage(message, isDevelopment)
+ const sanitizedError = error !== undefined ? sanitizeErrorForLogging(error) : undefined
+
+ console.error(sanitizedMessage, sanitizedError)
}
/**
* Log a warning (only in development)
- *
+ *
* @param message - Warning message
* @param args - Additional arguments to log
*/
-export function logWarn(...args: unknown[]): void {
+export function logWarn (...args: unknown[]): void {
if (isDevelopment) {
console.warn(...args)
}
}
-
-
diff --git a/src/utils/mmkvKeyManager.ts b/src/utils/mmkvKeyManager.ts
index 9fd794c..8624f67 100644
--- a/src/utils/mmkvKeyManager.ts
+++ b/src/utils/mmkvKeyManager.ts
@@ -1,14 +1,14 @@
/**
* MMKV Encryption Key Manager
- *
+ *
* Manages encryption keys for MMKV storage on a per-account basis.
* Each account (identified by email/identifier) gets its own encryption key,
* allowing multiple accounts on the same device with isolated encrypted storage.
- *
+ *
* SECURITY NOTE: MMKV stores NON-SENSITIVE data only (addresses, balances, metadata).
* Since the data is non-sensitive, we use DETERMINISTIC key derivation from account identifier.
* This allows the same account to access the same encrypted data across devices.
- *
+ *
* IMPORTANT: For sensitive data (wallet seeds, encryption keys), use SecureStorage which
* uses randomly generated keys stored in the device keychain.
*/
@@ -23,43 +23,43 @@ export type AccountIdentifier = string
/**
* Convert Uint8Array to base64 string using standard encoding
* This implementation follows RFC 4648 and handles all edge cases correctly
- *
+ *
* @param bytes - Uint8Array to convert
* @returns Base64 encoded string
*/
-function bytesToBase64(bytes: Uint8Array): string {
+function bytesToBase64 (bytes: Uint8Array): string {
// Try to use Buffer if available (common in React Native with polyfills)
if (typeof Buffer !== 'undefined') {
return Buffer.from(bytes).toString('base64')
}
-
+
// Fallback to manual encoding for environments without Buffer
const base64Chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
let result = ''
-
+
for (let i = 0; i < bytes.length; i += 3) {
const a = bytes[i] ?? 0
const b = i + 1 < bytes.length ? (bytes[i + 1] ?? 0) : 0
const c = i + 2 < bytes.length ? (bytes[i + 2] ?? 0) : 0
-
+
const bitmap = (a << 16) | (b << 8) | c
-
+
result += base64Chars.charAt((bitmap >> 18) & 63)
result += base64Chars.charAt((bitmap >> 12) & 63)
-
+
if (i + 1 < bytes.length) {
result += base64Chars.charAt((bitmap >> 6) & 63)
} else {
result += '='
}
-
+
if (i + 2 < bytes.length) {
result += base64Chars.charAt(bitmap & 63)
} else {
result += '='
}
}
-
+
return result
}
@@ -81,7 +81,7 @@ let accessCounter = 0
/**
* Evict least recently used key from cache when limit is reached
*/
-function evictLRUKey(): void {
+function evictLRUKey (): void {
if (keyCache.size < MAX_CACHE_SIZE) {
return
}
@@ -104,7 +104,7 @@ function evictLRUKey(): void {
}
}
-async function deriveKeyFromAccount(accountIdentifier: AccountIdentifier): Promise {
+async function deriveKeyFromAccount (accountIdentifier: AccountIdentifier): Promise {
// Check cache first
const cachedKey = keyCache.get(accountIdentifier)
if (cachedKey !== undefined) {
@@ -118,41 +118,40 @@ async function deriveKeyFromAccount(accountIdentifier: AccountIdentifier): Promi
// This salt is public and part of the derivation algorithm
const SALT = 'wdk-mmkv-encryption-salt-v1'
const input = `${SALT}:${accountIdentifier}`
-
+
// Use expo-crypto for production-grade SHA-256 hashing
// This is a well-tested, battle-hardened implementation
const hashHex = await Crypto.digestStringAsync(
Crypto.CryptoDigestAlgorithm.SHA256,
input
)
-
+
// Convert hex string to base64 using standard encoding
// SHA-256 produces 64 hex characters (32 bytes)
// Convert hex to bytes, then to base64
const hexBytes = hashHex.match(/.{1,2}/g)
- if (!hexBytes || hashHex.length !== 64) {
+ if ((hexBytes == null) || hashHex.length !== 64) {
throw new Error(`Invalid SHA-256 hash format: expected 64 hex characters, got ${hashHex.length}`)
}
const hashBytes = new Uint8Array(
hexBytes.map((byte: string) => parseInt(byte, 16))
)
-
+
// Convert bytes to base64 using standard encoding
// Use a well-tested base64 encoding implementation
const key = bytesToBase64(hashBytes)
-
+
// Evict LRU key if cache is full
evictLRUKey()
-
+
// Cache the result for future use
accessCounter++
keyCache.set(accountIdentifier, key)
keyAccessOrder.set(accountIdentifier, accessCounter)
-
+
return key
}
-
/**
* Maximum length for account identifiers to prevent DoS attacks
* 256 characters is reasonable for emails and user IDs
@@ -161,11 +160,11 @@ const MAX_ACCOUNT_IDENTIFIER_LENGTH = 256
/**
* Validate account identifier input
- *
+ *
* @param accountIdentifier - Account identifier to validate
* @throws Error if validation fails
*/
-function validateAccountIdentifier(accountIdentifier: AccountIdentifier): void {
+function validateAccountIdentifier (accountIdentifier: AccountIdentifier): void {
if (!accountIdentifier || typeof accountIdentifier !== 'string') {
throw new Error('Account identifier must be a non-empty string')
}
@@ -190,17 +189,17 @@ function validateAccountIdentifier(accountIdentifier: AccountIdentifier): void {
/**
* Clear the key derivation cache
- *
+ *
* Useful when switching accounts or when you want to free memory.
* Note: Keys will be re-derived on next access since derivation is deterministic.
- *
+ *
* @example
* ```typescript
* // Clear cache when user logs out
* clearKeyCache()
* ```
*/
-export function clearKeyCache(): void {
+export function clearKeyCache (): void {
keyCache.clear()
keyAccessOrder.clear()
accessCounter = 0
@@ -208,30 +207,30 @@ export function clearKeyCache(): void {
/**
* Get MMKV encryption key for an account
- *
+ *
* SECURITY: Since MMKV stores non-sensitive data, we use deterministic key derivation.
* The key is derived from the account identifier, allowing the same account to access
* the same encrypted data across devices.
- *
+ *
* The key is NOT stored - it's derived on-demand from the account identifier.
* Results are cached since derivation is deterministic.
- *
+ *
* This ensures:
* - Account data isolation (different accounts = different keys)
* - Cross-device compatibility (same account = same key)
* - No key storage needed (deterministic derivation)
- *
+ *
* @param accountIdentifier - Account identifier (email or user ID)
* @returns Promise that resolves to encryption key (base64 string, 32 bytes)
* @throws Error if account identifier is invalid or key derivation fails
- *
+ *
* @example
* ```typescript
* const key = await getMMKVKey('user@example.com')
* const mmkv = createMMKV({ encryptionKey: key })
* ```
*/
-export async function getMMKVKey(accountIdentifier: AccountIdentifier): Promise {
+export async function getMMKVKey (accountIdentifier: AccountIdentifier): Promise {
// Validate input before processing
validateAccountIdentifier(accountIdentifier)
@@ -250,7 +249,3 @@ export async function getMMKVKey(accountIdentifier: AccountIdentifier): Promise<
throw new Error(`Failed to derive encryption key for account: ${String(error)}`)
}
}
-
-
-
-
diff --git a/src/utils/mnemonicUtils.ts b/src/utils/mnemonicUtils.ts
index c63bc57..6df3c28 100644
--- a/src/utils/mnemonicUtils.ts
+++ b/src/utils/mnemonicUtils.ts
@@ -4,10 +4,10 @@
/**
* Validate a mnemonic phrase
- *
+ *
* @param mnemonic - The mnemonic phrase to validate
* @returns true if the mnemonic is valid (12 or 24 words, all non-empty)
- *
+ *
* @example
* ```ts
* validateMnemonic("word1 word2 ... word12") // true
@@ -15,21 +15,17 @@
* validateMnemonic("word1 word2") // false (too few words)
* ```
*/
-export function validateMnemonic(mnemonic: string): boolean {
+export function validateMnemonic (mnemonic: string): boolean {
const trimmed = mnemonic.trim()
-
+
// Normalize whitespace first (multiple spaces become single spaces)
// This handles cases like "word1 word2" where multiple spaces should be normalized
const normalized = trimmed.replace(/\s+/g, ' ')
-
+
// Split and validate
const words = normalized.split(' ')
const validLengths = [12, 24]
-
+
// Check word count and that all words are non-empty
return validLengths.includes(words.length) && words.every(word => word.length > 0)
}
-
-
-
-
diff --git a/src/utils/operationMutex.ts b/src/utils/operationMutex.ts
index 36c85ac..8206bf1 100644
--- a/src/utils/operationMutex.ts
+++ b/src/utils/operationMutex.ts
@@ -39,8 +39,8 @@ export interface MutexResult {
* }
* ```
*/
-export function acquireOperationMutex(
- operationDescription: string,
+export function acquireOperationMutex (
+ operationDescription: string
): MutexResult {
const walletStore = getWalletStore()
const state = walletStore.getState()
@@ -48,19 +48,19 @@ export function acquireOperationMutex(
// Check if operation is already in progress
if (state.isOperationInProgress) {
logWarn(
- `[OperationMutex] Operation "${operationDescription}" blocked by: ${state.currentOperation}`,
+ `[OperationMutex] Operation "${operationDescription}" blocked by: ${state.currentOperation}`
)
return {
acquired: false,
currentOperation: state.currentOperation,
- release: () => {}, // No-op release
+ release: () => {} // No-op release
}
}
// Acquire mutex
walletStore.setState({
isOperationInProgress: true,
- currentOperation: operationDescription,
+ currentOperation: operationDescription
})
log(`[OperationMutex] Acquired mutex for: ${operationDescription}`)
@@ -75,15 +75,15 @@ export function acquireOperationMutex(
if (currentState.currentOperation === operationDescription) {
walletStore.setState({
isOperationInProgress: false,
- currentOperation: null,
+ currentOperation: null
})
log(`[OperationMutex] Released mutex for: ${operationDescription}`)
} else {
logWarn(
- `[OperationMutex] Attempted to release mutex for "${operationDescription}" but current operation is "${currentState.currentOperation}"`,
+ `[OperationMutex] Attempted to release mutex for "${operationDescription}" but current operation is "${currentState.currentOperation}"`
)
}
- },
+ }
}
}
@@ -116,34 +116,34 @@ const DEFAULT_OPERATION_TIMEOUT_MS = 30 * 1000
* }, 60000) // 60 second timeout
* ```
*/
-export async function withOperationMutex(
+export async function withOperationMutex (
operationDescription: string,
operation: () => Promise,
- timeoutMs: number = DEFAULT_OPERATION_TIMEOUT_MS,
+ timeoutMs: number = DEFAULT_OPERATION_TIMEOUT_MS
): Promise {
const mutex = acquireOperationMutex(operationDescription)
if (!mutex.acquired) {
throw new Error(
- `Cannot execute "${operationDescription}": Another operation is in progress (${mutex.currentOperation})`,
+ `Cannot execute "${operationDescription}": Another operation is in progress (${mutex.currentOperation})`
)
}
// Set up timeout protection
- let timeoutId: NodeJS.Timeout | null = null
+ let timeoutId: ReturnType | null = null
let timeoutExceeded = false
const timeoutPromise = new Promise((_, reject) => {
timeoutId = setTimeout(() => {
timeoutExceeded = true
logWarn(
- `[OperationMutex] Operation "${operationDescription}" exceeded timeout of ${timeoutMs}ms`,
+ `[OperationMutex] Operation "${operationDescription}" exceeded timeout of ${timeoutMs}ms`
)
mutex.release()
reject(
new Error(
- `Operation "${operationDescription}" exceeded timeout of ${timeoutMs}ms`,
- ),
+ `Operation "${operationDescription}" exceeded timeout of ${timeoutMs}ms`
+ )
)
}, timeoutMs)
})
@@ -152,11 +152,6 @@ export async function withOperationMutex(
// Race between operation and timeout
return await Promise.race([operation(), timeoutPromise])
} catch (error) {
- // If timeout occurred, error is already handled
- if (timeoutExceeded) {
- throw error
- }
- // Otherwise, re-throw the operation error
throw error
} finally {
// Clear timeout if operation completed before timeout
@@ -173,7 +168,7 @@ export async function withOperationMutex(
/**
* Check if an operation is currently in progress
*/
-export function isOperationInProgress(): boolean {
+export function isOperationInProgress (): boolean {
const walletStore = getWalletStore()
return walletStore.getState().isOperationInProgress
}
@@ -181,7 +176,7 @@ export function isOperationInProgress(): boolean {
/**
* Get current operation description
*/
-export function getCurrentOperation(): string | null {
+export function getCurrentOperation (): string | null {
const walletStore = getWalletStore()
return walletStore.getState().currentOperation
}
diff --git a/src/utils/result.ts b/src/utils/result.ts
index 1152b84..2bf606e 100644
--- a/src/utils/result.ts
+++ b/src/utils/result.ts
@@ -1,6 +1,6 @@
/**
* Result Type for Error Handling
- *
+ *
* Provides a consistent pattern for handling operations that can succeed or fail.
* This eliminates the need for try-catch blocks and provides type-safe error handling.
*/
@@ -9,27 +9,27 @@
* Result type representing success or failure
*/
export type Result =
- | { success: true; data: T; error?: never }
- | { success: false; error: E; data?: never }
+ | { success: true, data: T, error?: never }
+ | { success: false, error: E, data?: never }
/**
* Create a success result
*/
-export function ok(data: T): Result {
+export function ok (data: T): Result {
return { success: true, data }
}
/**
* Create an error result
*/
-export function err(error: E): Result {
+export function err (error: E): Result {
return { success: false, error }
}
/**
* Wrap an async function to return a Result instead of throwing
*/
-export async function toResult(
+export async function toResult (
fn: () => Promise
): Promise> {
try {
@@ -43,7 +43,7 @@ export async function toResult(
/**
* Wrap a synchronous function to return a Result instead of throwing
*/
-export function toResultSync(
+export function toResultSync (
fn: () => T
): Result {
try {
@@ -53,5 +53,3 @@ export function toResultSync(
return err(error as E)
}
}
-
-
diff --git a/src/utils/schemas.ts b/src/utils/schemas.ts
index 594b7bb..98606d3 100644
--- a/src/utils/schemas.ts
+++ b/src/utils/schemas.ts
@@ -1,6 +1,6 @@
/**
* Zod Schemas for Runtime Validation
- *
+ *
* Provides Zod schemas for all WDK types to replace manual if/else type guards.
* These schemas provide better error messages and are easier to maintain.
*/
@@ -11,74 +11,89 @@ import { z } from 'zod'
* Ethereum address schema (0x followed by 40 hex characters)
*/
export const ethereumAddressSchema = z.string().regex(/^0x[a-fA-F0-9]{40}$/, {
- message: 'Must be a valid Ethereum address (0x followed by 40 hex characters)',
+ message: 'Must be a valid Ethereum address (0x followed by 40 hex characters)'
})
/**
* Spark address schema (Bech32 format: spark1/sparkt1/sparkrt1 followed by base32 characters)
*/
export const sparkAddressSchema = z.string().regex(/^spark(1|t1|rt1|test1)[a-z0-9]+$/, {
- message: 'Must be a valid Spark address (spark1/sparkt1/sparkrt1 followed by base32 characters)',
+ message: 'Must be a valid Spark address (spark1/sparkt1/sparkrt1 followed by base32 characters)'
}).min(14).max(90)
/**
- * Address schema (Ethereum or Spark)
+ * Bitcoin address schema
+ * Supports:
+ * - P2PKH (starts with 1, 26-35 chars)
+ * - P2SH (starts with 3, 26-35 chars)
+ * - SegWit (starts with bc1, 14-74 chars)
+ * - Testnet (starts with m, n, 2, tb1)
*/
-export const addressSchema = z.union([ethereumAddressSchema, sparkAddressSchema])
+export const bitcoinAddressSchema = z.string().regex(/^(1|3|bc1|m|n|2|tb1)[a-zA-Z0-9]+$/, {
+ message: 'Must be a valid Bitcoin address'
+}).min(14).max(90)
+
+/**
+ * Address schema (Generic)
+ * Allows any non-empty string to support any blockchain (BTC, Solana, etc.)
+ */
+export const addressSchema = z.string().min(1)
+
+export const assetIdSchema = z.string().min(1)
/**
- * Network configuration schema
+ * Network configuration schema (Generic)
+ * Matches { blockchain: string, config: object }
*/
-export const networkConfigSchema = z.object({
- chainId: z.number().int().positive(),
+export const wdkConfigSchema = z.object({
blockchain: z.string().min(1),
- provider: z.string().min(1).optional(),
- bundlerUrl: z.string().min(1).optional(),
- paymasterUrl: z.string().min(1).optional(),
- paymasterAddress: ethereumAddressSchema.optional(),
- entryPointAddress: ethereumAddressSchema.optional(),
- transferMaxFee: z.number().nonnegative().optional(),
-})
+ config: z.record(z.string(), z.unknown()).optional().default({})
+}).passthrough()
/**
* Network configurations schema
*/
-export const networkConfigsSchema = z.record(
+export const wdkNetworkConfigsSchema = z.record(
z.string().regex(/^[a-zA-Z0-9_-]+$/, {
- message: 'Network name must contain only alphanumeric characters, hyphens, and underscores',
+ message: 'Network name must contain only alphanumeric characters, hyphens, and underscores'
}),
- networkConfigSchema
+ wdkConfigSchema
).refine((configs) => Object.keys(configs).length > 0, {
- message: 'NetworkConfigs must contain at least one network',
+ message: 'NetworkConfigs must contain at least one network'
})
/**
- * Token configuration schema
+ * Protocol configuration schema
+ * Matches { protocolName: string, blockchain: string, config: object }
*/
-export const tokenConfigSchema = z.object({
- symbol: z.string().min(1),
- name: z.string().min(1),
- decimals: z.number().int().min(0).max(18),
- address: z.union([ethereumAddressSchema, z.null()]),
-})
+export const protocolConfigSchema = z.object({
+ protocolName: z.string().min(1),
+ blockchain: z.string().min(1),
+ config: z.record(z.string(), z.unknown()).optional().default({})
+}).passthrough()
/**
- * Network tokens schema
+ * WDK configuration schema
*/
-export const networkTokensSchema = z.object({
- native: tokenConfigSchema,
- tokens: z.array(tokenConfigSchema),
+export const wdkConfigsSchema = z.object({
+ networks: wdkNetworkConfigsSchema,
+ protocols: z.record(z.string(), protocolConfigSchema).optional()
})
/**
- * Token configurations schema
+ * Asset configuration schema (Generic)
+ * Minimal requirements: id, symbol, name, decimals, isNative.
+ * All other fields are optional/passthrough.
*/
-export const tokenConfigsSchema = z.record(
- z.string().min(1),
- networkTokensSchema
-).refine((configs) => Object.keys(configs).length > 0, {
- message: 'TokenConfigs must contain at least one network',
-})
+export const assetConfigSchema = z.object({
+ id: z.string().min(1),
+ symbol: z.string().min(1),
+ name: z.string().min(1),
+ decimals: z.number().int().min(0),
+ isNative: z.boolean(),
+ address: z.union([z.string().min(1), z.null()]).optional()
+ // All other fields allowed
+}).passthrough()
/**
* Account index schema
@@ -89,14 +104,14 @@ export const accountIndexSchema = z.number().int().nonnegative()
* Network name schema
*/
export const networkNameSchema = z.string().regex(/^[a-zA-Z0-9_-]+$/, {
- message: 'Network name must contain only alphanumeric characters, hyphens, and underscores',
+ message: 'Network name must contain only alphanumeric characters, hyphens, and underscores'
}).min(1)
/**
* Balance string schema (valid number string)
*/
export const balanceStringSchema = z.string().regex(/^-?\d+(\.\d+)?$/, {
- message: 'Balance must be a valid number string',
+ message: 'Balance must be a valid number string'
})
/**
@@ -119,7 +134,7 @@ export const walletAddressesSchema = z.record(
/**
* Wallet balances schema
- * Maps network -> accountIndex -> tokenAddress -> balance
+ * Maps network -> accountIndex -> assetId -> balance
*/
export const walletBalancesSchema = z.record(
networkNameSchema,
@@ -137,7 +152,7 @@ export const walletBalancesSchema = z.record(
/**
* Balance loading states schema
- * Maps "network-accountIndex-tokenAddress" -> boolean
+ * Maps "network-accountIndex-assetId" -> boolean
*/
export const balanceLoadingStatesSchema = z.record(z.string(), z.boolean())
@@ -148,9 +163,9 @@ export const balanceFetchResultSchema = z.object({
success: z.boolean(),
network: networkNameSchema,
accountIndex: accountIndexSchema,
- tokenAddress: z.union([ethereumAddressSchema, z.null()]),
+ assetId: z.string().min(1),
balance: z.union([balanceStringSchema, z.null()]),
- error: z.string().optional(),
+ error: z.string().optional()
})
/**
@@ -161,7 +176,7 @@ export const walletSchema = z.object({
identifier: z.string().min(1),
name: z.string().min(1),
createdAt: z.number().int().nonnegative(),
- updatedAt: z.number().int().nonnegative(),
+ updatedAt: z.number().int().nonnegative()
})
/**
@@ -169,14 +184,14 @@ export const walletSchema = z.object({
*/
export const workletResponseSchema = z.object({
result: z.string(),
- error: z.string().optional(),
+ error: z.string().optional()
})
/**
* Balance response schema (numeric string)
*/
export const balanceResponseSchema = z.string().regex(/^\d+$/, {
- message: 'Balance must be a numeric string',
+ message: 'Balance must be a numeric string'
})
/**
@@ -185,6 +200,5 @@ export const balanceResponseSchema = z.string().regex(/^\d+$/, {
export const accountMethodResponseSchema = z.union([
balanceResponseSchema,
z.string(), // For addresses
- z.object({}).passthrough(), // For other responses (objects)
+ z.object({}).passthrough() // For other responses (objects)
])
-
diff --git a/src/utils/storeHelpers.ts b/src/utils/storeHelpers.ts
index 3763ef6..b01c678 100644
--- a/src/utils/storeHelpers.ts
+++ b/src/utils/storeHelpers.ts
@@ -5,11 +5,9 @@
* to reduce code duplication across services.
*/
-import type { HRPC } from '@tetherto/pear-wrk-wdk'
-
import { getWorkletStore } from '../store/workletStore'
import { getWalletStore } from '../store/walletStore'
-import { asExtendedHRPC } from '../types/hrpc'
+import type { HRPC } from '../types'
import type { WalletState } from '../store/walletStore'
import { produce } from 'immer'
@@ -25,37 +23,20 @@ import { produce } from 'immer'
* await hrpc.callMethod(...)
* ```
*/
-export function requireInitialized(): HRPC {
+export function requireInitialized (): HRPC {
const state = getWorkletStore().getState()
- if (!state.isInitialized || !state.hrpc) {
+ if (!state.isInitialized || (state.hrpc == null)) {
throw new Error('WDK not initialized')
}
return state.hrpc
}
-/**
- * Require that worklet is initialized and return extended HRPC instance
- *
- * @throws Error if worklet is not initialized
- * @returns Extended HRPC instance
- *
- * @example
- * ```typescript
- * const hrpc = requireExtendedHRPC()
- * await hrpc.initializeWDK(...)
- * ```
- */
-export function requireExtendedHRPC(): ReturnType {
- const hrpc = requireInitialized()
- return asExtendedHRPC(hrpc)
-}
-
/**
* Check if worklet is initialized
*
* @returns true if worklet is initialized, false otherwise
*/
-export function isInitialized(): boolean {
+export function isInitialized (): boolean {
const state = getWorkletStore().getState()
return state.isInitialized && state.hrpc !== null
}
@@ -75,13 +56,13 @@ export function isInitialized(): boolean {
* @param balance - Balance value
* @returns The updated state
*/
-export function updateBalanceInState(
+export function updateBalanceInState (
prev: WalletState,
walletId: string,
network: string,
accountIndex: number,
tokenKey: string,
- balance: string,
+ balance: string
) {
return produce(prev, (state) => {
state.balances[walletId] ??= {}
@@ -105,12 +86,12 @@ export function updateBalanceInState(
* @param address - Address value
* @returns The updated state
*/
-export function updateAddressInState(
+export function updateAddressInState (
prev: WalletState,
walletId: string,
network: string,
accountIndex: number,
- address: string,
+ address: string
) {
return produce(prev, (state) => {
state.addresses[walletId] ??= {}
@@ -135,7 +116,7 @@ export function updateAddressInState(
* // Use targetWalletId for operations
* ```
*/
-export function resolveWalletId(walletId?: string): string {
+export function resolveWalletId (walletId?: string): string {
if (walletId) {
return walletId
}
@@ -159,10 +140,10 @@ export function resolveWalletId(walletId?: string): string {
* const balance = getNestedState(state.balances, [walletId, network, accountIndex, tokenKey], null)
* ```
*/
-export function getNestedState(
+export function getNestedState (
obj: Record,
- path: (string | number)[],
- defaultValue: T,
+ path: Array,
+ defaultValue: T
): T {
let current: unknown = obj
for (const key of path) {
@@ -193,10 +174,10 @@ export function getNestedState(
* const newState = updateNestedState(prev, ['balances', walletId, network, accountIndex, tokenKey], balance)
* ```
*/
-export function updateNestedState>(
+export function updateNestedState> (
prev: T,
- path: (string | number)[],
- value: unknown,
+ path: Array,
+ value: unknown
): Partial {
if (path.length === 0) {
if (typeof value === 'object' && value !== null && !Array.isArray(value)) {
@@ -221,6 +202,6 @@ export function updateNestedState>(
return {
...prev,
- [keyString]: updatedValue,
+ [keyString]: updatedValue
} as Partial
}
diff --git a/src/utils/typeGuards.ts b/src/utils/typeGuards.ts
index 5077fa0..d92f081 100644
--- a/src/utils/typeGuards.ts
+++ b/src/utils/typeGuards.ts
@@ -1,72 +1,64 @@
/**
* Runtime Type Guards
- *
+ *
* Provides runtime type checking for critical data paths to ensure type safety
* beyond TypeScript's compile-time checks.
- *
+ *
* NOTE: These type guards now use Zod schemas internally for validation.
* They are kept for backward compatibility but may be deprecated in the future.
*/
import {
- networkConfigSchema,
- networkConfigsSchema,
- tokenConfigSchema,
- tokenConfigsSchema,
+ wdkConfigSchema,
+ wdkConfigsSchema,
+ assetConfigSchema,
walletAddressesSchema,
walletBalancesSchema,
ethereumAddressSchema,
sparkAddressSchema,
+ bitcoinAddressSchema,
accountIndexSchema,
networkNameSchema,
- balanceStringSchema,
+ balanceStringSchema
} from './schemas'
+
import type {
- NetworkConfig,
- NetworkConfigs,
- TokenConfig,
- TokenConfigs,
+ WdkConfigs,
+ AssetConfig,
WalletAddresses,
WalletBalances,
+ WdkNetworkConfig
} from '../types'
/**
* Type guard to check if a value is a valid NetworkConfig
* Uses Zod schema internally for validation
*/
-export function isNetworkConfig(value: unknown): value is NetworkConfig {
- return networkConfigSchema.safeParse(value).success
+export function isWdkConfig (value: unknown): value is WdkNetworkConfig {
+ return wdkConfigSchema.safeParse(value).success
}
/**
* Type guard to check if a value is a valid NetworkConfigs
* Uses Zod schema internally for validation
*/
-export function isNetworkConfigs(value: unknown): value is NetworkConfigs {
- return networkConfigsSchema.safeParse(value).success
+export function isWdkConfigs (value: unknown): value is WdkConfigs {
+ return wdkConfigsSchema.safeParse(value).success
}
/**
- * Type guard to check if a value is a valid TokenConfig
+ * Type guard to check if a value is a valid AssetConfig
* Uses Zod schema internally for validation
*/
-export function isTokenConfig(value: unknown): value is TokenConfig {
- return tokenConfigSchema.safeParse(value).success
-}
-
-/**
- * Type guard to check if a value is a valid TokenConfigs
- * Uses Zod schema internally for validation
- */
-export function isTokenConfigs(value: unknown): value is TokenConfigs {
- return tokenConfigsSchema.safeParse(value).success
+export function isAssetConfig (value: unknown): value is AssetConfig {
+ return assetConfigSchema.safeParse(value).success
}
/**
* Type guard to check if a value is a valid WalletAddresses structure
* Uses Zod schema internally for validation
*/
-export function isWalletAddresses(value: unknown): value is WalletAddresses {
+export function isWalletAddresses (value: unknown): value is WalletAddresses {
return walletAddressesSchema.safeParse(value).success
}
@@ -74,7 +66,7 @@ export function isWalletAddresses(value: unknown): value is WalletAddresses {
* Type guard to check if a value is a valid WalletBalances structure
* Uses Zod schema internally for validation
*/
-export function isWalletBalances(value: unknown): value is WalletBalances {
+export function isWalletBalances (value: unknown): value is WalletBalances {
return walletBalancesSchema.safeParse(value).success
}
@@ -82,7 +74,7 @@ export function isWalletBalances(value: unknown): value is WalletBalances {
* Type guard to check if a value is a valid Ethereum address
* Uses Zod schema internally for validation
*/
-export function isEthereumAddress(value: unknown): value is string {
+export function isEthereumAddress (value: unknown): value is string {
return ethereumAddressSchema.safeParse(value).success
}
@@ -91,22 +83,30 @@ export function isEthereumAddress(value: unknown): value is string {
* Spark addresses start with "spark1" followed by Bech32-encoded characters
* Uses Zod schema internally for validation
*/
-export function isSparkAddress(value: unknown): value is string {
+export function isSparkAddress (value: unknown): value is string {
return sparkAddressSchema.safeParse(value).success
}
/**
- * Type guard to check if a value is a valid address (Ethereum or Spark format)
+ * Type guard to check if a value is a valid Bitcoin address
+ * Uses Zod schema internally for validation
*/
-export function isValidAddress(value: unknown): value is string {
- return isEthereumAddress(value) || isSparkAddress(value)
+export function isBitcoinAddress (value: unknown): value is string {
+ return bitcoinAddressSchema.safeParse(value).success
+}
+
+/**
+ * Type guard to check if a value is a valid address (Ethereum, Spark, or Bitcoin format)
+ */
+export function isValidAddress (value: unknown): value is string {
+ return isEthereumAddress(value) || isSparkAddress(value) || isBitcoinAddress(value)
}
/**
* Type guard to check if a value is a valid account index
* Uses Zod schema internally for validation
*/
-export function isValidAccountIndex(value: unknown): value is number {
+export function isValidAccountIndex (value: unknown): value is number {
return accountIndexSchema.safeParse(value).success
}
@@ -114,7 +114,7 @@ export function isValidAccountIndex(value: unknown): value is number {
* Type guard to check if a value is a valid network name
* Uses Zod schema internally for validation
*/
-export function isValidNetworkName(value: unknown): value is string {
+export function isValidNetworkName (value: unknown): value is string {
return networkNameSchema.safeParse(value).success
}
@@ -122,8 +122,6 @@ export function isValidNetworkName(value: unknown): value is string {
* Type guard to check if a value is a valid balance string
* Uses Zod schema internally for validation
*/
-export function isValidBalanceString(value: unknown): value is string {
+export function isValidBalanceString (value: unknown): value is string {
return balanceStringSchema.safeParse(value).success
}
-
-
diff --git a/src/utils/validation.ts b/src/utils/validation.ts
index fe52c1f..bb0974e 100644
--- a/src/utils/validation.ts
+++ b/src/utils/validation.ts
@@ -1,6 +1,6 @@
/**
* Validation utilities for WDK provider props and inputs
- *
+ *
* These functions throw errors for invalid inputs.
* Uses Zod schemas for validation with better error messages.
* For type guards (boolean returns), see typeGuards.ts
@@ -8,23 +8,23 @@
import { z } from 'zod'
import {
- networkConfigsSchema,
- tokenConfigsSchema,
+ wdkConfigsSchema,
accountIndexSchema,
networkNameSchema,
balanceStringSchema,
ethereumAddressSchema,
+ assetIdSchema
} from './schemas'
-import type { NetworkConfigs, TokenConfigs } from '../types'
+import type { WdkConfigs } from '../types'
/**
* Extract error message from Zod error
*/
-function getZodErrorMessage(error: unknown): string {
+function getZodErrorMessage (error: unknown): string {
if (error instanceof z.ZodError) {
// Get the first error message for simplicity
const firstIssue = error.issues[0]
- if (firstIssue) {
+ if (firstIssue != null) {
return firstIssue.message
}
return 'Validation failed'
@@ -38,29 +38,18 @@ function getZodErrorMessage(error: unknown): string {
/**
* Validate network configuration
*/
-export function validateNetworkConfigs(networkConfigs: NetworkConfigs): void {
+export function validateWdkConfigs (networkConfigs: WdkConfigs): void {
try {
- networkConfigsSchema.parse(networkConfigs)
+ wdkConfigsSchema.parse(networkConfigs)
} catch (error) {
throw new Error(`Invalid networkConfigs: ${getZodErrorMessage(error)}`)
}
}
-/**
- * Validate token configuration
- */
-export function validateTokenConfigs(tokenConfigs: TokenConfigs): void {
- try {
- tokenConfigsSchema.parse(tokenConfigs)
- } catch (error) {
- throw new Error(`Invalid tokenConfigs: ${getZodErrorMessage(error)}`)
- }
-}
-
/**
* Validate balance refresh interval
*/
-export function validateBalanceRefreshInterval(interval: number | undefined): void {
+export function validateBalanceRefreshInterval (interval: number | undefined): void {
if (interval !== undefined) {
if (typeof interval !== 'number') {
throw new Error('balanceRefreshInterval must be a number')
@@ -76,12 +65,12 @@ export function validateBalanceRefreshInterval(interval: number | undefined): vo
/**
* Validate that an object has required methods
- *
+ *
* @param obj - Object to validate
* @param requiredMethods - Array of required method names
* @param objectName - Name of the object for error messages
*/
-export function validateRequiredMethods(
+export function validateRequiredMethods (
obj: unknown,
requiredMethods: string[],
objectName: string
@@ -100,7 +89,7 @@ export function validateRequiredMethods(
/**
* Validate account index
*/
-export function validateAccountIndex(accountIndex: number): void {
+export function validateAccountIndex (accountIndex: number): void {
try {
accountIndexSchema.parse(accountIndex)
} catch (error) {
@@ -112,7 +101,7 @@ export function validateAccountIndex(accountIndex: number): void {
/**
* Validate network name
*/
-export function validateNetworkName(network: string): void {
+export function validateNetworkName (network: string): void {
try {
networkNameSchema.parse(network)
} catch (error) {
@@ -128,7 +117,7 @@ export function validateNetworkName(network: string): void {
/**
* Validate token address (can be null for native tokens)
*/
-export function validateTokenAddress(tokenAddress: string | null): void {
+export function validateTokenAddress (tokenAddress: string | null): void {
if (tokenAddress === null) {
return
}
@@ -140,10 +129,19 @@ export function validateTokenAddress(tokenAddress: string | null): void {
}
}
+export function validateAssetId (assetId: string): void {
+ try {
+ assetIdSchema.parse(assetId)
+ } catch (error) {
+ const message = getZodErrorMessage(error)
+ throw new Error(`Invalid assetId: ${message}`)
+ }
+}
+
/**
* Validate balance string
*/
-export function validateBalance(balance: string): void {
+export function validateBalance (balance: string): void {
try {
balanceStringSchema.parse(balance)
} catch (error) {
@@ -155,20 +153,17 @@ export function validateBalance(balance: string): void {
/**
* Validate wallet parameters (network, accountIndex, optional tokenAddress)
* Convenience function to validate common wallet operation parameters
- *
+ *
* @param network - Network name
* @param accountIndex - Account index
- * @param tokenAddress - Optional token address (null for native tokens)
+ * @param assetId - Asset ID (optional)
*/
-export function validateWalletParams(
+export function validateWalletParams (
network: string,
accountIndex: number,
- tokenAddress?: string | null
+ assetId?: string
): void {
validateNetworkName(network)
validateAccountIndex(accountIndex)
- if (tokenAddress !== undefined) {
- validateTokenAddress(tokenAddress)
- }
+ assetId && validateAssetId(assetId)
}
-
diff --git a/src/utils/walletStateHelpers.ts b/src/utils/walletStateHelpers.ts
index a04d63c..f805086 100644
--- a/src/utils/walletStateHelpers.ts
+++ b/src/utils/walletStateHelpers.ts
@@ -1,14 +1,14 @@
/**
* Wallet State Helper Functions
- *
+ *
* Pure functions that determine wallet state transition decisions.
* These helpers are used by WdkAppProvider for wallet state synchronization logic.
- *
+ *
* These functions are extracted for:
* - Readability: Complex state logic separated from component orchestration
* - Testability: Pure functions can be tested in isolation
* - Reusability: Can be used elsewhere if needed
- *
+ *
* Note: The effect that uses these functions must remain consolidated to prevent race conditions.
*/
@@ -18,12 +18,12 @@ import { isWalletLoadingState } from '../store/walletStore'
/**
* Determine if wallet state should be reset to not_loaded
* This happens when activeWalletId is cleared (null)
- *
+ *
* @param activeWalletId - Currently active wallet identifier (null if none)
* @param walletLoadingState - Current wallet loading state
* @returns true if state should be reset to not_loaded
*/
-export function shouldResetToNotLoaded(
+export function shouldResetToNotLoaded (
activeWalletId: string | null,
walletLoadingState: WalletLoadingState
): boolean {
@@ -33,17 +33,17 @@ export function shouldResetToNotLoaded(
/**
* Determine wallet switch decision when activeWalletId changes
* Returns whether a switch should occur and whether the new wallet should be marked ready
- *
+ *
* @param currentWalletId - Wallet ID currently tracked in loading state
* @param activeWalletId - New active wallet ID
* @param hasAddresses - Whether the new wallet has addresses available
* @returns Object with shouldSwitch and shouldMarkReady flags
*/
-export function getWalletSwitchDecision(
+export function getWalletSwitchDecision (
currentWalletId: string | null,
activeWalletId: string | null,
hasAddresses: boolean
-): { shouldSwitch: boolean; shouldMarkReady: boolean } {
+): { shouldSwitch: boolean, shouldMarkReady: boolean } {
if (currentWalletId !== activeWalletId) {
return { shouldSwitch: true, shouldMarkReady: hasAddresses }
}
@@ -53,10 +53,10 @@ export function getWalletSwitchDecision(
/**
* Determine if wallet should be marked as ready
* This checks if wallet is in loading/checking state, addresses exist, and worklet is initialized with seed
- *
+ *
* Note: If addresses exist but state is not_loaded, we need to go through loading first.
* This is handled by useWalletManager.initializeWallet() or useOnboarding.
- *
+ *
* @param walletLoadingState - Current wallet loading state
* @param hasAddresses - Whether wallet has addresses available
* @param currentWalletId - Wallet ID currently tracked in loading state
@@ -64,7 +64,7 @@ export function getWalletSwitchDecision(
* @param isWorkletInitialized - Whether the worklet is initialized with wallet credentials (seed loaded)
* @returns true if wallet should be marked as ready
*/
-export function shouldMarkWalletAsReady(
+export function shouldMarkWalletAsReady (
walletLoadingState: WalletLoadingState,
hasAddresses: boolean,
currentWalletId: string | null,
@@ -84,14 +84,14 @@ export function shouldMarkWalletAsReady(
/**
* Determine if an error should be handled for the current wallet
* Only handle errors if they're for the wallet we're currently tracking
- *
+ *
* @param walletManagerError - Error message from wallet manager (null if no error)
* @param currentWalletId - Wallet ID currently tracked in loading state
* @param activeWalletId - Currently active wallet identifier
* @param walletLoadingState - Current wallet loading state
* @returns true if error should be handled for current wallet
*/
-export function shouldHandleError(
+export function shouldHandleError (
walletManagerError: string | null,
currentWalletId: string | null,
activeWalletId: string | null,
@@ -101,4 +101,3 @@ export function shouldHandleError(
// Only update error if we're tracking this wallet
return currentWalletId === activeWalletId || walletLoadingState.type === 'not_loaded'
}
-
diff --git a/src/utils/walletUtils.ts b/src/utils/walletUtils.ts
index efa360c..6124f33 100644
--- a/src/utils/walletUtils.ts
+++ b/src/utils/walletUtils.ts
@@ -1,6 +1,6 @@
/**
* Wallet Utilities
- *
+ *
* Helper functions for working with wallets and retrieving addresses from walletStore.
*/
@@ -12,31 +12,31 @@ import type { WalletStore } from '../types'
/**
* Get addresses for a wallet from walletStore
- *
+ *
* This helper function retrieves addresses for a specific accountIndex from the walletStore.
* Addresses are stored in walletStore as: { [network]: { [accountIndex]: address } }
* This converts them to: { [network]: address } for a specific accountIndex
- *
+ *
* NOTE: walletStore is the ONLY place where addresses are actually stored.
* This function simply retrieves/looks up addresses from walletStore.
- *
+ *
* @param walletStore - The wallet store instance (Zustand store) - the source of truth for addresses
* @param accountIndex - The account index to get addresses for
* @returns Record of network -> address for the given accountIndex
*/
-export function getWalletAddresses(
+export function getWalletAddresses (
walletStore: { getState: () => WalletStoreType },
accountIndex: number
): Record {
const state = walletStore.getState()
const addresses: Record = {}
-
+
// Get active wallet ID or use all wallets
const activeWalletId = state.activeWalletId
-
+
// Retrieve addresses for this accountIndex from walletStore
// state.addresses is WalletAddressesByWallet: { [walletId]: { [network]: { [accountIndex]: address } } }
- if (activeWalletId && state.addresses[activeWalletId]) {
+ if (activeWalletId && (state.addresses[activeWalletId] != null)) {
// Use active wallet if available
const walletAddresses = state.addresses[activeWalletId]
// walletAddresses is WalletAddresses: { [network]: { [accountIndex]: address } }
@@ -64,35 +64,35 @@ export function getWalletAddresses(
}
})
}
-
+
return addresses
}
/**
* Create a base wallet store that wraps the worklet and wallet stores
- *
+ *
* This provides the worklet methods (callAccountMethod, isWalletInitialized)
* and helper functions for retrieving addresses from walletStore.
* Apps should extend this with their own wallet metadata and balance management.
- *
+ *
* Always uses the default MMKV storage adapter.
- *
+ *
* @returns Base wallet store implementation
*/
-export function createBaseWalletStore(): Pick & {
+export function createBaseWalletStore (): Pick & {
getWalletAddresses: (accountIndex: number) => Record
} {
const workletStore = getWorkletStore()
const walletStore = getWalletStore()
-
+
return {
callAccountMethod: async (
network: string,
accountIndex: number,
methodName: string,
- args?: unknown
+ args?: unknown | unknown[]
): Promise => {
- return AccountService.callAccountMethod(network, accountIndex, methodName, args)
+ return await (AccountService.callAccountMethod(network, accountIndex, methodName, args) as Promise)
},
isWalletInitialized: () => {
@@ -101,7 +101,6 @@ export function createBaseWalletStore(): Pick {
return getWalletAddresses(walletStore, accountIndex)
- },
+ }
}
}
-
diff --git a/tsconfig.json b/tsconfig.json
index 7e1963c..e63b1e8 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -2,6 +2,7 @@
"compilerOptions": {
"target": "ES2020",
"module": "ESNext",
+ "moduleResolution": "bundler",
"lib": ["ES2020"],
"declaration": true,
"outDir": "./dist",
@@ -12,7 +13,6 @@
"skipLibCheck": true,
"forceConsistentCasingInFileNames": true,
"resolveJsonModule": true,
- "moduleResolution": "bundler",
"jsx": "react",
"baseUrl": ".",
"noUnusedLocals": false,